+    if (upload_password.length > 0)
+        form.append ("upload_password", upload_password);
+
+    req.send (form);
+}
+
+function check_html5_file_api ()
+{
+    if (window.File && window.FileReader && window.FileList && window.Blob)
+        return true;
+    return false;
+}
+
+var async_global_transfered = 0;
+var async_global_url = '';
+var async_global_file;
+var async_global_ref = '';
+var async_global_max_size = 0;
+var async_global_time;
+var async_global_transfering = 0;
+
+function async_upload_start (url, max_size, file, time, password, one_time, upload_password)
+{
+    async_global_transfered = 0;
+    async_global_url = url;
+    async_global_file = file;
+    async_global_max_size = max_size;
+    async_global_time = time;
+
+    var req = new XMLHttpRequest ();
+    req.addEventListener ("error", upload_failed, false);
+    req.addEventListener ("abort", upload_failed, false);
+    req.onreadystatechange = function ()
+    {
+        if (req.readyState == 4 && req.status == 200)
+        {
+            var res = req.responseText;
+            if (res == "Error")
+                return;
+            res = res.split ("\n");
+            async_global_ref = res[0];
+            var code = res[1];
+            async_upload_push (code);
+        }
+    }
+    req.open ("POST", async_global_url + 'script.php?init_async' , true);
+
+    var form = new FormData();
+    form.append ("filename", async_global_file.name);
+    form.append ("type", async_global_file.type);
+    if (time)
+        form.append ("time", time);
+    if (password)
+        form.append ("key", password);
+    if (one_time)
+        form.append ("one_time_download", '1');
+    if (upload_password.length > 0)
+        form.append ("upload_password", upload_password);
+
+    req.send (form);
+}
+
+function async_upload_progress (e)
+{
+    if (!e.lengthComputable && async_global_file.size != 0)
+        return;
+    var p = Math.round ((e.loaded + async_global_transfered) * 100 / (async_global_file.size));
+    if (p == 100)
+        show_upload_progression (' ');
+    else
+        show_upload_progression (p.toString() + '%');
+}
+
+function async_upload_push (code)
+{
+    if (async_global_transfered == async_global_file.size)
+    {
+        async_upload_end (code);
+        return;
+    }
+    var req = new XMLHttpRequest ();
+    req.upload.addEventListener ("progress", async_upload_progress, false);
+    req.addEventListener ("error", upload_failed, false);
+    req.addEventListener ("abort", upload_failed, false);
+    req.onreadystatechange = function ()
+    {
+        if (req.readyState == 4 && req.status == 200)
+        {
+            var res = req.responseText;
+            if (res == "Error")
+                return;
+            res = res.split ("\n");
+            var code = res[0]
+            async_global_transfered = async_global_transfering;
+            async_upload_push (code);
+        }
+    }
+    req.open ("POST", async_global_url + 'script.php?push_async' , true);
+
+    var chunk_size = parseInt (async_global_max_size * 0.50);
+    var start = async_global_transfered;
+    var end = start + chunk_size;
+    if (end >= async_global_file.size)
+        end = async_global_file.size;
+    var blob = async_global_file.slice (start, end);
+    async_global_transfering = end;
+
+    var form = new FormData();
+    form.append ("ref", async_global_ref);
+    form.append ("data", blob);
+    form.append ("code", code);
+    req.send (form);
+}
+
+function async_upload_end (code)
+{
+    var req = new XMLHttpRequest ();
+    req.addEventListener ("error", upload_failed, false);
+    req.addEventListener ("abort", upload_failed, false);
+    req.onreadystatechange = function ()
+    {
+        if (req.readyState == 4 && req.status == 200)
+        {
+            var res = req.responseText;
+            if (res == "Error")
+                return;
+            res = res.split ("\n");
+            if (async_global_time != 'none')
+            {
+                var d = new Date();
+                if (async_global_time == 'minute')
+                    d.setSeconds (d.getSeconds() + 60);
+                else if (async_global_time == 'hour')
+                    d.setSeconds (d.getSeconds() + 3600);
+                else if (async_global_time == 'day')
+                    d.setSeconds (d.getSeconds() + 86400);
+                else if (async_global_time == 'week')
+                    d.setSeconds (d.getSeconds() + 604800);
+                else if (async_global_time == 'month')
+                    d.setSeconds (d.getSeconds() + 2419200);
+                else
+                    return;
+                show_link (async_global_url, res[0], res[1], res[2], d.toString());
+            }
+            else
+                show_link (async_global_url, res[0], res[1], res[2]);
+        }
+    }
+    req.open ("POST", async_global_url + 'script.php?end_async' , true);
+
+    var form = new FormData();
+    form.append ("ref", async_global_ref);
+    form.append ("code", code);