diff --git a/_test/cases/lib/exe/js_js_compress.test.php b/_test/cases/lib/exe/js_js_compress.test.php
index 0bfb620569937246665f3edc9931a95fe845b091..48b36af15ecf030263ac09ba0e174f71aeb6be1e 100644
--- a/_test/cases/lib/exe/js_js_compress.test.php
+++ b/_test/cases/lib/exe/js_js_compress.test.php
@@ -40,15 +40,25 @@ class js_js_compress_test extends UnitTestCase {
     }
 
     function test_dquot1(){
-        $text = 'var foo="Now what \'do we//get /*here*/ ?";';
+        $text = 'var foo="Now what \\" \'do we//get /*here*/ ?";';
         $this->assertEqual(js_compress($text), $text);
     }
 
+    function test_dquotrunaway(){
+        $text = 'var foo="Now where does it end';
+        $this->assertEqual(js_compress($text), "$text\n"); //\n is added by compressor
+    }
+
     function test_squot1(){
-        $text = "var foo='Now what \"do we//get /*here*/ ?';";
+        $text = "var foo='Now what \\' \"do we//get /*here*/ ?';";
         $this->assertEqual(js_compress($text), $text);
     }
 
+    function test_squotrunaway(){
+        $text = "var foo='Now where does it end";
+        $this->assertEqual(js_compress($text), "$text\n"); //\n is added by compressor
+    }
+
     function test_nl1(){
         $text = "var foo=6;\nvar baz=7;";
         $this->assertEqual(js_compress($text), 'var foo=6;var baz=7;');
@@ -63,6 +73,12 @@ class js_js_compress_test extends UnitTestCase {
         $text = "var foo=6;  \t  ";
         $this->assertEqual(js_compress($text), 'var foo=6;');
     }
+
+    function test_shortcond(){
+        $text = "var foo = (baz) ? 'bar' : 'bla';";
+        $this->assertEqual(js_compress($text), "var foo=(baz)?'bar':'bla';");
+
+    }
 }
 
 //Setup VIM: ex: et ts=4 enc=utf-8 :
diff --git a/lib/exe/js.php b/lib/exe/js.php
index 7ff60710ca712bdb7a9bcdbdd88be9b242cd91ff..2aa9c43996449910e10167cc2db2b2eef169802b 100644
--- a/lib/exe/js.php
+++ b/lib/exe/js.php
@@ -238,7 +238,7 @@ function js_compress($s){
     $len = strlen($s);
 
     // items that don't need spaces next to them
-    $chars = '^&|!+\-*\/%=:;,{}()<>% \t\n\r';
+    $chars = '^&|!+\-*\/%=\?:;,{}()<>% \t\n\r';
 
     ob_start();
     while($i < $len){
@@ -286,11 +286,12 @@ function js_compress($s){
         // double quote strings
         if($ch == '"'){
             $j = 1;
-            while( $s{$i+$j} != '"' ){
-                while( ($s{$i+$j} != '\\') && ($s{$i+$j} != '"') ){
-                    $j = $j + 1;
+            while( $s{$i+$j} != '"' && ($i+$j < $len)){
+                if( $s{$i+$j} == '\\' && $s{$i+$j+1} == '"' ){
+                    $j += 2;
+                }else{
+                    $j += 1;
                 }
-                if($s{$i+$j} == '\\') $j = $j + 2;
             }
             echo substr($s,$i,$j+1);
             $i = $i + $j + 1;
@@ -300,11 +301,12 @@ function js_compress($s){
         // single quote strings
         if($ch == "'"){
             $j = 1;
-            while( $s{$i+$j} != "'" ){
-                while( ($s{$i+$j} != '\\') && ($s{$i+$j} != "'") ){
-                    $j = $j + 1;
+            while( $s{$i+$j} != "'" && ($i+$j < $len)){
+                if( $s{$i+$j} == '\\' && $s{$i+$j+1} == "'" ){
+                    $j += 2;
+                }else{
+                    $j += 1;
                 }
-                if ($s{$i+$j} == '\\') $j = $j + 2;
             }
             echo substr($s,$i,$j+1);
             $i = $i + $j + 1;