fmsystem-commits
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Fmsystem-commits] [7152] api: alternative multi file upload


From: Sigurd Nes
Subject: [Fmsystem-commits] [7152] api: alternative multi file upload
Date: Fri, 01 Apr 2011 10:39:58 +0000

Revision: 7152
          http://svn.sv.gnu.org/viewvc/?view=rev&root=fmsystem&revision=7152
Author:   sigurdne
Date:     2011-04-01 10:39:57 +0000 (Fri, 01 Apr 2011)
Log Message:
-----------
api: alternative multi file upload

Added Paths:
-----------
    trunk/phpgwapi/js/uploadify/
    trunk/phpgwapi/js/uploadify/cancel.png
    trunk/phpgwapi/js/uploadify/check.php
    trunk/phpgwapi/js/uploadify/com/
    trunk/phpgwapi/js/uploadify/com/adobe/
    trunk/phpgwapi/js/uploadify/com/adobe/air/
    trunk/phpgwapi/js/uploadify/com/adobe/air/logging/
    trunk/phpgwapi/js/uploadify/com/adobe/air/logging/FileTarget.as
    trunk/phpgwapi/js/uploadify/com/adobe/crypto/
    trunk/phpgwapi/js/uploadify/com/adobe/crypto/HMAC.as
    trunk/phpgwapi/js/uploadify/com/adobe/crypto/MD5.as
    trunk/phpgwapi/js/uploadify/com/adobe/crypto/MD5Stream.as
    trunk/phpgwapi/js/uploadify/com/adobe/crypto/SHA1.as
    trunk/phpgwapi/js/uploadify/com/adobe/crypto/SHA224.as
    trunk/phpgwapi/js/uploadify/com/adobe/crypto/SHA256.as
    trunk/phpgwapi/js/uploadify/com/adobe/crypto/WSSEUsernameToken.as
    trunk/phpgwapi/js/uploadify/com/adobe/errors/
    trunk/phpgwapi/js/uploadify/com/adobe/errors/IllegalStateError.as
    trunk/phpgwapi/js/uploadify/com/adobe/fileformats/
    trunk/phpgwapi/js/uploadify/com/adobe/fileformats/vcard/
    trunk/phpgwapi/js/uploadify/com/adobe/fileformats/vcard/Address.as
    trunk/phpgwapi/js/uploadify/com/adobe/fileformats/vcard/Email.as
    trunk/phpgwapi/js/uploadify/com/adobe/fileformats/vcard/Phone.as
    trunk/phpgwapi/js/uploadify/com/adobe/fileformats/vcard/VCard.as
    trunk/phpgwapi/js/uploadify/com/adobe/fileformats/vcard/VCardParser.as
    trunk/phpgwapi/js/uploadify/com/adobe/images/
    trunk/phpgwapi/js/uploadify/com/adobe/images/BitString.as
    trunk/phpgwapi/js/uploadify/com/adobe/images/JPGEncoder.as
    trunk/phpgwapi/js/uploadify/com/adobe/images/PNGEncoder.as
    trunk/phpgwapi/js/uploadify/com/adobe/net/
    trunk/phpgwapi/js/uploadify/com/adobe/net/DynamicURLLoader.as
    trunk/phpgwapi/js/uploadify/com/adobe/net/IURIResolver.as
    trunk/phpgwapi/js/uploadify/com/adobe/net/MimeTypeMap.as
    trunk/phpgwapi/js/uploadify/com/adobe/net/URI.as
    trunk/phpgwapi/js/uploadify/com/adobe/net/URIEncodingBitmap.as
    trunk/phpgwapi/js/uploadify/com/adobe/net/proxies/
    trunk/phpgwapi/js/uploadify/com/adobe/net/proxies/RFC2817Socket.as
    trunk/phpgwapi/js/uploadify/com/adobe/protocols/
    trunk/phpgwapi/js/uploadify/com/adobe/protocols/dict/
    trunk/phpgwapi/js/uploadify/com/adobe/protocols/dict/Database.as
    trunk/phpgwapi/js/uploadify/com/adobe/protocols/dict/Definition.as
    trunk/phpgwapi/js/uploadify/com/adobe/protocols/dict/Dict.as
    trunk/phpgwapi/js/uploadify/com/adobe/protocols/dict/DictionaryServer.as
    trunk/phpgwapi/js/uploadify/com/adobe/protocols/dict/MatchStrategy.as
    trunk/phpgwapi/js/uploadify/com/adobe/protocols/dict/Response.as
    trunk/phpgwapi/js/uploadify/com/adobe/protocols/dict/events/
    
trunk/phpgwapi/js/uploadify/com/adobe/protocols/dict/events/ConnectedEvent.as
    trunk/phpgwapi/js/uploadify/com/adobe/protocols/dict/events/DatabaseEvent.as
    
trunk/phpgwapi/js/uploadify/com/adobe/protocols/dict/events/DefinitionEvent.as
    
trunk/phpgwapi/js/uploadify/com/adobe/protocols/dict/events/DefinitionHeaderEvent.as
    
trunk/phpgwapi/js/uploadify/com/adobe/protocols/dict/events/DictionaryServerEvent.as
    
trunk/phpgwapi/js/uploadify/com/adobe/protocols/dict/events/DisconnectedEvent.as
    trunk/phpgwapi/js/uploadify/com/adobe/protocols/dict/events/ErrorEvent.as
    trunk/phpgwapi/js/uploadify/com/adobe/protocols/dict/events/MatchEvent.as
    
trunk/phpgwapi/js/uploadify/com/adobe/protocols/dict/events/MatchStrategiesEvent.as
    trunk/phpgwapi/js/uploadify/com/adobe/protocols/dict/events/NoMatchEvent.as
    trunk/phpgwapi/js/uploadify/com/adobe/protocols/dict/util/
    
trunk/phpgwapi/js/uploadify/com/adobe/protocols/dict/util/CompleteResponseEvent.as
    trunk/phpgwapi/js/uploadify/com/adobe/protocols/dict/util/SocketHelper.as
    trunk/phpgwapi/js/uploadify/com/adobe/serialization/
    trunk/phpgwapi/js/uploadify/com/adobe/serialization/json/
    trunk/phpgwapi/js/uploadify/com/adobe/serialization/json/JSON.as
    trunk/phpgwapi/js/uploadify/com/adobe/serialization/json/JSONDecoder.as
    trunk/phpgwapi/js/uploadify/com/adobe/serialization/json/JSONEncoder.as
    trunk/phpgwapi/js/uploadify/com/adobe/serialization/json/JSONParseError.as
    trunk/phpgwapi/js/uploadify/com/adobe/serialization/json/JSONToken.as
    trunk/phpgwapi/js/uploadify/com/adobe/serialization/json/JSONTokenType.as
    trunk/phpgwapi/js/uploadify/com/adobe/serialization/json/JSONTokenizer.as
    trunk/phpgwapi/js/uploadify/com/adobe/utils/
    trunk/phpgwapi/js/uploadify/com/adobe/utils/ArrayUtil.as
    trunk/phpgwapi/js/uploadify/com/adobe/utils/DateUtil.as
    trunk/phpgwapi/js/uploadify/com/adobe/utils/DictionaryUtil.as
    trunk/phpgwapi/js/uploadify/com/adobe/utils/IntUtil.as
    trunk/phpgwapi/js/uploadify/com/adobe/utils/NumberFormatter.as
    trunk/phpgwapi/js/uploadify/com/adobe/utils/StringUtil.as
    trunk/phpgwapi/js/uploadify/com/adobe/utils/XMLUtil.as
    trunk/phpgwapi/js/uploadify/com/adobe/webapis/
    trunk/phpgwapi/js/uploadify/com/adobe/webapis/ServiceBase.as
    trunk/phpgwapi/js/uploadify/com/adobe/webapis/URLLoaderBase.as
    trunk/phpgwapi/js/uploadify/com/adobe/webapis/events/
    trunk/phpgwapi/js/uploadify/com/adobe/webapis/events/ServiceEvent.as
    trunk/phpgwapi/js/uploadify/expressInstall.swf
    trunk/phpgwapi/js/uploadify/jquery-1.4.2.min.js
    trunk/phpgwapi/js/uploadify/jquery.uploadify.v2.1.4.js
    trunk/phpgwapi/js/uploadify/jquery.uploadify.v2.1.4.min.js
    trunk/phpgwapi/js/uploadify/swfobject.js
    trunk/phpgwapi/js/uploadify/test.html
    trunk/phpgwapi/js/uploadify/uploadify.allglyphs.swf
    trunk/phpgwapi/js/uploadify/uploadify.css
    trunk/phpgwapi/js/uploadify/uploadify.fla
    trunk/phpgwapi/js/uploadify/uploadify.php
    trunk/phpgwapi/js/uploadify/uploadify.swf

Added: trunk/phpgwapi/js/uploadify/cancel.png
===================================================================
(Binary files differ)


Property changes on: trunk/phpgwapi/js/uploadify/cancel.png
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Added: trunk/phpgwapi/js/uploadify/check.php
===================================================================
--- trunk/phpgwapi/js/uploadify/check.php                               (rev 0)
+++ trunk/phpgwapi/js/uploadify/check.php       2011-04-01 10:39:57 UTC (rev 
7152)
@@ -0,0 +1,35 @@
+<?php
+/*
+Uploadify v2.1.4
+Release Date: November 8, 2010
+
+Copyright (c) 2010 Ronnie Garcia, Travis Nickels
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
+*/
+$fileArray = array();
+foreach ($_POST as $key => $value) {
+       if ($key != 'folder') {
+               if (file_exists($_SERVER['DOCUMENT_ROOT'] . $_POST['folder'] . 
'/' . $value)) {
+                       $fileArray[$key] = $value;
+               }
+       }
+}
+echo json_encode($fileArray);
+?>
\ No newline at end of file

Added: trunk/phpgwapi/js/uploadify/com/adobe/air/logging/FileTarget.as
===================================================================
--- trunk/phpgwapi/js/uploadify/com/adobe/air/logging/FileTarget.as             
                (rev 0)
+++ trunk/phpgwapi/js/uploadify/com/adobe/air/logging/FileTarget.as     
2011-04-01 10:39:57 UTC (rev 7152)
@@ -0,0 +1,98 @@
+/*
+  Copyright (c) 2008, Adobe Systems Incorporated
+  All rights reserved.
+
+  Redistribution and use in source and binary forms, with or without 
+  modification, are permitted provided that the following conditions are
+  met:
+
+  * Redistributions of source code must retain the above copyright notice, 
+    this list of conditions and the following disclaimer.
+  
+  * Redistributions in binary form must reproduce the above copyright
+    notice, this list of conditions and the following disclaimer in the 
+    documentation and/or other materials provided with the distribution.
+  
+  * Neither the name of Adobe Systems Incorporated nor the names of its 
+    contributors may be used to endorse or promote products derived from 
+    this software without specific prior written permission.
+
+  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+  IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+  THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+  PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR 
+  CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+  EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+  PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+  PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+  LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+  NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+package com.adobe.air.logging
+{
+       import mx.logging.AbstractTarget;
+       import flash.filesystem.File;
+       import flash.filesystem.FileStream;
+       import flash.filesystem.FileMode;
+       import mx.logging.LogEvent;
+       import flash.system.System;
+       import flash.system.Capabilities;
+       import mx.logging.targets.LineFormattedTarget;
+       import mx.core.mx_internal;
+       
+       use namespace mx_internal;
+
+       /**
+        * An Adobe AIR only class that provides a log target for the Flex 
logging
+        * framework, that logs files to a file on the user's system.
+        * 
+        * This class will only work when running within Adobe AIR>
+        */
+       public class FileTarget extends LineFormattedTarget
+       {
+               private const DEFAULT_LOG_PATH:String = 
"app-storage:/application.log";
+               
+               private var log:File;
+               
+               public function FileTarget(logFile:File = null)
+               {
+                       if(logFile != null)
+                       {
+                               log = logFile;
+                       }
+                       else
+                       {
+                               log = new File(DEFAULT_LOG_PATH);
+                       }
+               }
+               
+               public function get logURI():String
+               {
+                       return log.url;
+               }
+               
+               mx_internal override function internalLog(message:String):void
+           {
+                       write(message);
+           }           
+               
+               private function write(msg:String):void
+               {               
+                       var fs:FileStream = new FileStream();
+                               fs.open(log, FileMode.APPEND);
+                               fs.writeUTFBytes(msg + "\n");
+                               fs.close();
+               }       
+               
+               public function clear():void
+               {
+                       var fs:FileStream = new FileStream();
+                               fs.open(log, FileMode.WRITE);
+                               fs.writeUTFBytes("");
+                               fs.close();                     
+               }
+               
+       }
+}
\ No newline at end of file

Added: trunk/phpgwapi/js/uploadify/com/adobe/crypto/HMAC.as
===================================================================
--- trunk/phpgwapi/js/uploadify/com/adobe/crypto/HMAC.as                        
        (rev 0)
+++ trunk/phpgwapi/js/uploadify/com/adobe/crypto/HMAC.as        2011-04-01 
10:39:57 UTC (rev 7152)
@@ -0,0 +1,127 @@
+/*
+  Copyright (c) 2008, Adobe Systems Incorporated
+  All rights reserved.
+
+  Redistribution and use in source and binary forms, with or without 
+  modification, are permitted provided that the following conditions are
+  met:
+
+  * Redistributions of source code must retain the above copyright notice, 
+    this list of conditions and the following disclaimer.
+  
+  * Redistributions in binary form must reproduce the above copyright
+    notice, this list of conditions and the following disclaimer in the 
+    documentation and/or other materials provided with the distribution.
+  
+  * Neither the name of Adobe Systems Incorporated nor the names of its 
+    contributors may be used to endorse or promote products derived from 
+    this software without specific prior written permission.
+
+  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+  IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+  THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+  PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR 
+  CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+  EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+  PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+  PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+  LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+  NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+package com.adobe.crypto {
+       import flash.utils.ByteArray;
+       import flash.utils.Endian;
+       import flash.utils.describeType;
+       /**
+        * Keyed-Hashing for Message Authentication
+        * Implementation based on algorithm description at 
+        * http://www.faqs.org/rfcs/rfc2104.html
+        */
+       public class HMAC 
+       {
+               /**
+                * Performs the HMAC hash algorithm using byte arrays.
+                *
+                * @param secret The secret key
+                * @param message The message to hash
+                * @param algorithm Hash object to use
+                * @return A string containing the hash value of message
+                * @langversion ActionScript 3.0
+                * @playerversion Flash 8.5
+                * @tiptext
+                */
+               public static function hash( secret:String, message:String, 
algorithm:Object = null ):String
+               {
+                       var text:ByteArray = new ByteArray();
+                       var k_secret:ByteArray = new ByteArray();
+                       
+                       text.writeUTFBytes(message);
+                       k_secret.writeUTFBytes(secret);
+                       
+                       return hashBytes(k_secret, text, algorithm);
+               }
+               
+               /**
+                * Performs the HMAC hash algorithm using string.
+                *
+                * @param secret The secret key
+                * @param message The message to hash
+                * @param algorithm Hash object to use
+                * @return A string containing the hash value of message
+                * @langversion ActionScript 3.0
+                * @playerversion Flash 8.5
+                * @tiptext
+                */
+               public static function hashBytes( secret:ByteArray, 
message:ByteArray, algorithm:Object = null ):String
+               {
+                       var ipad:ByteArray = new ByteArray();
+                       var opad:ByteArray = new ByteArray();
+                       var endian:String = Endian.BIG_ENDIAN;
+                       
+                       if(algorithm == null){
+                               algorithm = MD5;
+                       }
+                       
+                       if ( describeType(algorithm)address@hidden() == 
"com.adobe.crypto::MD5" ) {
+                               endian = Endian.LITTLE_ENDIAN;
+                       }
+                       
+                       if ( secret.length > 64 ) {
+                               algorithm.hashBytes(secret);
+                               secret = new ByteArray();
+                               secret.endian = endian;
+                               
+                               while ( algorithm.digest.bytesAvailable != 0 ) {
+                                       
secret.writeInt(algorithm.digest.readInt());
+                               }
+                       }
+
+                       secret.length = 64
+                       secret.position = 0;
+                       for ( var x:int = 0; x < 64; x++ ) {
+                               var byte:int = secret.readByte();
+                               ipad.writeByte(0x36 ^ byte);
+                               opad.writeByte(0x5c ^ byte);
+                       }
+                       
+                       ipad.writeBytes(message);
+                       algorithm.hashBytes(ipad);
+                       var tmp:ByteArray = new ByteArray();
+                       tmp.endian = endian;    
+                       
+                       while ( algorithm.digest.bytesAvailable != 0 ) {
+                               tmp.writeInt(algorithm.digest.readInt());
+                       }
+                       tmp.position = 0;
+                       
+                       while ( tmp.bytesAvailable != 0 ) {
+                               opad.writeByte(tmp.readUnsignedByte());
+                       }
+                       return algorithm.hashBytes( opad );
+               }
+               
+       }
+       
+}

Added: trunk/phpgwapi/js/uploadify/com/adobe/crypto/MD5.as
===================================================================
--- trunk/phpgwapi/js/uploadify/com/adobe/crypto/MD5.as                         
(rev 0)
+++ trunk/phpgwapi/js/uploadify/com/adobe/crypto/MD5.as 2011-04-01 10:39:57 UTC 
(rev 7152)
@@ -0,0 +1,281 @@
+/*
+  Copyright (c) 2008, Adobe Systems Incorporated
+  All rights reserved.
+
+  Redistribution and use in source and binary forms, with or without 
+  modification, are permitted provided that the following conditions are
+  met:
+
+  * Redistributions of source code must retain the above copyright notice, 
+    this list of conditions and the following disclaimer.
+  
+  * Redistributions in binary form must reproduce the above copyright
+    notice, this list of conditions and the following disclaimer in the 
+    documentation and/or other materials provided with the distribution.
+  
+  * Neither the name of Adobe Systems Incorporated nor the names of its 
+    contributors may be used to endorse or promote products derived from 
+    this software without specific prior written permission.
+
+  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+  IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+  THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+  PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR 
+  CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+  EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+  PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+  PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+  LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+  NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+package com.adobe.crypto {
+       
+       import com.adobe.utils.IntUtil;
+       import flash.utils.ByteArray;   
+       /**
+        * The MD5 Message-Digest Algorithm
+        *
+        * Implementation based on algorithm description at 
+        * http://www.faqs.org/rfcs/rfc1321.html
+        */
+       public class MD5 {
+               
+               public static var digest:ByteArray;
+               /**
+                * Performs the MD5 hash algorithm on a string.
+                *
+                * @param s The string to hash
+                * @return A string containing the hash value of s
+                * @langversion ActionScript 3.0
+                * @playerversion Flash 8.5
+                * @tiptext
+                */
+                
+               public static function hash(s:String) :String{
+                       //Convert to byteArray and send through hashBinary 
function
+                       // so as to only have complex code in one location
+                       var ba:ByteArray = new ByteArray();
+                       ba.writeUTFBytes(s);    
+                       return hashBinary(ba);
+               }
+               
+               public static function hashBytes(s:ByteArray) :String{  
+                       return hashBinary(s);
+               }
+               
+               /**
+                * Performs the MD5 hash algorithm on a ByteArray.
+                *
+                * @param s The string to hash
+                * @return A string containing the hash value of s
+                * @langversion ActionScript 3.0
+                * @playerversion Flash 8.5
+                * @tiptext
+                */      
+               public static function hashBinary( s:ByteArray ):String {
+                       // initialize the md buffers
+                       var a:int = 1732584193;
+                       var b:int = -271733879;
+                       var c:int = -1732584194;
+                       var d:int = 271733878;
+                       
+                       // variables to store previous values
+                       var aa:int;
+                       var bb:int;
+                       var cc:int;
+                       var dd:int;
+                       
+                       // create the blocks from the string and
+                       // save the length as a local var to reduce
+                       // lookup in the loop below
+                       var x:Array = createBlocks( s );
+                       var len:int = x.length;
+                       
+                       // loop over all of the blocks
+                       for ( var i:int = 0; i < len; i += 16) {
+                               // save previous values
+                               aa = a;
+                               bb = b;
+                               cc = c;
+                               dd = d;                         
+                               
+                               // Round 1
+                               a = ff( a, b, c, d, x[int(i+ 0)],  7, 
-680876936 );     // 1
+                               d = ff( d, a, b, c, x[int(i+ 1)], 12, 
-389564586 );     // 2
+                               c = ff( c, d, a, b, x[int(i+ 2)], 17, 606105819 
);      // 3
+                               b = ff( b, c, d, a, x[int(i+ 3)], 22, 
-1044525330 );    // 4
+                               a = ff( a, b, c, d, x[int(i+ 4)],  7, 
-176418897 );     // 5
+                               d = ff( d, a, b, c, x[int(i+ 5)], 12, 
1200080426 );     // 6
+                               c = ff( c, d, a, b, x[int(i+ 6)], 17, 
-1473231341 );    // 7
+                               b = ff( b, c, d, a, x[int(i+ 7)], 22, -45705983 
);      // 8
+                               a = ff( a, b, c, d, x[int(i+ 8)],  7, 
1770035416 );     // 9
+                               d = ff( d, a, b, c, x[int(i+ 9)], 12, 
-1958414417 );    // 10
+                               c = ff( c, d, a, b, x[int(i+10)], 17, -42063 ); 
                // 11
+                               b = ff( b, c, d, a, x[int(i+11)], 22, 
-1990404162 );    // 12
+                               a = ff( a, b, c, d, x[int(i+12)],  7, 
1804603682 );     // 13
+                               d = ff( d, a, b, c, x[int(i+13)], 12, -40341101 
);      // 14
+                               c = ff( c, d, a, b, x[int(i+14)], 17, 
-1502002290 );    // 15
+                               b = ff( b, c, d, a, x[int(i+15)], 22, 
1236535329 );     // 16
+                               
+                               // Round 2
+                               a = gg( a, b, c, d, x[int(i+ 1)],  5, 
-165796510 );     // 17
+                               d = gg( d, a, b, c, x[int(i+ 6)],  9, 
-1069501632 );    // 18
+                               c = gg( c, d, a, b, x[int(i+11)], 14, 643717713 
);      // 19
+                               b = gg( b, c, d, a, x[int(i+ 0)], 20, 
-373897302 );     // 20
+                               a = gg( a, b, c, d, x[int(i+ 5)],  5, 
-701558691 );     // 21
+                               d = gg( d, a, b, c, x[int(i+10)],  9, 38016083 
);       // 22
+                               c = gg( c, d, a, b, x[int(i+15)], 14, 
-660478335 );     // 23
+                               b = gg( b, c, d, a, x[int(i+ 4)], 20, 
-405537848 );     // 24
+                               a = gg( a, b, c, d, x[int(i+ 9)],  5, 568446438 
);      // 25
+                               d = gg( d, a, b, c, x[int(i+14)],  9, 
-1019803690 );    // 26
+                               c = gg( c, d, a, b, x[int(i+ 3)], 14, 
-187363961 );     // 27
+                               b = gg( b, c, d, a, x[int(i+ 8)], 20, 
1163531501 );     // 28
+                               a = gg( a, b, c, d, x[int(i+13)],  5, 
-1444681467 );    // 29
+                               d = gg( d, a, b, c, x[int(i+ 2)],  9, -51403784 
);      // 30
+                               c = gg( c, d, a, b, x[int(i+ 7)], 14, 
1735328473 );     // 31
+                               b = gg( b, c, d, a, x[int(i+12)], 20, 
-1926607734 );    // 32
+                               
+                               // Round 3
+                               a = hh( a, b, c, d, x[int(i+ 5)],  4, -378558 
);        // 33
+                               d = hh( d, a, b, c, x[int(i+ 8)], 11, 
-2022574463 );    // 34
+                               c = hh( c, d, a, b, x[int(i+11)], 16, 
1839030562 );     // 35
+                               b = hh( b, c, d, a, x[int(i+14)], 23, -35309556 
);      // 36
+                               a = hh( a, b, c, d, x[int(i+ 1)],  4, 
-1530992060 );    // 37
+                               d = hh( d, a, b, c, x[int(i+ 4)], 11, 
1272893353 );     // 38
+                               c = hh( c, d, a, b, x[int(i+ 7)], 16, 
-155497632 );     // 39
+                               b = hh( b, c, d, a, x[int(i+10)], 23, 
-1094730640 );    // 40
+                               a = hh( a, b, c, d, x[int(i+13)],  4, 681279174 
);      // 41
+                               d = hh( d, a, b, c, x[int(i+ 0)], 11, 
-358537222 );     // 42
+                               c = hh( c, d, a, b, x[int(i+ 3)], 16, 
-722521979 );     // 43
+                               b = hh( b, c, d, a, x[int(i+ 6)], 23, 76029189 
);       // 44
+                               a = hh( a, b, c, d, x[int(i+ 9)],  4, 
-640364487 );     // 45
+                               d = hh( d, a, b, c, x[int(i+12)], 11, 
-421815835 );     // 46
+                               c = hh( c, d, a, b, x[int(i+15)], 16, 530742520 
);      // 47
+                               b = hh( b, c, d, a, x[int(i+ 2)], 23, 
-995338651 );     // 48
+                               
+                               // Round 4
+                               a = ii( a, b, c, d, x[int(i+ 0)],  6, 
-198630844 );     // 49
+                               d = ii( d, a, b, c, x[int(i+ 7)], 10, 
1126891415 );     // 50
+                               c = ii( c, d, a, b, x[int(i+14)], 15, 
-1416354905 );    // 51
+                               b = ii( b, c, d, a, x[int(i+ 5)], 21, -57434055 
);      // 52
+                               a = ii( a, b, c, d, x[int(i+12)],  6, 
1700485571 );     // 53
+                               d = ii( d, a, b, c, x[int(i+ 3)], 10, 
-1894986606 );    // 54
+                               c = ii( c, d, a, b, x[int(i+10)], 15, -1051523 
);       // 55
+                               b = ii( b, c, d, a, x[int(i+ 1)], 21, 
-2054922799 );    // 56
+                               a = ii( a, b, c, d, x[int(i+ 8)],  6, 
1873313359 );     // 57
+                               d = ii( d, a, b, c, x[int(i+15)], 10, -30611744 
);      // 58
+                               c = ii( c, d, a, b, x[int(i+ 6)], 15, 
-1560198380 );    // 59
+                               b = ii( b, c, d, a, x[int(i+13)], 21, 
1309151649 );     // 60
+                               a = ii( a, b, c, d, x[int(i+ 4)],  6, 
-145523070 );     // 61
+                               d = ii( d, a, b, c, x[int(i+11)], 10, 
-1120210379 );    // 62
+                               c = ii( c, d, a, b, x[int(i+ 2)], 15, 718787259 
);      // 63
+                               b = ii( b, c, d, a, x[int(i+ 9)], 21, 
-343485551 );     // 64
+
+                               a += aa;
+                               b += bb;
+                               c += cc;
+                               d += dd;
+                       }
+                       digest = new ByteArray()
+                       digest.writeInt(a);
+                       digest.writeInt(b);
+                       digest.writeInt(c);
+                       digest.writeInt(d);
+                       digest.position = 0;
+                       // Finish up by concatening the buffers with their hex 
output
+                       return IntUtil.toHex( a ) + IntUtil.toHex( b ) + 
IntUtil.toHex( c ) + IntUtil.toHex( d );
+               }
+               
+               /**
+                * Auxiliary function f as defined in RFC
+                */
+               private static function f( x:int, y:int, z:int ):int {
+                       return ( x & y ) | ( (~x) & z );
+               }
+               
+               /**
+                * Auxiliary function g as defined in RFC
+                */
+               private static function g( x:int, y:int, z:int ):int {
+                       return ( x & z ) | ( y & (~z) );
+               }
+               
+               /**
+                * Auxiliary function h as defined in RFC
+                */
+               private static function h( x:int, y:int, z:int ):int {
+                       return x ^ y ^ z;
+               }
+               
+               /**
+                * Auxiliary function i as defined in RFC
+                */
+               private static function i( x:int, y:int, z:int ):int {
+                       return y ^ ( x | (~z) );
+               }
+               
+               /**
+                * A generic transformation function.  The logic of ff, gg, hh, 
and
+                * ii are all the same, minus the function used, so pull that 
logic
+                * out and simplify the method bodies for the transoformation 
functions.
+                */
+               private static function transform( func:Function, a:int, b:int, 
c:int, d:int, x:int, s:int, t:int):int {
+                       var tmp:int = a + int( func( b, c, d ) ) + x + t;
+                       return IntUtil.rol( tmp, s ) +  b;
+               }
+               
+               /**
+                * ff transformation function
+                */
+               private static function ff ( a:int, b:int, c:int, d:int, x:int, 
s:int, t:int ):int {
+                       return transform( f, a, b, c, d, x, s, t );
+               }
+               
+               /**
+                * gg transformation function
+                */
+               private static function gg ( a:int, b:int, c:int, d:int, x:int, 
s:int, t:int ):int {
+                       return transform( g, a, b, c, d, x, s, t );
+               }
+               
+               /**
+                * hh transformation function
+                */
+               private static function hh ( a:int, b:int, c:int, d:int, x:int, 
s:int, t:int ):int {
+                       return transform( h, a, b, c, d, x, s, t );
+               }
+               
+               /**
+                * ii transformation function
+                */
+               private static function ii ( a:int, b:int, c:int, d:int, x:int, 
s:int, t:int ):int {
+                       return transform( i, a, b, c, d, x, s, t );
+               }
+               
+               /**
+                * Converts a string to a sequence of 16-word blocks
+                * that we'll do the processing on.  Appends padding
+                * and length in the process.
+                *
+                * @param s The string to split into blocks
+                * @return An array containing the blocks that s was
+                *                      split into.
+                */
+               private static function createBlocks( s:ByteArray ):Array {
+                       var blocks:Array = new Array();
+                       var len:int = s.length * 8;
+                       var mask:int = 0xFF; // ignore hi byte of characters > 
0xFF
+                       for( var i:int = 0; i < len; i += 8 ) {
+                               blocks[ int(i >> 5) ] |= ( s[ i / 8 ] & mask ) 
<< ( i % 32 );
+                       }
+                       
+                       // append padding and length
+                       blocks[ int(len >> 5) ] |= 0x80 << ( len % 32 );
+                       blocks[ int(( ( ( len + 64 ) >>> 9 ) << 4 ) + 14) ] = 
len;
+                       return blocks;
+               }
+               
+       }
+}

Added: trunk/phpgwapi/js/uploadify/com/adobe/crypto/MD5Stream.as
===================================================================
--- trunk/phpgwapi/js/uploadify/com/adobe/crypto/MD5Stream.as                   
        (rev 0)
+++ trunk/phpgwapi/js/uploadify/com/adobe/crypto/MD5Stream.as   2011-04-01 
10:39:57 UTC (rev 7152)
@@ -0,0 +1,402 @@
+/*
+  Copyright (c) 2008, Adobe Systems Incorporated
+  All rights reserved.
+
+  Redistribution and use in source and binary forms, with or without 
+  modification, are permitted provided that the following conditions are
+  met:
+
+  * Redistributions of source code must retain the above copyright notice, 
+    this list of conditions and the following disclaimer.
+  
+  * Redistributions in binary form must reproduce the above copyright
+    notice, this list of conditions and the following disclaimer in the 
+    documentation and/or other materials provided with the distribution.
+  
+  * Neither the name of Adobe Systems Incorporated nor the names of its 
+    contributors may be used to endorse or promote products derived from 
+    this software without specific prior written permission.
+
+  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+  IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+  THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+  PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR 
+  CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+  EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+  PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+  PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+  LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+  NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+package com.adobe.crypto
+{
+    import com.adobe.utils.IntUtil;   
+    import flash.utils.ByteArray;
+
+    /**
+     * Perform MD5 hash of an input stream in chunks. This class is
+     * based on com.adobe.crypto.MD5 and can process data in
+     * chunks. Both block creation and hash computation are done
+     * together for whatever input is available so that the memory
+     * overhead at a time is always fixed. Memory usage is governed by
+     * two parameters: one is the amount of data passed in to update()
+     * and the other is memoryBlockSize. The latter comes into play
+     * only when the memory window exceeds the pre allocated memory
+     * window of flash player. Usage: create an instance, call
+     * update(data) repeatedly for all chunks and finally complete()
+     * which will return the md5 hash.
+     */      
+    public class MD5Stream
+    {
+        private static var mask:int = 0xFF;
+
+        private var arr:Array = [];
+
+        /* running count of length */
+        private var arrLen:int;
+        
+        // initialize the md buffers
+        private var a:int = 1732584193;
+        private var b:int = -271733879;
+        private var c:int = -1732584194;
+        private var d:int = 271733878;
+        
+        // variables to store previous values
+        private var aa:int;
+        private var bb:int;
+        private var cc:int;
+        private var dd:int;
+
+        /* index for data read */
+        private var arrIndexLen:int = 0;
+        /* index for hash computation */
+        private var arrProcessIndex:int = 0;
+        /* index for removing stale arr values */
+        private var cleanIndex:int = 0;
+        
+        /** 
+         * Change this value from the default (16384) in the range of
+         * MBs to actually affect GC as GC allocates in pools of
+         * memory */
+        public var memoryBlockSize:int = 16384;
+        
+        
+        public function MD5Stream()
+        {
+            
+        }
+               
+        
+        /**
+         * Pass in chunks of the input data with update(), call
+         * complete() with an optional chunk which will return the
+         * final hash. Equivalent to the way
+         * java.security.MessageDigest works.
+         *
+         * @param input The optional bytearray chunk which is the final part 
of the input
+         * @return A string containing the hash value
+         * @langversion ActionScript 3.0
+         * @playerversion Flash 8.5
+         * @tiptext
+         */
+        public function complete(input:ByteArray=null):String
+        {
+            if ( arr.length == 0 )
+            {
+                if ( input == null )
+                {
+                    throw new Error("null input to complete without prior call 
to update. At least an empty bytearray must be passed.");
+                }                              
+            }
+            
+            if ( input != null )
+            {
+                readIntoArray(input);
+            }
+
+            //pad, append length
+            padArray(arrLen);
+
+            hashRemainingChunks(false);
+            
+            var res:String = IntUtil.toHex( a ) + IntUtil.toHex( b ) + 
+                                        IntUtil.toHex( c ) + IntUtil.toHex( d 
);
+            resetFields();
+            
+            return res;
+        }
+
+        /**
+         * Pass in chunks of the input data with update(), call
+         * complete() with an optional chunk which will return the
+         * final hash. Equivalent to the way
+         * java.security.MessageDigest works.
+         *
+         * @param input The bytearray chunk to perform the hash on
+         * @langversion ActionScript 3.0
+         * @playerversion Flash 8.5
+         * @tiptext
+         */        
+        public function update(input:ByteArray):void
+        {
+            readIntoArray(input);
+            hashRemainingChunks();
+        }
+
+        /**
+         * Re-initialize this instance for use to perform hashing on
+         * another input stream. This is called automatically by
+         * complete().
+         *
+         * @langversion ActionScript 3.0
+         * @playerversion Flash 8.5
+         * @tiptext
+         */               
+        public function resetFields():void
+        {
+            //truncate array
+            arr.length = 0;
+            arrLen = 0;
+            
+            // initialize the md buffers
+            a = 1732584193;
+            b = -271733879;
+            c = -1732584194;
+            d = 271733878;
+            
+            // variables to store previous values
+            aa = 0;
+            bb = 0;
+            cc = 0;
+            dd = 0;
+            
+            arrIndexLen = 0;            
+            arrProcessIndex = 0;
+            cleanIndex = 0;
+        }
+        
+        /** read into arr and free up used blocks of arr */
+        private function readIntoArray(input:ByteArray):void
+        {
+            var closestChunkLen:int = input.length * 8;
+            arrLen += closestChunkLen;
+            
+            /* clean up memory. if there are entries in the array that
+             * are already processed and the amount is greater than
+             * memoryBlockSize, create a new array, copy the last
+             * block into it and let the old one get picked up by
+             * GC. */
+            if ( arrProcessIndex - cleanIndex > memoryBlockSize )
+            {
+                var newarr:Array= new Array();
+                
+                /* AS Arrays in sparse arrays. arr[2002] can exist 
+                 * without values for arr[0] - arr[2001] */
+                for ( var j:int = arrProcessIndex; j < arr.length; j++ )
+                {                                              
+                    newarr[j] = arr[j];
+                }
+                
+                cleanIndex = arrProcessIndex;
+                arr = null;
+                arr = newarr;
+            }
+            
+            for ( var k:int = 0; k < closestChunkLen; k+=8 )
+            {
+                //discard high bytes (convert to uint)
+                arr[ int(arrIndexLen >> 5) ] |= ( input[ k / 8 ] & mask ) << ( 
arrIndexLen % 32 );
+                arrIndexLen += 8;
+            }
+            
+            
+        }
+        
+        private function hashRemainingChunks(bUpdate:Boolean=true):void
+        {
+            var len:int = arr.length;
+
+            /* leave a 16 word block untouched if we are called from
+             * update. This is because, padArray() can modify the last
+             * block and this modification has to happen before we
+             * compute the hash.  */
+            if ( bUpdate )
+            {
+                len -= 16;
+            }
+
+            /* don't do anything if don't have a 16 word block. */
+            if ( arrProcessIndex >= len || len - arrProcessIndex < 15 )
+            {
+                return;
+            }
+
+            
+            for ( var i:int = arrProcessIndex; i < len ; i += 16, 
arrProcessIndex += 16) 
+            {                  
+                // save previous values
+                aa = a;
+                bb = b;
+                cc = c;
+                dd = d;                         
+                
+                // Round 1
+                a = ff( a, b, c, d, arr[int(i+ 0)],  7, -680876936 );     // 1
+                d = ff( d, a, b, c, arr[int(i+ 1)], 12, -389564586 );     // 2
+                c = ff( c, d, a, b, arr[int(i+ 2)], 17, 606105819 );      // 3
+                b = ff( b, c, d, a, arr[int(i+ 3)], 22, -1044525330 );    // 4
+                a = ff( a, b, c, d, arr[int(i+ 4)],  7, -176418897 );     // 5
+                d = ff( d, a, b, c, arr[int(i+ 5)], 12, 1200080426 );     // 6
+                c = ff( c, d, a, b, arr[int(i+ 6)], 17, -1473231341 );    // 7
+                b = ff( b, c, d, a, arr[int(i+ 7)], 22, -45705983 );      // 8
+                a = ff( a, b, c, d, arr[int(i+ 8)],  7, 1770035416 );     // 9
+                d = ff( d, a, b, c, arr[int(i+ 9)], 12, -1958414417 );    // 10
+                c = ff( c, d, a, b, arr[int(i+10)], 17, -42063 );              
   // 11
+                b = ff( b, c, d, a, arr[int(i+11)], 22, -1990404162 );    // 12
+                a = ff( a, b, c, d, arr[int(i+12)],  7, 1804603682 );     // 13
+                d = ff( d, a, b, c, arr[int(i+13)], 12, -40341101 );      // 14
+                c = ff( c, d, a, b, arr[int(i+14)], 17, -1502002290 );    // 15
+                b = ff( b, c, d, a, arr[int(i+15)], 22, 1236535329 );     // 16
+                
+                // Round 2
+                a = gg( a, b, c, d, arr[int(i+ 1)],  5, -165796510 );     // 17
+                d = gg( d, a, b, c, arr[int(i+ 6)],  9, -1069501632 );    // 18
+                c = gg( c, d, a, b, arr[int(i+11)], 14, 643717713 );      // 19
+                b = gg( b, c, d, a, arr[int(i+ 0)], 20, -373897302 );     // 20
+                a = gg( a, b, c, d, arr[int(i+ 5)],  5, -701558691 );     // 21
+                d = gg( d, a, b, c, arr[int(i+10)],  9, 38016083 );       // 22
+                c = gg( c, d, a, b, arr[int(i+15)], 14, -660478335 );     // 23
+                b = gg( b, c, d, a, arr[int(i+ 4)], 20, -405537848 );     // 24
+                a = gg( a, b, c, d, arr[int(i+ 9)],  5, 568446438 );      // 25
+                d = gg( d, a, b, c, arr[int(i+14)],  9, -1019803690 );    // 26
+                c = gg( c, d, a, b, arr[int(i+ 3)], 14, -187363961 );     // 27
+                b = gg( b, c, d, a, arr[int(i+ 8)], 20, 1163531501 );     // 28
+                a = gg( a, b, c, d, arr[int(i+13)],  5, -1444681467 );    // 29
+                d = gg( d, a, b, c, arr[int(i+ 2)],  9, -51403784 );      // 30
+                c = gg( c, d, a, b, arr[int(i+ 7)], 14, 1735328473 );     // 31
+                b = gg( b, c, d, a, arr[int(i+12)], 20, -1926607734 );    // 32
+                
+                // Round 3
+                a = hh( a, b, c, d, arr[int(i+ 5)],  4, -378558 );        // 33
+                d = hh( d, a, b, c, arr[int(i+ 8)], 11, -2022574463 );    // 34
+                c = hh( c, d, a, b, arr[int(i+11)], 16, 1839030562 );     // 35
+                b = hh( b, c, d, a, arr[int(i+14)], 23, -35309556 );      // 36
+                a = hh( a, b, c, d, arr[int(i+ 1)],  4, -1530992060 );    // 37
+                d = hh( d, a, b, c, arr[int(i+ 4)], 11, 1272893353 );     // 38
+                c = hh( c, d, a, b, arr[int(i+ 7)], 16, -155497632 );     // 39
+                b = hh( b, c, d, a, arr[int(i+10)], 23, -1094730640 );    // 40
+                a = hh( a, b, c, d, arr[int(i+13)],  4, 681279174 );      // 41
+                d = hh( d, a, b, c, arr[int(i+ 0)], 11, -358537222 );     // 42
+                c = hh( c, d, a, b, arr[int(i+ 3)], 16, -722521979 );     // 43
+                b = hh( b, c, d, a, arr[int(i+ 6)], 23, 76029189 );       // 44
+                a = hh( a, b, c, d, arr[int(i+ 9)],  4, -640364487 );     // 45
+                d = hh( d, a, b, c, arr[int(i+12)], 11, -421815835 );     // 46
+                c = hh( c, d, a, b, arr[int(i+15)], 16, 530742520 );      // 47
+                b = hh( b, c, d, a, arr[int(i+ 2)], 23, -995338651 );     // 48
+                
+                // Round 4
+                a = ii( a, b, c, d, arr[int(i+ 0)],  6, -198630844 );     // 49
+                d = ii( d, a, b, c, arr[int(i+ 7)], 10, 1126891415 );     // 50
+                c = ii( c, d, a, b, arr[int(i+14)], 15, -1416354905 );    // 51
+                b = ii( b, c, d, a, arr[int(i+ 5)], 21, -57434055 );      // 52
+                a = ii( a, b, c, d, arr[int(i+12)],  6, 1700485571 );     // 53
+                d = ii( d, a, b, c, arr[int(i+ 3)], 10, -1894986606 );    // 54
+                c = ii( c, d, a, b, arr[int(i+10)], 15, -1051523 );       // 55
+                b = ii( b, c, d, a, arr[int(i+ 1)], 21, -2054922799 );    // 56
+                a = ii( a, b, c, d, arr[int(i+ 8)],  6, 1873313359 );     // 57
+                d = ii( d, a, b, c, arr[int(i+15)], 10, -30611744 );      // 58
+                c = ii( c, d, a, b, arr[int(i+ 6)], 15, -1560198380 );    // 59
+                b = ii( b, c, d, a, arr[int(i+13)], 21, 1309151649 );     // 60
+                a = ii( a, b, c, d, arr[int(i+ 4)],  6, -145523070 );     // 61
+                d = ii( d, a, b, c, arr[int(i+11)], 10, -1120210379 );    // 62
+                c = ii( c, d, a, b, arr[int(i+ 2)], 15, 718787259 );      // 63
+                b = ii( b, c, d, a, arr[int(i+ 9)], 21, -343485551 );     // 64
+                
+                a += aa;
+                b += bb;
+                c += cc;
+                d += dd;
+                
+            }
+            
+        }
+        
+        private function padArray(len:int):void
+        {                      
+            arr[ int(len >> 5) ] |= 0x80 << ( len % 32 );
+            arr[ int(( ( ( len + 64 ) >>> 9 ) << 4 ) + 14) ] = len;
+            arrLen = arr.length;
+        }  
+        
+        /* Code below same as com.adobe.crypto.MD5 */ 
+        
+        /**
+         * Auxiliary function f as defined in RFC
+         */
+        private static function f( x:int, y:int, z:int ):int {
+            return ( x & y ) | ( (~x) & z );
+        }
+        
+        /**
+         * Auxiliary function g as defined in RFC
+         */
+        private static function g( x:int, y:int, z:int ):int {
+            return ( x & z ) | ( y & (~z) );
+        }
+        
+        /**
+         * Auxiliary function h as defined in RFC
+         */
+        private static function h( x:int, y:int, z:int ):int {
+            return x ^ y ^ z;
+        }
+        
+        /**
+         * Auxiliary function i as defined in RFC
+         */
+        private static function i( x:int, y:int, z:int ):int {
+            return y ^ ( x | (~z) );
+        }
+        
+        /**
+         * A generic transformation function.  The logic of ff, gg, hh, and
+         * ii are all the same, minus the function used, so pull that logic
+         * out and simplify the method bodies for the transoformation 
functions.
+         */
+        private static function transform( func:Function, a:int, b:int, c:int, 
d:int, x:int, s:int, t:int):int {
+            var tmp:int = a + int( func( b, c, d ) ) + x + t;
+            return IntUtil.rol( tmp, s ) +  b;
+        }
+        
+        /**
+         * ff transformation function
+         */
+        private static function ff ( a:int, b:int, c:int, d:int, x:int, s:int, 
t:int ):int {
+            return transform( f, a, b, c, d, x, s, t );
+        }
+        
+        /**
+         * gg transformation function
+         */
+        private static function gg ( a:int, b:int, c:int, d:int, x:int, s:int, 
t:int ):int {
+            return transform( g, a, b, c, d, x, s, t );
+        }
+        
+        /**
+         * hh transformation function
+         */
+        private static function hh ( a:int, b:int, c:int, d:int, x:int, s:int, 
t:int ):int {
+            return transform( h, a, b, c, d, x, s, t );
+        }
+        
+        /**
+         * ii transformation function
+         */
+        private static function ii ( a:int, b:int, c:int, d:int, x:int, s:int, 
t:int ):int {
+            return transform( i, a, b, c, d, x, s, t );
+        }
+        
+    }
+}
\ No newline at end of file

Added: trunk/phpgwapi/js/uploadify/com/adobe/crypto/SHA1.as
===================================================================
--- trunk/phpgwapi/js/uploadify/com/adobe/crypto/SHA1.as                        
        (rev 0)
+++ trunk/phpgwapi/js/uploadify/com/adobe/crypto/SHA1.as        2011-04-01 
10:39:57 UTC (rev 7152)
@@ -0,0 +1,271 @@
+/*
+  Copyright (c) 2008, Adobe Systems Incorporated
+  All rights reserved.
+
+  Redistribution and use in source and binary forms, with or without 
+  modification, are permitted provided that the following conditions are
+  met:
+
+  * Redistributions of source code must retain the above copyright notice, 
+    this list of conditions and the following disclaimer.
+  
+  * Redistributions in binary form must reproduce the above copyright
+    notice, this list of conditions and the following disclaimer in the 
+    documentation and/or other materials provided with the distribution.
+  
+  * Neither the name of Adobe Systems Incorporated nor the names of its 
+    contributors may be used to endorse or promote products derived from 
+    this software without specific prior written permission.
+
+  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+  IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+  THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+  PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR 
+  CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+  EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+  PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+  PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+  LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+  NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+package com.adobe.crypto
+{
+       import com.adobe.utils.IntUtil;
+       import flash.utils.ByteArray;
+       import mx.utils.Base64Encoder;
+       
+       /**
+        *  US Secure Hash Algorithm 1 (SHA1)
+        *
+        *  Implementation based on algorithm description at 
+        *  http://www.faqs.org/rfcs/rfc3174.html
+        */
+       public class SHA1
+       {
+               public static var digest:ByteArray;
+               
+               /**
+                *  Performs the SHA1 hash algorithm on a string.
+                *
+                *  @param s            The string to hash
+                *  @return                     A string containing the hash 
value of s
+                *  @langversion        ActionScript 3.0
+                *  @playerversion      9.0
+                *  @tiptext
+                */
+               public static function hash( s:String ):String
+               {
+                       var blocks:Array = createBlocksFromString( s );
+                       var byteArray:ByteArray = hashBlocks( blocks );
+                       
+                       return IntUtil.toHex( byteArray.readInt(), true )
+                                       + IntUtil.toHex( byteArray.readInt(), 
true )
+                                       + IntUtil.toHex( byteArray.readInt(), 
true )
+                                       + IntUtil.toHex( byteArray.readInt(), 
true )
+                                       + IntUtil.toHex( byteArray.readInt(), 
true );
+               }
+               
+               /**
+                *  Performs the SHA1 hash algorithm on a ByteArray.
+                *
+                *  @param data         The ByteArray data to hash
+                *  @return                     A string containing the hash 
value of data
+                *  @langversion        ActionScript 3.0
+                *  @playerversion      9.0
+                */
+               public static function hashBytes( data:ByteArray ):String
+               {
+                       var blocks:Array = SHA1.createBlocksFromByteArray( data 
);
+                       var byteArray:ByteArray = hashBlocks(blocks);
+                       
+                       return IntUtil.toHex( byteArray.readInt(), true )
+                                       + IntUtil.toHex( byteArray.readInt(), 
true )
+                                       + IntUtil.toHex( byteArray.readInt(), 
true )
+                                       + IntUtil.toHex( byteArray.readInt(), 
true )
+                                       + IntUtil.toHex( byteArray.readInt(), 
true );
+               }
+               
+               /**
+                *  Performs the SHA1 hash algorithm on a string, then does
+                *  Base64 encoding on the result.
+                *
+                *  @param s            The string to hash
+                *  @return                     The base64 encoded hash value 
of s
+                *  @langversion        ActionScript 3.0
+                *  @playerversion      9.0
+                *  @tiptext
+                */
+               public static function hashToBase64( s:String ):String
+               {
+                       var blocks:Array = SHA1.createBlocksFromString( s );
+                       var byteArray:ByteArray = hashBlocks(blocks);
+
+                       // ByteArray.toString() returns the contents as a UTF-8 
string,
+                       // which we can't use because certain byte sequences 
might trigger
+                       // a UTF-8 conversion.  Instead, we convert the bytes 
to characters
+                       // one by one.
+                       var charsInByteArray:String = "";
+                       byteArray.position = 0;
+                       for (var j:int = 0; j < byteArray.length; j++)
+                       {
+                               var byte:uint = byteArray.readUnsignedByte();
+                               charsInByteArray += String.fromCharCode(byte);
+                       }
+
+                       var encoder:Base64Encoder = new Base64Encoder();
+                       encoder.encode(charsInByteArray);
+                       return encoder.flush();
+               }
+               
+               private static function hashBlocks( blocks:Array ):ByteArray
+               {
+                       // initialize the h's
+                       var h0:int = 0x67452301;
+                       var h1:int = 0xefcdab89;
+                       var h2:int = 0x98badcfe;
+                       var h3:int = 0x10325476;
+                       var h4:int = 0xc3d2e1f0;
+                       
+                       var len:int = blocks.length;
+                       var w:Array = new Array( 80 );
+                       
+                       // loop over all of the blocks
+                       for ( var i:int = 0; i < len; i += 16 ) {
+                       
+                               // 6.1.c
+                               var a:int = h0;
+                               var b:int = h1;
+                               var c:int = h2;
+                               var d:int = h3;
+                               var e:int = h4;
+                               
+                               // 80 steps to process each block
+                               // TODO: unroll for faster execution, or 4 
loops of
+                               // 20 each to avoid the k and f function calls
+                               for ( var t:int = 0; t < 80; t++ ) {
+                                       
+                                       if ( t < 16 ) {
+                                               // 6.1.a
+                                               w[ t ] = blocks[ i + t ];
+                                       } else {
+                                               // 6.1.b
+                                               w[ t ] = IntUtil.rol( w[ t - 3 
] ^ w[ t - 8 ] ^ w[ t - 14 ] ^ w[ t - 16 ], 1 );
+                                       }
+                                       
+                                       // 6.1.d
+                                       var temp:int = IntUtil.rol( a, 5 ) + f( 
t, b, c, d ) + e + int( w[ t ] ) + k( t );
+                                       
+                                       e = d;
+                                       d = c;
+                                       c = IntUtil.rol( b, 30 );
+                                       b = a;
+                                       a = temp;
+                               }
+                               
+                               // 6.1.e
+                               h0 += a;
+                               h1 += b;
+                               h2 += c;
+                               h3 += d;
+                               h4 += e;                
+                       }
+                       
+                       var byteArray:ByteArray = new ByteArray();
+                       byteArray.writeInt(h0);
+                       byteArray.writeInt(h1);
+                       byteArray.writeInt(h2);
+                       byteArray.writeInt(h3);
+                       byteArray.writeInt(h4);
+                       byteArray.position = 0;
+                       
+                       digest = new ByteArray();
+                       digest.writeBytes(byteArray);
+                       digest.position = 0;
+                       return byteArray;
+               }
+
+               /**
+                *  Performs the logical function based on t
+                */
+               private static function f( t:int, b:int, c:int, d:int ):int {
+                       if ( t < 20 ) {
+                               return ( b & c ) | ( ~b & d );
+                       } else if ( t < 40 ) {
+                               return b ^ c ^ d;
+                       } else if ( t < 60 ) {
+                               return ( b & c ) | ( b & d ) | ( c & d );
+                       }
+                       return b ^ c ^ d;
+               }
+               
+               /**
+                *  Determines the constant value based on t
+                */
+               private static function k( t:int ):int {
+                       if ( t < 20 ) {
+                               return 0x5a827999;
+                       } else if ( t < 40 ) {
+                               return 0x6ed9eba1;
+                       } else if ( t < 60 ) {
+                               return 0x8f1bbcdc;
+                       }
+                       return 0xca62c1d6;
+               }
+                                       
+               /**
+                *  Converts a ByteArray to a sequence of 16-word blocks
+                *  that we'll do the processing on.  Appends padding
+                *  and length in the process.
+                *
+                *  @param data         The data to split into blocks
+                *  @return                     An array containing the blocks 
into which data was split
+                */
+               private static function createBlocksFromByteArray( 
data:ByteArray ):Array
+               {
+                       var oldPosition:int = data.position;
+                       data.position = 0;
+                       
+                       var blocks:Array = new Array();
+                       var len:int = data.length * 8;
+                       var mask:int = 0xFF; // ignore hi byte of characters > 
0xFF
+                       for( var i:int = 0; i < len; i += 8 )
+                       {
+                               blocks[ i >> 5 ] |= ( data.readByte() & mask ) 
<< ( 24 - i % 32 );
+                       }
+                       
+                       // append padding and length
+                       blocks[ len >> 5 ] |= 0x80 << ( 24 - len % 32 );
+                       blocks[ ( ( ( len + 64 ) >> 9 ) << 4 ) + 15 ] = len;
+                       
+                       data.position = oldPosition;
+                       
+                       return blocks;
+               }
+                                       
+               /**
+                *  Converts a string to a sequence of 16-word blocks
+                *  that we'll do the processing on.  Appends padding
+                *  and length in the process.
+                *
+                *  @param s    The string to split into blocks
+                *  @return             An array containing the blocks that s 
was split into.
+                */
+               private static function createBlocksFromString( s:String ):Array
+               {
+                       var blocks:Array = new Array();
+                       var len:int = s.length * 8;
+                       var mask:int = 0xFF; // ignore hi byte of characters > 
0xFF
+                       for( var i:int = 0; i < len; i += 8 ) {
+                               blocks[ i >> 5 ] |= ( s.charCodeAt( i / 8 ) & 
mask ) << ( 24 - i % 32 );
+                       }
+                       
+                       // append padding and length
+                       blocks[ len >> 5 ] |= 0x80 << ( 24 - len % 32 );
+                       blocks[ ( ( ( len + 64 ) >> 9 ) << 4 ) + 15 ] = len;
+                       return blocks;
+               }
+               
+       }
+}

Added: trunk/phpgwapi/js/uploadify/com/adobe/crypto/SHA224.as
===================================================================
--- trunk/phpgwapi/js/uploadify/com/adobe/crypto/SHA224.as                      
        (rev 0)
+++ trunk/phpgwapi/js/uploadify/com/adobe/crypto/SHA224.as      2011-04-01 
10:39:57 UTC (rev 7152)
@@ -0,0 +1,257 @@
+/*
+  Copyright (c) 2008, Adobe Systems Incorporated
+  All rights reserved.
+
+  Redistribution and use in source and binary forms, with or without 
+  modification, are permitted provided that the following conditions are
+  met:
+
+  * Redistributions of source code must retain the above copyright notice, 
+    this list of conditions and the following disclaimer.
+  
+  * Redistributions in binary form must reproduce the above copyright
+    notice, this list of conditions and the following disclaimer in the 
+    documentation and/or other materials provided with the distribution.
+  
+  * Neither the name of Adobe Systems Incorporated nor the names of its 
+    contributors may be used to endorse or promote products derived from 
+    this software without specific prior written permission.
+
+  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+  IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+  THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+  PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR 
+  CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+  EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+  PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+  PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+  LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+  NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+package com.adobe.crypto
+{
+       import com.adobe.utils.IntUtil;
+       import flash.utils.ByteArray;
+       import mx.utils.Base64Encoder;
+       
+       /**
+        * The SHA-224 algorithm
+        * 
+        * @see 
http://csrc.nist.gov/publications/fips/fips180-2/fips180-2withchangenotice.pdf
+        */
+       public class SHA224
+       {
+               public static var digest:ByteArray;
+               
+               /**
+                *  Performs the SHA224 hash algorithm on a string.
+                *
+                *  @param s            The string to hash
+                *  @return                     A string containing the hash 
value of s
+                *  @langversion        ActionScript 3.0
+                *  @playerversion      9.0
+                *  @tiptext
+                */
+               public static function hash( s:String ):String {
+                       var blocks:Array = createBlocksFromString( s );
+                       var byteArray:ByteArray = hashBlocks( blocks );
+                       return IntUtil.toHex( byteArray.readInt(), true )
+                                       + IntUtil.toHex( byteArray.readInt(), 
true )
+                                       + IntUtil.toHex( byteArray.readInt(), 
true )
+                                       + IntUtil.toHex( byteArray.readInt(), 
true )
+                                       + IntUtil.toHex( byteArray.readInt(), 
true )
+                                       + IntUtil.toHex( byteArray.readInt(), 
true )
+                                       + IntUtil.toHex( byteArray.readInt(), 
true );
+               }
+               
+               /**
+                *  Performs the SHA224 hash algorithm on a ByteArray.
+                *
+                *  @param data         The ByteArray data to hash
+                *  @return                     A string containing the hash 
value of data
+                *  @langversion        ActionScript 3.0
+                *  @playerversion      9.0
+                */
+               public static function hashBytes( data:ByteArray ):String
+               {
+                       var blocks:Array = createBlocksFromByteArray( data );
+                       var byteArray:ByteArray = hashBlocks(blocks);
+                       return IntUtil.toHex( byteArray.readInt(), true )
+                                       + IntUtil.toHex( byteArray.readInt(), 
true )
+                                       + IntUtil.toHex( byteArray.readInt(), 
true )
+                                       + IntUtil.toHex( byteArray.readInt(), 
true )
+                                       + IntUtil.toHex( byteArray.readInt(), 
true )
+                                       + IntUtil.toHex( byteArray.readInt(), 
true )
+                                       + IntUtil.toHex( byteArray.readInt(), 
true );
+               }
+               
+               /**
+                *  Performs the SHA224 hash algorithm on a string, then does
+                *  Base64 encoding on the result.
+                *
+                *  @param s            The string to hash
+                *  @return                     The base64 encoded hash value 
of s
+                *  @langversion        ActionScript 3.0
+                *  @playerversion      9.0
+                *  @tiptext
+                */
+               public static function hashToBase64( s:String ):String
+               {
+                       var blocks:Array = createBlocksFromString( s );
+                       var byteArray:ByteArray = hashBlocks(blocks);
+
+                       // ByteArray.toString() returns the contents as a UTF-8 
string,
+                       // which we can't use because certain byte sequences 
might trigger
+                       // a UTF-8 conversion.  Instead, we convert the bytes 
to characters
+                       // one by one.
+                       var charsInByteArray:String = "";
+                       byteArray.position = 0;
+                       for (var j:int = 0; j < byteArray.length; j++)
+                       {
+                               var byte:uint = byteArray.readUnsignedByte();
+                               charsInByteArray += String.fromCharCode(byte);
+                       }
+
+                       var encoder:Base64Encoder = new Base64Encoder();
+                       encoder.encode(charsInByteArray);
+                       return encoder.flush();
+               }
+               
+               private static function hashBlocks( blocks:Array ):ByteArray {
+                       var h0:int = 0xc1059ed8;
+                       var h1:int = 0x367cd507;
+                       var h2:int = 0x3070dd17;
+                       var h3:int = 0xf70e5939;
+                       var h4:int = 0xffc00b31;
+                       var h5:int = 0x68581511;
+                       var h6:int = 0x64f98fa7;
+                       var h7:int = 0xbefa4fa4;
+                       
+                       var k:Array = new Array(0x428a2f98, 0x71374491, 
0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5, 
0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe, 
0x9bdc06a7, 0xc19bf174, 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, 
0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da, 0x983e5152, 0xa831c66d, 
0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967, 
0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, 0x650a7354, 0x766a0abb, 
0x81c2c92e, 0x92722c85, 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, 
0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070, 0x19a4c116, 0x1e376c08, 
0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3, 
0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, 0x90befffa, 0xa4506ceb, 
0xbef9a3f7, 0xc67178f2);
+                       
+                       var len:int = blocks.length;
+                       var w:Array = new Array();
+                       
+                       // loop over all of the blocks
+                       for ( var i:int = 0; i < len; i += 16 ) {
+                               
+                               var a:int = h0;
+                               var b:int = h1;
+                               var c:int = h2;
+                               var d:int = h3;
+                               var e:int = h4;
+                               var f:int = h5;
+                               var g:int = h6;
+                               var h:int = h7;
+                               
+                               for(var t:int = 0; t < 64; t++) {
+                                       
+                                       if ( t < 16 ) {
+                                               w[t] = blocks[ i + t ];
+                                               if(isNaN(w[t])) { w[t] = 0; }
+                                       } else {
+                                               var ws0:int = 
IntUtil.ror(w[t-15], 7) ^ IntUtil.ror(w[t-15], 18) ^ (w[t-15] >>> 3);
+                                               var ws1:int = 
IntUtil.ror(w[t-2], 17) ^ IntUtil.ror(w[t-2], 19) ^ (w[t-2] >>> 10);
+                                               w[t] = w[t-16] + ws0 + w[t-7] + 
ws1;
+                                       }
+                                       
+                                       var s0:int = IntUtil.ror(a, 2) ^ 
IntUtil.ror(a, 13) ^ IntUtil.ror(a, 22);
+                                       var maj:int = (a & b) ^ (a & c) ^ (b & 
c);
+                                       var t2:int = s0 + maj;
+                                       var s1:int = IntUtil.ror(e, 6) ^ 
IntUtil.ror(e, 11) ^ IntUtil.ror(e, 25);
+                                       var ch:int = (e & f) ^ ((~e) & g);
+                                       var t1:int = h + s1 + ch + k[t] + w[t];
+                                       
+                                       h = g;
+                                       g = f;
+                                       f = e;
+                                       e = d + t1;
+                                       d = c;
+                                       c = b;
+                                       b = a;
+                                       a = t1 + t2;
+                               }
+                                       
+                               //Add this chunk's hash to result so far:
+                               h0 += a;
+                               h1 += b;
+                               h2 += c;
+                               h3 += d;
+                               h4 += e;
+                               h5 += f;
+                               h6 += g;
+                               h7 += h;
+                       }
+                       
+                       var byteArray:ByteArray = new ByteArray();
+                       byteArray.writeInt(h0);
+                       byteArray.writeInt(h1);
+                       byteArray.writeInt(h2);
+                       byteArray.writeInt(h3);
+                       byteArray.writeInt(h4);
+                       byteArray.writeInt(h5);
+                       byteArray.writeInt(h6);
+                       byteArray.position = 0;
+                       
+                       digest = new ByteArray();
+                       digest.writeBytes(byteArray);
+                       digest.position = 0;
+                       return byteArray;
+               }
+               
+               /**
+                *  Converts a ByteArray to a sequence of 16-word blocks
+                *  that we'll do the processing on.  Appends padding
+                *  and length in the process.
+                *
+                *  @param data         The data to split into blocks
+                *  @return                     An array containing the blocks 
into which data was split
+                */
+               private static function createBlocksFromByteArray( 
data:ByteArray ):Array
+               {
+                       var oldPosition:int = data.position;
+                       data.position = 0;
+                       
+                       var blocks:Array = new Array();
+                       var len:int = data.length * 8;
+                       var mask:int = 0xFF; // ignore hi byte of characters > 
0xFF
+                       for( var i:int = 0; i < len; i += 8 )
+                       {
+                               blocks[ i >> 5 ] |= ( data.readByte() & mask ) 
<< ( 24 - i % 32 );
+                       }
+                       
+                       // append padding and length
+                       blocks[ len >> 5 ] |= 0x80 << ( 24 - len % 32 );
+                       blocks[ ( ( ( len + 64 ) >> 9 ) << 4 ) + 15 ] = len;
+                       
+                       data.position = oldPosition;
+                       
+                       return blocks;
+               }
+                                       
+               /**
+                *  Converts a string to a sequence of 16-word blocks
+                *  that we'll do the processing on.  Appends padding
+                *  and length in the process.
+                *
+                *  @param s    The string to split into blocks
+                *  @return             An array containing the blocks that s 
was split into.
+                */
+               private static function createBlocksFromString( s:String ):Array
+               {
+                       var blocks:Array = new Array();
+                       var len:int = s.length * 8;
+                       var mask:int = 0xFF; // ignore hi byte of characters > 
0xFF
+                       for( var i:int = 0; i < len; i += 8 ) {
+                               blocks[ i >> 5 ] |= ( s.charCodeAt( i / 8 ) & 
mask ) << ( 24 - i % 32 );
+                       }
+                       
+                       // append padding and length
+                       blocks[ len >> 5 ] |= 0x80 << ( 24 - len % 32 );
+                       blocks[ ( ( ( len + 64 ) >> 9 ) << 4 ) + 15 ] = len;
+                       return blocks;
+               }
+       }
+}

Added: trunk/phpgwapi/js/uploadify/com/adobe/crypto/SHA256.as
===================================================================
--- trunk/phpgwapi/js/uploadify/com/adobe/crypto/SHA256.as                      
        (rev 0)
+++ trunk/phpgwapi/js/uploadify/com/adobe/crypto/SHA256.as      2011-04-01 
10:39:57 UTC (rev 7152)
@@ -0,0 +1,261 @@
+/*
+  Copyright (c) 2008, Adobe Systems Incorporated
+  All rights reserved.
+
+  Redistribution and use in source and binary forms, with or without 
+  modification, are permitted provided that the following conditions are
+  met:
+
+  * Redistributions of source code must retain the above copyright notice, 
+    this list of conditions and the following disclaimer.
+  
+  * Redistributions in binary form must reproduce the above copyright
+    notice, this list of conditions and the following disclaimer in the 
+    documentation and/or other materials provided with the distribution.
+  
+  * Neither the name of Adobe Systems Incorporated nor the names of its 
+    contributors may be used to endorse or promote products derived from 
+    this software without specific prior written permission.
+
+  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+  IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+  THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+  PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR 
+  CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+  EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+  PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+  PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+  LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+  NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+package com.adobe.crypto
+{
+       import com.adobe.utils.IntUtil;
+       import flash.utils.ByteArray;
+       import mx.utils.Base64Encoder;
+       
+       /**
+        * The SHA-256 algorithm
+        * 
+        * @see 
http://csrc.nist.gov/publications/fips/fips180-2/fips180-2withchangenotice.pdf
+        */
+       public class SHA256
+       {
+               public static var digest:ByteArray;
+               /**
+                *  Performs the SHA256 hash algorithm on a string.
+                *
+                *  @param s            The string to hash
+                *  @return                     A string containing the hash 
value of s
+                *  @langversion        ActionScript 3.0
+                *  @playerversion      9.0
+                *  @tiptext
+                */
+               public static function hash( s:String ):String {
+                       var blocks:Array = createBlocksFromString( s );
+                       var byteArray:ByteArray = hashBlocks( blocks );
+                       
+                       return IntUtil.toHex( byteArray.readInt(), true )
+                                       + IntUtil.toHex( byteArray.readInt(), 
true )
+                                       + IntUtil.toHex( byteArray.readInt(), 
true )
+                                       + IntUtil.toHex( byteArray.readInt(), 
true )
+                                       + IntUtil.toHex( byteArray.readInt(), 
true )
+                                       + IntUtil.toHex( byteArray.readInt(), 
true )
+                                       + IntUtil.toHex( byteArray.readInt(), 
true )
+                                       + IntUtil.toHex( byteArray.readInt(), 
true );
+               }
+               
+               /**
+                *  Performs the SHA256 hash algorithm on a ByteArray.
+                *
+                *  @param data         The ByteArray data to hash
+                *  @return                     A string containing the hash 
value of data
+                *  @langversion        ActionScript 3.0
+                *  @playerversion      9.0
+                */
+               public static function hashBytes( data:ByteArray ):String
+               {
+                       var blocks:Array = createBlocksFromByteArray( data );
+                       var byteArray:ByteArray = hashBlocks(blocks);
+                       
+                       return IntUtil.toHex( byteArray.readInt(), true )
+                                       + IntUtil.toHex( byteArray.readInt(), 
true )
+                                       + IntUtil.toHex( byteArray.readInt(), 
true )
+                                       + IntUtil.toHex( byteArray.readInt(), 
true )
+                                       + IntUtil.toHex( byteArray.readInt(), 
true )
+                                       + IntUtil.toHex( byteArray.readInt(), 
true )
+                                       + IntUtil.toHex( byteArray.readInt(), 
true )
+                                       + IntUtil.toHex( byteArray.readInt(), 
true );
+               }
+               
+               /**
+                *  Performs the SHA256 hash algorithm on a string, then does
+                *  Base64 encoding on the result.
+                *
+                *  @param s            The string to hash
+                *  @return                     The base64 encoded hash value 
of s
+                *  @langversion        ActionScript 3.0
+                *  @playerversion      9.0
+                *  @tiptext
+                */
+               public static function hashToBase64( s:String ):String
+               {
+                       var blocks:Array = createBlocksFromString( s );
+                       var byteArray:ByteArray = hashBlocks(blocks);
+
+                       // ByteArray.toString() returns the contents as a UTF-8 
string,
+                       // which we can't use because certain byte sequences 
might trigger
+                       // a UTF-8 conversion.  Instead, we convert the bytes 
to characters
+                       // one by one.
+                       var charsInByteArray:String = "";
+                       byteArray.position = 0;
+                       for (var j:int = 0; j < byteArray.length; j++)
+                       {
+                               var byte:uint = byteArray.readUnsignedByte();
+                               charsInByteArray += String.fromCharCode(byte);
+                       }
+
+                       var encoder:Base64Encoder = new Base64Encoder();
+                       encoder.encode(charsInByteArray);
+                       return encoder.flush();
+               }
+               
+               private static function hashBlocks( blocks:Array ):ByteArray {
+                       var h0:int = 0x6a09e667;
+                       var h1:int = 0xbb67ae85;
+                       var h2:int = 0x3c6ef372;
+                       var h3:int = 0xa54ff53a;
+                       var h4:int = 0x510e527f;
+                       var h5:int = 0x9b05688c;
+                       var h6:int = 0x1f83d9ab;
+                       var h7:int = 0x5be0cd19;
+                       
+                       var k:Array = new Array(0x428a2f98, 0x71374491, 
0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5, 
0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe, 
0x9bdc06a7, 0xc19bf174, 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, 
0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da, 0x983e5152, 0xa831c66d, 
0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967, 
0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, 0x650a7354, 0x766a0abb, 
0x81c2c92e, 0x92722c85, 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, 
0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070, 0x19a4c116, 0x1e376c08, 
0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3, 
0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, 0x90befffa, 0xa4506ceb, 
0xbef9a3f7, 0xc67178f2);
+                       
+                       var len:int = blocks.length;
+                       var w:Array = new Array( 64 );
+                       
+                       // loop over all of the blocks
+                       for ( var i:int = 0; i < len; i += 16 ) {
+                               
+                               var a:int = h0;
+                               var b:int = h1;
+                               var c:int = h2;
+                               var d:int = h3;
+                               var e:int = h4;
+                               var f:int = h5;
+                               var g:int = h6;
+                               var h:int = h7;
+                               
+                               for(var t:int = 0; t < 64; t++) {
+                                       
+                                       if ( t < 16 ) {
+                                               w[t] = blocks[ i + t ];
+                                               if(isNaN(w[t])) { w[t] = 0; }
+                                       } else {
+                                               var ws0:int = 
IntUtil.ror(w[t-15], 7) ^ IntUtil.ror(w[t-15], 18) ^ (w[t-15] >>> 3);
+                                               var ws1:int = 
IntUtil.ror(w[t-2], 17) ^ IntUtil.ror(w[t-2], 19) ^ (w[t-2] >>> 10);
+                                               w[t] = w[t-16] + ws0 + w[t-7] + 
ws1;
+                                       }
+                                       
+                                       var s0:int = IntUtil.ror(a, 2) ^ 
IntUtil.ror(a, 13) ^ IntUtil.ror(a, 22);
+                                       var maj:int = (a & b) ^ (a & c) ^ (b & 
c);
+                                       var t2:int = s0 + maj;
+                                       var s1:int = IntUtil.ror(e, 6) ^ 
IntUtil.ror(e, 11) ^ IntUtil.ror(e, 25);
+                                       var ch:int = (e & f) ^ ((~e) & g);
+                                       var t1:int = h + s1 + ch + k[t] + w[t];
+                                       
+                                       h = g;
+                                       g = f;
+                                       f = e;
+                                       e = d + t1;
+                                       d = c;
+                                       c = b;
+                                       b = a;
+                                       a = t1 + t2;
+                               }
+                                       
+                               //Add this chunk's hash to result so far:
+                               h0 += a;
+                               h1 += b;
+                               h2 += c;
+                               h3 += d;
+                               h4 += e;
+                               h5 += f;
+                               h6 += g;
+                               h7 += h;
+                       }
+                       
+                       var byteArray:ByteArray = new ByteArray();
+                       byteArray.writeInt(h0);
+                       byteArray.writeInt(h1);
+                       byteArray.writeInt(h2);
+                       byteArray.writeInt(h3);
+                       byteArray.writeInt(h4);
+                       byteArray.writeInt(h5);
+                       byteArray.writeInt(h6);
+                       byteArray.writeInt(h7);
+                       byteArray.position = 0;
+                       
+                       digest = new ByteArray();
+                       digest.writeBytes(byteArray);
+                       digest.position = 0;
+                       return byteArray;
+               }
+               
+               /**
+                *  Converts a ByteArray to a sequence of 16-word blocks
+                *  that we'll do the processing on.  Appends padding
+                *  and length in the process.
+                *
+                *  @param data         The data to split into blocks
+                *  @return                     An array containing the blocks 
into which data was split
+                */
+               private static function createBlocksFromByteArray( 
data:ByteArray ):Array
+               {
+                       var oldPosition:int = data.position;
+                       data.position = 0;
+                       
+                       var blocks:Array = new Array();
+                       var len:int = data.length * 8;
+                       var mask:int = 0xFF; // ignore hi byte of characters > 
0xFF
+                       for( var i:int = 0; i < len; i += 8 )
+                       {
+                               blocks[ i >> 5 ] |= ( data.readByte() & mask ) 
<< ( 24 - i % 32 );
+                       }
+                       
+                       // append padding and length
+                       blocks[ len >> 5 ] |= 0x80 << ( 24 - len % 32 );
+                       blocks[ ( ( ( len + 64 ) >> 9 ) << 4 ) + 15 ] = len;
+                       
+                       data.position = oldPosition;
+                       
+                       return blocks;
+               }
+                                       
+               /**
+                *  Converts a string to a sequence of 16-word blocks
+                *  that we'll do the processing on.  Appends padding
+                *  and length in the process.
+                *
+                *  @param s    The string to split into blocks
+                *  @return             An array containing the blocks that s 
was split into.
+                */
+               private static function createBlocksFromString( s:String ):Array
+               {
+                       var blocks:Array = new Array();
+                       var len:int = s.length * 8;
+                       var mask:int = 0xFF; // ignore hi byte of characters > 
0xFF
+                       for( var i:int = 0; i < len; i += 8 ) {
+                               blocks[ i >> 5 ] |= ( s.charCodeAt( i / 8 ) & 
mask ) << ( 24 - i % 32 );
+                       }
+                       
+                       // append padding and length
+                       blocks[ len >> 5 ] |= 0x80 << ( 24 - len % 32 );
+                       blocks[ ( ( ( len + 64 ) >> 9 ) << 4 ) + 15 ] = len;
+                       return blocks;
+               }
+       }
+}

Added: trunk/phpgwapi/js/uploadify/com/adobe/crypto/WSSEUsernameToken.as
===================================================================
--- trunk/phpgwapi/js/uploadify/com/adobe/crypto/WSSEUsernameToken.as           
                (rev 0)
+++ trunk/phpgwapi/js/uploadify/com/adobe/crypto/WSSEUsernameToken.as   
2011-04-01 10:39:57 UTC (rev 7152)
@@ -0,0 +1,114 @@
+/*
+  Copyright (c) 2008, Adobe Systems Incorporated
+  All rights reserved.
+
+  Redistribution and use in source and binary forms, with or without 
+  modification, are permitted provided that the following conditions are
+  met:
+
+  * Redistributions of source code must retain the above copyright notice, 
+    this list of conditions and the following disclaimer.
+  
+  * Redistributions in binary form must reproduce the above copyright
+    notice, this list of conditions and the following disclaimer in the 
+    documentation and/or other materials provided with the distribution.
+  
+  * Neither the name of Adobe Systems Incorporated nor the names of its 
+    contributors may be used to endorse or promote products derived from 
+    this software without specific prior written permission.
+
+  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+  IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+  THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+  PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR 
+  CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+  EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+  PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+  PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+  LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+  NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+package com.adobe.crypto
+{
+       import mx.formatters.DateFormatter;
+       import mx.utils.Base64Encoder;
+       
+       /**
+        * Web Services Security Username Token
+        *
+        * Implementation based on algorithm description at 
+        * 
http://www.oasis-open.org/committees/wss/documents/WSS-Username-02-0223-merged.pdf
+        */
+       public class WSSEUsernameToken
+       {
+               /**
+                * Generates a WSSE Username Token.
+                *
+                * @param username The username
+                * @param password The password
+                * @param nonce A cryptographically random nonce (if null, the 
nonce
+                * will be generated)
+                * @param timestamp The time at which the token is generated 
(if null,
+                * the time will be set to the moment of execution)
+                * @return The generated token
+                * @langversion ActionScript 3.0
+                * @playerversion Flash 9.0
+                * @tiptext
+                */
+               public static function getUsernameToken(username:String, 
password:String, nonce:String=null, timestamp:Date=null):String
+               {
+                       if (nonce == null)
+                       {
+                               nonce = generateNonce();
+                       }
+                       nonce = base64Encode(nonce);
+               
+                       var created:String = generateTimestamp(timestamp);
+               
+                       var password64:String = getBase64Digest(nonce,
+                               created,
+                               password);
+               
+                       var token:String = new String("UsernameToken 
Username=\"");
+                       token += username + "\", " +
+                                        "PasswordDigest=\"" + password64 + 
"\", " +
+                                        "Nonce=\"" + nonce + "\", " +
+                                        "Created=\"" + created + "\"";
+                       return token;
+               }
+               
+               private static function generateNonce():String
+               {
+                       // Math.random returns a Number between 0 and 1.  We 
don't want our
+                       // nonce to contain invalid characters (e.g. the 
period) so we
+                       // strip them out before returning the result.
+                       var s:String =  Math.random().toString();
+                       return s.replace(".", "");
+               }
+               
+               internal static function base64Encode(s:String):String
+               {
+                       var encoder:Base64Encoder = new Base64Encoder();
+                       encoder.encode(s);
+                       return encoder.flush();
+               }
+               
+               internal static function 
generateTimestamp(timestamp:Date):String
+               {
+                       if (timestamp == null)
+                       {
+                               timestamp = new Date();
+                       }
+                       var dateFormatter:DateFormatter = new DateFormatter();
+                       dateFormatter.formatString = "YYYY-MM-DDTJJ:NN:SS"
+                       return dateFormatter.format(timestamp) + "Z";
+               }
+               
+               internal static function getBase64Digest(nonce:String, 
created:String, password:String):String
+               {
+                       return SHA1.hashToBase64(nonce + created + password);
+               }
+       }
+}
\ No newline at end of file

Added: trunk/phpgwapi/js/uploadify/com/adobe/errors/IllegalStateError.as
===================================================================
--- trunk/phpgwapi/js/uploadify/com/adobe/errors/IllegalStateError.as           
                (rev 0)
+++ trunk/phpgwapi/js/uploadify/com/adobe/errors/IllegalStateError.as   
2011-04-01 10:39:57 UTC (rev 7152)
@@ -0,0 +1,63 @@
+/*
+  Copyright (c) 2008, Adobe Systems Incorporated
+  All rights reserved.
+
+  Redistribution and use in source and binary forms, with or without 
+  modification, are permitted provided that the following conditions are
+  met:
+
+  * Redistributions of source code must retain the above copyright notice, 
+    this list of conditions and the following disclaimer.
+  
+  * Redistributions in binary form must reproduce the above copyright
+    notice, this list of conditions and the following disclaimer in the 
+    documentation and/or other materials provided with the distribution.
+  
+  * Neither the name of Adobe Systems Incorporated nor the names of its 
+    contributors may be used to endorse or promote products derived from 
+    this software without specific prior written permission.
+
+  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+  IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+  THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+  PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR 
+  CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+  EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+  PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+  PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+  LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+  NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+package com.adobe.errors
+{
+       /**
+       * This class represents an Error that is thrown when a method is called 
when
+       * the receiving instance is in an invalid state.
+       *
+       * For example, this may occur if a method has been called, and other 
properties
+       * in the instance have not been initialized properly.
+       *
+       * @langversion ActionScript 3.0
+       * @playerversion Flash 9.0
+       * @tiptext
+       *
+       */
+       public class IllegalStateError extends Error
+       {
+               /**
+               *       Constructor
+               *
+               *       @param message A message describing the error in detail.
+               *
+               *       @langversion ActionScript 3.0
+               *       @playerversion Flash 9.0
+               *       @tiptext
+               */
+               public function IllegalStateError(message:String)
+               {
+                       super(message);
+               }
+       }
+}
\ No newline at end of file

Added: trunk/phpgwapi/js/uploadify/com/adobe/fileformats/vcard/Address.as
===================================================================
--- trunk/phpgwapi/js/uploadify/com/adobe/fileformats/vcard/Address.as          
                (rev 0)
+++ trunk/phpgwapi/js/uploadify/com/adobe/fileformats/vcard/Address.as  
2011-04-01 10:39:57 UTC (rev 7152)
@@ -0,0 +1,47 @@
+/*
+  Copyright (c) 2008, Adobe Systems Incorporated
+  All rights reserved.
+
+  Redistribution and use in source and binary forms, with or without 
+  modification, are permitted provided that the following conditions are
+  met:
+
+  * Redistributions of source code must retain the above copyright notice, 
+    this list of conditions and the following disclaimer.
+  
+  * Redistributions in binary form must reproduce the above copyright
+    notice, this list of conditions and the following disclaimer in the 
+    documentation and/or other materials provided with the distribution.
+  
+  * Neither the name of Adobe Systems Incorporated nor the names of its 
+    contributors may be used to endorse or promote products derived from 
+    this software without specific prior written permission.
+
+  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+  IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+  THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+  PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR 
+  CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+  EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+  PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+  PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+  LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+  NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+package com.adobe.fileformats.vcard
+{
+       public class Address
+       {
+               public var type:String;
+               public var street:String;
+               public var city:String;
+               public var state:String;
+               public var postalCode:String;
+               
+               public function toString():String
+               {
+                       return (street + " " + city + ", " + state + " " + 
postalCode);
+               }
+       }
+}
\ No newline at end of file

Added: trunk/phpgwapi/js/uploadify/com/adobe/fileformats/vcard/Email.as
===================================================================
--- trunk/phpgwapi/js/uploadify/com/adobe/fileformats/vcard/Email.as            
                (rev 0)
+++ trunk/phpgwapi/js/uploadify/com/adobe/fileformats/vcard/Email.as    
2011-04-01 10:39:57 UTC (rev 7152)
@@ -0,0 +1,39 @@
+/*
+  Copyright (c) 2008, Adobe Systems Incorporated
+  All rights reserved.
+
+  Redistribution and use in source and binary forms, with or without 
+  modification, are permitted provided that the following conditions are
+  met:
+
+  * Redistributions of source code must retain the above copyright notice, 
+    this list of conditions and the following disclaimer.
+  
+  * Redistributions in binary form must reproduce the above copyright
+    notice, this list of conditions and the following disclaimer in the 
+    documentation and/or other materials provided with the distribution.
+  
+  * Neither the name of Adobe Systems Incorporated nor the names of its 
+    contributors may be used to endorse or promote products derived from 
+    this software without specific prior written permission.
+
+  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+  IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+  THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+  PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR 
+  CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+  EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+  PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+  PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+  LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+  NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+package com.adobe.fileformats.vcard
+{
+       public class Email
+       {
+               public var type:String;
+               public var address:String;
+       }
+}
\ No newline at end of file

Added: trunk/phpgwapi/js/uploadify/com/adobe/fileformats/vcard/Phone.as
===================================================================
--- trunk/phpgwapi/js/uploadify/com/adobe/fileformats/vcard/Phone.as            
                (rev 0)
+++ trunk/phpgwapi/js/uploadify/com/adobe/fileformats/vcard/Phone.as    
2011-04-01 10:39:57 UTC (rev 7152)
@@ -0,0 +1,39 @@
+/*
+  Copyright (c) 2008, Adobe Systems Incorporated
+  All rights reserved.
+
+  Redistribution and use in source and binary forms, with or without 
+  modification, are permitted provided that the following conditions are
+  met:
+
+  * Redistributions of source code must retain the above copyright notice, 
+    this list of conditions and the following disclaimer.
+  
+  * Redistributions in binary form must reproduce the above copyright
+    notice, this list of conditions and the following disclaimer in the 
+    documentation and/or other materials provided with the distribution.
+  
+  * Neither the name of Adobe Systems Incorporated nor the names of its 
+    contributors may be used to endorse or promote products derived from 
+    this software without specific prior written permission.
+
+  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+  IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+  THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+  PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR 
+  CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+  EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+  PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+  PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+  LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+  NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+package com.adobe.fileformats.vcard
+{
+       public class Phone
+       {
+               public var type:String;
+               public var number:String;
+       }
+}
\ No newline at end of file

Added: trunk/phpgwapi/js/uploadify/com/adobe/fileformats/vcard/VCard.as
===================================================================
--- trunk/phpgwapi/js/uploadify/com/adobe/fileformats/vcard/VCard.as            
                (rev 0)
+++ trunk/phpgwapi/js/uploadify/com/adobe/fileformats/vcard/VCard.as    
2011-04-01 10:39:57 UTC (rev 7152)
@@ -0,0 +1,54 @@
+/*
+  Copyright (c) 2008, Adobe Systems Incorporated
+  All rights reserved.
+
+  Redistribution and use in source and binary forms, with or without 
+  modification, are permitted provided that the following conditions are
+  met:
+
+  * Redistributions of source code must retain the above copyright notice, 
+    this list of conditions and the following disclaimer.
+  
+  * Redistributions in binary form must reproduce the above copyright
+    notice, this list of conditions and the following disclaimer in the 
+    documentation and/or other materials provided with the distribution.
+  
+  * Neither the name of Adobe Systems Incorporated nor the names of its 
+    contributors may be used to endorse or promote products derived from 
+    this software without specific prior written permission.
+
+  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+  IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+  THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+  PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR 
+  CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+  EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+  PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+  PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+  LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+  NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+package com.adobe.fileformats.vcard
+{
+       import flash.utils.ByteArray;
+
+       public class VCard
+       {
+               public var fullName:String;
+               public var orgs:Array;
+               public var title:String;
+               public var image:ByteArray;
+               public var phones:Array;
+               public var emails:Array;
+               public var addresses:Array;
+               
+               public function VCard()
+               {
+                       orgs = new Array();
+                       phones = new Array();
+                       emails = new Array();
+                       addresses = new Array();
+               }
+       }
+}
\ No newline at end of file

Added: trunk/phpgwapi/js/uploadify/com/adobe/fileformats/vcard/VCardParser.as
===================================================================
--- trunk/phpgwapi/js/uploadify/com/adobe/fileformats/vcard/VCardParser.as      
                        (rev 0)
+++ trunk/phpgwapi/js/uploadify/com/adobe/fileformats/vcard/VCardParser.as      
2011-04-01 10:39:57 UTC (rev 7152)
@@ -0,0 +1,246 @@
+/*
+  Copyright (c) 2008, Adobe Systems Incorporated
+  All rights reserved.
+
+  Redistribution and use in source and binary forms, with or without 
+  modification, are permitted provided that the following conditions are
+  met:
+
+  * Redistributions of source code must retain the above copyright notice, 
+    this list of conditions and the following disclaimer.
+  
+  * Redistributions in binary form must reproduce the above copyright
+    notice, this list of conditions and the following disclaimer in the 
+    documentation and/or other materials provided with the distribution.
+  
+  * Neither the name of Adobe Systems Incorporated nor the names of its 
+    contributors may be used to endorse or promote products derived from 
+    this software without specific prior written permission.
+
+  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+  IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+  THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+  PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR 
+  CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+  EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+  PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+  PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+  LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+  NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+package com.adobe.fileformats.vcard
+{
+       import mx.utils.Base64Decoder;
+       import mx.utils.StringUtil;
+       
+       public class VCardParser
+       {
+               public static function parse(vcardStr:String):Array
+               {
+                       var vcards:Array = new Array();
+                       var lines:Array = vcardStr.split(/\r\n/);
+                       var vcard:VCard;
+                       var type:String;
+                       var typeTmp:String;
+                       var line:String;
+
+                       for (var i:uint = 0; i < lines.length; ++i)
+                       {
+                               line = lines[i];
+                               if (line == "BEGIN:VCARD")
+                               {
+                                       vcard = new VCard();
+                               }
+                               else if (line == "END:VCARD")
+                               {
+                                       if (vcard != null)
+                                       {
+                                               vcards.push(vcard);
+                                       }
+                               }
+                               else if(line.search(/^ORG/i) != -1)
+                               {
+                                       var org:String = line.substring(4, 
line.length);
+                                       var orgArray:Array = org.split(";");
+                                       for each (var orgToken:String in 
orgArray)
+                                       {
+                                               if 
(StringUtil.trim(orgToken).length > 0)
+                                               {
+                                                       
vcard.orgs.push(orgToken);
+                                               }
+                                       }
+                               }
+                               else if(line.search(/^TITLE/i) != -1)
+                               {
+                                       var title:String = line.substring(6, 
line.length);
+                                       vcard.title = title;
+                               }
+                               else if (line.search(/^FN:/i) != -1)
+                               {
+                                       var fullName:String = line.substring(3, 
line.length);
+                                       vcard.fullName = fullName;
+                               }
+                               else if (line.search(/^TEL/i) != -1)
+                               {
+                                       type = new String();
+                                       typeTmp = new String();
+                                       var phone:Phone = new Phone();
+                                       var number:String;
+                                       var phoneTokens:Array = line.split(";");
+                                       for each (var phoneToken:String in 
phoneTokens)
+                                       {
+                                               if 
(phoneToken.search(/^TYPE=/i) != -1)
+                                               {
+                                                       if 
(phoneToken.indexOf(":") != -1)
+                                                       {
+                                                               typeTmp = 
phoneToken.substring(5, phoneToken.indexOf(":"));
+                                                               number = 
phoneToken.substring(phoneToken.indexOf(":")+1, phoneToken.length);
+                                                       }
+                                                       else
+                                                       {                       
                                                
+                                                               typeTmp = 
phoneToken.substring(5, phoneToken.length);
+                                                       }
+
+                                                       typeTmp = 
typeTmp.toLocaleLowerCase();
+
+                                                       if (typeTmp == "pref")
+                                                       {
+                                                               continue;
+                                                       }
+                                                       if (type.length != 0)
+                                                       {
+                                                               type += (" ");
+                                                       }
+                                                       type += typeTmp;
+                                               }
+                                       }
+                                       if (type.length > 0 && number != null)
+                                       {
+                                               phone.type = type;
+                                               phone.number = number;
+                                       }
+                                       vcard.phones.push(phone);
+                               }
+                               else if (line.search(/^EMAIL/i) != -1)
+                               {
+                                       type = new String();
+                                       typeTmp = new String();
+                                       var email:Email = new Email();
+                                       var emailAddress:String;
+                                       var emailTokens:Array = line.split(";");
+                                       for each (var emailToken:String in 
emailTokens)
+                                       {
+                                               if 
(emailToken.search(/^TYPE=/i) != -1)
+                                               {
+                                                       if 
(emailToken.indexOf(":") != -1)
+                                                       {
+                                                               typeTmp = 
emailToken.substring(5, emailToken.indexOf(":"));
+                                                               emailAddress = 
emailToken.substring(emailToken.indexOf(":")+1, emailToken.length);
+                                                       }
+                                                       else
+                                                       {                       
                                                
+                                                               typeTmp = 
emailToken.substring(5, emailToken.length);
+                                                       }
+
+                                                       typeTmp = 
typeTmp.toLocaleLowerCase();
+
+                                                       if (typeTmp == "pref" 
|| typeTmp == "internet")
+                                                       {
+                                                               continue;
+                                                       }
+                                                       if (type.length != 0)
+                                                       {
+                                                               type += (" ");
+                                                       }
+                                                       type += typeTmp;
+                                               }
+                                       }
+                                       if (type.length > 0 && emailAddress != 
null)
+                                       {
+                                               email.type = type;
+                                               email.address = emailAddress;
+                                       }
+                                       vcard.emails.push(email);
+                               }
+                               else if (line.indexOf("ADR;") != -1)
+                               {
+                                       var addressTokens:Array = 
line.split(";");
+                                       var address:Address = new Address();
+                                       for (var j:uint = 0; j < 
addressTokens.length; ++j)
+                                       {
+                                               var addressToken:String = 
addressTokens[j];
+                                               if 
(addressToken.search(/^home:+$/i) != -1) // For Outlook, which uses 
non-standard vCards.
+                                               {
+                                                       address.type = "home";
+                                               }
+                                               else if 
(addressToken.search(/^work:+$/i) != -1) // For Outlook, which uses 
non-standard vCards.
+                                               {
+                                                       address.type = "work";
+                                               }
+                                               if 
(addressToken.search(/^type=/i) != -1)  // The "type" parameter is the standard 
way (which Address Book uses)
+                                               {
+                                                       // First, remove the 
optional ":" character.
+                                                       addressToken = 
addressToken.replace(/:/,"");
+                                                       var addressType:String 
= addressToken.substring(5, addressToken.length).toLowerCase();
+                                                       if (addressType == 
"pref") // Not interested in which one is preferred.
+                                                       {
+                                                               continue;
+                                                       }
+                                                       else if 
(addressType.indexOf("home") != -1) // home
+                                                       {
+                                                               addressType = 
"home";
+                                                       }
+                                                       else if 
(addressType.indexOf("work") != -1) // work
+                                                       {
+                                                               addressType = 
"work";
+                                                       }
+                                                       else if 
(addressType.indexOf(",") != -1) // if the comma technique is used, just use 
the first one
+                                                       {
+                                                               var 
typeTokens:Array = addressType.split(",");
+                                                               for each (var 
typeToken:String in typeTokens)
+                                                               {
+                                                                       if 
(typeToken != "pref")
+                                                                       {
+                                                                               
addressType = typeToken;
+                                                                               
break;
+                                                                       }
+                                                               }
+                                                       }
+                                                       address.type = 
addressType;
+                                               }
+                                               else if 
(addressToken.search(/^\d/) != -1 && address.street == null)
+                                               {
+                                                       address.street = 
addressToken.replace(/\\n/, "");
+                                                       address.city = 
addressTokens[j+1];
+                                                       address.state = 
addressTokens[j+2];
+                                                       address.postalCode = 
addressTokens[j+3];
+                                               }
+                                       }
+                                       if (address.type != null && 
address.street != null)
+                                       {
+                                               vcard.addresses.push(address);
+                                       }
+
+                               }
+                               else if (line.search(/^PHOTO;BASE64/i) != -1)
+                               {
+                                       var imageStr:String = new String();
+                                       for (var k:uint = i+1; k < 
lines.length; ++k)
+                                       {
+                                               imageStr += lines[k];
+                                               //if (lines[k].search(/.+\=$/) 
!= -1) // Very slow in Mac due to RegEx bug
+                                               if (lines[k].indexOf('=') != -1)
+                                               {
+                                                       var 
decoder:Base64Decoder = new Base64Decoder();
+                                                       
decoder.decode(imageStr);
+                                                       vcard.image = 
decoder.flush();
+                                                       break;
+                                               }
+                                       }
+                               }
+                       }
+                       return vcards;
+               }
+       }
+}
\ No newline at end of file

Added: trunk/phpgwapi/js/uploadify/com/adobe/images/BitString.as
===================================================================
--- trunk/phpgwapi/js/uploadify/com/adobe/images/BitString.as                   
        (rev 0)
+++ trunk/phpgwapi/js/uploadify/com/adobe/images/BitString.as   2011-04-01 
10:39:57 UTC (rev 7152)
@@ -0,0 +1,39 @@
+/*
+  Copyright (c) 2008, Adobe Systems Incorporated
+  All rights reserved.
+
+  Redistribution and use in source and binary forms, with or without 
+  modification, are permitted provided that the following conditions are
+  met:
+
+  * Redistributions of source code must retain the above copyright notice, 
+    this list of conditions and the following disclaimer.
+  
+  * Redistributions in binary form must reproduce the above copyright
+    notice, this list of conditions and the following disclaimer in the 
+    documentation and/or other materials provided with the distribution.
+  
+  * Neither the name of Adobe Systems Incorporated nor the names of its 
+    contributors may be used to endorse or promote products derived from 
+    this software without specific prior written permission.
+
+  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+  IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+  THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+  PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR 
+  CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+  EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+  PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+  PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+  LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+  NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+package com.adobe.images
+{
+       public class BitString
+       {
+               public var len:int = 0;
+               public var val:int = 0;
+       }
+}
\ No newline at end of file

Added: trunk/phpgwapi/js/uploadify/com/adobe/images/JPGEncoder.as
===================================================================
--- trunk/phpgwapi/js/uploadify/com/adobe/images/JPGEncoder.as                  
        (rev 0)
+++ trunk/phpgwapi/js/uploadify/com/adobe/images/JPGEncoder.as  2011-04-01 
10:39:57 UTC (rev 7152)
@@ -0,0 +1,648 @@
+/*
+  Copyright (c) 2008, Adobe Systems Incorporated
+  All rights reserved.
+
+  Redistribution and use in source and binary forms, with or without 
+  modification, are permitted provided that the following conditions are
+  met:
+
+  * Redistributions of source code must retain the above copyright notice, 
+    this list of conditions and the following disclaimer.
+  
+  * Redistributions in binary form must reproduce the above copyright
+    notice, this list of conditions and the following disclaimer in the 
+    documentation and/or other materials provided with the distribution.
+  
+  * Neither the name of Adobe Systems Incorporated nor the names of its 
+    contributors may be used to endorse or promote products derived from 
+    this software without specific prior written permission.
+
+  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+  IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+  THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+  PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR 
+  CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+  EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+  PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+  PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+  LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+  NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+package com.adobe.images
+{
+       import flash.geom.*;
+       import flash.display.*;
+       import flash.utils.*;
+       
+       /**
+        * Class that converts BitmapData into a valid JPEG
+        */             
+       public class JPGEncoder
+       {
+
+               // Static table initialization
+       
+               private var ZigZag:Array = [
+                        0, 1, 5, 6,14,15,27,28,
+                        2, 4, 7,13,16,26,29,42,
+                        3, 8,12,17,25,30,41,43,
+                        9,11,18,24,31,40,44,53,
+                       10,19,23,32,39,45,52,54,
+                       20,22,33,38,46,51,55,60,
+                       21,34,37,47,50,56,59,61,
+                       35,36,48,49,57,58,62,63
+               ];
+       
+               private var YTable:Array = new Array(64);
+               private var UVTable:Array = new Array(64);
+               private var fdtbl_Y:Array = new Array(64);
+               private var fdtbl_UV:Array = new Array(64);
+       
+               private function initQuantTables(sf:int):void
+               {
+                       var i:int;
+                       var t:Number;
+                       var YQT:Array = [
+                               16, 11, 10, 16, 24, 40, 51, 61,
+                               12, 12, 14, 19, 26, 58, 60, 55,
+                               14, 13, 16, 24, 40, 57, 69, 56,
+                               14, 17, 22, 29, 51, 87, 80, 62,
+                               18, 22, 37, 56, 68,109,103, 77,
+                               24, 35, 55, 64, 81,104,113, 92,
+                               49, 64, 78, 87,103,121,120,101,
+                               72, 92, 95, 98,112,100,103, 99
+                       ];
+                       for (i = 0; i < 64; i++) {
+                               t = Math.floor((YQT[i]*sf+50)/100);
+                               if (t < 1) {
+                                       t = 1;
+                               } else if (t > 255) {
+                                       t = 255;
+                               }
+                               YTable[ZigZag[i]] = t;
+                       }
+                       var UVQT:Array = [
+                               17, 18, 24, 47, 99, 99, 99, 99,
+                               18, 21, 26, 66, 99, 99, 99, 99,
+                               24, 26, 56, 99, 99, 99, 99, 99,
+                               47, 66, 99, 99, 99, 99, 99, 99,
+                               99, 99, 99, 99, 99, 99, 99, 99,
+                               99, 99, 99, 99, 99, 99, 99, 99,
+                               99, 99, 99, 99, 99, 99, 99, 99,
+                               99, 99, 99, 99, 99, 99, 99, 99
+                       ];
+                       for (i = 0; i < 64; i++) {
+                               t = Math.floor((UVQT[i]*sf+50)/100);
+                               if (t < 1) {
+                                       t = 1;
+                               } else if (t > 255) {
+                                       t = 255;
+                               }
+                               UVTable[ZigZag[i]] = t;
+                       }
+                       var aasf:Array = [
+                               1.0, 1.387039845, 1.306562965, 1.175875602,
+                               1.0, 0.785694958, 0.541196100, 0.275899379
+                       ];
+                       i = 0;
+                       for (var row:int = 0; row < 8; row++)
+                       {
+                               for (var col:int = 0; col < 8; col++)
+                               {
+                                       fdtbl_Y[i]  = (1.0 / (YTable 
[ZigZag[i]] * aasf[row] * aasf[col] * 8.0));
+                                       fdtbl_UV[i] = (1.0 / 
(UVTable[ZigZag[i]] * aasf[row] * aasf[col] * 8.0));
+                                       i++;
+                               }
+                       }
+               }
+       
+               private var YDC_HT:Array;
+               private var UVDC_HT:Array;
+               private var YAC_HT:Array;
+               private var UVAC_HT:Array;
+       
+               private function computeHuffmanTbl(nrcodes:Array, 
std_table:Array):Array
+               {
+                       var codevalue:int = 0;
+                       var pos_in_table:int = 0;
+                       var HT:Array = new Array();
+                       for (var k:int=1; k<=16; k++) {
+                               for (var j:int=1; j<=nrcodes[k]; j++) {
+                                       HT[std_table[pos_in_table]] = new 
BitString();
+                                       HT[std_table[pos_in_table]].val = 
codevalue;
+                                       HT[std_table[pos_in_table]].len = k;
+                                       pos_in_table++;
+                                       codevalue++;
+                               }
+                               codevalue*=2;
+                       }
+                       return HT;
+               }
+       
+               private var std_dc_luminance_nrcodes:Array = 
[0,0,1,5,1,1,1,1,1,1,0,0,0,0,0,0,0];
+               private var std_dc_luminance_values:Array = 
[0,1,2,3,4,5,6,7,8,9,10,11];
+               private var std_ac_luminance_nrcodes:Array = 
[0,0,2,1,3,3,2,4,3,5,5,4,4,0,0,1,0x7d];
+               private var std_ac_luminance_values:Array = [
+                       0x01,0x02,0x03,0x00,0x04,0x11,0x05,0x12,
+                       0x21,0x31,0x41,0x06,0x13,0x51,0x61,0x07,
+                       0x22,0x71,0x14,0x32,0x81,0x91,0xa1,0x08,
+                       0x23,0x42,0xb1,0xc1,0x15,0x52,0xd1,0xf0,
+                       0x24,0x33,0x62,0x72,0x82,0x09,0x0a,0x16,
+                       0x17,0x18,0x19,0x1a,0x25,0x26,0x27,0x28,
+                       0x29,0x2a,0x34,0x35,0x36,0x37,0x38,0x39,
+                       0x3a,0x43,0x44,0x45,0x46,0x47,0x48,0x49,
+                       0x4a,0x53,0x54,0x55,0x56,0x57,0x58,0x59,
+                       0x5a,0x63,0x64,0x65,0x66,0x67,0x68,0x69,
+                       0x6a,0x73,0x74,0x75,0x76,0x77,0x78,0x79,
+                       0x7a,0x83,0x84,0x85,0x86,0x87,0x88,0x89,
+                       0x8a,0x92,0x93,0x94,0x95,0x96,0x97,0x98,
+                       0x99,0x9a,0xa2,0xa3,0xa4,0xa5,0xa6,0xa7,
+                       0xa8,0xa9,0xaa,0xb2,0xb3,0xb4,0xb5,0xb6,
+                       0xb7,0xb8,0xb9,0xba,0xc2,0xc3,0xc4,0xc5,
+                       0xc6,0xc7,0xc8,0xc9,0xca,0xd2,0xd3,0xd4,
+                       0xd5,0xd6,0xd7,0xd8,0xd9,0xda,0xe1,0xe2,
+                       0xe3,0xe4,0xe5,0xe6,0xe7,0xe8,0xe9,0xea,
+                       0xf1,0xf2,0xf3,0xf4,0xf5,0xf6,0xf7,0xf8,
+                       0xf9,0xfa
+               ];
+       
+               private var std_dc_chrominance_nrcodes:Array = 
[0,0,3,1,1,1,1,1,1,1,1,1,0,0,0,0,0];
+               private var std_dc_chrominance_values:Array = 
[0,1,2,3,4,5,6,7,8,9,10,11];
+               private var std_ac_chrominance_nrcodes:Array = 
[0,0,2,1,2,4,4,3,4,7,5,4,4,0,1,2,0x77];
+               private var std_ac_chrominance_values:Array = [
+                       0x00,0x01,0x02,0x03,0x11,0x04,0x05,0x21,
+                       0x31,0x06,0x12,0x41,0x51,0x07,0x61,0x71,
+                       0x13,0x22,0x32,0x81,0x08,0x14,0x42,0x91,
+                       0xa1,0xb1,0xc1,0x09,0x23,0x33,0x52,0xf0,
+                       0x15,0x62,0x72,0xd1,0x0a,0x16,0x24,0x34,
+                       0xe1,0x25,0xf1,0x17,0x18,0x19,0x1a,0x26,
+                       0x27,0x28,0x29,0x2a,0x35,0x36,0x37,0x38,
+                       0x39,0x3a,0x43,0x44,0x45,0x46,0x47,0x48,
+                       0x49,0x4a,0x53,0x54,0x55,0x56,0x57,0x58,
+                       0x59,0x5a,0x63,0x64,0x65,0x66,0x67,0x68,
+                       0x69,0x6a,0x73,0x74,0x75,0x76,0x77,0x78,
+                       0x79,0x7a,0x82,0x83,0x84,0x85,0x86,0x87,
+                       0x88,0x89,0x8a,0x92,0x93,0x94,0x95,0x96,
+                       0x97,0x98,0x99,0x9a,0xa2,0xa3,0xa4,0xa5,
+                       0xa6,0xa7,0xa8,0xa9,0xaa,0xb2,0xb3,0xb4,
+                       0xb5,0xb6,0xb7,0xb8,0xb9,0xba,0xc2,0xc3,
+                       0xc4,0xc5,0xc6,0xc7,0xc8,0xc9,0xca,0xd2,
+                       0xd3,0xd4,0xd5,0xd6,0xd7,0xd8,0xd9,0xda,
+                       0xe2,0xe3,0xe4,0xe5,0xe6,0xe7,0xe8,0xe9,
+                       0xea,0xf2,0xf3,0xf4,0xf5,0xf6,0xf7,0xf8,
+                       0xf9,0xfa
+               ];
+       
+               private function initHuffmanTbl():void
+               {
+                       YDC_HT = 
computeHuffmanTbl(std_dc_luminance_nrcodes,std_dc_luminance_values);
+                       UVDC_HT = 
computeHuffmanTbl(std_dc_chrominance_nrcodes,std_dc_chrominance_values);
+                       YAC_HT = 
computeHuffmanTbl(std_ac_luminance_nrcodes,std_ac_luminance_values);
+                       UVAC_HT = 
computeHuffmanTbl(std_ac_chrominance_nrcodes,std_ac_chrominance_values);
+               }
+       
+               private var bitcode:Array = new Array(65535);
+               private var category:Array = new Array(65535);
+       
+               private function initCategoryNumber():void
+               {
+                       var nrlower:int = 1;
+                       var nrupper:int = 2;
+                       var nr:int;
+                       for (var cat:int=1; cat<=15; cat++) {
+                               //Positive numbers
+                               for (nr=nrlower; nr<nrupper; nr++) {
+                                       category[32767+nr] = cat;
+                                       bitcode[32767+nr] = new BitString();
+                                       bitcode[32767+nr].len = cat;
+                                       bitcode[32767+nr].val = nr;
+                               }
+                               //Negative numbers
+                               for (nr=-(nrupper-1); nr<=-nrlower; nr++) {
+                                       category[32767+nr] = cat;
+                                       bitcode[32767+nr] = new BitString();
+                                       bitcode[32767+nr].len = cat;
+                                       bitcode[32767+nr].val = nrupper-1+nr;
+                               }
+                               nrlower <<= 1;
+                               nrupper <<= 1;
+                       }
+               }
+       
+               // IO functions
+       
+               private var byteout:ByteArray;
+               private var bytenew:int = 0;
+               private var bytepos:int = 7;
+       
+               private function writeBits(bs:BitString):void
+               {
+                       var value:int = bs.val;
+                       var posval:int = bs.len-1;
+                       while ( posval >= 0 ) {
+                               if (value & uint(1 << posval) ) {
+                                       bytenew |= uint(1 << bytepos);
+                               }
+                               posval--;
+                               bytepos--;
+                               if (bytepos < 0) {
+                                       if (bytenew == 0xFF) {
+                                               writeByte(0xFF);
+                                               writeByte(0);
+                                       }
+                                       else {
+                                               writeByte(bytenew);
+                                       }
+                                       bytepos=7;
+                                       bytenew=0;
+                               }
+                       }
+               }
+       
+               private function writeByte(value:int):void
+               {
+                       byteout.writeByte(value);
+               }
+       
+               private function writeWord(value:int):void
+               {
+                       writeByte((value>>8)&0xFF);
+                       writeByte((value   )&0xFF);
+               }
+       
+               // DCT & quantization core
+       
+               private function fDCTQuant(data:Array, fdtbl:Array):Array
+               {
+                       var tmp0:Number, tmp1:Number, tmp2:Number, tmp3:Number, 
tmp4:Number, tmp5:Number, tmp6:Number, tmp7:Number;
+                       var tmp10:Number, tmp11:Number, tmp12:Number, 
tmp13:Number;
+                       var z1:Number, z2:Number, z3:Number, z4:Number, 
z5:Number, z11:Number, z13:Number;
+                       var i:int;
+                       /* Pass 1: process rows. */
+                       var dataOff:int=0;
+                       for (i=0; i<8; i++) {
+                               tmp0 = data[dataOff+0] + data[dataOff+7];
+                               tmp7 = data[dataOff+0] - data[dataOff+7];
+                               tmp1 = data[dataOff+1] + data[dataOff+6];
+                               tmp6 = data[dataOff+1] - data[dataOff+6];
+                               tmp2 = data[dataOff+2] + data[dataOff+5];
+                               tmp5 = data[dataOff+2] - data[dataOff+5];
+                               tmp3 = data[dataOff+3] + data[dataOff+4];
+                               tmp4 = data[dataOff+3] - data[dataOff+4];
+       
+                               /* Even part */
+                               tmp10 = tmp0 + tmp3;    /* phase 2 */
+                               tmp13 = tmp0 - tmp3;
+                               tmp11 = tmp1 + tmp2;
+                               tmp12 = tmp1 - tmp2;
+       
+                               data[dataOff+0] = tmp10 + tmp11; /* phase 3 */
+                               data[dataOff+4] = tmp10 - tmp11;
+       
+                               z1 = (tmp12 + tmp13) * 0.707106781; /* c4 */
+                               data[dataOff+2] = tmp13 + z1; /* phase 5 */
+                               data[dataOff+6] = tmp13 - z1;
+       
+                               /* Odd part */
+                               tmp10 = tmp4 + tmp5; /* phase 2 */
+                               tmp11 = tmp5 + tmp6;
+                               tmp12 = tmp6 + tmp7;
+       
+                               /* The rotator is modified from fig 4-8 to 
avoid extra negations. */
+                               z5 = (tmp10 - tmp12) * 0.382683433; /* c6 */
+                               z2 = 0.541196100 * tmp10 + z5; /* c2-c6 */
+                               z4 = 1.306562965 * tmp12 + z5; /* c2+c6 */
+                               z3 = tmp11 * 0.707106781; /* c4 */
+       
+                               z11 = tmp7 + z3;        /* phase 5 */
+                               z13 = tmp7 - z3;
+       
+                               data[dataOff+5] = z13 + z2;     /* phase 6 */
+                               data[dataOff+3] = z13 - z2;
+                               data[dataOff+1] = z11 + z4;
+                               data[dataOff+7] = z11 - z4;
+       
+                               dataOff += 8; /* advance pointer to next row */
+                       }
+       
+                       /* Pass 2: process columns. */
+                       dataOff = 0;
+                       for (i=0; i<8; i++) {
+                               tmp0 = data[dataOff+ 0] + data[dataOff+56];
+                               tmp7 = data[dataOff+ 0] - data[dataOff+56];
+                               tmp1 = data[dataOff+ 8] + data[dataOff+48];
+                               tmp6 = data[dataOff+ 8] - data[dataOff+48];
+                               tmp2 = data[dataOff+16] + data[dataOff+40];
+                               tmp5 = data[dataOff+16] - data[dataOff+40];
+                               tmp3 = data[dataOff+24] + data[dataOff+32];
+                               tmp4 = data[dataOff+24] - data[dataOff+32];
+       
+                               /* Even part */
+                               tmp10 = tmp0 + tmp3;    /* phase 2 */
+                               tmp13 = tmp0 - tmp3;
+                               tmp11 = tmp1 + tmp2;
+                               tmp12 = tmp1 - tmp2;
+       
+                               data[dataOff+ 0] = tmp10 + tmp11; /* phase 3 */
+                               data[dataOff+32] = tmp10 - tmp11;
+       
+                               z1 = (tmp12 + tmp13) * 0.707106781; /* c4 */
+                               data[dataOff+16] = tmp13 + z1; /* phase 5 */
+                               data[dataOff+48] = tmp13 - z1;
+       
+                               /* Odd part */
+                               tmp10 = tmp4 + tmp5; /* phase 2 */
+                               tmp11 = tmp5 + tmp6;
+                               tmp12 = tmp6 + tmp7;
+       
+                               /* The rotator is modified from fig 4-8 to 
avoid extra negations. */
+                               z5 = (tmp10 - tmp12) * 0.382683433; /* c6 */
+                               z2 = 0.541196100 * tmp10 + z5; /* c2-c6 */
+                               z4 = 1.306562965 * tmp12 + z5; /* c2+c6 */
+                               z3 = tmp11 * 0.707106781; /* c4 */
+       
+                               z11 = tmp7 + z3;        /* phase 5 */
+                               z13 = tmp7 - z3;
+       
+                               data[dataOff+40] = z13 + z2; /* phase 6 */
+                               data[dataOff+24] = z13 - z2;
+                               data[dataOff+ 8] = z11 + z4;
+                               data[dataOff+56] = z11 - z4;
+       
+                               dataOff++; /* advance pointer to next column */
+                       }
+       
+                       // Quantize/descale the coefficients
+                       for (i=0; i<64; i++) {
+                               // Apply the quantization and scaling factor & 
Round to nearest integer
+                               data[i] = Math.round((data[i]*fdtbl[i]));
+                       }
+                       return data;
+               }
+       
+               // Chunk writing
+       
+               private function writeAPP0():void
+               {
+                       writeWord(0xFFE0); // marker
+                       writeWord(16); // length
+                       writeByte(0x4A); // J
+                       writeByte(0x46); // F
+                       writeByte(0x49); // I
+                       writeByte(0x46); // F
+                       writeByte(0); // = "JFIF",'\0'
+                       writeByte(1); // versionhi
+                       writeByte(1); // versionlo
+                       writeByte(0); // xyunits
+                       writeWord(1); // xdensity
+                       writeWord(1); // ydensity
+                       writeByte(0); // thumbnwidth
+                       writeByte(0); // thumbnheight
+               }
+       
+               private function writeSOF0(width:int, height:int):void
+               {
+                       writeWord(0xFFC0); // marker
+                       writeWord(17);   // length, truecolor YUV JPG
+                       writeByte(8);    // precision
+                       writeWord(height);
+                       writeWord(width);
+                       writeByte(3);    // nrofcomponents
+                       writeByte(1);    // IdY
+                       writeByte(0x11); // HVY
+                       writeByte(0);    // QTY
+                       writeByte(2);    // IdU
+                       writeByte(0x11); // HVU
+                       writeByte(1);    // QTU
+                       writeByte(3);    // IdV
+                       writeByte(0x11); // HVV
+                       writeByte(1);    // QTV
+               }
+       
+               private function writeDQT():void
+               {
+                       writeWord(0xFFDB); // marker
+                       writeWord(132);    // length
+                       writeByte(0);
+                       var i:int;
+                       for (i=0; i<64; i++) {
+                               writeByte(YTable[i]);
+                       }
+                       writeByte(1);
+                       for (i=0; i<64; i++) {
+                               writeByte(UVTable[i]);
+                       }
+               }
+       
+               private function writeDHT():void
+               {
+                       writeWord(0xFFC4); // marker
+                       writeWord(0x01A2); // length
+                       var i:int;
+       
+                       writeByte(0); // HTYDCinfo
+                       for (i=0; i<16; i++) {
+                               writeByte(std_dc_luminance_nrcodes[i+1]);
+                       }
+                       for (i=0; i<=11; i++) {
+                               writeByte(std_dc_luminance_values[i]);
+                       }
+       
+                       writeByte(0x10); // HTYACinfo
+                       for (i=0; i<16; i++) {
+                               writeByte(std_ac_luminance_nrcodes[i+1]);
+                       }
+                       for (i=0; i<=161; i++) {
+                               writeByte(std_ac_luminance_values[i]);
+                       }
+       
+                       writeByte(1); // HTUDCinfo
+                       for (i=0; i<16; i++) {
+                               writeByte(std_dc_chrominance_nrcodes[i+1]);
+                       }
+                       for (i=0; i<=11; i++) {
+                               writeByte(std_dc_chrominance_values[i]);
+                       }
+       
+                       writeByte(0x11); // HTUACinfo
+                       for (i=0; i<16; i++) {
+                               writeByte(std_ac_chrominance_nrcodes[i+1]);
+                       }
+                       for (i=0; i<=161; i++) {
+                               writeByte(std_ac_chrominance_values[i]);
+                       }
+               }
+       
+               private function writeSOS():void
+               {
+                       writeWord(0xFFDA); // marker
+                       writeWord(12); // length
+                       writeByte(3); // nrofcomponents
+                       writeByte(1); // IdY
+                       writeByte(0); // HTY
+                       writeByte(2); // IdU
+                       writeByte(0x11); // HTU
+                       writeByte(3); // IdV
+                       writeByte(0x11); // HTV
+                       writeByte(0); // Ss
+                       writeByte(0x3f); // Se
+                       writeByte(0); // Bf
+               }
+       
+               // Core processing
+               private var DU:Array = new Array(64);
+       
+               private function processDU(CDU:Array, fdtbl:Array, DC:Number, 
HTDC:Array, HTAC:Array):Number
+               {
+                       var EOB:BitString = HTAC[0x00];
+                       var M16zeroes:BitString = HTAC[0xF0];
+                       var i:int;
+       
+                       var DU_DCT:Array = fDCTQuant(CDU, fdtbl);
+                       //ZigZag reorder
+                       for (i=0;i<64;i++) {
+                               DU[ZigZag[i]]=DU_DCT[i];
+                       }
+                       var Diff:int = DU[0] - DC; DC = DU[0];
+                       //Encode DC
+                       if (Diff==0) {
+                               writeBits(HTDC[0]); // Diff might be 0
+                       } else {
+                               writeBits(HTDC[category[32767+Diff]]);
+                               writeBits(bitcode[32767+Diff]);
+                       }
+                       //Encode ACs
+                       var end0pos:int = 63;
+                       for (; (end0pos>0)&&(DU[end0pos]==0); end0pos--) {
+                       };
+                       //end0pos = first element in reverse order !=0
+                       if ( end0pos == 0) {
+                               writeBits(EOB);
+                               return DC;
+                       }
+                       i = 1;
+                       while ( i <= end0pos ) {
+                               var startpos:int = i;
+                               for (; (DU[i]==0) && (i<=end0pos); i++) {
+                               }
+                               var nrzeroes:int = i-startpos;
+                               if ( nrzeroes >= 16 ) {
+                                       for (var nrmarker:int=1; nrmarker <= 
nrzeroes/16; nrmarker++) {
+                                               writeBits(M16zeroes);
+                                       }
+                                       nrzeroes = int(nrzeroes&0xF);
+                               }
+                               
writeBits(HTAC[nrzeroes*16+category[32767+DU[i]]]);
+                               writeBits(bitcode[32767+DU[i]]);
+                               i++;
+                       }
+                       if ( end0pos != 63 ) {
+                               writeBits(EOB);
+                       }
+                       return DC;
+               }
+       
+               private var YDU:Array = new Array(64);
+               private var UDU:Array = new Array(64);
+               private var VDU:Array = new Array(64);
+       
+               private function RGB2YUV(img:BitmapData, xpos:int, 
ypos:int):void
+               {
+                       var pos:int=0;
+                       for (var y:int=0; y<8; y++) {
+                               for (var x:int=0; x<8; x++) {
+                                       var P:uint = 
img.getPixel32(xpos+x,ypos+y);
+                                       var R:Number = Number((P>>16)&0xFF);
+                                       var G:Number = Number((P>> 8)&0xFF);
+                                       var B:Number = Number((P    )&0xFF);
+                                       YDU[pos]=((( 0.29900)*R+( 0.58700)*G+( 
0.11400)*B))-128;
+                                       UDU[pos]=(((-0.16874)*R+(-0.33126)*G+( 
0.50000)*B));
+                                       VDU[pos]=((( 
0.50000)*R+(-0.41869)*G+(-0.08131)*B));
+                                       pos++;
+                               }
+                       }
+               }
+       
+               /**
+                * Constructor for JPEGEncoder class
+                *
+                * @param quality The quality level between 1 and 100 that 
detrmines the
+                * level of compression used in the generated JPEG
+                * @langversion ActionScript 3.0
+                * @playerversion Flash 9.0
+                * @tiptext
+                */             
+               public function JPGEncoder(quality:Number = 50)
+               {
+                       if (quality <= 0) {
+                               quality = 1;
+                       }
+                       if (quality > 100) {
+                               quality = 100;
+                       }
+                       var sf:int = 0;
+                       if (quality < 50) {
+                               sf = int(5000 / quality);
+                       } else {
+                               sf = int(200 - quality*2);
+                       }
+                       // Create tables
+                       initHuffmanTbl();
+                       initCategoryNumber();
+                       initQuantTables(sf);
+               }
+       
+               /**
+                * Created a JPEG image from the specified BitmapData
+                *
+                * @param image The BitmapData that will be converted into the 
JPEG format.
+                * @return a ByteArray representing the JPEG encoded image data.
+                * @langversion ActionScript 3.0
+                * @playerversion Flash 9.0
+                * @tiptext
+                */     
+               public function encode(image:BitmapData):ByteArray
+               {
+                       // Initialize bit writer
+                       byteout = new ByteArray();
+                       bytenew=0;
+                       bytepos=7;
+       
+                       // Add JPEG headers
+                       writeWord(0xFFD8); // SOI
+                       writeAPP0();
+                       writeDQT();
+                       writeSOF0(image.width,image.height);
+                       writeDHT();
+                       writeSOS();
+
+       
+                       // Encode 8x8 macroblocks
+                       var DCY:Number=0;
+                       var DCU:Number=0;
+                       var DCV:Number=0;
+                       bytenew=0;
+                       bytepos=7;
+                       for (var ypos:int=0; ypos<image.height; ypos+=8) {
+                               for (var xpos:int=0; xpos<image.width; xpos+=8) 
{
+                                       RGB2YUV(image, xpos, ypos);
+                                       DCY = processDU(YDU, fdtbl_Y, DCY, 
YDC_HT, YAC_HT);
+                                       DCU = processDU(UDU, fdtbl_UV, DCU, 
UVDC_HT, UVAC_HT);
+                                       DCV = processDU(VDU, fdtbl_UV, DCV, 
UVDC_HT, UVAC_HT);
+                               }
+                       }
+       
+                       // Do the bit alignment of the EOI marker
+                       if ( bytepos >= 0 ) {
+                               var fillbits:BitString = new BitString();
+                               fillbits.len = bytepos+1;
+                               fillbits.val = (1<<(bytepos+1))-1;
+                               writeBits(fillbits);
+                       }
+       
+                       writeWord(0xFFD9); //EOI
+                       return byteout;
+               }
+       }
+}

Added: trunk/phpgwapi/js/uploadify/com/adobe/images/PNGEncoder.as
===================================================================
--- trunk/phpgwapi/js/uploadify/com/adobe/images/PNGEncoder.as                  
        (rev 0)
+++ trunk/phpgwapi/js/uploadify/com/adobe/images/PNGEncoder.as  2011-04-01 
10:39:57 UTC (rev 7152)
@@ -0,0 +1,141 @@
+/*
+  Copyright (c) 2008, Adobe Systems Incorporated
+  All rights reserved.
+
+  Redistribution and use in source and binary forms, with or without 
+  modification, are permitted provided that the following conditions are
+  met:
+
+  * Redistributions of source code must retain the above copyright notice, 
+    this list of conditions and the following disclaimer.
+  
+  * Redistributions in binary form must reproduce the above copyright
+    notice, this list of conditions and the following disclaimer in the 
+    documentation and/or other materials provided with the distribution.
+  
+  * Neither the name of Adobe Systems Incorporated nor the names of its 
+    contributors may be used to endorse or promote products derived from 
+    this software without specific prior written permission.
+
+  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+  IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+  THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+  PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR 
+  CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+  EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+  PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+  PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+  LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+  NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+package com.adobe.images
+{
+       import flash.geom.*;
+       import flash.display.Bitmap;
+       import flash.display.BitmapData;
+       import flash.utils.ByteArray;
+
+       /**
+        * Class that converts BitmapData into a valid PNG
+        */     
+       public class PNGEncoder
+       {
+               /**
+                * Created a PNG image from the specified BitmapData
+                *
+                * @param image The BitmapData that will be converted into the 
PNG format.
+                * @return a ByteArray representing the PNG encoded image data.
+                * @langversion ActionScript 3.0
+                * @playerversion Flash 9.0
+                * @tiptext
+                */                     
+           public static function encode(img:BitmapData):ByteArray {
+               // Create output byte array
+               var png:ByteArray = new ByteArray();
+               // Write PNG signature
+               png.writeUnsignedInt(0x89504e47);
+               png.writeUnsignedInt(0x0D0A1A0A);
+               // Build IHDR chunk
+               var IHDR:ByteArray = new ByteArray();
+               IHDR.writeInt(img.width);
+               IHDR.writeInt(img.height);
+               IHDR.writeUnsignedInt(0x08060000); // 32bit RGBA
+               IHDR.writeByte(0);
+               writeChunk(png,0x49484452,IHDR);
+               // Build IDAT chunk
+               var IDAT:ByteArray= new ByteArray();
+               for(var i:int=0;i < img.height;i++) {
+                   // no filter
+                   IDAT.writeByte(0);
+                   var p:uint;
+                   var j:int;
+                   if ( !img.transparent ) {
+                       for(j=0;j < img.width;j++) {
+                           p = img.getPixel(j,i);
+                           IDAT.writeUnsignedInt(
+                               uint(((p&0xFFFFFF) << 8)|0xFF));
+                       }
+                   } else {
+                       for(j=0;j < img.width;j++) {
+                           p = img.getPixel32(j,i);
+                           IDAT.writeUnsignedInt(
+                               uint(((p&0xFFFFFF) << 8)|
+                               (p>>>24)));
+                       }
+                   }
+               }
+               IDAT.compress();
+               writeChunk(png,0x49444154,IDAT);
+               // Build IEND chunk
+               writeChunk(png,0x49454E44,null);
+               // return PNG
+               return png;
+           }
+       
+           private static var crcTable:Array;
+           private static var crcTableComputed:Boolean = false;
+       
+           private static function writeChunk(png:ByteArray, 
+                   type:uint, data:ByteArray):void {
+               if (!crcTableComputed) {
+                   crcTableComputed = true;
+                   crcTable = [];
+                   var c:uint;
+                   for (var n:uint = 0; n < 256; n++) {
+                       c = n;
+                       for (var k:uint = 0; k < 8; k++) {
+                           if (c & 1) {
+                               c = uint(uint(0xedb88320) ^ 
+                                   uint(c >>> 1));
+                           } else {
+                               c = uint(c >>> 1);
+                           }
+                       }
+                       crcTable[n] = c;
+                   }
+               }
+               var len:uint = 0;
+               if (data != null) {
+                   len = data.length;
+               }
+               png.writeUnsignedInt(len);
+               var p:uint = png.position;
+               png.writeUnsignedInt(type);
+               if ( data != null ) {
+                   png.writeBytes(data);
+               }
+               var e:uint = png.position;
+               png.position = p;
+               c = 0xffffffff;
+               for (var i:int = 0; i < (e-p); i++) {
+                   c = uint(crcTable[
+                       (c ^ png.readUnsignedByte()) & 
+                       uint(0xff)] ^ uint(c >>> 8));
+               }
+               c = uint(c^uint(0xffffffff));
+               png.position = e;
+               png.writeUnsignedInt(c);
+           }
+       }
+}
\ No newline at end of file

Added: trunk/phpgwapi/js/uploadify/com/adobe/net/DynamicURLLoader.as
===================================================================
--- trunk/phpgwapi/js/uploadify/com/adobe/net/DynamicURLLoader.as               
                (rev 0)
+++ trunk/phpgwapi/js/uploadify/com/adobe/net/DynamicURLLoader.as       
2011-04-01 10:39:57 UTC (rev 7152)
@@ -0,0 +1,55 @@
+/*
+  Copyright (c) 2008, Adobe Systems Incorporated
+  All rights reserved.
+
+  Redistribution and use in source and binary forms, with or without 
+  modification, are permitted provided that the following conditions are
+  met:
+
+  * Redistributions of source code must retain the above copyright notice, 
+    this list of conditions and the following disclaimer.
+  
+  * Redistributions in binary form must reproduce the above copyright
+    notice, this list of conditions and the following disclaimer in the 
+    documentation and/or other materials provided with the distribution.
+  
+  * Neither the name of Adobe Systems Incorporated nor the names of its 
+    contributors may be used to endorse or promote products derived from 
+    this software without specific prior written permission.
+
+  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+  IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+  THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+  PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR 
+  CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+  EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+  PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+  PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+  LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+  NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+package com.adobe.net
+{
+       import flash.net.URLLoader;
+
+       /**
+       *       Class that provides a dynamic implimentation of the URLLoader 
class.
+       * 
+       *       This class provides no API implimentations. However, since the 
class is
+       *       declared as dynamic, it can be used in place of URLLoader, and 
allow
+       *       you to dynamically attach properties to it (which URLLoader 
does not allow).
+       * 
+       *       @langversion ActionScript 3.0
+       *       @playerversion Flash 9.0
+       *       @tiptext
+       */      
+       public dynamic class DynamicURLLoader extends URLLoader 
+       {
+               public function DynamicURLLoader()
+               {
+                       super();
+               }
+       }
+}
\ No newline at end of file

Added: trunk/phpgwapi/js/uploadify/com/adobe/net/IURIResolver.as
===================================================================
--- trunk/phpgwapi/js/uploadify/com/adobe/net/IURIResolver.as                   
        (rev 0)
+++ trunk/phpgwapi/js/uploadify/com/adobe/net/IURIResolver.as   2011-04-01 
10:39:57 UTC (rev 7152)
@@ -0,0 +1,76 @@
+/*
+  Copyright (c) 2008, Adobe Systems Incorporated
+  All rights reserved.
+
+  Redistribution and use in source and binary forms, with or without 
+  modification, are permitted provided that the following conditions are
+  met:
+
+  * Redistributions of source code must retain the above copyright notice, 
+    this list of conditions and the following disclaimer.
+  
+  * Redistributions in binary form must reproduce the above copyright
+    notice, this list of conditions and the following disclaimer in the 
+    documentation and/or other materials provided with the distribution.
+  
+  * Neither the name of Adobe Systems Incorporated nor the names of its 
+    contributors may be used to endorse or promote products derived from 
+    this software without specific prior written permission.
+
+  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+  IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+  THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+  PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR 
+  CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+  EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+  PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+  PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+  LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+  NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+package com.adobe.net
+{
+       /**
+        * The URI class cannot know about DNS aliases, virtual hosts, or
+        * symbolic links that may be involved.  The application can provide
+        * an implementation of this interface to resolve the URI before the
+        * URI class makes any comparisons.  For example, a web host has
+        * two aliases:
+        * 
+        * <p><code>
+        *    http://www.site.com/
+        *    http://www.site.net/
+        * </code></p>
+        * 
+        * <p>The application can provide an implementation that automatically
+        * resolves site.net to site.com before URI compares two URI objects.
+        * Only the application can know and understand the context in which
+        * the URI's are being used.</p>
+        * 
+        * <p>Use the URI.resolver accessor to assign a custom resolver to
+        * the URI class.  Any resolver specified is global to all instances
+        * of URI.</p>
+        * 
+        * <p>URI will call this before performing URI comparisons in the
+        * URI.getRelation() and URI.getCommonParent() functions.
+        * 
+        * @see URI.getRelation
+        * @see URI.getCommonParent
+        * 
+        * @langversion ActionScript 3.0
+        * @playerversion Flash 9.0
+        */
+       public interface IURIResolver
+       {
+               /**
+                * Implement this method to provide custom URI resolution for
+                * your application.
+                * 
+                * @langversion ActionScript 3.0
+                * @playerversion Flash 9.0
+                */
+               function resolve(uri:URI) : URI;
+       }
+}
\ No newline at end of file

Added: trunk/phpgwapi/js/uploadify/com/adobe/net/MimeTypeMap.as
===================================================================
--- trunk/phpgwapi/js/uploadify/com/adobe/net/MimeTypeMap.as                    
        (rev 0)
+++ trunk/phpgwapi/js/uploadify/com/adobe/net/MimeTypeMap.as    2011-04-01 
10:39:57 UTC (rev 7152)
@@ -0,0 +1,196 @@
+/*
+  Copyright (c) 2008, Adobe Systems Incorporated
+  All rights reserved.
+
+  Redistribution and use in source and binary forms, with or without 
+  modification, are permitted provided that the following conditions are
+  met:
+
+  * Redistributions of source code must retain the above copyright notice, 
+    this list of conditions and the following disclaimer.
+  
+  * Redistributions in binary form must reproduce the above copyright
+    notice, this list of conditions and the following disclaimer in the 
+    documentation and/or other materials provided with the distribution.
+  
+  * Neither the name of Adobe Systems Incorporated nor the names of its 
+    contributors may be used to endorse or promote products derived from 
+    this software without specific prior written permission.
+
+  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+  IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+  THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+  PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR 
+  CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+  EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+  PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+  PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+  LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+  NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+package com.adobe.net
+{
+       public class MimeTypeMap
+       {
+               private var types:Array = 
+                       [["application/andrew-inset","ez"],
+                       ["application/atom+xml","atom"],
+                       ["application/mac-binhex40","hqx"],
+                       ["application/mac-compactpro","cpt"],
+                       ["application/mathml+xml","mathml"],
+                       ["application/msword","doc"],
+                       
["application/octet-stream","bin","dms","lha","lzh","exe","class","so","dll","dmg"],
+                       ["application/oda","oda"],
+                       ["application/ogg","ogg"],
+                       ["application/pdf","pdf"],
+                       ["application/postscript","ai","eps","ps"],
+                       ["application/rdf+xml","rdf"],
+                       ["application/smil","smi","smil"],
+                       ["application/srgs","gram"],
+                       ["application/srgs+xml","grxml"],
+                       
["application/vnd.adobe.apollo-application-installer-package+zip","air"],
+                       ["application/vnd.mif","mif"],
+                       ["application/vnd.mozilla.xul+xml","xul"],
+                       ["application/vnd.ms-excel","xls"],
+                       ["application/vnd.ms-powerpoint","ppt"],
+                       ["application/vnd.rn-realmedia","rm"],
+                       ["application/vnd.wap.wbxml","wbxml"],
+                       ["application/vnd.wap.wmlc","wmlc"],
+                       ["application/vnd.wap.wmlscriptc","wmlsc"],
+                       ["application/voicexml+xml","vxml"],
+                       ["application/x-bcpio","bcpio"],
+                       ["application/x-cdlink","vcd"],
+                       ["application/x-chess-pgn","pgn"],
+                       ["application/x-cpio","cpio"],
+                       ["application/x-csh","csh"],
+                       ["application/x-director","dcr","dir","dxr"],
+                       ["application/x-dvi","dvi"],
+                       ["application/x-futuresplash","spl"],
+                       ["application/x-gtar","gtar"],
+                       ["application/x-hdf","hdf"],
+                       ["application/x-javascript","js"],
+                       ["application/x-koan","skp","skd","skt","skm"],
+                       ["application/x-latex","latex"],
+                       ["application/x-netcdf","nc","cdf"],
+                       ["application/x-sh","sh"],
+                       ["application/x-shar","shar"],
+                       ["application/x-shockwave-flash","swf"],
+                       ["application/x-stuffit","sit"],
+                       ["application/x-sv4cpio","sv4cpio"],
+                       ["application/x-sv4crc","sv4crc"],
+                       ["application/x-tar","tar"],
+                       ["application/x-tcl","tcl"],
+                       ["application/x-tex","tex"],
+                       ["application/x-texinfo","texinfo","texi"],
+                       ["application/x-troff","t","tr","roff"],
+                       ["application/x-troff-man","man"],
+                       ["application/x-troff-me","me"],
+                       ["application/x-troff-ms","ms"],
+                       ["application/x-ustar","ustar"],
+                       ["application/x-wais-source","src"],
+                       ["application/xhtml+xml","xhtml","xht"],
+                       ["application/xml","xml","xsl"],
+                       ["application/xml-dtd","dtd"],
+                       ["application/xslt+xml","xslt"],
+                       ["application/zip","zip"],
+                       ["audio/basic","au","snd"],
+                       ["audio/midi","mid","midi","kar"],
+                       ["audio/mpeg","mp3","mpga","mp2"],
+                       ["audio/x-aiff","aif","aiff","aifc"],
+                       ["audio/x-mpegurl","m3u"],
+                       ["audio/x-pn-realaudio","ram","ra"],
+                       ["audio/x-wav","wav"],
+                       ["chemical/x-pdb","pdb"],
+                       ["chemical/x-xyz","xyz"],
+                       ["image/bmp","bmp"],
+                       ["image/cgm","cgm"],
+                       ["image/gif","gif"],
+                       ["image/ief","ief"],
+                       ["image/jpeg","jpg","jpeg","jpe"],
+                       ["image/png","png"],
+                       ["image/svg+xml","svg"],
+                       ["image/tiff","tiff","tif"],
+                       ["image/vnd.djvu","djvu","djv"],
+                       ["image/vnd.wap.wbmp","wbmp"],
+                       ["image/x-cmu-raster","ras"],
+                       ["image/x-icon","ico"],
+                       ["image/x-portable-anymap","pnm"],
+                       ["image/x-portable-bitmap","pbm"],
+                       ["image/x-portable-graymap","pgm"],
+                       ["image/x-portable-pixmap","ppm"],
+                       ["image/x-rgb","rgb"],
+                       ["image/x-xbitmap","xbm"],
+                       ["image/x-xpixmap","xpm"],
+                       ["image/x-xwindowdump","xwd"],
+                       ["model/iges","igs","iges"],
+                       ["model/mesh","msh","mesh","silo"],
+                       ["model/vrml","wrl","vrml"],
+                       ["text/calendar","ics","ifb"],
+                       ["text/css","css"],
+                       ["text/html","html","htm"],
+                       ["text/plain","txt","asc"],
+                       ["text/richtext","rtx"],
+                       ["text/rtf","rtf"],
+                       ["text/sgml","sgml","sgm"],
+                       ["text/tab-separated-values","tsv"],
+                       ["text/vnd.wap.wml","wml"],
+                       ["text/vnd.wap.wmlscript","wmls"],
+                       ["text/x-setext","etx"],
+                       ["video/mpeg","mpg","mpeg","mpe"],
+                       ["video/quicktime","mov","qt"],
+                       ["video/vnd.mpegurl","m4u","mxu"],
+                       ["video/x-flv","flv"],
+                       ["video/x-msvideo","avi"],
+                       ["video/x-sgi-movie","movie"],
+                       ["x-conference/x-cooltalk","ice"]];
+               
+               /**
+                * Returns the mimetype for the given extension.
+                */
+               public function getMimeType(extension:String):String
+               {
+                       extension = extension.toLocaleLowerCase();
+                       for each (var a:Array in types)
+                       {
+                               for each (var b:String in a)
+                               {
+                                       if (b == extension)
+                                       {
+                                               return a[0];
+                                       }
+                               }
+                       }
+                       return null;
+               }
+
+               /**
+                * Returns the prefered extension for the given mimetype.
+                */
+               public function getExtension(mimetype:String):String
+               {
+                       mimetype = mimetype.toLocaleLowerCase();
+                       for each (var a:Array in types)
+                       {
+                               if (a[0] == mimetype)
+                               {
+                                       return a[1];
+                               }
+                       }
+                       return null;
+               }
+
+               /**
+                * Adds a mimetype to the map. The order of the extensions 
matters. The most preferred should come first.
+                */
+               public function addMimeType(mimetype:String, 
extensions:Array):void
+               {
+                       var newType:Array = [mimetype];
+                       for each (var a:String in extensions)
+                       {
+                               newType.push(a);
+                       }
+                       types.push(newType);
+               }
+       }
+}
\ No newline at end of file

Added: trunk/phpgwapi/js/uploadify/com/adobe/net/URI.as
===================================================================
--- trunk/phpgwapi/js/uploadify/com/adobe/net/URI.as                            
(rev 0)
+++ trunk/phpgwapi/js/uploadify/com/adobe/net/URI.as    2011-04-01 10:39:57 UTC 
(rev 7152)
@@ -0,0 +1,2466 @@
+/*
+  Copyright (c) 2008, Adobe Systems Incorporated
+  All rights reserved.
+
+  Redistribution and use in source and binary forms, with or without 
+  modification, are permitted provided that the following conditions are
+  met:
+
+  * Redistributions of source code must retain the above copyright notice, 
+    this list of conditions and the following disclaimer.
+  
+  * Redistributions in binary form must reproduce the above copyright
+    notice, this list of conditions and the following disclaimer in the 
+    documentation and/or other materials provided with the distribution.
+  
+  * Neither the name of Adobe Systems Incorporated nor the names of its 
+    contributors may be used to endorse or promote products derived from 
+    this software without specific prior written permission.
+
+  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+  IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+  THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+  PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR 
+  CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+  EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+  PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+  PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+  LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+  NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+package com.adobe.net
+{
+       import flash.utils.ByteArray;
+       
+       /**
+        * This class implements functions and utilities for working with URI's
+        * (Universal Resource Identifiers).  For technical description of the
+        * URI syntax, please see RFC 3986 at 
http://www.ietf.org/rfc/rfc3986.txt
+        * or do a web search for "rfc 3986".
+        * 
+        * <p>The most important aspect of URI's to understand is that URI's
+        * and URL's are not strings.  URI's are complex data structures that
+        * encapsulate many pieces of information.  The string version of a
+        * URI is the serialized representation of that data structure.  This
+        * string serialization is used to provide a human readable
+        * representation and a means to transport the data over the network
+        * where it can then be parsed back into its' component parts.</p>
+        * 
+        * <p>URI's fall into one of three categories:
+        * <ul>
+        *  <li>&lt;scheme&gt;:&lt;scheme-specific-part&gt;#&lt;fragment&gt;    
        (non-hierarchical)</li>
+        *  
<li>&lt;scheme&gt;:<authority&gt;&lt;path&gt;?&lt;query&gt;#&lt;fragment&gt;    
    (hierarchical)</li>
+        *  <li>&lt;path&gt;?&lt;query&gt;#&lt;fragment&gt;                     
                        (relative hierarchical)</li>
+        * </ul></p>
+        * 
+        * <p>The query and fragment parts are optional.</p>
+        * 
+        * <p>This class supports both non-hierarchical and hierarchical 
URI's</p>
+        * 
+        * <p>This class is intended to be used "as-is" for the vast majority
+        * of common URI's.  However, if your application requires a custom
+        * URI syntax (e.g. custom query syntax or special handling of
+        * non-hierarchical URI's), this class can be fully subclassed.  If you
+        * intended to subclass URI, please see the source code for complete
+        * documation on protected members and protected fuctions.</p>
+        * 
+        * @langversion ActionScript 3.0
+        * @playerversion Flash 9.0 
+        */
+       public class URI
+       {       
+               // Here we define which characters must be escaped for each
+               // URI part.  The characters that must be escaped for each
+               // part differ depending on what would cause ambiguous parsing.
+               // RFC 3986 sec. 2.4 states that characters should only be
+               // encoded when they would conflict with subcomponent 
delimiters.
+               // We don't want to over-do the escaping.  We only want to 
escape
+               // the minimum needed to prevent parsing problems.
+               
+               // space and % must be escaped in all cases.  '%' is the 
delimiter
+               // for escaped characters.
+               public static const URImustEscape:String =      " %";
+               
+               // Baseline of what characters must be escaped
+               public static const URIbaselineEscape:String = URImustEscape + 
":?#/@";
+               
+               // Characters that must be escaped in the part part.
+               public static const URIpathEscape:String = URImustEscape + "?#";
+               
+               // Characters that must be escaped in the query part, if setting
+               // the query as a whole string.  If the query is set by
+               // name/value, URIqueryPartEscape is used instead.
+               public static const URIqueryEscape:String = URImustEscape + "#";
+               
+               // This is what each name/value pair must escape "&=" as well
+               // so they don't conflict with the "param=value&param2=value2"
+               // syntax.
+               public static const URIqueryPartEscape:String = URImustEscape + 
"#&=";
+               
+               // Non-hierarchical URI's can have query and fragment parts, but
+               // we also want to prevent '/' otherwise it might end up looking
+               // like a hierarchical URI to the parser.
+               public static const URInonHierEscape:String =   URImustEscape + 
"?#/";
+               
+               // Baseline uninitialized setting for the URI scheme.
+               public static const UNKNOWN_SCHEME:String = "unknown";
+               
+               // The following bitmaps are used for performance enhanced
+               // character escaping.
+               
+               // Baseline characters that need to be escaped.  Many parts use
+               // this.
+               protected static const 
URIbaselineExcludedBitmap:URIEncodingBitmap =
+                       new URIEncodingBitmap(URIbaselineEscape);
+               
+               // Scheme escaping bitmap
+               protected static const 
URIschemeExcludedBitmap:URIEncodingBitmap = 
+                       URIbaselineExcludedBitmap;
+               
+               // User/pass escaping bitmap
+               protected static const 
URIuserpassExcludedBitmap:URIEncodingBitmap =
+                       URIbaselineExcludedBitmap;
+               
+               // Authority escaping bitmap
+               protected static const 
URIauthorityExcludedBitmap:URIEncodingBitmap =
+                       URIbaselineExcludedBitmap;
+                       
+               // Port escaping bitmap
+               protected static const URIportExludedBitmap:URIEncodingBitmap = 
+                       URIbaselineExcludedBitmap;
+               
+               // Path escaping bitmap
+               protected static const URIpathExcludedBitmap:URIEncodingBitmap =
+                       new URIEncodingBitmap(URIpathEscape);
+                       
+               // Query (whole) escaping bitmap
+               protected static const URIqueryExcludedBitmap:URIEncodingBitmap 
=
+                       new URIEncodingBitmap(URIqueryEscape);
+                       
+               // Query (individual parts) escaping bitmap
+               protected static const 
URIqueryPartExcludedBitmap:URIEncodingBitmap =
+                       new URIEncodingBitmap(URIqueryPartEscape);
+                       
+               // Fragments are the last part in the URI.  They only need to
+               // escape space, '#', and '%'.  Turns out that is what query
+               // uses too.
+               protected static const 
URIfragmentExcludedBitmap:URIEncodingBitmap =
+                       URIqueryExcludedBitmap;
+                       
+               // Characters that need to be escaped in the non-hierarchical 
part
+               protected static const 
URInonHierexcludedBitmap:URIEncodingBitmap =
+                       new URIEncodingBitmap(URInonHierEscape);
+                       
+               // Values used by getRelation()
+               public static const NOT_RELATED:int = 0;
+               public static const CHILD:int = 1;
+               public static const EQUAL:int = 2;
+               public static const PARENT:int = 3;
+
+               
//-------------------------------------------------------------------
+               // protected class members
+               
//-------------------------------------------------------------------
+               protected var _valid:Boolean = false;
+               protected var _relative:Boolean = false;
+               protected var _scheme:String = "";
+               protected var _authority:String = "";
+               protected var _username:String = "";
+               protected var _password:String = "";
+               protected var _port:String = "";
+               protected var _path:String = "";
+               protected var _query:String = "";
+               protected var _fragment:String = "";
+               protected var _nonHierarchical:String = "";
+               protected static var _resolver:IURIResolver = null;
+
+
+               /**
+                *  URI Constructor.  If no string is given, this will 
initialize
+                *  this URI object to a blank URI.
+                */
+               public function URI(uri:String = null) : void   
+               {
+                       if (uri == null)
+                               initialize();
+                       else
+                               constructURI(uri);
+               }
+
+               
+               /**
+                * @private
+                * Method that loads the URI from the given string.
+                */
+               protected function constructURI(uri:String) : Boolean
+               {
+                       if (!parseURI(uri))
+                               _valid = false;
+                               
+                       return isValid();
+               }
+               
+               
+               /**
+                * @private Private initializiation.
+                */
+               protected function initialize() : void
+               {
+                       _valid = false;
+                       _relative = false;
+               
+                       _scheme = UNKNOWN_SCHEME;
+                       _authority = "";
+                       _username = "";
+                       _password = "";
+                       _port = "";
+                       _path = "";
+                       _query = "";
+                       _fragment = "";
+               
+                       _nonHierarchical = "";
+               }       
+               
+               /**
+                * @private Accessor to explicitly set/get the hierarchical
+                * state of the URI.
+                */
+               protected function set hierState(state:Boolean) : void
+               {
+                       if (state)
+                       {
+                               // Clear the non-hierarchical data
+                               _nonHierarchical = "";
+               
+                               // Also set the state vars while we are at it
+                               if (_scheme == "" || _scheme == UNKNOWN_SCHEME)
+                                       _relative = true;
+                               else
+                                       _relative = false;
+               
+                               if (_authority.length == 0 && _path.length == 0)
+                                       _valid = false;
+                               else
+                                       _valid = true;
+                       }
+                       else
+                       {
+                               // Clear the hierarchical data
+                               _authority = "";
+                               _username = "";
+                               _password = "";
+                               _port = "";
+                               _path = "";
+               
+                               _relative = false;
+               
+                               if (_scheme == "" || _scheme == UNKNOWN_SCHEME)
+                                       _valid = false;
+                               else
+                                       _valid = true;
+                       }
+               }
+               protected function get hierState() : Boolean
+               {
+                       return (_nonHierarchical.length == 0);
+               }
+               
+               
+               /**
+                * @private Functions that performs some basic consistency 
validation.
+                */
+               protected function validateURI() : Boolean
+               {
+                       // Check the scheme
+                       if (isAbsolute())
+                       {
+                               if (_scheme.length <= 1 || _scheme == 
UNKNOWN_SCHEME)
+                               {
+                                       // we probably parsed a C:\ type path 
or no scheme
+                                       return false;
+                               }
+                               else if (verifyAlpha(_scheme) == false)
+                                       return false;  // Scheme contains bad 
characters
+                       }
+                       
+                       if (hierState)
+                       {
+                               if (_path.search('\\') != -1)
+                                       return false;  // local path
+                               else if (isRelative() == false && _scheme == 
UNKNOWN_SCHEME)
+                                       return false;  // It's an absolute URI, 
but it has a bad scheme
+                       }
+                       else
+                       {
+                               if (_nonHierarchical.search('\\') != -1)
+                                       return false;  // some kind of local 
path
+                       }
+               
+                       // Looks like it's ok.
+                       return true;
+               }
+               
+               
+               /**
+                * @private
+                *
+                * Given a URI in string format, parse that sucker into its 
basic
+                * components and assign them to this object.  A URI is of the 
form:
+                *    <scheme>:<authority><path>?<query>#<fragment>
+                *
+                * For simplicity, we parse the URI in the following order:
+                *              
+                *              1. Fragment (anchors)
+                *              2. Query        (CGI stuff)
+                *              3. Scheme       ("http")
+                *              4. Authority (host name)
+                *              5. Username/Password (if any)
+                *              6. Port         (server port if any)
+                *              7. Path         (/homepages/mypage.html)
+                *
+                * The reason for this order is to minimize any parsing 
ambiguities.
+                * Fragments and queries can contain almost anything (they are 
parts
+                * that can contain custom data with their own syntax).  Parsing
+                * them out first removes a large chance of parsing errors.  
This
+                * method expects well formed URI's, but performing the parse in
+                * this order makes us a little more tolerant of user error.
+                * 
+                * REGEXP
+                * Why doesn't this use regular expressions to parse the URI?  
We
+                * have found that in a real world scenario, URI's are not 
always
+                * well formed.  Sometimes characters that should have been 
escaped
+                * are not, and those situations would break a regexp pattern.  
This
+                * function attempts to be smart about what it is parsing based 
on
+                * location of characters relative to eachother.  This function 
has
+                * been proven through real-world use to parse the vast majority
+                * of URI's correctly.
+                *
+                * NOTE
+                * It is assumed that the string in URI form is escaped.  This 
function
+                * does not escape anything.  If you constructed the URI string 
by
+                * hand, and used this to parse in the URI and still need it 
escaped,
+                * call forceEscape() on your URI object.
+                *
+                * Parsing Assumptions
+                * This routine assumes that the URI being passed is well 
formed.
+                * Passing things like local paths, malformed URI's, and the 
such
+                * will result in parsing errors.  This function can handle
+                *       - absolute hierarchical (e.g. 
"http://something.com/index.html),
+                *   - relative hierarchical (e.g. "../images/flower.gif"), or
+                *   - non-hierarchical URIs (e.g. "mailto:address@hidden";).
+                * 
+                * Anything else will probably result in a parsing error, or a 
bogus
+                * URI object.
+                * 
+                * Note that non-hierarchical URIs *MUST* have a scheme, 
otherwise
+                * they will be mistaken for relative URI's.
+                * 
+                * If you are not sure what is being passed to you (like 
manually
+                * entered text from UI), you can construct a blank URI object 
and
+                * call unknownToURI() passing in the unknown string.
+                * 
+                * @return      true if successful, false if there was some 
kind of
+                * parsing error
+                */
+               protected function parseURI(uri:String) : Boolean
+               {
+                       var baseURI:String = uri;
+                       var index:int, index2:int;
+               
+                       // Make sure this object is clean before we start.  If 
it was used
+                       // before and we are now parsing a new URI, we don't 
want any stale
+                       // info lying around.
+                       initialize();
+               
+                       // Remove any fragments (anchors) from the URI
+                       index = baseURI.indexOf("#");
+                       if (index != -1)
+                       {
+                               // Store the fragment piece if any
+                               if (baseURI.length > (index + 1)) // +1 is to 
skip the '#'
+                                       _fragment = baseURI.substr(index + 1, 
baseURI.length - (index + 1)); 
+               
+                               // Trim off the fragment
+                               baseURI = baseURI.substr(0, index);
+                       }
+               
+                       // We need to strip off any CGI parameters (eg 
'?param=bob')
+                       index = baseURI.indexOf("?");
+                       if (index != -1)
+                       {
+                               if (baseURI.length > (index + 1))
+                                       _query = baseURI.substr(index + 1, 
baseURI.length - (index + 1)); // +1 is to skip the '?'
+               
+                               // Trim off the query
+                               baseURI = baseURI.substr(0, index);
+                       }
+               
+                       // Now try to find the scheme part
+                       index = baseURI.search(':');
+                       index2 = baseURI.search('/');
+               
+                       var containsColon:Boolean = (index != -1);
+                       var containsSlash:Boolean = (index2 != -1);
+               
+                       // This value is indeterminate if "containsColon" is 
false.
+                       // (if there is no colon, does the slash come before or
+                       // after said non-existing colon?)
+                       var colonBeforeSlash:Boolean = (!containsSlash || index 
< index2);
+               
+                       // If it has a colon and it's before the first slash, 
we will treat
+                       // it as a scheme.  If a slash is before a colon, there 
must be a
+                       // stray colon in a path or something.  In which case, 
the colon is
+                       // not the separator for the scheme.  Technically, we 
could consider
+                       // this an error, but since this is not an ambiguous 
state (we know
+                       // 100% that this has no scheme), we will keep going.
+                       if (containsColon && colonBeforeSlash)
+                       {
+                               // We found a scheme
+                               _scheme = baseURI.substr(0, index);
+                               
+                               // Normalize the scheme
+                               _scheme = _scheme.toLowerCase();
+               
+                               baseURI = baseURI.substr(index + 1);
+               
+                               if (baseURI.substr(0, 2) == "//")
+                               {
+                                       // This is a hierarchical URI
+                                       _nonHierarchical = "";
+               
+                                       // Trim off the "//"
+                                       baseURI = baseURI.substr(2, 
baseURI.length - 2);
+                               }
+                               else
+                               {
+                                       // This is a non-hierarchical URI like 
"mailto:address@hidden";
+                                       _nonHierarchical = baseURI;
+               
+                                       if ((_valid = validateURI()) == false)
+                                               initialize();  // Bad URI.  
Clear it.
+               
+                                       // No more parsing to do for this case
+                                       return isValid();
+                               }
+                       }
+                       else
+                       {
+                               // No scheme.  We will consider this a relative 
URI
+                               _scheme = "";
+                               _relative = true;
+                               _nonHierarchical = "";
+                       }
+               
+                       // Ok, what we have left is everything after the 
<scheme>://
+               
+                       // Now that we have stripped off any query and fragment 
parts, we
+                       // need to split the authority from the path
+               
+                       if (isRelative())
+                       {
+                               // Don't bother looking for the authority.  
It's a relative URI
+                               _authority = "";
+                               _port = "";
+                               _path = baseURI;
+                       }
+                       else
+                       {
+                               // Check for malformed UNC style 
file://///server/type/path/
+                               // By the time we get here, we have already 
trimmed the "file://"
+                               // so baseURI will be ///server/type/path.  If 
baseURI only
+                               // has one slash, we leave it alone because 
that is valid (that
+                               // is the case of "file:///path/to/file.txt" 
where there is no
+                               // server - implicit "localhost").
+                               if (baseURI.substr(0, 2) == "//")
+                               {
+                                       // Trim all leading slashes
+                                       while(baseURI.charAt(0) == "/")
+                                               baseURI = baseURI.substr(1, 
baseURI.length - 1);
+                               }
+               
+                               index = baseURI.search('/');
+                               if (index == -1)
+                               {
+                                       // No path.  We must have passed 
something like "http://something.com";
+                                       _authority = baseURI;
+                                       _path = "";
+                               }
+                               else
+                               {
+                                       _authority = baseURI.substr(0, index);
+                                       _path = baseURI.substr(index, 
baseURI.length - index);
+                               }
+               
+                               // Check to see if the URI has any username or 
password information.
+                               // For example:  ftp://username:address@hidden
+                               index = _authority.search('@');
+                               if (index != -1)
+                               {
+                                       // We have a username and possibly a 
password
+                                       _username = _authority.substr(0, index);
+               
+                                       // Remove the username/password from 
the authority
+                                       _authority = _authority.substr(index + 
1);  // Skip the '@'
+               
+                                       // Now check to see if the username 
also has a password
+                                       index = _username.search(':');
+                                       if (index != -1)
+                                       {
+                                               _password = 
_username.substring(index + 1, _username.length);
+                                               _username = _username.substr(0, 
index);
+                                       }
+                                       else
+                                               _password = "";
+                               }
+                               else
+                               {
+                                       _username = "";
+                                       _password = "";
+                               }
+               
+                               // Lastly, check to see if the authorty has a 
port number.
+                               // This is parsed after the username/password 
to avoid conflicting
+                               // with the ':' in the 'username:password' if 
one exists.
+                               index = _authority.search(':');
+                               if (index != -1)
+                               {
+                                       _port = _authority.substring(index + 1, 
_authority.length);  // skip the ':'
+                                       _authority = _authority.substr(0, 
index);
+                               }
+                               else
+                               {
+                                       _port = "";
+                               }
+                               
+                               // Lastly, normalize the authority.  Domain 
names
+                               // are case insensitive.
+                               _authority = _authority.toLowerCase();
+                       }
+               
+                       if ((_valid = validateURI()) == false)
+                               initialize();  // Bad URI.  Clear it
+               
+                       return isValid();
+               }
+               
+               
+               
/********************************************************************
+                * Copy function.
+                */
+               public function copyURI(uri:URI) : void
+               {
+                       this._scheme = uri._scheme;
+                       this._authority = uri._authority;
+                       this._username = uri._username;
+                       this._password = uri._password;
+                       this._port = uri._port;
+                       this._path = uri._path;
+                       this._query = uri._query;
+                       this._fragment = uri._fragment;
+                       this._nonHierarchical = uri._nonHierarchical;
+               
+                       this._valid = uri._valid;
+                       this._relative = uri._relative;
+               }
+               
+               
+               /**
+                * @private
+                * Checks if the given string only contains a-z or A-Z.
+                */
+               protected function verifyAlpha(str:String) : Boolean
+               {
+                       var pattern:RegExp = /[^a-z]/;
+                       var index:int;
+                       
+                       str = str.toLowerCase();
+                       index = str.search(pattern);
+                       
+                       if (index == -1)
+                               return true;
+                       else
+                               return false;
+               }
+               
+               /**
+                * Is this a valid URI?
+                * 
+                * @return true if this object represents a valid URI, false
+                * otherwise.
+                */
+               public function isValid() : Boolean
+               { 
+                       return this._valid;
+               }
+               
+               
+               /**
+                * Is this URI an absolute URI?  An absolute URI is a complete, 
fully
+                * qualified reference to a resource.  e.g. 
http://site.com/index.htm
+                * Non-hierarchical URI's are always absolute.
+                */
+               public function isAbsolute() : Boolean
+               { 
+                       return !this._relative;
+               }
+               
+               
+               /**
+                * Is this URI a relative URI?  Relative URI's do not have a 
scheme
+                * and only contain a relative path with optional anchor and 
query
+                * parts.  e.g. "../reports/index.htm".  Non-hierarchical URI's
+                * will never be relative.
+                */
+               public function isRelative() : Boolean
+               { 
+                       return this._relative;
+               }
+               
+               
+               /**
+                * Does this URI point to a resource that is a directory/folder?
+                * The URI specification dictates that any path that ends in a 
slash
+                * is a directory.  This is needed to be able to perform 
correct path
+                * logic when combining relative URI's with absolute URI's to
+                * obtain the correct absolute URI to a resource.
+                * 
+                * @see URI.chdir
+                * 
+                * @return true if this URI represents a directory resource, 
false
+                * if this URI represents a file resource.
+                */
+               public function isDirectory() : Boolean
+               {
+                       if (_path.length == 0)
+                               return false;
+               
+                       return (_path.charAt(path.length - 1) == '/');
+               }
+               
+               
+               /**
+                * Is this URI a hierarchical URI? URI's can be  
+                */
+               public function isHierarchical() : Boolean
+               { 
+                       return hierState;
+               }
+                               
+               
+               /**
+                * The scheme of the URI.
+                */
+               public function get scheme() : String
+               { 
+                       return URI.unescapeChars(_scheme);
+               }
+               public function set scheme(schemeStr:String) : void
+               {
+                       // Normalize the scheme
+                       var normalized:String = schemeStr.toLowerCase();
+                       _scheme = URI.fastEscapeChars(normalized, 
URI.URIschemeExcludedBitmap);
+               }
+               
+               
+               /**
+                * The authority (host) of the URI.  Only valid for
+                * hierarchical URI's.  If the URI is relative, this will
+                * be an empty string. When setting this value, the string
+                * given is assumed to be unescaped.  When retrieving this
+                * value, the resulting string is unescaped.
+                */
+               public function get authority() : String
+               { 
+                       return URI.unescapeChars(_authority);
+               }
+               public function set authority(authorityStr:String) : void
+               {
+                       // Normalize the authority
+                       authorityStr = authorityStr.toLowerCase();
+                       
+                       _authority = URI.fastEscapeChars(authorityStr,
+                               URI.URIauthorityExcludedBitmap);
+                       
+                       // Only hierarchical URI's can have an authority, make
+                       // sure this URI is of the proper format.
+                       this.hierState = true;
+               }
+               
+               
+               /**
+                * The username of the URI.  Only valid for hierarchical
+                * URI's.  If the URI is relative, this will be an empty
+                * string.
+                * 
+                * <p>The URI specification allows for authentication
+                * credentials to be embedded in the URI as such:</p>
+                * 
+                * <p>http://user:passwd&#64;host/path/to/file.htm</p>
+                * 
+                * <p>When setting this value, the string
+                * given is assumed to be unescaped.  When retrieving this
+                * value, the resulting string is unescaped.</p>
+                */
+               public function get username() : String
+               {
+                       return URI.unescapeChars(_username);
+               }
+               public function set username(usernameStr:String) : void
+               {
+                       _username = URI.fastEscapeChars(usernameStr, 
URI.URIuserpassExcludedBitmap);
+                       
+                       // Only hierarchical URI's can have a username.
+                       this.hierState = true;
+               }
+               
+               
+               /**
+                * The password of the URI.  Similar to username.
+                * @see URI.username
+                */
+               public function get password() : String
+               {
+                       return URI.unescapeChars(_password);
+               }
+               public function set password(passwordStr:String) : void
+               {
+                       _password = URI.fastEscapeChars(passwordStr,
+                               URI.URIuserpassExcludedBitmap);
+                       
+                       // Only hierarchical URI's can have a password.
+                       this.hierState = true;
+               }
+               
+               
+               /**
+                * The host port number.  Only valid for hierarchical URI's.  If
+                * the URI is relative, this will be an empty string. URI's can
+                * contain the port number of the remote host:
+                * 
+                * <p>http://site.com:8080/index.htm</p>
+                */
+               public function get port() : String
+               { 
+                       return URI.unescapeChars(_port);
+               }
+               public function set port(portStr:String) : void
+               {
+                       _port = URI.escapeChars(portStr);
+                       
+                       // Only hierarchical URI's can have a port.
+                       this.hierState = true;
+               }
+               
+               
+               /**
+                * The path portion of the URI.  Only valid for hierarchical
+                * URI's.  When setting this value, the string
+                * given is assumed to be unescaped.  When retrieving this
+                * value, the resulting string is unescaped.
+                * 
+                * <p>The path portion can be in one of two formats. 1) an 
absolute
+                * path, or 2) a relative path.  An absolute path starts with a
+                * slash ('/'), a relative path does not.</p>
+                * 
+                * <p>An absolute path may look like:</p>
+                * <listing>/full/path/to/my/file.htm</listing>
+                * 
+                * <p>A relative path may look like:</p>
+                * <listing>
+                * path/to/my/file.htm
+                * ../images/logo.gif
+                * ../../reports/index.htm
+                * </listing>
+                * 
+                * <p>Paths can be absolute or relative.  Note that this not 
the same as
+                * an absolute or relative URI.  An absolute URI can only have 
absolute
+                * paths.  For example:</p>
+                * 
+                * <listing>http:/site.com/path/to/file.htm</listing>
+                * 
+                * <p>This absolute URI has an absolute path of 
"/path/to/file.htm".</p>
+                * 
+                * <p>Relative URI's can have either absolute paths or relative 
paths.
+                * All of the following relative URI's are valid:</p>
+                * 
+                * <listing>
+                * /absolute/path/to/file.htm
+                * path/to/file.htm
+                * ../path/to/file.htm
+                * </listing>
+                */
+               public function get path() : String
+               { 
+                       return URI.unescapeChars(_path);
+               }
+               public function set path(pathStr:String) : void
+               {       
+                       this._path = URI.fastEscapeChars(pathStr, 
URI.URIpathExcludedBitmap);
+               
+                       if (this._scheme == UNKNOWN_SCHEME)
+                       {
+                               // We set the path.  This is a valid URI now.
+                               this._scheme = "";
+                       }
+               
+                       // Only hierarchical URI's can have a path.
+                       hierState = true;
+               }
+               
+               
+               /**
+                * The query (CGI) portion of the URI.  This part is valid for
+                * both hierarchical and non-hierarchical URI's.
+                * 
+                * <p>This accessor should only be used if a custom query syntax
+                * is used.  This URI class supports the common "param=value"
+                * style query syntax via the get/setQueryValue() and
+                * get/setQueryByMap() functions.  Those functions should be 
used
+                * instead if the common syntax is being used.
+                * 
+                * <p>The URI RFC does not specify any particular
+                * syntax for the query part of a URI.  It is intended to allow
+                * any format that can be agreed upon by the two communicating 
hosts.
+                * However, most systems have standardized on the typical CGI
+                * format:</p>
+                * 
+                * 
<listing>http://site.com/script.php?param1=value1&param2=value2</listing>
+                * 
+                * <p>This class has specific support for this query syntax</p>
+                * 
+                * <p>This common query format is an array of name/value
+                * pairs with its own syntax that is different from the overall 
URI
+                * syntax.  The query has its own escaping logic.  For a query 
part
+                * to be properly escaped and unescaped, it must be split into 
its

@@ Diff output truncated at 153600 characters. @@



reply via email to

[Prev in Thread] Current Thread [Next in Thread]