From 4802bcdb39ea0d7d5631210aa2b982f5ff8024bf Mon Sep 17 00:00:00 2001
From: Reinhold Kainhofer <reinhold@kainhofer.com>
Date: Tue, 2 Dec 2014 22:40:03 +0100
Subject: [PATCH] Handle JSON parsing error (server not returning proper JSON);
 Fix IE and some JS bugs

---
 fields/vmordernumbercounters.php              |  1 +
 .../en-GB/en-GB.plg_vmshopper_ordernumber.ini |  2 +-
 .../en-GB.plg_vmshopper_ordernumber.sys.ini   |  2 +-
 ordernumber/assets/js/ordernumber.js          | 32 ++++++++++++++-----
 4 files changed, 27 insertions(+), 10 deletions(-)

diff --git a/fields/vmordernumbercounters.php b/fields/vmordernumbercounters.php
index bec2518..b3aff63 100644
--- a/fields/vmordernumbercounters.php
+++ b/fields/vmordernumbercounters.php
@@ -68,6 +68,7 @@ class JFormFieldVmOrdernumberCounters extends JFormField {
         JText::script('PLG_ORDERNUMBER_JS_DELETECOUNTER');
         JText::script('PLG_ORDERNUMBER_JS_DELETE_FAILED');
         JText::script('PLG_ORDERNUMBER_JS_ADD_FAILED');
+        JText::script('PLG_ORDERNUMBER_JS_JSONERROR');
     }
     protected function getInput() {
         $pluginpath = '/plugins/vmshopper/ordernumber/ordernumber/';
diff --git a/language/en-GB/en-GB.plg_vmshopper_ordernumber.ini b/language/en-GB/en-GB.plg_vmshopper_ordernumber.ini
index 0eb4e45..5c25278 100644
--- a/language/en-GB/en-GB.plg_vmshopper_ordernumber.ini
+++ b/language/en-GB/en-GB.plg_vmshopper_ordernumber.ini
@@ -64,5 +64,5 @@ PLG_ORDERNUMBER_JS_INVALID_COUNTERVALUE="You entered an invalid value for the co
 PLG_ORDERNUMBER_JS_MODIFY_FAILED="Failed modifying counter {0}"
 PLG_ORDERNUMBER_JS_DELETE_FAILED="Failed deleting counter {0}"
 PLG_ORDERNUMBER_JS_ADD_FAILED="Failed adding counter {0}"
-
+PLG_ORDERNUMBER_JS_JSONERROR="Error reading response from server:"
 
diff --git a/language/en-GB/en-GB.plg_vmshopper_ordernumber.sys.ini b/language/en-GB/en-GB.plg_vmshopper_ordernumber.sys.ini
index 0eb4e45..5c25278 100644
--- a/language/en-GB/en-GB.plg_vmshopper_ordernumber.sys.ini
+++ b/language/en-GB/en-GB.plg_vmshopper_ordernumber.sys.ini
@@ -64,5 +64,5 @@ PLG_ORDERNUMBER_JS_INVALID_COUNTERVALUE="You entered an invalid value for the co
 PLG_ORDERNUMBER_JS_MODIFY_FAILED="Failed modifying counter {0}"
 PLG_ORDERNUMBER_JS_DELETE_FAILED="Failed deleting counter {0}"
 PLG_ORDERNUMBER_JS_ADD_FAILED="Failed adding counter {0}"
-
+PLG_ORDERNUMBER_JS_JSONERROR="Error reading response from server:"
 
diff --git a/ordernumber/assets/js/ordernumber.js b/ordernumber/assets/js/ordernumber.js
index 9ef759b..c7d64f8 100644
--- a/ordernumber/assets/js/ordernumber.js
+++ b/ordernumber/assets/js/ordernumber.js
@@ -60,8 +60,13 @@ var ajaxEditCounter = function (btn, nrtype, ctr, value) {
             url: "index.php?option=com_virtuemart&view=plugin&type=vmshopper&name=ordernumber&action=setCounter&format=raw",
             data: { nrtype: counter.type, counter: counter.counter, value: value },
             success: function( data ) {
-                var json = data ? jQuery.parseJSON(data) : null;
-                handleJSONResponse(json, counter);
+                try {
+                    var json = jQuery.parseJSON(data);
+                    handleJSONResponse(json, counter);
+                } catch (e) {
+                    alert(Joomla.JText._('PLG_ORDERNUMBER_JS_JSONERROR')+"\n"+e);
+                    return;
+                }
                 if (json.success>0) {
                     jQuery(counter.row).children(".counter_value").text(value);
                 } else {
@@ -88,10 +93,15 @@ var ajaxDeleteCounter = function (btn, nrtype, ctr, value) {
             url: "index.php?option=com_virtuemart&view=plugin&type=vmshopper&name=ordernumber&action=deleteCounter&format=raw",
             data: { nrtype: counter.type, counter: counter.counter },
             success: function( data ) {
-                var json = data ? jQuery.parseJSON(data) : null;
-                handleJSONResponse(json, counter);
+                try {
+                    var json = jQuery.parseJSON(data);
+                    handleJSONResponse(json, counter);
+                } catch (e) {
+                    alert(Joomla.JText._('PLG_ORDERNUMBER_JS_JSONERROR')+"\n"+e);
+                    return;
+                }
                 if (json.success>0) {
-                    jQuery(counter.row).fadeOut(1500, function() { $(this).remove(); });
+                    jQuery(counter.row).fadeOut(1500, function() { jQuery(counter.row).remove(); });
                 } else {
                     alert (String.Format(Joomla.JText._('PLG_ORDERNUMBER_JS_DELETE_FAILED', "Failed deleting counter {0}"), counter.counter));
                 }
@@ -114,16 +124,22 @@ var ajaxAddCounter = function (btn, nrtype) {
             data: { nrtype: nrtype, counter: countername },
             success: function( data ) {
                 var json = data ? jQuery.parseJSON(data) : null;
-                handleJSONResponse(json, { type: nrtype, counter: countername, value: 0, row: row });
+                try {
+                    var json = jQuery.parseJSON(data);
+                    handleJSONResponse(json, null);
+                } catch (e) {
+                    alert(Joomla.JText._('PLG_ORDERNUMBER_JS_JSONERROR')+"\n"+e);
+                    return;
+                }
                 if (json.success>0) {
                     if (json.newrow) {
                         jQuery(row).before(jQuery(json.newrow));
                     }
                 } else {
-                    alert (String.Format(Joomla.JText._('PLG_ORDERNUMBER_JS_ADD_FAILED', "Failed adding counter {0}"), counter.counter));
+                    alert (String.Format(Joomla.JText._('PLG_ORDERNUMBER_JS_ADD_FAILED', "Failed adding counter {0}"), countername));
                 }
             },
-            error: function() { alert (String.Format(Joomla.JText._('PLG_ORDERNUMBER_JS_ADD_FAILED', "Failed adding counter {0}"), counter.counter)); },
+            error: function() { alert (String.Format(Joomla.JText._('PLG_ORDERNUMBER_JS_ADD_FAILED', "Failed adding counter {0}"), countername)); },
             complete: function() { jQuery(loading).remove(); },
         });
     }
-- 
GitLab