]> git.p6c8.net - jirafeau_mojo42.git/blobdiff - lib/functions.js.php
[FEATURE] Convert UTC dates to clients timezone
[jirafeau_mojo42.git] / lib / functions.js.php
index 7a1c5af373dc17691f2981f7e9f245be4477b629..e952430cb586d6398368039ed681deaed0e26476 100644 (file)
 
 header('Content-Type: text/javascript');
 
-define ('JIRAFEAU_ROOT', dirname (__FILE__) . '/../');
-require (JIRAFEAU_ROOT . 'lib/config.original.php');
-require (JIRAFEAU_ROOT . 'lib/settings.php');
-require (JIRAFEAU_ROOT . 'lib/functions.php');
-require (JIRAFEAU_ROOT . 'lib/lang.php');
+define('JIRAFEAU_ROOT', dirname(__FILE__) . '/../');
+
+require(JIRAFEAU_ROOT . 'lib/settings.php');
+require(JIRAFEAU_ROOT . 'lib/functions.php');
+require(JIRAFEAU_ROOT . 'lib/lang.php');
 ?>
 
 function translate (expr)
 {
-    var lang_array = <?php echo json_lang_generator () ?>;
+    var lang_array = <?php echo json_lang_generator() ?>;
     if (lang_array.hasOwnProperty(expr))
         return lang_array[expr];
     return expr;
 }
 
+function isEmpty(str) {
+    return (!str || 0 === str.length);
+}
+
+// Extend date object with format method
+Date.prototype.format = function(format) {
+    format = format || 'YYYY-MM-DD hh:mm';
+
+    var zeropad = function(number, length) {
+        number = number.toString();
+        length = length || 2;
+        while(number.length < length)
+            number = '0' + number;
+        return number;
+    },
+    formats = {
+        YYYY: this.getFullYear(),
+        MM: zeropad(this.getMonth() + 1),
+        DD: zeropad(this.getDate()),
+        hh: zeropad(this.getHours()),
+        mm: zeropad(this.getMinutes()),
+        O: (function() {
+            localDate = new Date;
+            sign = (localDate.getTimezoneOffset() > 0) ? '-' : '+';
+            offset = Math.abs(localDate.getTimezoneOffset());
+            hours = zeropad(Math.floor(offset / 60));
+            minutes = zeropad(offset % 60);
+            return sign + hours + ":" + minutes;
+        })()
+    },
+    pattern = '(' + Object.keys(formats).join(')|(') + ')';
+
+    return format.replace(new RegExp(pattern, 'g'), function(match) {
+        return formats[match];
+    });
+};
+
+function dateFromUtcString(datestring) {
+    // matches »YYYY-MM-DD hh:mm«
+    var m = datestring.match(/(\d+)-(\d+)-(\d+)\s+(\d+):(\d+)/);
+    return new Date(Date.UTC(+m[1], +m[2] - 1, +m[3], +m[4], +m[5], 0));
+}
+
+function dateFromUtcTimestamp(datetimestamp) {
+    return new Date(parseInt(datetimestamp) * 1000)
+}
+
+function dateToUtcString(datelocal) {
+    return new Date(
+        datelocal.getUTCFullYear(),
+        datelocal.getUTCMonth(),
+        datelocal.getUTCDate(),
+        datelocal.getUTCHours(),
+        datelocal.getUTCMinutes(),
+        datelocal.getUTCSeconds()
+    ).format();
+}
+
+function dateToUtcTimestamp(datelocal) {
+    return (Date.UTC(
+        datelocal.getUTCFullYear(),
+        datelocal.getUTCMonth(),
+        datelocal.getUTCDate(),
+        datelocal.getUTCHours(),
+        datelocal.getUTCMinutes(),
+        datelocal.getUTCSeconds()
+    ) / 1000);
+}
+
+function convertAllDatetimeFields() {
+    datefields = document.getElementsByClassName('datetime')
+    for(var i=0; i<datefields.length; i++) {
+        dateUTC = datefields[i].getAttribute('data-datetime');
+        datefields[i].setAttribute('title', dateUTC + ' (GMT)');
+        datefields[i].innerHTML = dateFromUtcString(dateUTC).format('YYYY-MM-DD hh:mm (GMT O)');
+    }
+}
+
 function show_link (url, reference, delete_code, crypt_key, date)
 {
     // Upload finished
@@ -61,9 +139,11 @@ function show_link (url, reference, delete_code, crypt_key, date)
     var filename = document.getElementById('file_select').files[0].name;
     var b = encodeURIComponent("Download file \"" + filename + "\":") + "%0D";
     b += encodeURIComponent(download_link_href) + "%0D";
-    if (date)
-        b += "%0D" + encodeURIComponent("This file will be available until " + date) + "%0D";
-    document.getElementById('upload_link_email').href = "mailto:?body=" + b + "&subject=" + encodeURIComponent(filename);
+    if (false == isEmpty(date))
+    {
+        b += "%0D" + encodeURIComponent("This file will be available until " + date.format('YYYY-MM-DD hh:mm (GMT O)')) + "%0D";
+        document.getElementById('upload_link_email').href = "mailto:?body=" + b + "&subject=" + encodeURIComponent(filename);
+    }
 
     // Delete link
     var delete_link = url + 'f.php?h=' + reference + '&amp;d=' + delete_code;
@@ -72,13 +152,17 @@ function show_link (url, reference, delete_code, crypt_key, date)
     document.getElementById('delete_link').href = delete_link_href;
 
     // Validity date
-    if (date)
+    if (isEmpty(date))
     {
-        document.getElementById('date').innerHTML = date;
+        document.getElementById('validity').style.display = 'none';
+    }
+    else {
+        document.getElementById('date').innerHTML = '<span class="datetime" title="'
+            + dateToUtcString(date) + ' (GMT)">'
+            + date.format('YYYY-MM-DD hh:mm (GMT O)')
+            + '</span>';
         document.getElementById('validity').style.display = '';
     }
-    else
-        document.getElementById('validity').style.display = 'none';
 
     // Preview link (if allowed)
     if (!!document.getElementById('preview_link'))
@@ -259,21 +343,29 @@ function classic_upload (url, file, time, password, one_time, upload_password)
         if (req.readyState == 4 && req.status == 200)
         {
             var res = req.responseText;
-            if (res == "Error")
+
+            // if response starts with "Error" then show a failure
+            if (/^Error/.test(res))
             {
-                pop_failure ();
+                pop_failure (res);
                 return;
             }
+
             res = res.split ("\n");
+            var expiryDate = '';
             if (time != 'none')
             {
-                var d = new Date();
-                if(!add_time_string_to_date(d, time))
+                // convert time (local time + selected expiry date)
+                var localDatetime = new Date();
+                if(!add_time_string_to_date(localDatetime, time))
+                {
+                    pop_failure ('Error: Date can not be parsed');
                     return;
-                show_link (url, res[0], res[1], res[2], d.toString());
+                }
+                expiryDate = localDatetime;
             }
-            else
-                show_link (url, res[0], res[1], res[2]);
+
+            show_link (url, res[0], res[1], res[2], expiryDate);
         }
     }
     req.open ("POST", url + 'script.php' , true);
@@ -321,11 +413,13 @@ function async_upload_start (url, max_size, file, time, password, one_time, uplo
         if (req.readyState == 4 && req.status == 200)
         {
             var res = req.responseText;
-            if (res == "Error")
+
+            if (/^Error/.test(res))
             {
-                pop_failure ();
+                pop_failure (res);
                 return;
             }
+
             res = res.split ("\n");
             async_global_ref = res[0];
             var code = res[1];
@@ -390,11 +484,13 @@ function async_upload_push (code)
         if (req.readyState == 4 && req.status == 200)
         {
             var res = req.responseText;
-            if (res == "Error")
+
+            if (/^Error/.test(res))
             {
-                pop_failure ();
+                pop_failure (res);
                 return;
             }
+
             res = res.split ("\n");
             var code = res[0]
             async_global_transfered = async_global_transfering;
@@ -428,21 +524,27 @@ function async_upload_end (code)
         if (req.readyState == 4 && req.status == 200)
         {
             var res = req.responseText;
-            if (res == "Error")
+
+            if (/^Error/.test(res))
             {
-                pop_failure ();
+                pop_failure (res);
                 return;
             }
+
             res = res.split ("\n");
+            var expiryDate = '';
             if (async_global_time != 'none')
             {
-                var d = new Date();
-                if(!add_time_string_to_date(d, async_global_time))
-                    return;
-                show_link (async_global_url, res[0], res[1], res[2], d.toString());
+              // convert time (local time + selected expiry date)
+              var localDatetime = new Date();
+              if(!add_time_string_to_date(localDatetime, async_global_time)) {
+                pop_failure ('Error: Date can not be parsed');
+                return;
+              }
+              expiryDate = localDatetime;
             }
-            else
-                show_link (async_global_url, res[0], res[1], res[2]);
+
+            show_link (async_global_url, res[0], res[1], res[2], expiryDate);
         }
     }
     req.open ("POST", async_global_url + 'script.php?end_async' , true);
@@ -615,3 +717,9 @@ function upload_speed_refresh_limiter(speed_str)
     }
     return upload_speed_refresh_limiter_last_value;
 }
+
+// document.ready()
+document.addEventListener('DOMContentLoaded', function(event) {
+    // Search for all datetime fields and convert the time to local timezone
+    convertAllDatetimeFields();
+});

patrick-canterino.de