Fix #6494 - translations code for reports
authorAlan Knowles <alan@roojs.com>
Wed, 2 Dec 2020 06:22:50 +0000 (14:22 +0800)
committerAlan Knowles <alan@roojs.com>
Wed, 2 Dec 2020 06:22:50 +0000 (14:22 +0800)
Pman.Dialog.AdminEnumType.bjs
Pman.Dialog.AdminEnumType.js
Pman.Dialog.AdminLanguagePick.bjs [new file with mode: 0644]
Pman.Dialog.AdminLanguagePick.js [new file with mode: 0644]
Pman.Dialog.AdminTranslateTemplates.bjs [new file with mode: 0644]
Pman.Dialog.AdminTranslateTemplates.js [new file with mode: 0644]
Pman.Tab.AdminTranslations.bjs
Pman.Tab.AdminTranslations.js
Translations.php
UpdateBjsTemplates.php [new file with mode: 0644]

index 86cf4f8..0243514 100644 (file)
@@ -1,87 +1,98 @@
 {
-    "name" : "Pman.Dialog.AdminEnumType",
-    "parent" : "",
-    "title" : "",
-    "path" : "/home/michael/gitlive/Pman.Admin/Pman.Dialog.AdminEnumType.bjs",
-    "permname" : "",
-    "modOrder" : "001",
-    "items" : [
+ "name" : "Pman.Dialog.AdminEnumType",
+ "parent" : "",
+ "title" : "",
+ "path" : "/home/alan/gitlive/Pman.Admin/Pman.Dialog.AdminEnumType.bjs",
+ "permname" : "",
+ "modOrder" : "001",
+ "strings" : {
+  "7dce122004969d56ae2e0245cb754d35" : "Edit",
+  "b48968e1c912da07df5e8d6d246291ec" : "Display Name",
+  "ea4788705e6873b424c65e91c2846b19" : "Cancel",
+  "49ee3087348e8d44e1feda1917443987" : "Name",
+  "c9cc8cce247e49bae79f15173ce97354" : "Save"
+ },
+ "named_strings" : {
+  "display_name_fieldLabel" : "b48968e1c912da07df5e8d6d246291ec",
+  "name_fieldLabel" : "49ee3087348e8d44e1feda1917443987"
+ },
+ "items" : [
+  {
+   "Boolean modal" : true,
+   "Number width" : 480,
+   "xtype" : "LayoutDialog",
+   "Number height" : 160,
+   "Boolean resizable" : false,
+   "$ xns" : "Roo",
+   "String title" : "Edit",
+   "items" : [
+    {
+     "xtype" : "LayoutRegion",
+     "$ xns" : "Roo",
+     "* prop" : "center\n"
+    },
+    {
+     "xtype" : "ContentPanel",
+     "$ xns" : "Roo",
+     "String region" : "center",
+     "items" : [
+      {
+       "listeners" : {
+        "|actioncomplete" : "function (_self, action)\n{\n    if(action.type == 'submit'){\n        _this.dialog.hide();\n        \n        if(_this.callback){\n            _this.callback.call(_this, _this.form.getValues());\n        }\n        return\n    }\n}",
+        "rendered" : "function (form)\n{\n    _this.form = this;\n}"
+       },
+       "$ url" : "baseURL + '/Roo/Core_enum'",
+       "xtype" : "Form",
+       "$ xns" : "Roo.form",
+       "items" : [
         {
-            "Boolean modal" : true,
-            "Number width" : 480,
-            "xtype" : "LayoutDialog",
-            "Number height" : 160,
-            "Boolean resizable" : false,
-            "$ xns" : "Roo",
-            "String title" : "Edit",
-            "items" : [
-                {
-                    "xtype" : "LayoutRegion",
-                    "$ xns" : "Roo",
-                    "* prop" : "center\n"
-                },
-                {
-                    "xtype" : "ContentPanel",
-                    "String region" : "center",
-                    "$ xns" : "Roo",
-                    "items" : [
-                        {
-                            "listeners" : {
-                                "rendered" : "function (form)\n{\n    _this.form = this;\n}",
-                                "|actioncomplete" : "function (_self, action)\n{\n    if(action.type == 'submit'){\n        _this.dialog.hide();\n        \n        if(_this.callback){\n            _this.callback.call(_this, _this.form.getValues());\n        }\n        return\n    }\n}"
-                            },
-                            "$ url" : "baseURL + '/Roo/Core_enum'",
-                            "xtype" : "Form",
-                            "$ xns" : "Roo.form",
-                            "items" : [
-                                {
-                                    "Boolean allowBlank" : false,
-                                    "String name" : "name",
-                                    "Number width" : 270,
-                                    "xtype" : "TextField",
-                                    "String fieldLabel" : "Name",
-                                    "$ xns" : "Roo.form"
-                                },
-                                {
-                                    "String name" : "id",
-                                    "xtype" : "Hidden",
-                                    "$ xns" : "Roo.form"
-                                },
-                                {
-                                    "String name" : "etype",
-                                    "xtype" : "Hidden",
-                                    "$ xns" : "Roo.form"
-                                },
-                                {
-                                    "String name" : "display_name",
-                                    "Number width" : 270,
-                                    "xtype" : "TextField",
-                                    "String fieldLabel" : "Display Name",
-                                    "$ xns" : "Roo.form"
-                                }
-                            ]
-                        }
-                    ]
-                },
-                {
-                    "listeners" : {
-                        "click" : "function (_self, e)\n{\n    //this.url = baseURL + '/Roo/Core_enum.php';\n    //_this.dialog.el.mask(\"Saving\");\n    _this.form.doAction(\"submit\");\n}"
-                    },
-                    "xtype" : "Button",
-                    "String text" : "Save",
-                    "$ xns" : "Roo",
-                    "* prop" : "buttons[]"
-                },
-                {
-                    "listeners" : {
-                        "click" : "function (_self, e)\n{\n    _this.dialog.hide();\n}"
-                    },
-                    "xtype" : "Button",
-                    "String text" : "Cancel",
-                    "$ xns" : "Roo",
-                    "* prop" : "buttons[]"
-                }
-            ]
+         "Boolean allowBlank" : false,
+         "String name" : "name",
+         "Number width" : 270,
+         "xtype" : "TextField",
+         "String fieldLabel" : "Name",
+         "$ xns" : "Roo.form"
+        },
+        {
+         "String name" : "id",
+         "xtype" : "Hidden",
+         "$ xns" : "Roo.form"
+        },
+        {
+         "String name" : "etype",
+         "xtype" : "Hidden",
+         "$ xns" : "Roo.form"
+        },
+        {
+         "String name" : "display_name",
+         "Number width" : 270,
+         "xtype" : "TextField",
+         "String fieldLabel" : "Display Name",
+         "$ xns" : "Roo.form"
         }
-    ]
+       ]
+      }
+     ]
+    },
+    {
+     "listeners" : {
+      "click" : "function (_self, e)\n{\n    //this.url = baseURL + '/Roo/Core_enum.php';\n    //_this.dialog.el.mask(\"Saving\");\n    _this.form.doAction(\"submit\");\n}"
+     },
+     "xtype" : "Button",
+     "String text" : "Save",
+     "$ xns" : "Roo",
+     "* prop" : "buttons[]"
+    },
+    {
+     "listeners" : {
+      "click" : "function (_self, e)\n{\n    _this.dialog.hide();\n}"
+     },
+     "xtype" : "Button",
+     "String text" : "Cancel",
+     "$ xns" : "Roo",
+     "* prop" : "buttons[]"
+    }
+   ]
+  }
+ ]
 }
\ No newline at end of file
index e94bf6a..0067865 100644 (file)
@@ -6,139 +6,148 @@ Roo.namespace('Pman.Dialog');
 
 Pman.Dialog.AdminEnumType = {
 
-    dialog : false,
-    callback:  false,
+ _strings : {
+  '7dce122004969d56ae2e0245cb754d35' :"Edit",
+  'b48968e1c912da07df5e8d6d246291ec' :"Display Name",
+  'ea4788705e6873b424c65e91c2846b19' :"Cancel",
+  '49ee3087348e8d44e1feda1917443987' :"Name",
+  'c9cc8cce247e49bae79f15173ce97354' :"Save"
+ },
+ _named_strings : {
+  'display_name_fieldLabel' : 'b48968e1c912da07df5e8d6d246291ec' /* Display Name */ ,
+  'name_fieldLabel' : '49ee3087348e8d44e1feda1917443987' /* Name */ 
+ },
 
-    show : function(data, cb)
-    {
-        if (!this.dialog) {
-            this.create();
-        }
-
-        this.callback = cb;
-        this.data = data;
-        this.dialog.show(this.data._el);
-        if (this.form) {
-           this.form.reset();
-           this.form.setValues(data);
-           this.form.fireEvent('actioncomplete', this.form,  { type: 'setdata', data: data });
-        }
-
-    },
+ dialog : false,
+ callback:  false,
 
-    create : function()
-    {
-        var _this = this;
-        this.dialog = Roo.factory({
-            center
- : {
-                '|xns' : 'Roo',
-                xtype : 'LayoutRegion',
-                xns : Roo
-            },
-            '|xns' : 'Roo',
-            modal : true,
-            width : 480,
-            xtype : 'LayoutDialog',
-            height : 160,
-            resizable : false,
-            xns : Roo,
-            title : "Edit",
-            buttons : [
-                {
-                       '|xns' : 'Roo',
-                       xtype : 'Button',
-                       text : "Save",
-                       xns : Roo,
-                       listeners : {
-                               click : function (_self, e)
-                                  {
-                                      //this.url = baseURL + '/Roo/Core_enum.php';
-                                      //_this.dialog.el.mask("Saving");
-                                      _this.form.doAction("submit");
-                                  }
-                       }
-                   },
-{
-                       '|xns' : 'Roo',
-                       xtype : 'Button',
-                       text : "Cancel",
-                       xns : Roo,
-                       listeners : {
-                               click : function (_self, e)
-                                  {
-                                      _this.dialog.hide();
-                                  }
-                       }
-                   }
-            ],
-            items : [
-               {
-                    '|xns' : 'Roo',
-                    xtype : 'ContentPanel',
-                    region : 'center',
-                    xns : Roo,
-                    items : [
-                       {
-                            '|xns' : 'Roo.form',
-                            url : baseURL + '/Roo/Core_enum',
-                            xtype : 'Form',
-                            xns : Roo.form,
-                            listeners : {
-                               rendered : function (form)
-                                  {
-                                      _this.form = this;
-                                  },
-                               actioncomplete : function (_self, action)
-                                  {
-                                      if(action.type == 'submit'){
-                                          _this.dialog.hide();
-                                          
-                                          if(_this.callback){
-                                              _this.callback.call(_this, _this.form.getValues());
-                                          }
-                                          return
-                                      }
-                                  }
-                            },
-                            items : [
-                               {
-                                    '|xns' : 'Roo.form',
-                                    allowBlank : false,
-                                    name : 'name',
-                                    width : 270,
-                                    xtype : 'TextField',
-                                    fieldLabel : 'Name',
-                                    xns : Roo.form
-                                },
-                               {
-                                    '|xns' : 'Roo.form',
-                                    name : 'id',
-                                    xtype : 'Hidden',
-                                    xns : Roo.form
-                                },
-                               {
-                                    '|xns' : 'Roo.form',
-                                    name : 'etype',
-                                    xtype : 'Hidden',
-                                    xns : Roo.form
-                                },
-                               {
-                                    '|xns' : 'Roo.form',
-                                    name : 'display_name',
-                                    width : 270,
-                                    xtype : 'TextField',
-                                    fieldLabel : 'Display Name',
-                                    xns : Roo.form
-                                }
-                            ]
+ show : function(data, cb)
+ {
+  if (!this.dialog) {
+   this.create();
+  }
 
-                        }
-                    ]
+  this.callback = cb;
+  this.data = data;
+  this.dialog.show(this.data._el);
+  if (this.form) {
+   this.form.reset();
+   this.form.setValues(data);
+   this.form.fireEvent('actioncomplete', this.form,  { type: 'setdata', data: data });
+  }
 
-                }
-            ]
+ },
 
-        });
-    }
+ create : function()
+ {
+   var _this = this;
+   this.dialog = Roo.factory({
+    xtype : 'LayoutDialog',
+    height : 160,
+    modal : true,
+    resizable : false,
+    title : _this._strings['7dce122004969d56ae2e0245cb754d35'] /* Edit */,
+    width : 480,
+    xns : Roo,
+    '|xns' : 'Roo',
+    center
+ : {
+     xtype : 'LayoutRegion',
+     xns : Roo,
+     '|xns' : 'Roo'
+    },
+    buttons : [
+     {
+      xtype : 'Button',
+      text : _this._strings['c9cc8cce247e49bae79f15173ce97354'] /* Save */,
+      listeners : {
+       click : function (_self, e)
+        {
+            //this.url = baseURL + '/Roo/Core_enum.php';
+            //_this.dialog.el.mask("Saving");
+            _this.form.doAction("submit");
+        }
+      },
+      xns : Roo,
+      '|xns' : 'Roo'
+     },
+     {
+      xtype : 'Button',
+      text : _this._strings['ea4788705e6873b424c65e91c2846b19'] /* Cancel */,
+      listeners : {
+       click : function (_self, e)
+        {
+            _this.dialog.hide();
+        }
+      },
+      xns : Roo,
+      '|xns' : 'Roo'
+     }
+    ],
+    items  : [
+     {
+      xtype : 'ContentPanel',
+      region : 'center',
+      xns : Roo,
+      '|xns' : 'Roo',
+      items  : [
+       {
+        xtype : 'Form',
+        url : baseURL + '/Roo/Core_enum',
+        listeners : {
+         actioncomplete : function (_self, action)
+          {
+              if(action.type == 'submit'){
+                  _this.dialog.hide();
+                  
+                  if(_this.callback){
+                      _this.callback.call(_this, _this.form.getValues());
+                  }
+                  return
+              }
+          },
+         rendered : function (form)
+          {
+              _this.form = this;
+          }
+        },
+        xns : Roo.form,
+        '|xns' : 'Roo.form',
+        items  : [
+         {
+          xtype : 'TextField',
+          allowBlank : false,
+          fieldLabel : _this._strings['49ee3087348e8d44e1feda1917443987'] /* Name */,
+          name : 'name',
+          width : 270,
+          xns : Roo.form,
+          '|xns' : 'Roo.form'
+         },
+         {
+          xtype : 'Hidden',
+          name : 'id',
+          xns : Roo.form,
+          '|xns' : 'Roo.form'
+         },
+         {
+          xtype : 'Hidden',
+          name : 'etype',
+          xns : Roo.form,
+          '|xns' : 'Roo.form'
+         },
+         {
+          xtype : 'TextField',
+          fieldLabel : _this._strings['b48968e1c912da07df5e8d6d246291ec'] /* Display Name */,
+          name : 'display_name',
+          width : 270,
+          xns : Roo.form,
+          '|xns' : 'Roo.form'
+         }
+        ]
+       }
+      ]
+     }
+    ]
+   });
+ }
 };
diff --git a/Pman.Dialog.AdminLanguagePick.bjs b/Pman.Dialog.AdminLanguagePick.bjs
new file mode 100644 (file)
index 0000000..5f5fd3c
--- /dev/null
@@ -0,0 +1,118 @@
+{
+ "name" : "Pman.Dialog.AdminLanguagePick",
+ "parent" : "",
+ "title" : "",
+ "path" : "/home/alan/gitlive/Pman.Admin/Pman.Dialog.AdminLanguagePick.bjs",
+ "permname" : "",
+ "modOrder" : "001",
+ "strings" : {
+  "4994a8ffeba4ac3140beb89e8d41f174" : "Language",
+  "ea4788705e6873b424c65e91c2846b19" : "Cancel",
+  "052ca52fc8eb1bdff3e34de3fa735e35" : "Select a Language",
+  "e0aa021e21dddbd6d8cecec71e9cf564" : "OK"
+ },
+ "named_strings" : {
+  "language_name_fieldLabel" : "4994a8ffeba4ac3140beb89e8d41f174"
+ },
+ "items" : [
+  {
+   "modal" : true,
+   "collapsible" : false,
+   "title" : "Select a Language",
+   "xtype" : "LayoutDialog",
+   "width" : 400,
+   "$ xns" : "Roo",
+   "closable" : false,
+   "resizable" : false,
+   "height" : 120,
+   "items" : [
+    {
+     "xtype" : "LayoutRegion",
+     "$ xns" : "Roo",
+     "* prop" : "center"
+    },
+    {
+     "region" : "center",
+     "xtype" : "ContentPanel",
+     "$ xns" : "Roo",
+     "items" : [
+      {
+       "listeners" : {
+        "|actioncomplete" : "function(_self,action)\n{\n    if (action.type == 'setdata') {\n       //_this.dialog.el.mask(\"Loading\");\n       //this.load({ method: 'GET', params: { '_id' : _this.data.id }});\n       return;\n    }\n    if (action.type == 'load') {\n        _this.dialog.el.unmask();\n        return;\n    }\n    if (action.type =='submit') {\n    \n        _this.dialog.el.unmask();\n        _this.dialog.hide();\n\n         if (_this.callback) {\n            _this.callback.call(_this, _this.form.getValues());\n         }\n         _this.form.reset();\n         return;\n    }\n}\n",
+        "|rendered" : "function (form)\n{\n    _this.form= form;\n}\n"
+       },
+       "$ url" : "baseURL + '/Roo/INGORE.php'",
+       "xtype" : "Form",
+       "method" : "GET",
+       "style" : "margin:10px;",
+       "$ xns" : "Roo.form",
+       "items" : [
+        {
+         "alwaysQuery" : true,
+         "listWidth" : 200,
+         "triggerAction" : "all",
+         "fieldLabel" : "Language",
+         "displayField" : "title",
+         "hiddenName" : "lang",
+         "valueField" : "code",
+         "xtype" : "ComboBox",
+         "allowBlank" : false,
+         "editable" : false,
+         "width" : 200,
+         "$ xns" : "Roo.form",
+         "name" : "language_name",
+         "items" : [
+          {
+           "listeners" : {
+            "beforeload" : "function (_self, o)\n{\n    o.params['!code'] = 'en'; // exclude english from the list (it's the default?)\n}"
+           },
+           "xtype" : "Store",
+           "$ xns" : "Roo.data",
+           "* prop" : "store",
+           "items" : [
+            {
+             "$ url" : "baseURL + '/Core/I18n/Lang'",
+             "xtype" : "HttpProxy",
+             "method" : "GET",
+             "$ xns" : "Roo.data",
+             "* prop" : "proxy"
+            },
+            {
+             "id" : "code",
+             "root" : "data",
+             "xtype" : "JsonReader",
+             "$ fields" : "[\n    {\n        'name': 'code',\n        'type': 'string'\n    },\n    {\n        'name': 'title',\n        'type': 'string'\n    }\n]",
+             "$ xns" : "Roo.data",
+             "* prop" : "reader",
+             "totalProperty" : "total"
+            }
+           ]
+          }
+         ]
+        }
+       ]
+      }
+     ]
+    },
+    {
+     "listeners" : {
+      "click" : "function (_self, e)\n{\n    _this.dialog.hide();\n}"
+     },
+     "text" : "Cancel",
+     "xtype" : "Button",
+     "$ xns" : "Roo",
+     "* prop" : "buttons[]"
+    },
+    {
+     "listeners" : {
+      "click" : "function (_self, e)\n{\n    // do some checks?\n     \n    var data =  _this.form.getValues();\n \n    if (!data.lang.length) {\n    \n        Roo.MessageBox.alert(\"Error\", \"Select language\");\n        return;\n    \n    }\n    _this.dialog.hide();\n            \n    var callbackData = data.lang;\n   // Roo.log(_this.data);\n    if(_this.data._with_name == true){\n        callbackData = {'lang' : data.lang , 'lang_name' : _this.form.findField('lang').lastSelectionText};\n    }\n    \n    _this.callback(callbackData);\n    \n\n}"
+     },
+     "text" : "OK",
+     "xtype" : "Button",
+     "$ xns" : "Roo",
+     "* prop" : "buttons[]"
+    }
+   ]
+  }
+ ]
+}
\ No newline at end of file
diff --git a/Pman.Dialog.AdminLanguagePick.js b/Pman.Dialog.AdminLanguagePick.js
new file mode 100644 (file)
index 0000000..386b0c8
--- /dev/null
@@ -0,0 +1,207 @@
+//<script type="text/javascript">
+
+// Auto generated file - created by app.Builder.js- do not edit directly (at present!)
+
+Roo.namespace('Pman.Dialog');
+
+Pman.Dialog.AdminLanguagePick = {
+
+ _strings : {
+  '4994a8ffeba4ac3140beb89e8d41f174' :"Language",
+  'ea4788705e6873b424c65e91c2846b19' :"Cancel",
+  '052ca52fc8eb1bdff3e34de3fa735e35' :"Select a Language",
+  'e0aa021e21dddbd6d8cecec71e9cf564' :"OK"
+ },
+ _named_strings : {
+  'language_name_fieldLabel' : '4994a8ffeba4ac3140beb89e8d41f174' /* Language */ 
+ },
+
+ dialog : false,
+ callback:  false,
+
+ show : function(data, cb)
+ {
+  if (!this.dialog) {
+   this.create();
+  }
+
+  this.callback = cb;
+  this.data = data;
+  this.dialog.show(this.data._el);
+  if (this.form) {
+   this.form.reset();
+   this.form.setValues(data);
+   this.form.fireEvent('actioncomplete', this.form,  { type: 'setdata', data: data });
+  }
+
+ },
+
+ create : function()
+ {
+   var _this = this;
+   this.dialog = Roo.factory({
+    xtype : 'LayoutDialog',
+    closable : false,
+    collapsible : false,
+    height : 120,
+    modal : true,
+    resizable : false,
+    title : _this._strings['052ca52fc8eb1bdff3e34de3fa735e35'] /* Select a Language */,
+    width : 400,
+    xns : Roo,
+    '|xns' : 'Roo',
+    center : {
+     xtype : 'LayoutRegion',
+     xns : Roo,
+     '|xns' : 'Roo'
+    },
+    buttons : [
+     {
+      xtype : 'Button',
+      text : _this._strings['ea4788705e6873b424c65e91c2846b19'] /* Cancel */,
+      listeners : {
+       click : function (_self, e)
+        {
+            _this.dialog.hide();
+        }
+      },
+      xns : Roo,
+      '|xns' : 'Roo'
+     },
+     {
+      xtype : 'Button',
+      text : _this._strings['e0aa021e21dddbd6d8cecec71e9cf564'] /* OK */,
+      listeners : {
+       click : function (_self, e)
+        {
+            // do some checks?
+             
+            var data =  _this.form.getValues();
+         
+            if (!data.lang.length) {
+            
+                Roo.MessageBox.alert("Error", "Select language");
+                return;
+            
+            }
+            _this.dialog.hide();
+                    
+            var callbackData = data.lang;
+           // Roo.log(_this.data);
+            if(_this.data._with_name == true){
+                callbackData = {'lang' : data.lang , 'lang_name' : _this.form.findField('lang').lastSelectionText};
+            }
+            
+            _this.callback(callbackData);
+            
+        
+        }
+      },
+      xns : Roo,
+      '|xns' : 'Roo'
+     }
+    ],
+    items  : [
+     {
+      xtype : 'ContentPanel',
+      region : 'center',
+      xns : Roo,
+      '|xns' : 'Roo',
+      items  : [
+       {
+        xtype : 'Form',
+        method : 'GET',
+        style : 'margin:10px;',
+        url : baseURL + '/Roo/INGORE.php',
+        listeners : {
+         actioncomplete : function(_self,action)
+          {
+              if (action.type == 'setdata') {
+                 //_this.dialog.el.mask("Loading");
+                 //this.load({ method: 'GET', params: { '_id' : _this.data.id }});
+                 return;
+              }
+              if (action.type == 'load') {
+                  _this.dialog.el.unmask();
+                  return;
+              }
+              if (action.type =='submit') {
+              
+                  _this.dialog.el.unmask();
+                  _this.dialog.hide();
+          
+                   if (_this.callback) {
+                      _this.callback.call(_this, _this.form.getValues());
+                   }
+                   _this.form.reset();
+                   return;
+              }
+          },
+         rendered : function (form)
+          {
+              _this.form= form;
+          }
+        },
+        xns : Roo.form,
+        '|xns' : 'Roo.form',
+        items  : [
+         {
+          xtype : 'ComboBox',
+          allowBlank : false,
+          alwaysQuery : true,
+          displayField : 'title',
+          editable : false,
+          fieldLabel : _this._strings['4994a8ffeba4ac3140beb89e8d41f174'] /* Language */,
+          hiddenName : 'lang',
+          listWidth : 200,
+          name : 'language_name',
+          triggerAction : 'all',
+          valueField : 'code',
+          width : 200,
+          xns : Roo.form,
+          '|xns' : 'Roo.form',
+          store : {
+           xtype : 'Store',
+           listeners : {
+            beforeload : function (_self, o)
+             {
+                 o.params['!code'] = 'en'; // exclude english from the list (it's the default?)
+             }
+           },
+           xns : Roo.data,
+           '|xns' : 'Roo.data',
+           proxy : {
+            xtype : 'HttpProxy',
+            method : 'GET',
+            url : baseURL + '/Core/I18n/Lang',
+            xns : Roo.data,
+            '|xns' : 'Roo.data'
+           },
+           reader : {
+            xtype : 'JsonReader',
+            fields : [
+                {
+                    'name': 'code',
+                    'type': 'string'
+                },
+                {
+                    'name': 'title',
+                    'type': 'string'
+                }
+            ],
+            id : 'code',
+            root : 'data',
+            totalProperty : 'total',
+            xns : Roo.data,
+            '|xns' : 'Roo.data'
+           }
+          }
+         }
+        ]
+       }
+      ]
+     }
+    ]
+   });
+ }
+};
diff --git a/Pman.Dialog.AdminTranslateTemplates.bjs b/Pman.Dialog.AdminTranslateTemplates.bjs
new file mode 100644 (file)
index 0000000..19b4900
--- /dev/null
@@ -0,0 +1,116 @@
+{
+ "name" : "Pman.Dialog.AdminTranslateTemplates",
+ "parent" : "",
+ "title" : "",
+ "path" : "/home/alan/gitlive/Pman.Admin/Pman.Dialog.AdminTranslateTemplates.bjs",
+ "permname" : "",
+ "modOrder" : "001",
+ "strings" : {
+  "0a52da7a03a6de3beefe54f8c03ad80d" : "Original",
+  "d41d8cd98f00b204e9800998ecf8427e" : "",
+  "6dd08874f83507e9c7b23f1a46b7fa7c" : "Translation",
+  "ea4788705e6873b424c65e91c2846b19" : "Cancel",
+  "305253475cc868103805068f45a90468" : "Edit Translation",
+  "e0aa021e21dddbd6d8cecec71e9cf564" : "OK"
+ },
+ "named_strings" : {
+  "src_id_txt_fieldLabel" : "0a52da7a03a6de3beefe54f8c03ad80d",
+  "src_id_txt_value" : "d41d8cd98f00b204e9800998ecf8427e",
+  "txt_fieldLabel" : "6dd08874f83507e9c7b23f1a46b7fa7c"
+ },
+ "items" : [
+  {
+   "modal" : true,
+   "collapsible" : false,
+   "background" : true,
+   "title" : "Edit Translation",
+   "xtype" : "LayoutDialog",
+   "width" : 800,
+   "$ xns" : "Roo",
+   "closable" : false,
+   "resizable" : true,
+   "height" : 450,
+   "items" : [
+    {
+     "xtype" : "LayoutRegion",
+     "$ xns" : "Roo",
+     "* prop" : "center",
+     "titlebar" : true,
+     "$ title" : "\"Note: If the original text contains template variables like  {TEMPLATE_VARIABLE} <br/>Be careful to retain them otherwise the translation may not work\""
+    },
+    {
+     "region" : "center",
+     "fitToFrame" : true,
+     "background" : true,
+     "xtype" : "ContentPanel",
+     "$ xns" : "Roo",
+     "items" : [
+      {
+       "listeners" : {
+        "|actionfailed" : "function (_self, action)\n{\n    _this.dialog.el.unmask();\n    Pman.standardActionFailed(_self, action);\n}\n",
+        "|actioncomplete" : "function (_self, action)\n{\n      \n    if (action.type == 'setdata') {\n       //_this.dialog.el.mask(\"Loading\");\n       \n       Roo.log(_this.data);\n       return;\n    }\n    if (action.type == 'load') {\n         return;\n    }\n    if (action.type =='submit') {\n        _this.dialog.hide();\n        if (_this.callback) {\n            _this.callback.call(_this, _this.form.getValues());\n        }\n        _this.form.reset();\n        return;\n    }\n}\n",
+        "|rendered" : "function (form)\n{\n   _this.form = form;\n}"
+       },
+       "style" : "margin: 5px",
+       "xtype" : "Form",
+       "method" : "POST",
+       "$ xns" : "Roo.form",
+       "items" : [
+        {
+         "labelAlign" : "top",
+         "xtype" : "Row",
+         "$ xns" : "Roo.form",
+         "items" : [
+          {
+           "fieldLabel" : "Original",
+           "xtype" : "TextArea",
+           "value" : "",
+           "readOnly" : true,
+           "width" : 750,
+           "$ xns" : "Roo.form",
+           "height" : 150,
+           "name" : "src_id_txt"
+          }
+         ]
+        },
+        {
+         "labelAlign" : "top",
+         "xtype" : "Row",
+         "$ xns" : "Roo.form",
+         "items" : [
+          {
+           "fieldLabel" : "Translation",
+           "xtype" : "TextArea",
+           "width" : 750,
+           "$ xns" : "Roo.form",
+           "name" : "txt",
+           "height" : 150
+          }
+         ]
+        }
+       ]
+      }
+     ]
+    },
+    {
+     "listeners" : {
+      "|click" : "function() {\n    _this.form.reset();\n    _this.dialog.hide();\n}"
+     },
+     "text" : "Cancel",
+     "xtype" : "Button",
+     "$ xns" : "Roo",
+     "* prop" : "buttons[]"
+    },
+    {
+     "listeners" : {
+      "|click" : "function() {\n    _this.dialog.el.mask(\"Saving\");\n    //_this.form.doAction('submit');\n    _this.dialog.hide();\n    if (_this.callback) {\n        _this.callback.call(_this, _this.form.getValues());\n    }\n    _this.dialog.el.unmask();\n    _this.form.reset();\n}"
+     },
+     "text" : "OK",
+     "xtype" : "Button",
+     "$ xns" : "Roo",
+     "* prop" : "buttons[]"
+    }
+   ]
+  }
+ ]
+}
\ No newline at end of file
diff --git a/Pman.Dialog.AdminTranslateTemplates.js b/Pman.Dialog.AdminTranslateTemplates.js
new file mode 100644 (file)
index 0000000..241cc77
--- /dev/null
@@ -0,0 +1,188 @@
+//<script type="text/javascript">
+
+// Auto generated file - created by app.Builder.js- do not edit directly (at present!)
+
+Roo.namespace('Pman.Dialog');
+
+Pman.Dialog.AdminTranslateTemplates = {
+
+ _strings : {
+  '0a52da7a03a6de3beefe54f8c03ad80d' :"Original",
+  'd41d8cd98f00b204e9800998ecf8427e' :"",
+  '6dd08874f83507e9c7b23f1a46b7fa7c' :"Translation",
+  'ea4788705e6873b424c65e91c2846b19' :"Cancel",
+  '305253475cc868103805068f45a90468' :"Edit Translation",
+  'e0aa021e21dddbd6d8cecec71e9cf564' :"OK"
+ },
+ _named_strings : {
+  'src_id_txt_fieldLabel' : '0a52da7a03a6de3beefe54f8c03ad80d' /* Original */ ,
+  'src_id_txt_value' : 'd41d8cd98f00b204e9800998ecf8427e' /*  */ ,
+  'txt_fieldLabel' : '6dd08874f83507e9c7b23f1a46b7fa7c' /* Translation */ 
+ },
+
+ dialog : false,
+ callback:  false,
+
+ show : function(data, cb)
+ {
+  if (!this.dialog) {
+   this.create();
+  }
+
+  this.callback = cb;
+  this.data = data;
+  this.dialog.show(this.data._el);
+  if (this.form) {
+   this.form.reset();
+   this.form.setValues(data);
+   this.form.fireEvent('actioncomplete', this.form,  { type: 'setdata', data: data });
+  }
+
+ },
+
+ create : function()
+ {
+   var _this = this;
+   this.dialog = Roo.factory({
+    xtype : 'LayoutDialog',
+    background : true,
+    closable : false,
+    collapsible : false,
+    height : 450,
+    modal : true,
+    resizable : true,
+    title : _this._strings['305253475cc868103805068f45a90468'] /* Edit Translation */,
+    width : 800,
+    xns : Roo,
+    '|xns' : 'Roo',
+    center : {
+     xtype : 'LayoutRegion',
+     title : "Note: If the original text contains template variables like  {TEMPLATE_VARIABLE} <br/>Be careful to retain them otherwise the translation may not work",
+     titlebar : true,
+     xns : Roo,
+     '|xns' : 'Roo'
+    },
+    buttons : [
+     {
+      xtype : 'Button',
+      text : _this._strings['ea4788705e6873b424c65e91c2846b19'] /* Cancel */,
+      listeners : {
+       click : function() {
+            _this.form.reset();
+            _this.dialog.hide();
+        }
+      },
+      xns : Roo,
+      '|xns' : 'Roo'
+     },
+     {
+      xtype : 'Button',
+      text : _this._strings['e0aa021e21dddbd6d8cecec71e9cf564'] /* OK */,
+      listeners : {
+       click : function() {
+            _this.dialog.el.mask("Saving");
+            //_this.form.doAction('submit');
+            _this.dialog.hide();
+            if (_this.callback) {
+                _this.callback.call(_this, _this.form.getValues());
+            }
+            _this.dialog.el.unmask();
+            _this.form.reset();
+        }
+      },
+      xns : Roo,
+      '|xns' : 'Roo'
+     }
+    ],
+    items  : [
+     {
+      xtype : 'ContentPanel',
+      background : true,
+      fitToFrame : true,
+      region : 'center',
+      xns : Roo,
+      '|xns' : 'Roo',
+      items  : [
+       {
+        xtype : 'Form',
+        method : 'POST',
+        style : 'margin: 5px',
+        listeners : {
+         actioncomplete : function (_self, action)
+          {
+                
+              if (action.type == 'setdata') {
+                 //_this.dialog.el.mask("Loading");
+                 
+                 Roo.log(_this.data);
+                 return;
+              }
+              if (action.type == 'load') {
+                   return;
+              }
+              if (action.type =='submit') {
+                  _this.dialog.hide();
+                  if (_this.callback) {
+                      _this.callback.call(_this, _this.form.getValues());
+                  }
+                  _this.form.reset();
+                  return;
+              }
+          },
+         actionfailed : function (_self, action)
+          {
+              _this.dialog.el.unmask();
+              Pman.standardActionFailed(_self, action);
+          },
+         rendered : function (form)
+          {
+             _this.form = form;
+          }
+        },
+        xns : Roo.form,
+        '|xns' : 'Roo.form',
+        items  : [
+         {
+          xtype : 'Row',
+          labelAlign : 'top',
+          xns : Roo.form,
+          '|xns' : 'Roo.form',
+          items  : [
+           {
+            xtype : 'TextArea',
+            fieldLabel : _this._strings['0a52da7a03a6de3beefe54f8c03ad80d'] /* Original */,
+            height : 150,
+            name : 'src_id_txt',
+            readOnly : true,
+            value : _this._strings['d41d8cd98f00b204e9800998ecf8427e'] /*  */,
+            width : 750,
+            xns : Roo.form,
+            '|xns' : 'Roo.form'
+           }
+          ]
+         },
+         {
+          xtype : 'Row',
+          labelAlign : 'top',
+          xns : Roo.form,
+          '|xns' : 'Roo.form',
+          items  : [
+           {
+            xtype : 'TextArea',
+            fieldLabel : _this._strings['6dd08874f83507e9c7b23f1a46b7fa7c'] /* Translation */,
+            height : 150,
+            name : 'txt',
+            width : 750,
+            xns : Roo.form,
+            '|xns' : 'Roo.form'
+           }
+          ]
+         }
+        ]
+       }
+      ]
+     }
+    ]
+   });
+ }
+};
index af3c7b4..ed24431 100644 (file)
@@ -7,33 +7,25 @@
  "modOrder" : "950",
  "strings" : {
   "0a52da7a03a6de3beefe54f8c03ad80d" : "Original",
-  "4994a8ffeba4ac3140beb89e8d41f174" : "Language",
-  "ae739a236065a45c64ad51aacb19498c" : "Active?",
-  "d41d8cd98f00b204e9800998ecf8427e" : "",
+  "0b8d92bc19b720bb1065649535463409" : "Translations",
+  "69fd71b6f79260924a32a45850a13ab7" : "Translations (rescan this to update strings)",
+  "9d1ead73e678fa2f51a70a933b0bf017" : "Not Found",
   "801ab24683a4a8c433c6eb40c48bcd9d" : "Download",
-  "e2ade2e0b88406a390f59b5232abb328" : "Translated (Click to Edit)",
   "6dd08874f83507e9c7b23f1a46b7fa7c" : "Translation",
-  "83dad8107f9459efe2b4fabcf5b63108" : "Select Language",
-  "a1d1ae170f841c328acdc6052511ed8c" : "Text in interface",
-  "78463a384a5aa4fad5fa73e2f506ecfc" : "English",
-  "4e7c16d320ae129cc81b296e05748b3a" : "Translate App",
-  "526d688f37a86d3c3f27d0c5016eb71d" : "Reset",
-  "b51c3fa7e0ae26a1d88bf1279f265bb4" : "Select Module",
-  "49ee3087348e8d44e1feda1917443987" : "Name",
-  "552bcc4e00cd663f09cc4efbaca1cd45" : "Select Translation of",
-  "ca0dbad92a874b2f69b549293387925e" : "Code",
-  "0a9e8bd9e8b301dfb2c21c355e0b377d" : "Languages and Countries"
- },
- "named_strings" : {
-  "language_title_value" : "d41d8cd98f00b204e9800998ecf8427e",
-  "language_title_qtip" : "83dad8107f9459efe2b4fabcf5b63108",
-  "language_title_fieldLabel" : "4994a8ffeba4ac3140beb89e8d41f174"
+  "e3d388b2c43e5ba0905702620ae2abc1" : "Search for",
+  "e2f9d206562d8f5ea421ad51100f7151" : "Displaying petition_entry{0} - {1} of {2}",
+  "cd6ae20e52d83f601c5fa12b66f0f6d0" : "Rescan",
+  "4d1c8263ba1036754f8db14a98f9f006" : "Reload",
+  "f2a6c498fb90ee345d997f888fce3b18" : "Delete",
+  "03c2e7e41ffc181a4e84080b4710e81e" : "New",
+  "193cfc9be3b995831c6af2fea6650e60" : "Page",
+  "1bc29b36f623ba82aaf6724fd3b16718" : "md5"
  },
  "items" : [
   {
    "region" : "center",
    "xtype" : "NestedLayoutPanel",
-   "title" : "Translate App",
+   "title" : "Translations",
    "$ xns" : "Roo",
    "items" : [
     {
      "* prop" : "layout",
      "items" : [
       {
-       "alwaysShowTabs" : true,
        "xtype" : "LayoutRegion",
-       "tabPosition" : "top",
+       "width" : 450,
+       "$ xns" : "Roo",
+       "split" : true,
+       "* prop" : "west"
+      },
+      {
+       "xtype" : "LayoutRegion",
        "$ xns" : "Roo",
        "* prop" : "center"
       },
       {
        "listeners" : {
-        "|activate" : "function() {\n    _this.panel = this;\n    if (_this.grid) {\n       _this.grid.getDataSource().reload(); \n    }\n}"
+        "render" : "function (_self)\n{\n    _this.treepanel = _self;\n}"
        },
-       "fitToframe" : true,
-       "background" : true,
-       "region" : "center",
-       "title" : "Text in interface",
-       "xtype" : "GridPanel",
-       "fitContainer" : true,
+       "region" : "west",
+       "xtype" : "TreePanel",
        "$ xns" : "Roo",
        "items" : [
         {
-         "listeners" : {
-          "|render" : "function() { \n    _this.grid = this; \n    //_this.dialog = Pman.Dialog.FILL_IN\n    if (_this.panel.active) {\n      _this.grid.getDataSource().reload(); \n    }\n}",
-          "celldblclick" : "function (_self, rowIndex, columnIndex, e)\n{\n    var di  = this.colModel.config[columnIndex].dataIndex;\n    if (di != 'reset_tx') {\n        return;\n    }\n    rec = this.ds.getAt(rowIndex);\n    \n      var g = _this.grid;\n \n    new Pman.Request({\n        url : baseURL + '/Admin/Translations.php',\n        method: 'POST',\n        params : {\n            id : rec.get('id'),\n            txt : '',\n            lang :  _this.langCombo.getValue(),\n            module :  _this.modCombo.getValue()\n        },\n        success : function()\n        {\n            //g.getView().el.unmask();\n            //g.getDataSource().reload();\n            rec.set('txt', '');\n        },\n        failure : function()\n        {\n            Roo.MessageBox.alert(\"Error\", \"There was a problem saving the data - try reloading\");\n           // g.getView().el.unmask();\n        }\n        \n    });\n       \n    \n}",
-          "|beforeedit" : "function(e) {\n    console.log('beforeedit');\n    //if (e.record.get('origtxt').indexOf('<') > -1) {\n                       // console.log(\"HTML EDITOR!!\");\n                     \n                    //    return false;\n                    //}\n                    if (e.record.get('txt').replace(/\\s+/, '').length) {\n                        return true;\n                    }\n                    if (e.record.get('suggest').length) {\n                        e.record.set('txt', e.record.get('suggest'));\n                    //    _this.saveRec(e.record);\n                        return;\n                    }\n                    \n                    \n                    \n                   \n                    var tl = e.record.get('id').split('/')[0];\n                  \n                    tl = (tl == 'zh_HK') ? 'zh-TW' : tl; \n                    tl = tl.replace('_', '-');\n                    var rec = e.record;\n                    \n                    \n                    \n                    Pman.gtranslate(e.record.get('origtxt'), 'en', tl, function(result) { \n                        if (typeof(result) == 'object') { //error\n                            return; \n                           }\n                        \n                        if (_this.grid.activeEditor) {\n                            _this.grid.activeEditor.setValue(result);\n                        } else {\n                            rec.set('txt',result);\n                            //_this.saveRec(rec);\n                        }\n\n                        //\n                        \n                        \n                        //console.log(result.translation);\n                    });\n                    \n                   \n                    \n                    return true;\n                } ",
-          "|afteredit" : "function (e)\n{\n    var saveRec  = function(rec)\n    {\n        var g = _this.grid;\n\n        //g.getView().el.mask('Saving');\n        new Pman.Request({\n            url : baseURL + '/Admin/Translations.php',\n            method: 'POST',\n            params : {\n                id : rec.get('id'),\n                txt : rec.get('txt'),\n                lang :  _this.langCombo.getValue(),\n                module :  _this.modCombo.getValue()\n            },\n            success : function()\n            {\n                //g.getView().el.unmask();\n                //g.getDataSource().reload();\n            },\n            failure : function()\n            {\n                Roo.MessageBox.alert(\"Error\", \"There was a problem saving the data - try reloading\");\n               // g.getView().el.unmask();\n            }\n            \n    });\n        };\n    \n    saveRec.defer(1000, _this, [ e.record ]);\n}"
-         },
-         "autoExpandColumn" : "txt",
-         "xtype" : "EditorGrid",
-         "loadMask" : true,
-         "clicksToEdit" : 1,
-         "$ xns" : "Roo.grid",
-         "* prop" : "grid",
+         "xtype" : "Toolbar",
+         "$ xns" : "Roo",
+         "* prop" : "toolbar",
          "items" : [
           {
            "listeners" : {
-            "|beforeload" : "function (_self, opts)\n{\n\n                        if (!_this.langCombo || !_this.langCombo.getValue().length) {\n                            return false;\n                        }\n                        if (!_this.modCombo || !_this.modCombo.getValue().length) {\n                            return false;\n                        }\n                        opts.params = {\n                            lang :  _this.langCombo.getValue(),\n                            module :  _this.modCombo.getValue()\n                        };\n}",
-            "loadexception" : "function (self, ret, load, jsonData)\n{\n    Roo.MessageBox.alert(\"Error\", jsonData);\n}"
+            "click" : "function (_self, e)\n{\n    Pman.Dialog.AdminLanguagePick.show( {  }, function(lang) {\n        \n        new Pman.Request({\n            url : baseURL + '/Roo/core_templatestr',\n            method : 'POST',\n            params : {\n                _rescan : lang\n            }, \n            success : function()\n            {\n                _this.treepanel.tree.getRootNode().reload();\n            }\n        });\n    \n    });\n    \n}"
            },
-           "xtype" : "Store",
-           "$ reader" : "Pman.Readers.Category",
-           "$ xns" : "Roo.data",
-           "* prop" : "dataSource",
-           "items" : [
-            {
-             "$ url" : "baseURL + '/Admin/Translations.php'",
-             "method" : "GET",
-             "xtype" : "HttpProxy",
-             "$ xns" : "Roo.data",
-             "* prop" : "proxy"
-            },
-            {
-             "id" : "id",
-             "root" : "data",
-             "xtype" : "JsonReader",
-             "$ xns" : "Roo.data",
-             "$ fields" : "[                    'id',             'tablename',             'tableid',             'colname',             'txt',             'lang',             { name:'updated', type:'date', dateFormat: 'Y-m-d H:i:s' },             { name:'origupdated', type:'date', dateFormat: 'Y-m-d H:i:s' },             'origtxt',             'msum',             'suggest'                  ]",
-             "* prop" : "reader",
-             "totalProperty" : "total"
-            }
-           ]
+           "text" : "New",
+           "xtype" : "Button",
+           "$ xns" : "Roo.Toolbar"
           },
           {
-           "xtype" : "Toolbar",
-           "$ xns" : "Roo",
-           "* prop" : "toolbar",
-           "items" : [
-            {
-             "listeners" : {
-              "|render" : "function (_self)\n{\n  _this.modCombo = _self;\n}",
-              "|select" : "function (combo, record, index)\n{\n  _this.grid.getDataSource().reload(); \n}"
-             },
-             "triggerAction" : "all",
-             "selectOnFocus" : true,
-             "displayField" : "module",
-             "xtype" : "ComboBox",
-             "valueField" : "module",
-             "emptyText" : "Select Module",
-             "typeAhead" : false,
-             "editable" : false,
-             "width" : 200,
-             "$ xns" : "Roo.form",
-             "mode" : "local",
-             "items" : [
-              {
-               "| data" : "(function() {             \n        var modlist = [];             \n        AppModules = typeof(AppModules) == 'undefined' ? '' : AppModules;\n        Roo.each( AppModules.split(','), function(mod) {            \n                 modlist.push( [ mod ] );            \n      });             \n      return modlist;\n   })()",
-               "xtype" : "SimpleStore",
-               "$ fields" : "['module']",
-               "$ xns" : "Roo.data",
-               "* prop" : "store"
-              }
-             ]
-            },
-            {
-             "listeners" : {
-              "|render" : "function (_self)\n{\n  _this.langCombo=_self;\n}",
-              "|select" : "function (combo, record, index)\n{\n  _this.grid.getDataSource().reload(); \n}"
-             },
-             "triggerAction" : "all",
-             "selectOnFocus" : true,
-             "displayField" : "ldisp",
-             "xtype" : "ComboBox",
-             "valueField" : "lang",
-             "emptyText" : "Select Language",
-             "typeAhead" : false,
-             "editable" : false,
-             "width" : 200,
-             "$ xns" : "Roo.form",
-             "mode" : "local",
-             "items" : [
-              {
-               "xtype" : "SimpleStore",
-               "$ data" : "[                                                [ 'zh_HK' , '\\u7E41\\u4E2D - Trad. Chin. (HK)' ],                         [ 'zh_CN', '\\u7C21\\u4E2D - Simp. Chin.' ]                     ]",
-               "$ xns" : "Roo.data",
-               "$ fields" : "['lang', 'ldisp']",
-               "* prop" : "store"
-              }
-             ]
-            },
-            {
-             "xtype" : "Fill",
-             "$ xns" : "Roo.Toolbar"
-            },
-            {
-             "listeners" : {
-              "click" : "function (_self, e)\n{\n    new Pman.Download({\n        grid: _this.grid\n    \n    });\n}"
-             },
-             "text" : "Download",
-             "xtype" : "Button",
-             "$ xns" : "Roo.Toolbar"
-            }
-           ]
+           "xtype" : "Separator",
+           "$ xns" : "Roo.Toolbar"
           },
           {
-           "xtype" : "ColumnModel",
-           "width" : 150,
-           "header" : "Name",
-           "$ renderer" : "function(v,x,r) {                       \n  var c = '#666';                       \n    if (r.get('updated') < r.get('origupdated')) {         \n                        c = 'red';                       \n                        \n                          }                                 \n                                           return '<div style=\"color:'+c+'\";>' +r.get('tableid')+ ':' + v + '</div>';          \n                                                                               }",
-           "$ xns" : "Roo.grid",
-           "* prop" : "colModel[]",
-           "dataIndex" : "colname"
+           "listeners" : {
+            "click" : "function (_self, e)\n{\n    var tree = _this.treepanel.tree;\n    var sn  = tree.getSelectionModel().getSelectedNode();\n\n    if (!sn || typeof(sn.attributes.language) == 'undefined' || !sn.attributes.language) {\n        Roo.MessageBox.alert(\"Error\", \"Select a language\");\n        return;\n    }\n\n     Roo.MessageBox.confirm(\"Confirm\", \"Are sure you want to delete the language\", function (v){\n            if (v != 'yes') {\n                return;\n            }\n            Roo.MessageBox.alert(\"Not yet\", \"not done yet\");\n            return;\n            \n            \n            \n            \n        });\n}"
+           },
+           "text" : "Delete",
+           "xtype" : "Button",
+           "$ xns" : "Roo.Toolbar"
           },
           {
-           "xtype" : "ColumnModel",
-           "width" : 300,
-           "header" : "Original",
-           "$ renderer" : "function(v,x,r) {                         var c = '#666';                         if (r.get('updated') < r.get('origupdated')) {                             c = 'red';                         }                         return '<div style=\"color:' + c+ '\">' +                                  Ext.util.Format.htmlEncode(v) + '</div>';                                              }",
-           "$ xns" : "Roo.grid",
-           "* prop" : "colModel[]",
-           "dataIndex" : "origtxt"
+           "xtype" : "Separator",
+           "$ xns" : "Roo.Toolbar"
           },
           {
-           "xtype" : "ColumnModel",
-           "header" : "Reset",
-           "width" : 50,
-           "$ renderer" : "function(v,x,r) {    \n    return  '<img src=\"' + rootURL + '/Pman/templates/images/edit-clear.gif' + '\" width=\"16\" height=\"16\">';\n}",
-           "$ xns" : "Roo.grid",
-           "* prop" : "colModel[]",
-           "dataIndex" : "reset_tx"
+           "listeners" : {
+            "click" : "function (_self, e)\n{\n    var tree = _this.treepanel.tree;\n    Roo.log(tree);\n    var sn  = tree.getSelectionModel().getSelectedNode();\n\n    if (!sn) {\n        Roo.MessageBox.alert(\"Error\", \"Select a node\");\n        return;\n    }\n    \n    var syncTemplate = function(){\n        new Pman.Request({\n            url : baseURL + '/Admin/UpdateBjsTemplates',\n            method : 'GET',\n            mask : 'Processing...',\n            timeout : 9000000,\n            success : function()\n            {\n                _this.treepanel.tree.getRootNode().reload();\n            }\n        });\n    \n    };\n    \n    \n    var syncLanguage = function(){\n        new Pman.Request({\n            url : baseURL + '/Roo/Core_templatestr',\n            method : 'POST',\n            mask : 'Processing...',\n            params : {\n                _rescan : sn.attributes.id.split(':')[1]\n            }, \n            success : function()\n            {\n                _this.treepanel.tree.getRootNode().reload();\n            }\n        });\n    };\n    \n    if(typeof(sn.isRoot) != 'undefined' && sn.isRoot){\n        syncTemplate();\n        return;\n    }\n    \n    if(typeof(sn.attributes.language) != 'undefined' && sn.attributes.language){\n        syncLanguage();\n        return;\n    }\n    \n    \n    \n    \n    \n}"
+           },
+           "text" : "Rescan",
+           "xtype" : "Button",
+           "$ xns" : "Roo.Toolbar"
           },
           {
-           "xtype" : "ColumnModel",
-           "header" : "Translated (Click to Edit)",
-           "width" : 150,
-           "$ renderer" : "function(v,x,r) {                                                   var c = '#666';                         if (r.get('updated') < r.get('origupdated')) {                             c = 'red';                         }                                                  return '<div style=\"color:' + c+ '\">' + Ext.util.Format.htmlEncode(v) + '</div>';                     }",
-           "$ xns" : "Roo.grid",
-           "* prop" : "colModel[]",
-           "dataIndex" : "txt",
-           "items" : [
-            {
-             "xtype" : "GridEditor",
-             "$ xns" : "Roo.grid",
-             "* prop" : "editor",
-             "items" : [
-              {
-               "xtype" : "TextField",
-               "$ xns" : "Roo.form",
-               "* prop" : "field"
-              }
-             ]
-            }
-           ]
+           "xtype" : "Fill",
+           "$ xns" : "Roo.Toolbar"
+          },
+          {
+           "listeners" : {
+            "click" : "function (_self, e)\n{\n    var tree = _this.treepanel.tree;\n\n    var sn  = tree.getSelectionModel().getSelectedNode();\n    \n    p = {\n        csvCols : 'src_id_mdsum,template_id_view_name,template_id_template,src_id_txt,lang,txt',\n        csvTitles : 'Code,Module,Template,Original,Language,Translation',\n        limit : 9999,\n        sort: 'template_id_view_name,template_id_template,src_id_txt',\n        dir: 'ASC'\n    };\n    if (!sn ||  sn.id == 'transtree') {\n        Roo.MessageBox.alert(\"Error\", \"Select language, module or page\");\n        return;\n    }\n    if (typeof(sn.id) == 'number') {\n        p.template_id = sn.id;\n\n    }\n    if (sn.id.match(/^view:/)) {\n        var sns = sn.id.split(':');\n        p.lang = sns[1];\n        p.template_id_view_name = sns[2];\n    }\n    if (sn.id.match(/^lang:/)) {\n        var sns = sn.id.split(':');\n        p.lang = sns[1];\n\n   }\n    // transtree\n    // view: {lang} : {view_name}\n    // lang:\n     \n    new Pman.Download({\n        url : baseURL + '/Roo/Core_templatestr',\n        params : p,\n        method : 'GET' \n    });\n    \n    \n    \n    \n    \n}"
+           },
+           "text" : "Download",
+           "xtype" : "Button",
+           "$ xns" : "Roo.Toolbar"
+          },
+          {
+           "xtype" : "Separator",
+           "$ xns" : "Roo.Toolbar"
+          },
+          {
+           "listeners" : {
+            "click" : "function (_self, e)\n{\n    _this.treepanel.tree.getRootNode().reload();\n    \n}"
+           },
+           "text" : "Reload",
+           "xtype" : "Button",
+           "$ xns" : "Roo.Toolbar"
+          }
+         ]
+        },
+        {
+         "xtype" : "TreePanel",
+         "rootVisible" : true,
+         "$ xns" : "Roo.tree",
+         "containerScroll" : false,
+         "* prop" : "tree",
+         "items" : [
+          {
+           "listeners" : {
+            "loadexception" : "function (This, node, response)\n{\n    Roo.MessageBox.alert(\"Error\", \"Problem loading tree\");\n}",
+            "beforeload" : "function (This, node, callback)\n{\n    // set some params.\n    Roo.log(node);\n    this.baseParams._tree = 1;\n    \n    //this.baseParams.category = node.attributes.category;\n}"
+           },
+           "$ baseParams" : "{ _tree : 1 }",
+           "xtype" : "TreeLoader",
+           "requestMethod" : "GET",
+           "$ xns" : "Roo.tree",
+           "* prop" : "loader",
+           "$ dataUrl" : "baseURL + '/Roo/Core_templatestr'"
+          },
+          {
+           "id" : "transtree",
+           "text" : "Translations (rescan this to update strings)",
+           "xtype" : "AsyncTreeNode",
+           "$ xns" : "Roo.tree",
+           "* prop" : "root"
+          },
+          {
+           "listeners" : {
+            "selectionchange" : "function (_self, node)\n{\n    Roo.log(node);\n    \n    //if (node.id.split('/').length < 2) {\n    //    return;\n   // }\n    (function() {\n        _this.grid.footer.onClick('first');\n    }).defer(100);\n    \n}"
+           },
+           "xtype" : "DefaultSelectionModel",
+           "$ xns" : "Roo.tree",
+           "* prop" : "selModel"
           }
          ]
         }
       },
       {
        "listeners" : {
-        "|activate" : "function() {\n    _this.langpanel = this;\n    if (_this.langgrid) {\n        _this.langgrid.ds.load({});\n    }\n}"
+        "|activate" : "function() {\n    _this.panel = this;\n    if (_this.grid) {\n        _this.grid.footer.onClick('first');\n    }\n}"
        },
-       "fitToframe" : true,
-       "background" : true,
+       "background" : false,
        "region" : "center",
-       "title" : "Languages and Countries",
+       "fitToframe" : true,
+       "title" : "Page",
        "xtype" : "GridPanel",
        "fitContainer" : true,
        "$ xns" : "Roo",
-       "tableName" : "i18n",
+       "tableName" : "Page",
        "items" : [
         {
          "listeners" : {
-          "beforeedit" : "function(e) {\n    console.log('beforeedit');\n    //if (e.record.get('origtxt').indexOf('<') > -1) {\n                       // console.log(\"HTML EDITOR!!\");\n             \n            //    return false;\n            //}\n            if (e.record.get('lval').replace(/\\s+/, '').length) {\n                return true;\n            }\n            \n            \n            var tl = _this.langgridCombo.getValue();\n          \n            tl = (tl == 'zh_HK') ? 'zh-TW' : tl; \n            tl = tl.replace('_', '-');\n            var rec = e.record;\n            \n            \n            \n            Pman.gtranslate(e.record.get('lval_en'), 'en', tl, function(result) { \n                if (typeof(result) == 'object') { //error\n                    return; \n                   }\n                \n                if (_this.grid.activeEditor) {\n                    _this.grid.activeEditor.setValue(result);\n                } else {\n                    rec.set('lval',result);\n                    //_this.saveRec(rec);\n                }\n\n                //\n                \n                \n                //console.log(result.translation);\n            });\n            \n           \n            \n            return true;\n        } ",
-          "|render" : "function() \n{\n    _this.langgrid = this; \n    //_this.dialog = Pman.Dialog.FILL_IN\n    if (_this.langpanel.active) {\n       this.ds.load({});\n    }\n}",
-          "cellclick" : "function (_self, rowIndex, columnIndex, e)\n{\n    if(_this.langgrid.colModel.getDataIndex(columnIndex) !== 'is_active'){\n        return;\n    }\n    \n    var s = _this.langgrid.ds.getAt(rowIndex);\n    \n    if(!s || s.data.id * 1 < 0){\n        return;\n    }\n    \n    s.set('is_active', s.data.is_active ? 0 : 1);\n    \n    new Pman.Request({\n        url : baseURL+'/Roo/I18n',\n        method : 'POST',\n        params : {\n            id : s.data.id,\n            is_active : s.data.is_active\n        }\n    }); \n    \n}",
-          "afteredit" : "function (e)\n{\n    var saveRec  = function(rec)\n    {\n        var g = _this.grid;\n\n        //g.getView().el.mask('Saving');\n        Ext.Ajax.request({\n            url : baseURL + '/Roo/I18n.php',\n            method: 'POST',\n            params : {\n                id : rec.get('id'),\n                lval : rec.get('lval'),\n                ltype : rec.get('ltype')\n            },\n            success : function()\n            {\n                //g.getView().el.unmask();\n                //g.getDataSource().reload();\n            },\n            failure : function()\n            {\n                Ext.Msg.alert(\"Error\", \"There was a problem saving the data - try reloading\");\n               // g.getView().el.unmask();\n            }\n            \n    });\n        };\n    \n    saveRec.defer(1000, _this, [ e.record ]);\n}"
+          "beforeedit" : "function (e)\n{   \n    /*if (e.record.data.src_id_txt.indexOf('<') > -1) {\n       // console.log(\"HTML EDITOR!!\");\n        Pman.Dialog.CmsTranslateEditor.show(e.record);\n        return false;\n    }*/\n    \n    var str=e.record.data.src_id_txt;\n    var patt=/{(.*?)}/g;\n    \n    Roo.log(str.length);\n    \n    \n    if(patt.test(str)){\n        e.cancel = true;\n        Pman.Dialog.AdminTranslateTemplates.show(e.record.data, function(v){\n            Roo.log(v);\n            e.value = v.txt;\n            e.record.set('txt', v.txt);\n            e.record.commit();\n        });\n        /*\n        Roo.MessageBox.prompt('WARNING', 'This text is with {TEMPLATE VARIABLE}, PLEASE BE CAREFUL EDITING. What\\'s change? '+str, function(btn, text){\n            if (btn == 'ok'){\n                e.value = text;\n                e.record.set('txt', text);\n                e.record.commit();\n            }\n        });*/\n        return;\n    }\n    \n    if(str.length > 150){\n        e.cancel = true;\n        Pman.Dialog.AdminTranslateTemplates.show(e.record.data, function(v){\n            e.value = v.txt;\n            e.record.set('txt', v.txt);\n            e.record.commit();\n        });\n        /*\n        Roo.MessageBox.prompt('WARNING', 'This text is with {TEMPLATE VARIABLE}, PLEASE BE CAREFUL EDITING. What\\'s change? '+str, function(btn, text){\n            if (btn == 'ok'){\n                e.value = text;\n                e.record.set('txt', text);\n                e.record.commit();\n            }\n        });*/\n        return;\n    }\n    \n\n    if (e.record.data.txt.replace(/\\s+/, '').length) {\n        return true;\n    }\n    \n    var tl = _this.treepanel.tree.getSelectionModel().getSelectedNode().parentNode.attributes.id;\n    // mapping?\n    \n    tl = (tl == 'zh_HK') ? 'zh-TW' : tl;\n    \n    if (tl == 'en' && !e.value.length) {\n\n        e.value = e.record.data.src_id_txt;\n        e.record.set('txt', e.record.data.src_id_txt);\n        return true;\n    }\n    \n    Pman.GoogleTranslate(e.record.data.src_id_txt, \"en\", tl, function(result) {\n       // Roo.log(result);\n        _this.grid.activeEditor.setValue(result);\n        //console.log(result.translation);\n    });\n    \n\n    \n    return true;\n}",
+          "|rowdblclick" : "function (_self, rowIndex, e)\n{\n    if (!_this.dialog) {\n        return;\n    }\n    _this.dialog.show( this.getDataSource().getAt(rowIndex).data, function() {\n        _this.grid.footer.onClick('first');\n    }); \n}\n",
+          "|render" : "function() \n{\n    _this.grid = this; \n    //_this.dialog = Pman.Dialog.FILL_IN\n    if (_this.panel.active) {\n        this.footer.onClick('first');\n      // this.ds.onc.onClick('first');\n    }\n}",
+          "afteredit" : "function (e)\n{\n    e.record.commit();\n}"
          },
-         "autoExpandColumn" : "lval",
+         "autoExpandColumn" : "txt",
          "xtype" : "EditorGrid",
          "loadMask" : true,
          "clicksToEdit" : 1,
          "$ xns" : "Roo.grid",
          "* prop" : "grid",
          "items" : [
+          {
+           "xtype" : "Toolbar",
+           "$ xns" : "Roo",
+           "* prop" : "toolbar",
+           "items" : [
+            {
+             "listeners" : {
+              "specialkey" : "function (_self, e)\n{\n_this.grid.footer.onClick('first');\n}",
+              "render" : "function (_self)\n{\n    _this.searchBox = this;\n}"
+             },
+             "xtype" : "TextField",
+             "String emptyText" : "Search for",
+             "$ xns" : "Roo.form"
+            },
+            {
+             "listeners" : {
+              "|click" : "function (_self, e)\n{\n_this.grid.footer.onClick('first');\n}"
+             },
+             "xtype" : "Button",
+             "cls" : "x-btn-icon",
+             "$ icon" : "rootURL + '/Pman/templates/images/search.gif'",
+             "$ xns" : "Roo.Toolbar"
+            },
+            {
+             "listeners" : {
+              "|click" : "function (_self, e)\n{\n    _this.searchBox.setValue('');\n    \n    _this.grid.footer.onClick('first');\n}"
+             },
+             "xtype" : "Button",
+             "cls" : "x-btn-icon",
+             "$ icon" : "rootURL + '/Pman/templates/images/edit-clear.gif'",
+             "$ xns" : "Roo.Toolbar"
+            }
+           ]
+          },
+          {
+           "pageSize" : 100,
+           "xtype" : "PagingToolbar",
+           "emptyMsg" : "Not Found",
+           "$ xns" : "Roo",
+           "displayMsg" : "Displaying petition_entry{0} - {1} of {2}",
+           "displayInfo" : true,
+           "* prop" : "footer"
+          },
           {
            "listeners" : {
-            "beforeload" : "function (_self, options)\n{\n   options  =options ||  {};\n   options.params =options.params|| {};\n   options.params.ltype = _this.langtypeCombo.getValue();\n   options.params.inlang = _this.langgridCombo.getValue();\n   options.params['query[_with_en]'] = 1;\n   if (!options.params.ltype.length || !options.params.inlang.length) {\n       return false;\n   }\n   \n   options.params.limit = 9999;\n   \n}"
+            "update" : "function (_self, rec, operation)\n{\n    Roo.log(operation);\n    \n    if (operation != 'commit') {\n        return;\n    }\n    \n\n    _this.grid.getView().el.mask(\"Saving\");\n    new Pman.Request({\n        url : baseURL + '/Roo/Core_templatestr',\n        method: 'POST',\n        params : {\n            id : rec.get('id'),\n            txt : rec.get('txt')\n        },\n        success : function()\n        {\n            _this.grid.getView().el.unmask();\n                //g.getDataSource().reload();\n        },\n        failure : function()\n        {\n            _this.grid.getView().el.unmask();\n            Roo.MessageBox.alert(\"Error\", \"There was a problem saving the data - try reloading\");\n         }\n            \n    });\n    \n}",
+            "beforeload" : "function (_self, o)\n{\n   \n    var sn = _this.treepanel.tree.getSelectionModel().getSelectedNode();\n\n    if (!sn || typeof(sn.attributes) == 'undefined' || typeof(sn.attributes.leaf) == 'undefined' || !sn.attributes.leaf) { \n        _this.grid.ds.removeAll();\n        return false;\n    }\n\n    o.params = o.params || {};\n    o.params.lang =  sn.parentNode.attributes.id.split(':')[1];\n    o.params.template_id = sn.attributes.id * 1;\n    o.params.active = 1;\n    o.params['!src_id'] = 0;\n    \n    if (_this.searchBox && _this.searchBox.getValue().length) { \n        o.params['_search_txt'] = _this.searchBox.getValue();\n    }\n    \n    \n    if(sn.attributes.on_table){\n        o.params.on_table = sn.attributes.on_table;\n    }\n    \n}\n\n\n"
            },
            "xtype" : "Store",
            "remoteSort" : true,
-           "$ sortInfo" : "{ field : 'lkey', direction: 'ASC' }",
+           "$ sortInfo" : "{ field : 'src_id_txt', direction: 'ASC' }",
            "$ xns" : "Roo.data",
            "* prop" : "dataSource",
            "items" : [
             {
-             "$ url" : "baseURL + '/Roo/i18n.php'",
-             "method" : "GET",
+             "$ url" : "baseURL + '/Roo/Core_templatestr.php'",
              "xtype" : "HttpProxy",
+             "method" : "GET",
              "$ xns" : "Roo.data",
              "* prop" : "proxy"
             },
              "id" : "id",
              "root" : "data",
              "xtype" : "JsonReader",
+             "$ fields" : "[\n    {\n        'name': 'id',\n        'type': 'int'\n    },\n    {\n        'name': 'shortname',\n        'type': 'string'\n    }\n   \n]",
              "$ xns" : "Roo.data",
-             "$ fields" : "[\n    {\n        'name': 'id',\n        'type': 'int'\n    },\n    {\n        'name': 'ltype',\n        'type': 'string'\n    },\n    {\n        'name': 'lkey',\n        'type': 'string'\n    },\n    {\n        'name': 'inlang',\n        'type': 'string'\n    },\n    {\n        'name': 'lval',\n        'type': 'string'\n    }\n]",
              "* prop" : "reader",
              "totalProperty" : "total"
             }
            ]
           },
-          {
-           "xtype" : "Toolbar",
-           "$ xns" : "Roo",
-           "* prop" : "toolbar",
-           "items" : [
-            {
-             "listeners" : {
-              "|render" : "function (_self)\n{\n  _this.langtypeCombo = _self;\n}",
-              "|select" : "function (combo, record, index)\n{\n  _this.langgrid.getDataSource().reload(); \n}"
-             },
-             "triggerAction" : "all",
-             "selectOnFocus" : true,
-             "emptyText" : "Select Translation of",
-             "displayField" : "lval",
-             "valueField" : "lkey",
-             "xtype" : "ComboBox",
-             "typeAhead" : false,
-             "editable" : false,
-             "width" : 200,
-             "$ xns" : "Roo.form",
-             "mode" : "local",
-             "items" : [
-              {
-               "xtype" : "SimpleStore",
-               "$ data" : "[\n   [ 'l', 'Language Names' ],\n   [ 'c', 'Country Names' ],\n    [ 'm', 'Currency Names' ]\n]",
-               "$ fields" : "['lkey','lval']",
-               "$ xns" : "Roo.data",
-               "* prop" : "store"
-              }
-             ]
-            },
-            {
-             "listeners" : {
-              "render" : "function (_self)\n{\n  _this.langgridCombo=_self;\n}",
-              "select" : "function (combo, record, index)\n{\n  _this.langgrid.getDataSource().reload(); \n}"
-             },
-             "listWidth" : 300,
-             "Number pageSize" : 400,
-             "triggerAction" : "all",
-             "Number minChars" : 2,
-             "fieldLabel" : "Language",
-             "selectOnFocus" : true,
-             "String queryParam" : "query[name_starts]",
-             "displayField" : "title",
-             "hiddenName" : "language",
-             "value" : "",
-             "valueField" : "code",
-             "xtype" : "ComboBox",
-             "allowBlank" : false,
-             "typeAhead" : true,
-             "editable" : true,
-             "width" : 200,
-             "$ xns" : "Roo.form",
-             "name" : "language_title",
-             "qtip" : "Select Language",
-             "items" : [
-              {
-               "listeners" : {
-                "beforeload" : "function (_self, options)\n{\n   options  =options ||  {};\n   options.params =options.params|| {};\n   options.params.ltype = 'l';\n   options.params.inlang = 'en';\n   \n    options.params._as_code_and_title = 1;\n   \n}"
-               },
-               "$ Object sortInfo" : "{ field : 'title', direction: 'ASC' }",
-               "xtype" : "Store",
-               "$ xns" : "Roo.data",
-               "* prop" : "store",
-               "items" : [
-                {
-                 "$ url" : "baseURL + '/Roo/i18n.php'",
-                 "xtype" : "HttpProxy",
-                 "method" : "GET",
-                 "$ xns" : "Roo.data",
-                 "* prop" : "proxy"
-                },
-                {
-                 "id" : "id",
-                 "root" : "data",
-                 "xtype" : "JsonReader",
-                 "$ xns" : "Roo.data",
-                 "$ fields" : "[\n    {\n        'name': 'id',\n        'type': 'int'\n    },\n    {\n        'name': 'ltype',\n        'type': 'string'\n    },\n    {\n        'name': 'lkey',\n        'type': 'string'\n    },\n    {\n        'name': 'inlang',\n        'type': 'string'\n    },\n    {\n        'name': 'lval',\n        'type': 'string'\n    } \n]",
-                 "* prop" : "reader",
-                 "totalProperty" : "total"
-                }
-               ]
-              }
-             ]
-            }
-           ]
-          },
-          {
-           "xtype" : "ColumnModel",
-           "header" : "Code",
-           "width" : 50,
-           "$ renderer" : "function(v) { return String.format('{0}', v); }",
-           "$ xns" : "Roo.grid",
-           "Boolean sortable" : true,
-           "* prop" : "colModel[]",
-           "dataIndex" : "lkey"
-          },
           {
            "xtype" : "ColumnModel",
-           "header" : "English",
-           "width" : 150,
-           "$ renderer" : "function(v) { return String.format('{0}', v); }",
+           "width" : 300,
+           "header" : "Original",
+           "$ renderer" : "function(v,x,r) \n{\n    var c = '#666';\n    if (r.data.updated  < r.data.src_id_updated) {\n        c = 'red';\n    }\n    \n    return String.format('<div style=\"color:'+c+'\";>{0}</div>', v)\n\n}",
            "$ xns" : "Roo.grid",
-           "Boolean sortable" : true,
-           "* prop" : "colModel[]",
-           "dataIndex" : "lval_en"
+           "* prop" : "cm[]",
+           "dataIndex" : "src_id_txt"
           },
           {
            "xtype" : "ColumnModel",
-           "header" : "Translation",
            "width" : 200,
-           "$ renderer" : "function(v) { return String.format('{0}', v); }",
+           "header" : "Translation",
+           "$ renderer" : "function(v,x,r) \n{ \n\n    var c = '#666';\n    if (r.data.updated  < r.data.src_id_updated) {\n        c = 'red';\n    }\n    \n    return String.format('<div style=\"color:'+c+'\";>{0}</div>', v)\n\n}",
            "$ xns" : "Roo.grid",
-           "Boolean sortable" : true,
-           "* prop" : "colModel[]",
-           "dataIndex" : "lval",
+           "* prop" : "cm[]",
+           "dataIndex" : "txt",
            "items" : [
             {
              "xtype" : "GridEditor",
              "items" : [
               {
                "xtype" : "TextField",
+               "allowBlank" : false,
                "$ xns" : "Roo.form",
                "* prop" : "field"
               }
           },
           {
            "xtype" : "ColumnModel",
-           "header" : "Active?",
-           "width" : 150,
-           "$ renderer" : "function(v,x,r) { \n\n    return '<img class=\"x-grid-check-icon' + (v*1 ? '-checked' : '')  + '\" src=\"' + Roo.BLANK_IMAGE_URL + '\"/>';\n                                        \n    \n}",
+           "width" : 250,
+           "header" : "md5",
+           "$ renderer" : "function(v,x,r) \n{\n    return v ? v : '';\n\n}",
            "$ xns" : "Roo.grid",
-           "* prop" : "colModel[]",
-           "dataIndex" : "is_active"
+           "* prop" : "cm[]",
+           "Boolean hidden" : true,
+           "dataIndex" : "src_id_mdsum"
           }
          ]
         }
index 94d83cd..0c4130a 100644 (file)
@@ -8,27 +8,19 @@ Pman.Tab.AdminTranslations = new Roo.XComponent({
 
  _strings : {
   '0a52da7a03a6de3beefe54f8c03ad80d' :"Original",
-  '4994a8ffeba4ac3140beb89e8d41f174' :"Language",
-  'ae739a236065a45c64ad51aacb19498c' :"Active?",
-  'd41d8cd98f00b204e9800998ecf8427e' :"",
+  '0b8d92bc19b720bb1065649535463409' :"Translations",
+  '69fd71b6f79260924a32a45850a13ab7' :"Translations (rescan this to update strings)",
+  '9d1ead73e678fa2f51a70a933b0bf017' :"Not Found",
   '801ab24683a4a8c433c6eb40c48bcd9d' :"Download",
-  'e2ade2e0b88406a390f59b5232abb328' :"Translated (Click to Edit)",
   '6dd08874f83507e9c7b23f1a46b7fa7c' :"Translation",
-  '83dad8107f9459efe2b4fabcf5b63108' :"Select Language",
-  'a1d1ae170f841c328acdc6052511ed8c' :"Text in interface",
-  '78463a384a5aa4fad5fa73e2f506ecfc' :"English",
-  '4e7c16d320ae129cc81b296e05748b3a' :"Translate App",
-  '526d688f37a86d3c3f27d0c5016eb71d' :"Reset",
-  'b51c3fa7e0ae26a1d88bf1279f265bb4' :"Select Module",
-  '49ee3087348e8d44e1feda1917443987' :"Name",
-  '552bcc4e00cd663f09cc4efbaca1cd45' :"Select Translation of",
-  'ca0dbad92a874b2f69b549293387925e' :"Code",
-  '0a9e8bd9e8b301dfb2c21c355e0b377d' :"Languages and Countries"
- },
- _named_strings : {
-  'language_title_value' : 'd41d8cd98f00b204e9800998ecf8427e' /*  */ ,
-  'language_title_qtip' : '83dad8107f9459efe2b4fabcf5b63108' /* Select Language */ ,
-  'language_title_fieldLabel' : '4994a8ffeba4ac3140beb89e8d41f174' /* Language */ 
+  'e3d388b2c43e5ba0905702620ae2abc1' :"Search for",
+  'e2f9d206562d8f5ea421ad51100f7151' :"Displaying petition_entry{0} - {1} of {2}",
+  'cd6ae20e52d83f601c5fa12b66f0f6d0' :"Rescan",
+  '4d1c8263ba1036754f8db14a98f9f006' :"Reload",
+  'f2a6c498fb90ee345d997f888fce3b18' :"Delete",
+  '03c2e7e41ffc181a4e84080b4710e81e' :"New",
+  '193cfc9be3b995831c6af2fea6650e60' :"Page",
+  '1bc29b36f623ba82aaf6724fd3b16718' :"md5"
  },
 
   part     :  ["Admin", "Translations" ],
@@ -45,7 +37,7 @@ Pman.Tab.AdminTranslations = new Roo.XComponent({
    return {
    xtype : 'NestedLayoutPanel',
    region : 'center',
-   title : _this._strings['4e7c16d320ae129cc81b296e05748b3a'] /* Translate App */,
+   title : _this._strings['0b8d92bc19b720bb1065649535463409'] /* Translations */,
    xns : Roo,
    '|xns' : 'Roo',
    layout : {
@@ -54,371 +46,312 @@ Pman.Tab.AdminTranslations = new Roo.XComponent({
     '|xns' : 'Roo',
     center : {
      xtype : 'LayoutRegion',
-     alwaysShowTabs : true,
-     tabPosition : 'top',
+     xns : Roo,
+     '|xns' : 'Roo'
+    },
+    west : {
+     xtype : 'LayoutRegion',
+     split : true,
+     width : 450,
      xns : Roo,
      '|xns' : 'Roo'
     },
     items  : [
      {
-      xtype : 'GridPanel',
-      background : true,
-      fitContainer : true,
-      fitToframe : true,
-      region : 'center',
-      title : _this._strings['a1d1ae170f841c328acdc6052511ed8c'] /* Text in interface */,
+      xtype : 'TreePanel',
+      region : 'west',
       listeners : {
-       activate : function() {
-            _this.panel = this;
-            if (_this.grid) {
-               _this.grid.getDataSource().reload(); 
-            }
+       render : function (_self)
+        {
+            _this.treepanel = _self;
         }
       },
       xns : Roo,
       '|xns' : 'Roo',
-      grid : {
-       xtype : 'EditorGrid',
-       autoExpandColumn : 'txt',
-       clicksToEdit : 1,
-       loadMask : true,
-       listeners : {
-        afteredit : function (e)
-         {
-             var saveRec  = function(rec)
-             {
-                 var g = _this.grid;
-         
-                 //g.getView().el.mask('Saving');
-                 new Pman.Request({
-                     url : baseURL + '/Admin/Translations.php',
-                     method: 'POST',
-                     params : {
-                         id : rec.get('id'),
-                         txt : rec.get('txt'),
-                         lang :  _this.langCombo.getValue(),
-                         module :  _this.modCombo.getValue()
-                     },
-                     success : function()
-                     {
-                         //g.getView().el.unmask();
-                         //g.getDataSource().reload();
-                     },
-                     failure : function()
-                     {
-                         Roo.MessageBox.alert("Error", "There was a problem saving the data - try reloading");
-                        // g.getView().el.unmask();
-                     }
-                     
-             });
-                 };
-             
-             saveRec.defer(1000, _this, [ e.record ]);
-         },
-        beforeedit : function(e) {
-             console.log('beforeedit');
-             //if (e.record.get('origtxt').indexOf('<') > -1) {
-                                // console.log("HTML EDITOR!!");
-                              
-                             //    return false;
-                             //}
-                             if (e.record.get('txt').replace(/\s+/, '').length) {
-                                 return true;
-                             }
-                             if (e.record.get('suggest').length) {
-                                 e.record.set('txt', e.record.get('suggest'));
-                             //    _this.saveRec(e.record);
-                                 return;
-                             }
-                             
-                             
-                             
-                            
-                             var tl = e.record.get('id').split('/')[0];
-                           
-                             tl = (tl == 'zh_HK') ? 'zh-TW' : tl; 
-                             tl = tl.replace('_', '-');
-                             var rec = e.record;
-                             
-                             
-                             
-                             Pman.gtranslate(e.record.get('origtxt'), 'en', tl, function(result) { 
-                                 if (typeof(result) == 'object') { //error
-                                     return; 
-                                    }
-                                 
-                                 if (_this.grid.activeEditor) {
-                                     _this.grid.activeEditor.setValue(result);
-                                 } else {
-                                     rec.set('txt',result);
-                                     //_this.saveRec(rec);
-                                 }
-         
-                                 //
-                                 
-                                 
-                                 //console.log(result.translation);
-                             });
-                             
-                            
-                             
-                             return true;
-                         },
-        celldblclick : function (_self, rowIndex, columnIndex, e)
-         {
-             var di  = this.colModel.config[columnIndex].dataIndex;
-             if (di != 'reset_tx') {
-                 return;
-             }
-             rec = this.ds.getAt(rowIndex);
-             
-               var g = _this.grid;
-          
-             new Pman.Request({
-                 url : baseURL + '/Admin/Translations.php',
-                 method: 'POST',
-                 params : {
-                     id : rec.get('id'),
-                     txt : '',
-                     lang :  _this.langCombo.getValue(),
-                     module :  _this.modCombo.getValue()
-                 },
-                 success : function()
-                 {
-                     //g.getView().el.unmask();
-                     //g.getDataSource().reload();
-                     rec.set('txt', '');
-                 },
-                 failure : function()
-                 {
-                     Roo.MessageBox.alert("Error", "There was a problem saving the data - try reloading");
-                    // g.getView().el.unmask();
-                 }
-                 
-             });
-                
-             
-         },
-        render : function() { 
-             _this.grid = this; 
-             //_this.dialog = Pman.Dialog.FILL_IN
-             if (_this.panel.active) {
-               _this.grid.getDataSource().reload(); 
-             }
-         }
-       },
-       xns : Roo.grid,
-       '|xns' : 'Roo.grid',
-       toolbar : {
-        xtype : 'Toolbar',
-        xns : Roo,
-        '|xns' : 'Roo',
-        items  : [
-         {
-          xtype : 'ComboBox',
-          displayField : 'module',
-          editable : false,
-          emptyText : _this._strings['b51c3fa7e0ae26a1d88bf1279f265bb4'] /* Select Module */,
-          mode : 'local',
-          selectOnFocus : true,
-          triggerAction : 'all',
-          typeAhead : false,
-          valueField : 'module',
-          width : 200,
-          listeners : {
-           render : function (_self)
-            {
-              _this.modCombo = _self;
-            },
-           select : function (combo, record, index)
-            {
-              _this.grid.getDataSource().reload(); 
-            }
-          },
-          xns : Roo.form,
-          '|xns' : 'Roo.form',
-          store : {
-           xtype : 'SimpleStore',
-           data : (function() {             
-                   var modlist = [];             
-                   AppModules = typeof(AppModules) == 'undefined' ? '' : AppModules;
-                   Roo.each( AppModules.split(','), function(mod) {            
-                            modlist.push( [ mod ] );            
-                 });             
-                 return modlist;
-              })(),
-           fields : ['module'],
-           xns : Roo.data,
-           '|xns' : 'Roo.data'
-          }
-         },
-         {
-          xtype : 'ComboBox',
-          displayField : 'ldisp',
-          editable : false,
-          emptyText : _this._strings['83dad8107f9459efe2b4fabcf5b63108'] /* Select Language */,
-          mode : 'local',
-          selectOnFocus : true,
-          triggerAction : 'all',
-          typeAhead : false,
-          valueField : 'lang',
-          width : 200,
-          listeners : {
-           render : function (_self)
-            {
-              _this.langCombo=_self;
-            },
-           select : function (combo, record, index)
-            {
-              _this.grid.getDataSource().reload(); 
-            }
-          },
-          xns : Roo.form,
-          '|xns' : 'Roo.form',
-          store : {
-           xtype : 'SimpleStore',
-           data : [                                                [ 'zh_HK' , '\u7E41\u4E2D - Trad. Chin. (HK)' ],                         [ 'zh_CN', '\u7C21\u4E2D - Simp. Chin.' ]                     ],
-           fields : ['lang', 'ldisp'],
-           xns : Roo.data,
-           '|xns' : 'Roo.data'
-          }
+      toolbar : {
+       xtype : 'Toolbar',
+       xns : Roo,
+       '|xns' : 'Roo',
+       items  : [
+        {
+         xtype : 'Button',
+         text : _this._strings['03c2e7e41ffc181a4e84080b4710e81e'] /* New */,
+         listeners : {
+          click : function (_self, e)
+           {
+               Pman.Dialog.AdminLanguagePick.show( {  }, function(lang) {
+                   
+                   new Pman.Request({
+                       url : baseURL + '/Roo/core_templatestr',
+                       method : 'POST',
+                       params : {
+                           _rescan : lang
+                       }, 
+                       success : function()
+                       {
+                           _this.treepanel.tree.getRootNode().reload();
+                       }
+                   });
+               
+               });
+               
+           }
          },
-         {
-          xtype : 'Fill',
-          xns : Roo.Toolbar,
-          '|xns' : 'Roo.Toolbar'
+         xns : Roo.Toolbar,
+         '|xns' : 'Roo.Toolbar'
+        },
+        {
+         xtype : 'Separator',
+         xns : Roo.Toolbar,
+         '|xns' : 'Roo.Toolbar'
+        },
+        {
+         xtype : 'Button',
+         text : _this._strings['f2a6c498fb90ee345d997f888fce3b18'] /* Delete */,
+         listeners : {
+          click : function (_self, e)
+           {
+               var tree = _this.treepanel.tree;
+               var sn  = tree.getSelectionModel().getSelectedNode();
+           
+               if (!sn || typeof(sn.attributes.language) == 'undefined' || !sn.attributes.language) {
+                   Roo.MessageBox.alert("Error", "Select a language");
+                   return;
+               }
+           
+                Roo.MessageBox.confirm("Confirm", "Are sure you want to delete the language", function (v){
+                       if (v != 'yes') {
+                           return;
+                       }
+                       Roo.MessageBox.alert("Not yet", "not done yet");
+                       return;
+                       
+                       
+                       
+                       
+                   });
+           }
          },
-         {
-          xtype : 'Button',
-          text : _this._strings['801ab24683a4a8c433c6eb40c48bcd9d'] /* Download */,
-          listeners : {
-           click : function (_self, e)
-            {
-                new Pman.Download({
-                    grid: _this.grid
-                
-                });
-            }
-          },
-          xns : Roo.Toolbar,
-          '|xns' : 'Roo.Toolbar'
-         }
-        ]
-       },
-       dataSource : {
-        xtype : 'Store',
-        reader : Pman.Readers.Category,
-        listeners : {
-         beforeload : function (_self, opts)
-          {
-          
-                                  if (!_this.langCombo || !_this.langCombo.getValue().length) {
-                                      return false;
-                                  }
-                                  if (!_this.modCombo || !_this.modCombo.getValue().length) {
-                                      return false;
-                                  }
-                                  opts.params = {
-                                      lang :  _this.langCombo.getValue(),
-                                      module :  _this.modCombo.getValue()
-                                  };
-          },
-         loadexception : function (self, ret, load, jsonData)
-          {
-              Roo.MessageBox.alert("Error", jsonData);
-          }
+         xns : Roo.Toolbar,
+         '|xns' : 'Roo.Toolbar'
         },
-        xns : Roo.data,
-        '|xns' : 'Roo.data',
-        proxy : {
-         xtype : 'HttpProxy',
-         method : 'GET',
-         url : baseURL + '/Admin/Translations.php',
-         xns : Roo.data,
-         '|xns' : 'Roo.data'
+        {
+         xtype : 'Separator',
+         xns : Roo.Toolbar,
+         '|xns' : 'Roo.Toolbar'
         },
-        reader : {
-         xtype : 'JsonReader',
-         fields : [                    'id',             'tablename',             'tableid',             'colname',             'txt',             'lang',             { name:'updated', type:'date', dateFormat: 'Y-m-d H:i:s' },             { name:'origupdated', type:'date', dateFormat: 'Y-m-d H:i:s' },             'origtxt',             'msum',             'suggest'                  ],
-         id : 'id',
-         root : 'data',
-         totalProperty : 'total',
-         xns : Roo.data,
-         '|xns' : 'Roo.data'
-        }
-       },
-       colModel : [
         {
-         xtype : 'ColumnModel',
-         dataIndex : 'colname',
-         header : _this._strings['49ee3087348e8d44e1feda1917443987'] /* Name */,
-         renderer : function(v,x,r) {                       
-           var c = '#666';                       
-             if (r.get('updated') < r.get('origupdated')) {         
-                                 c = 'red';                       
-                                 
-                                   }                                 
-                                                    return '<div style="color:'+c+'";>' +r.get('tableid')+ ':' + v + '</div>';          
-                                                                                        },
-         width : 150,
-         xns : Roo.grid,
-         '|xns' : 'Roo.grid'
+         xtype : 'Button',
+         text : _this._strings['cd6ae20e52d83f601c5fa12b66f0f6d0'] /* Rescan */,
+         listeners : {
+          click : function (_self, e)
+           {
+               var tree = _this.treepanel.tree;
+               Roo.log(tree);
+               var sn  = tree.getSelectionModel().getSelectedNode();
+           
+               if (!sn) {
+                   Roo.MessageBox.alert("Error", "Select a node");
+                   return;
+               }
+               
+               var syncTemplate = function(){
+                   new Pman.Request({
+                       url : baseURL + '/Admin/UpdateBjsTemplates',
+                       method : 'GET',
+                       mask : 'Processing...',
+                       timeout : 9000000,
+                       success : function()
+                       {
+                           _this.treepanel.tree.getRootNode().reload();
+                       }
+                   });
+               
+               };
+               
+               
+               var syncLanguage = function(){
+                   new Pman.Request({
+                       url : baseURL + '/Roo/Core_templatestr',
+                       method : 'POST',
+                       mask : 'Processing...',
+                       params : {
+                           _rescan : sn.attributes.id.split(':')[1]
+                       }, 
+                       success : function()
+                       {
+                           _this.treepanel.tree.getRootNode().reload();
+                       }
+                   });
+               };
+               
+               if(typeof(sn.isRoot) != 'undefined' && sn.isRoot){
+                   syncTemplate();
+                   return;
+               }
+               
+               if(typeof(sn.attributes.language) != 'undefined' && sn.attributes.language){
+                   syncLanguage();
+                   return;
+               }
+               
+               
+               
+               
+               
+           }
+         },
+         xns : Roo.Toolbar,
+         '|xns' : 'Roo.Toolbar'
         },
         {
-         xtype : 'ColumnModel',
-         dataIndex : 'origtxt',
-         header : _this._strings['0a52da7a03a6de3beefe54f8c03ad80d'] /* Original */,
-         renderer : function(v,x,r) {                         var c = '#666';                         if (r.get('updated') < r.get('origupdated')) {                             c = 'red';                         }                         return '<div style="color:' + c+ '">' +                                  Ext.util.Format.htmlEncode(v) + '</div>';                                              },
-         width : 300,
-         xns : Roo.grid,
-         '|xns' : 'Roo.grid'
+         xtype : 'Fill',
+         xns : Roo.Toolbar,
+         '|xns' : 'Roo.Toolbar'
         },
         {
-         xtype : 'ColumnModel',
-         dataIndex : 'reset_tx',
-         header : _this._strings['526d688f37a86d3c3f27d0c5016eb71d'] /* Reset */,
-         renderer : function(v,x,r) {    
-             return  '<img src="' + rootURL + '/Pman/templates/images/edit-clear.gif' + '" width="16" height="16">';
+         xtype : 'Button',
+         text : _this._strings['801ab24683a4a8c433c6eb40c48bcd9d'] /* Download */,
+         listeners : {
+          click : function (_self, e)
+           {
+               var tree = _this.treepanel.tree;
+           
+               var sn  = tree.getSelectionModel().getSelectedNode();
+               
+               p = {
+                   csvCols : 'src_id_mdsum,template_id_view_name,template_id_template,src_id_txt,lang,txt',
+                   csvTitles : 'Code,Module,Template,Original,Language,Translation',
+                   limit : 9999,
+                   sort: 'template_id_view_name,template_id_template,src_id_txt',
+                   dir: 'ASC'
+               };
+               if (!sn ||  sn.id == 'transtree') {
+                   Roo.MessageBox.alert("Error", "Select language, module or page");
+                   return;
+               }
+               if (typeof(sn.id) == 'number') {
+                   p.template_id = sn.id;
+           
+               }
+               if (sn.id.match(/^view:/)) {
+                   var sns = sn.id.split(':');
+                   p.lang = sns[1];
+                   p.template_id_view_name = sns[2];
+               }
+               if (sn.id.match(/^lang:/)) {
+                   var sns = sn.id.split(':');
+                   p.lang = sns[1];
+           
+              }
+               // transtree
+               // view: {lang} : {view_name}
+               // lang:
+                
+               new Pman.Download({
+                   url : baseURL + '/Roo/Core_templatestr',
+                   params : p,
+                   method : 'GET' 
+               });
+               
+               
+               
+               
+               
+           }
          },
-         width : 50,
-         xns : Roo.grid,
-         '|xns' : 'Roo.grid'
+         xns : Roo.Toolbar,
+         '|xns' : 'Roo.Toolbar'
         },
         {
-         xtype : 'ColumnModel',
-         dataIndex : 'txt',
-         header : _this._strings['e2ade2e0b88406a390f59b5232abb328'] /* Translated (Click to Edit) */,
-         renderer : function(v,x,r) {                                                   var c = '#666';                         if (r.get('updated') < r.get('origupdated')) {                             c = 'red';                         }                                                  return '<div style="color:' + c+ '">' + Ext.util.Format.htmlEncode(v) + '</div>';                     },
-         width : 150,
-         xns : Roo.grid,
-         '|xns' : 'Roo.grid',
-         editor : {
-          xtype : 'GridEditor',
-          xns : Roo.grid,
-          '|xns' : 'Roo.grid',
-          field : {
-           xtype : 'TextField',
-           xns : Roo.form,
-           '|xns' : 'Roo.form'
-          }
-         }
+         xtype : 'Separator',
+         xns : Roo.Toolbar,
+         '|xns' : 'Roo.Toolbar'
+        },
+        {
+         xtype : 'Button',
+         text : _this._strings['4d1c8263ba1036754f8db14a98f9f006'] /* Reload */,
+         listeners : {
+          click : function (_self, e)
+           {
+               _this.treepanel.tree.getRootNode().reload();
+               
+           }
+         },
+         xns : Roo.Toolbar,
+         '|xns' : 'Roo.Toolbar'
         }
        ]
+      },
+      tree : {
+       xtype : 'TreePanel',
+       containerScroll : false,
+       rootVisible : true,
+       xns : Roo.tree,
+       '|xns' : 'Roo.tree',
+       root : {
+        xtype : 'AsyncTreeNode',
+        id : 'transtree',
+        text : _this._strings['69fd71b6f79260924a32a45850a13ab7'] /* Translations (rescan this to update strings) */,
+        xns : Roo.tree,
+        '|xns' : 'Roo.tree'
+       },
+       selModel : {
+        xtype : 'DefaultSelectionModel',
+        listeners : {
+         selectionchange : function (_self, node)
+          {
+              Roo.log(node);
+              
+              //if (node.id.split('/').length < 2) {
+              //    return;
+             // }
+              (function() {
+                  _this.grid.footer.onClick('first');
+              }).defer(100);
+              
+          }
+        },
+        xns : Roo.tree,
+        '|xns' : 'Roo.tree'
+       },
+       loader : {
+        xtype : 'TreeLoader',
+        baseParams : { _tree : 1 },
+        dataUrl : baseURL + '/Roo/Core_templatestr',
+        requestMethod : 'GET',
+        listeners : {
+         beforeload : function (This, node, callback)
+          {
+              // set some params.
+              Roo.log(node);
+              this.baseParams._tree = 1;
+              
+              //this.baseParams.category = node.attributes.category;
+          },
+         loadexception : function (This, node, response)
+          {
+              Roo.MessageBox.alert("Error", "Problem loading tree");
+          }
+        },
+        xns : Roo.tree,
+        '|xns' : 'Roo.tree'
+       }
       }
      },
      {
       xtype : 'GridPanel',
-      background : true,
+      background : false,
       fitContainer : true,
       fitToframe : true,
       region : 'center',
-      tableName : 'i18n',
-      title : _this._strings['0a9e8bd9e8b301dfb2c21c355e0b377d'] /* Languages and Countries */,
+      tableName : 'Page',
+      title : _this._strings['193cfc9be3b995831c6af2fea6650e60'] /* Page */,
       listeners : {
        activate : function() {
-            _this.langpanel = this;
-            if (_this.langgrid) {
-                _this.langgrid.ds.load({});
+            _this.panel = this;
+            if (_this.grid) {
+                _this.grid.footer.onClick('first');
             }
         }
       },
@@ -426,265 +359,234 @@ Pman.Tab.AdminTranslations = new Roo.XComponent({
       '|xns' : 'Roo',
       grid : {
        xtype : 'EditorGrid',
-       autoExpandColumn : 'lval',
+       autoExpandColumn : 'txt',
        clicksToEdit : 1,
        loadMask : true,
        listeners : {
         afteredit : function (e)
          {
-             var saveRec  = function(rec)
-             {
-                 var g = _this.grid;
-         
-                 //g.getView().el.mask('Saving');
-                 Ext.Ajax.request({
-                     url : baseURL + '/Roo/I18n.php',
-                     method: 'POST',
-                     params : {
-                         id : rec.get('id'),
-                         lval : rec.get('lval'),
-                         ltype : rec.get('ltype')
-                     },
-                     success : function()
-                     {
-                         //g.getView().el.unmask();
-                         //g.getDataSource().reload();
-                     },
-                     failure : function()
-                     {
-                         Ext.Msg.alert("Error", "There was a problem saving the data - try reloading");
-                        // g.getView().el.unmask();
+             e.record.commit();
+         },
+        beforeedit : function (e)
+         {   
+             /*if (e.record.data.src_id_txt.indexOf('<') > -1) {
+                // console.log("HTML EDITOR!!");
+                 Pman.Dialog.CmsTranslateEditor.show(e.record);
+                 return false;
+             }*/
+             
+             var str=e.record.data.src_id_txt;
+             var patt=/{(.*?)}/g;
+             
+             Roo.log(str.length);
+             
+             
+             if(patt.test(str)){
+                 e.cancel = true;
+                 Pman.Dialog.AdminTranslateTemplates.show(e.record.data, function(v){
+                     Roo.log(v);
+                     e.value = v.txt;
+                     e.record.set('txt', v.txt);
+                     e.record.commit();
+                 });
+                 /*
+                 Roo.MessageBox.prompt('WARNING', 'This text is with {TEMPLATE VARIABLE}, PLEASE BE CAREFUL EDITING. What\'s change? '+str, function(btn, text){
+                     if (btn == 'ok'){
+                         e.value = text;
+                         e.record.set('txt', text);
+                         e.record.commit();
                      }
-                     
-             });
-                 };
+                 });*/
+                 return;
+             }
              
-             saveRec.defer(1000, _this, [ e.record ]);
-         },
-        beforeedit : function(e) {
-             console.log('beforeedit');
-             //if (e.record.get('origtxt').indexOf('<') > -1) {
-                                // console.log("HTML EDITOR!!");
-                      
-                     //    return false;
-                     //}
-                     if (e.record.get('lval').replace(/\s+/, '').length) {
-                         return true;
+             if(str.length > 150){
+                 e.cancel = true;
+                 Pman.Dialog.AdminTranslateTemplates.show(e.record.data, function(v){
+                     e.value = v.txt;
+                     e.record.set('txt', v.txt);
+                     e.record.commit();
+                 });
+                 /*
+                 Roo.MessageBox.prompt('WARNING', 'This text is with {TEMPLATE VARIABLE}, PLEASE BE CAREFUL EDITING. What\'s change? '+str, function(btn, text){
+                     if (btn == 'ok'){
+                         e.value = text;
+                         e.record.set('txt', text);
+                         e.record.commit();
                      }
-                     
-                     
-                     var tl = _this.langgridCombo.getValue();
-                   
-                     tl = (tl == 'zh_HK') ? 'zh-TW' : tl; 
-                     tl = tl.replace('_', '-');
-                     var rec = e.record;
-                     
-                     
-                     
-                     Pman.gtranslate(e.record.get('lval_en'), 'en', tl, function(result) { 
-                         if (typeof(result) == 'object') { //error
-                             return; 
-                            }
-                         
-                         if (_this.grid.activeEditor) {
-                             _this.grid.activeEditor.setValue(result);
-                         } else {
-                             rec.set('lval',result);
-                             //_this.saveRec(rec);
-                         }
-         
-                         //
-                         
-                         
-                         //console.log(result.translation);
-                     });
-                     
-                    
-                     
-                     return true;
-                 },
-        cellclick : function (_self, rowIndex, columnIndex, e)
-         {
-             if(_this.langgrid.colModel.getDataIndex(columnIndex) !== 'is_active'){
+                 });*/
                  return;
              }
              
-             var s = _this.langgrid.ds.getAt(rowIndex);
+         
+             if (e.record.data.txt.replace(/\s+/, '').length) {
+                 return true;
+             }
+             
+             var tl = _this.treepanel.tree.getSelectionModel().getSelectedNode().parentNode.attributes.id;
+             // mapping?
              
-             if(!s || s.data.id * 1 < 0){
-                 return;
+             tl = (tl == 'zh_HK') ? 'zh-TW' : tl;
+             
+             if (tl == 'en' && !e.value.length) {
+         
+                 e.value = e.record.data.src_id_txt;
+                 e.record.set('txt', e.record.data.src_id_txt);
+                 return true;
              }
              
-             s.set('is_active', s.data.is_active ? 0 : 1);
+             Pman.GoogleTranslate(e.record.data.src_id_txt, "en", tl, function(result) {
+                // Roo.log(result);
+                 _this.grid.activeEditor.setValue(result);
+                 //console.log(result.translation);
+             });
              
-             new Pman.Request({
-                 url : baseURL+'/Roo/I18n',
-                 method : 'POST',
-                 params : {
-                     id : s.data.id,
-                     is_active : s.data.is_active
-                 }
-             }); 
+         
              
+             return true;
          },
         render : function() 
          {
-             _this.langgrid = this; 
+             _this.grid = this; 
              //_this.dialog = Pman.Dialog.FILL_IN
-             if (_this.langpanel.active) {
-                this.ds.load({});
+             if (_this.panel.active) {
+                 this.footer.onClick('first');
+               // this.ds.onc.onClick('first');
              }
+         },
+        rowdblclick : function (_self, rowIndex, e)
+         {
+             if (!_this.dialog) {
+                 return;
+             }
+             _this.dialog.show( this.getDataSource().getAt(rowIndex).data, function() {
+                 _this.grid.footer.onClick('first');
+             }); 
          }
        },
        xns : Roo.grid,
        '|xns' : 'Roo.grid',
+       footer : {
+        xtype : 'PagingToolbar',
+        displayInfo : true,
+        displayMsg : _this._strings['e2f9d206562d8f5ea421ad51100f7151'] /* Displaying petition_entry{0} - {1} of {2} */,
+        emptyMsg : _this._strings['9d1ead73e678fa2f51a70a933b0bf017'] /* Not Found */,
+        pageSize : 100,
+        xns : Roo,
+        '|xns' : 'Roo'
+       },
        toolbar : {
         xtype : 'Toolbar',
         xns : Roo,
         '|xns' : 'Roo',
         items  : [
          {
-          xtype : 'ComboBox',
-          displayField : 'lval',
-          editable : false,
-          emptyText : _this._strings['552bcc4e00cd663f09cc4efbaca1cd45'] /* Select Translation of */,
-          mode : 'local',
-          selectOnFocus : true,
-          triggerAction : 'all',
-          typeAhead : false,
-          valueField : 'lkey',
-          width : 200,
+          xtype : 'TextField',
+          emptyText : _this._strings['e3d388b2c43e5ba0905702620ae2abc1'] /* Search for */,
           listeners : {
            render : function (_self)
             {
-              _this.langtypeCombo = _self;
+                _this.searchBox = this;
             },
-           select : function (combo, record, index)
+           specialkey : function (_self, e)
             {
-              _this.langgrid.getDataSource().reload(); 
+            _this.grid.footer.onClick('first');
             }
           },
           xns : Roo.form,
-          '|xns' : 'Roo.form',
-          store : {
-           xtype : 'SimpleStore',
-           data : [
-              [ 'l', 'Language Names' ],
-              [ 'c', 'Country Names' ],
-               [ 'm', 'Currency Names' ]
-           ],
-           fields : ['lkey','lval'],
-           xns : Roo.data,
-           '|xns' : 'Roo.data'
-          }
+          '|xns' : 'Roo.form'
          },
          {
-          xtype : 'ComboBox',
-          allowBlank : false,
-          displayField : 'title',
-          editable : true,
-          fieldLabel : _this._strings['4994a8ffeba4ac3140beb89e8d41f174'] /* Language */,
-          hiddenName : 'language',
-          listWidth : 300,
-          minChars : 2,
-          name : 'language_title',
-          pageSize : 400,
-          qtip : _this._strings['83dad8107f9459efe2b4fabcf5b63108'] /* Select Language */,
-          queryParam : 'query[name_starts]',
-          selectOnFocus : true,
-          triggerAction : 'all',
-          typeAhead : true,
-          value : _this._strings['d41d8cd98f00b204e9800998ecf8427e'] /*  */,
-          valueField : 'code',
-          width : 200,
+          xtype : 'Button',
+          cls : 'x-btn-icon',
+          icon : rootURL + '/Pman/templates/images/search.gif',
           listeners : {
-           render : function (_self)
-            {
-              _this.langgridCombo=_self;
-            },
-           select : function (combo, record, index)
+           click : function (_self, e)
             {
-              _this.langgrid.getDataSource().reload(); 
+            _this.grid.footer.onClick('first');
             }
           },
-          xns : Roo.form,
-          '|xns' : 'Roo.form',
-          store : {
-           xtype : 'Store',
-           sortInfo : { field : 'title', direction: 'ASC' },
-           listeners : {
-            beforeload : function (_self, options)
-             {
-                options  =options ||  {};
-                options.params =options.params|| {};
-                options.params.ltype = 'l';
-                options.params.inlang = 'en';
-                
-                 options.params._as_code_and_title = 1;
+          xns : Roo.Toolbar,
+          '|xns' : 'Roo.Toolbar'
+         },
+         {
+          xtype : 'Button',
+          cls : 'x-btn-icon',
+          icon : rootURL + '/Pman/templates/images/edit-clear.gif',
+          listeners : {
+           click : function (_self, e)
+            {
+                _this.searchBox.setValue('');
                 
-             }
-           },
-           xns : Roo.data,
-           '|xns' : 'Roo.data',
-           proxy : {
-            xtype : 'HttpProxy',
-            method : 'GET',
-            url : baseURL + '/Roo/i18n.php',
-            xns : Roo.data,
-            '|xns' : 'Roo.data'
-           },
-           reader : {
-            xtype : 'JsonReader',
-            fields : [
-                {
-                    'name': 'id',
-                    'type': 'int'
-                },
-                {
-                    'name': 'ltype',
-                    'type': 'string'
-                },
-                {
-                    'name': 'lkey',
-                    'type': 'string'
-                },
-                {
-                    'name': 'inlang',
-                    'type': 'string'
-                },
-                {
-                    'name': 'lval',
-                    'type': 'string'
-                } 
-            ],
-            id : 'id',
-            root : 'data',
-            totalProperty : 'total',
-            xns : Roo.data,
-            '|xns' : 'Roo.data'
-           }
-          }
+                _this.grid.footer.onClick('first');
+            }
+          },
+          xns : Roo.Toolbar,
+          '|xns' : 'Roo.Toolbar'
          }
         ]
        },
        dataSource : {
         xtype : 'Store',
         remoteSort : true,
-        sortInfo : { field : 'lkey', direction: 'ASC' },
+        sortInfo : { field : 'src_id_txt', direction: 'ASC' },
         listeners : {
-         beforeload : function (_self, options)
+         beforeload : function (_self, o)
           {
-             options  =options ||  {};
-             options.params =options.params|| {};
-             options.params.ltype = _this.langtypeCombo.getValue();
-             options.params.inlang = _this.langgridCombo.getValue();
-             options.params['query[_with_en]'] = 1;
-             if (!options.params.ltype.length || !options.params.inlang.length) {
-                 return false;
-             }
-             
-             options.params.limit = 9999;
              
+              var sn = _this.treepanel.tree.getSelectionModel().getSelectedNode();
+          
+              if (!sn || typeof(sn.attributes) == 'undefined' || typeof(sn.attributes.leaf) == 'undefined' || !sn.attributes.leaf) { 
+                  _this.grid.ds.removeAll();
+                  return false;
+              }
+          
+              o.params = o.params || {};
+              o.params.lang =  sn.parentNode.attributes.id.split(':')[1];
+              o.params.template_id = sn.attributes.id * 1;
+              o.params.active = 1;
+              o.params['!src_id'] = 0;
+              
+              if (_this.searchBox && _this.searchBox.getValue().length) { 
+                  o.params['_search_txt'] = _this.searchBox.getValue();
+              }
+              
+              
+              if(sn.attributes.on_table){
+                  o.params.on_table = sn.attributes.on_table;
+              }
+              
+          },
+         update : function (_self, rec, operation)
+          {
+              Roo.log(operation);
+              
+              if (operation != 'commit') {
+                  return;
+              }
+              
+          
+              _this.grid.getView().el.mask("Saving");
+              new Pman.Request({
+                  url : baseURL + '/Roo/Core_templatestr',
+                  method: 'POST',
+                  params : {
+                      id : rec.get('id'),
+                      txt : rec.get('txt')
+                  },
+                  success : function()
+                  {
+                      _this.grid.getView().el.unmask();
+                          //g.getDataSource().reload();
+                  },
+                  failure : function()
+                  {
+                      _this.grid.getView().el.unmask();
+                      Roo.MessageBox.alert("Error", "There was a problem saving the data - try reloading");
+                   }
+                      
+              });
+              
           }
         },
         xns : Roo.data,
@@ -692,7 +594,7 @@ Pman.Tab.AdminTranslations = new Roo.XComponent({
         proxy : {
          xtype : 'HttpProxy',
          method : 'GET',
-         url : baseURL + '/Roo/i18n.php',
+         url : baseURL + '/Roo/Core_templatestr.php',
          xns : Roo.data,
          '|xns' : 'Roo.data'
         },
@@ -704,21 +606,10 @@ Pman.Tab.AdminTranslations = new Roo.XComponent({
                  'type': 'int'
              },
              {
-                 'name': 'ltype',
-                 'type': 'string'
-             },
-             {
-                 'name': 'lkey',
-                 'type': 'string'
-             },
-             {
-                 'name': 'inlang',
-                 'type': 'string'
-             },
-             {
-                 'name': 'lval',
+                 'name': 'shortname',
                  'type': 'string'
              }
+            
          ],
          id : 'id',
          root : 'data',
@@ -727,33 +618,40 @@ Pman.Tab.AdminTranslations = new Roo.XComponent({
          '|xns' : 'Roo.data'
         }
        },
-       colModel : [
+       cm : [
         {
          xtype : 'ColumnModel',
-         dataIndex : 'lkey',
-         header : _this._strings['ca0dbad92a874b2f69b549293387925e'] /* Code */,
-         renderer : function(v) { return String.format('{0}', v); },
-         sortable : true,
-         width : 50,
-         xns : Roo.grid,
-         '|xns' : 'Roo.grid'
-        },
-        {
-         xtype : 'ColumnModel',
-         dataIndex : 'lval_en',
-         header : _this._strings['78463a384a5aa4fad5fa73e2f506ecfc'] /* English */,
-         renderer : function(v) { return String.format('{0}', v); },
-         sortable : true,
-         width : 150,
+         dataIndex : 'src_id_txt',
+         header : _this._strings['0a52da7a03a6de3beefe54f8c03ad80d'] /* Original */,
+         renderer : function(v,x,r) 
+         {
+             var c = '#666';
+             if (r.data.updated  < r.data.src_id_updated) {
+                 c = 'red';
+             }
+             
+             return String.format('<div style="color:'+c+'";>{0}</div>', v)
+         
+         },
+         width : 300,
          xns : Roo.grid,
          '|xns' : 'Roo.grid'
         },
         {
          xtype : 'ColumnModel',
-         dataIndex : 'lval',
+         dataIndex : 'txt',
          header : _this._strings['6dd08874f83507e9c7b23f1a46b7fa7c'] /* Translation */,
-         renderer : function(v) { return String.format('{0}', v); },
-         sortable : true,
+         renderer : function(v,x,r) 
+         { 
+         
+             var c = '#666';
+             if (r.data.updated  < r.data.src_id_updated) {
+                 c = 'red';
+             }
+             
+             return String.format('<div style="color:'+c+'";>{0}</div>', v)
+         
+         },
          width : 200,
          xns : Roo.grid,
          '|xns' : 'Roo.grid',
@@ -763,6 +661,7 @@ Pman.Tab.AdminTranslations = new Roo.XComponent({
           '|xns' : 'Roo.grid',
           field : {
            xtype : 'TextField',
+           allowBlank : false,
            xns : Roo.form,
            '|xns' : 'Roo.form'
           }
@@ -770,15 +669,15 @@ Pman.Tab.AdminTranslations = new Roo.XComponent({
         },
         {
          xtype : 'ColumnModel',
-         dataIndex : 'is_active',
-         header : _this._strings['ae739a236065a45c64ad51aacb19498c'] /* Active? */,
-         renderer : function(v,x,r) { 
+         dataIndex : 'src_id_mdsum',
+         header : _this._strings['1bc29b36f623ba82aaf6724fd3b16718'] /* md5 */,
+         hidden : true,
+         renderer : function(v,x,r) 
+         {
+             return v ? v : '';
          
-             return '<img class="x-grid-check-icon' + (v*1 ? '-checked' : '')  + '" src="' + Roo.BLANK_IMAGE_URL + '"/>';
-                                                 
-             
          },
-         width : 150,
+         width : 250,
          xns : Roo.grid,
          '|xns' : 'Roo.grid'
         }
index a9ce759..97839d0 100644 (file)
@@ -1,5 +1,8 @@
 <?php
 
+die("NOT USED!?");
+// see core_template code..
+
 
 /**
  * Pman_Admin_Translation:
@@ -89,7 +92,7 @@ class Pman_Admin_Translations extends Pman
         $module = $_REQUEST['module'];
         
         
-         $this->loadOriginalStrings($module); // what needs translating..
+        $this->loadOriginalStrings($module); // what needs translating..
         
         $ff = $this->bootLoader;
         if (empty($ff->Pman['public_cache_dir'])) {
@@ -108,7 +111,7 @@ class Pman_Admin_Translations extends Pman
         foreach($this->original as $k=>$ar) {
             foreach($ar as $tr=>$trv) {
                 // $hint = isset($hints[$tr]) ? $hints[$tr] : '';
-                $key = md5($k.'-'.$tr);
+                $key = $trv;
                 $ret[] = array(
                     'id' => $lang.'/'.$key,
                     'msum' => $key,
@@ -174,16 +177,45 @@ class Pman_Admin_Translations extends Pman
         // since this can handle errors better.!!?
         $info = $this->moduleJavascriptFilesInfo($module);
         //print_r($info);
-        $tfile =$info->basedir . '/'. $info->translation_data;
+        
+        
+        
+        $this->original  = array();
+        $tfile = $info->basedir . '/'. $info->translation_data;
          //var_dump($tfile);
-        if (empty($tfile) || !file_exists($tfile)) {
-            return array();
-        }
+        //if (empty($tfile) || !file_exists($tfile)) {
+            
+            foreach($info->filesmtime as $f =>$mt) {
+                $bjs = preg_replace('/\.js$/','.bjs', $f);
+                if (!file_exists($bjs)) {
+                    continue;
+                }
+                $jd = json_decode(file_get_contents($bjs));
+                if (empty($jd->strings)) {
+                    continue;
+                }
+                foreach($jd->strings as $tkey => $val) {
+                    $line = array(
+                        'module' => $module,
+                        'tfile' => preg_replace('/\.js$/','',  basename($bjs)),
+                    )
+                    
+                    
+                }
+                
+                $this->original[str_replace('.bjs', '', basename($bjs)) ] = array_flip((array)$jd->strings);
+            }
+             
+            file_put_contents($tfile, json_encode($this->original));
+            
+            
+        //}
         
         
-        require_once 'Services/JSON.php';
-        $j = new Services_JSON();
-        $this->original = (array) $j->decode('{'. file_get_contents($tfile).'}');
+        print_R($this->original);exit;
+        
+        
+        $this->original = (array) json_decode( file_get_contents($tfile) );
         ksort($this->original);
 
         $this->originalKeys = array();
diff --git a/UpdateBjsTemplates.php b/UpdateBjsTemplates.php
new file mode 100644 (file)
index 0000000..bc95b42
--- /dev/null
@@ -0,0 +1,335 @@
+<?php
+
+/**
+ *
+ *
+ */
+
+require_once 'Pman.php';
+class Pman_Admin_UpdateBjsTemplates extends Pman
+{
+    
+    static $cli_desc = "Update BJS Templates";
+    static $cli_opts = array();
+    
+    var $cli = false;
+    
+    var $opts;
+    
+    function getAuth() {
+        
+        
+        $ff = HTML_FlexyFramework::get();
+        if (!empty($ff->cli)) {
+            $this->cli = true;
+            return true;
+        }
+        
+        return true;
+    }
+     
+    function get($tbl, $opts=array())
+    {
+        PEAR::setErrorHandling(PEAR_ERROR_CALLBACK, array($this, 'onPearError'));
+        $this->opts = $opts;
+        $this->updateData();
+    }
+    
+    function updateData()
+    {   
+        $this->scanProjectBJS();
+        $this->scanPmanBJS();
+        $this->scanPmanTemplates();
+
+        $this->scanTables();
+        $this->syncLanguage();
+        
+        $this->jok('OK');
+        
+    }
+    
+    function scanProjectBJS()
+    {
+        $ff = HTML_FlexyFramework::get();
+        
+        if (empty($ff->Pman_Core)) {
+            $this->jerr("config[Pman_Core] is not set");
+        }
+        if (!empty($ff->Pman_Core['project_name'])) {
+            $base  = $ff->Pman_Core['project_name'];
+            
+            $dh = opendir($base);
+            
+            $ret = array();
+            
+            if(!$dh){
+                $this->jerr("could not open dir: config[Pman_Core] = " . $base);
+                return $ret; // something went wrong!?
+            }
+             
+            while (($fn = readdir($dh)) !== false) {
+                
+                if(empty($fn) || $fn[0] == '.' || !preg_match('/\.bjs$/', $fn)){
+                    continue;
+                }
+                
+                if($this->cli){
+                    echo "Processing {$fn} \n";
+                }
+                
+                $template = DB_DataObject::factory('core_template');
+                $template->setFrom(array(
+                    'template' => $fn,
+                    'lang' => 'en',
+                    'view_name' => $base
+                ));
+                
+                $o = false;
+                
+                if($template->find(true)){
+                    $o = clone ($template);
+                }
+                
+                $template->updated = $template->sqlValue("NOW()");
+                
+                (empty($o)) ? $template->insert() : $template->update($o);
+                
+                $data = json_decode(file_get_contents($base . '/' . $fn), true);
+                
+                $template->words = empty($data['strings']) ? array() : $data['strings'];
+                
+                $x = DB_DataObject::Factory('core_templatestr');
+                $x->syncTemplateWords($template, false);
+            }
+        }
+         
+    }
+    
+    function scanPmanBJS()
+    {
+        foreach ($this->modules() as $m){
+            $view_name = "Pman.$m";
+            
+            $dh = opendir("Pman/$m");
+        
+            $ret = array();
+
+            if(!$dh){
+                continue;
+            }
+            
+            while (($fn = readdir($dh)) !== false) {
+            
+                if(empty($fn) || $fn[0] == '.' || !preg_match('/\.bjs$/', $fn)){
+                    continue;
+                }
+
+                if($this->cli){
+                    echo "Processing {$fn} \n";
+                }
+
+                $template = DB_DataObject::factory('core_template');
+                $template->setFrom(array(
+                    'template' => $fn,
+                    'lang' => 'en',
+                    'view_name' => $view_name
+                ));
+
+                $o = false;
+
+                if($template->find(true)){
+                    $o = clone ($template);
+                }
+
+                $template->updated = $template->sqlValue("NOW()");
+
+                (empty($o)) ? $template->insert() : $template->update($o);
+
+                $data = json_decode(file_get_contents('Pman' . '/' . $m . '/' . $fn), true);
+
+                $template->words = empty($data['strings']) ? array() : $data['strings'];
+
+                $x = DB_DataObject::Factory('core_templatestr');
+                $x->syncTemplateWords($template, false);
+            }
+        }
+        
+    }
+    
+    function scanTables()
+    {
+        $ff = HTML_FlexyFramework::get();
+        
+        if (empty($ff->Pman_Core)) {
+            $this->jerr("config[Pman_Core] is not set");
+        }
+        
+        if(isset($ff->Pman_Core['DataObjects_Core_templatestr']['tables'])){
+            $cts = DB_DataObject::factory('core_templatestr');
+            
+            if($this->cli){
+                echo "Sync tables.....\n";
+            }
+            
+            foreach($ff->Pman_Core['DataObjects_Core_templatestr']['tables'] as $table=>$cols){
+                $t = DB_DataObject::factory($table);
+                foreach($t->fetchAll() as $d) {
+                    $cts->onTableChange($this, $d, 'update');
+                }
+            }
+        }
+    }
+    
+    function syncLanguage()
+    {
+        $ff = HTML_FlexyFramework::get();
+        
+        if (empty($ff->Pman_Core)) {
+            $this->jerr("config[Pman_Core] is not set");
+        }
+        
+        $opt_lang = empty($ff->Pman_Core_I18n) ? array( 'l' => array()) : $ff->Pman_Core_I18n;
+        
+        if($this->cli){
+            echo "Sync the Languages template.....\n";
+        }
+        
+        foreach($opt_lang['l'] as $l) {
+            if($this->cli){
+                echo "Sync $l Language.....\n";
+            }
+
+            $tps = DB_DataObject::factory('core_templatestr');
+            $tps->syncLang($l); /// this should be configured somewhere..
+        }
+    }
+    
+    function scanPmanTemplates()
+    {
+        // the CMS stuff scanned the PHP code looking for references to templates..
+        $tp = DB_DAtaObject::Factory('core_template');
+        
+        foreach ($this->modules() as $m){
+            
+            // templates...
+            $ar = $this->scanDir(array(
+                 'tdir' => "Pman/$m/templates",
+                'subdir' => '',
+                'match' => '/\.(html|txt|abw)$/',
+                'skipdir' => array('images','css','js'),
+                
+            ));
+            
+            
+            foreach($ar as $pg) {
+                
+                 
+                $tp->syncTemplatePage(array(
+                    'base' =>'Pman.'.$m, 
+                    'template_dir' =>  "Pman/$m/templates",
+                    'template' => $pg
+                ));
+            }
+            // should clean up old templates..
+            // php files..
+            $ar = $this->scanDir(array(
+                'tdir' => "Pman/$m",
+                'subdir' => '',
+                'match' => '/\.(php)$/',
+                'skipdir' => array('templates'),
+                
+            ));
+            
+            
+            foreach($ar as $pg) {
+                
+                $tp->syncPhpGetText(array(
+                    'base' =>'Pman.'.$m, 
+                    'template_dir' =>  "Pman/$m",
+                    'template' => $pg
+                ));
+            }
+            
+            
+            
+            
+            
+            //$tp->syncTemplatePage($pg);
+        }
+        
+         
+    }
+    
+    
+    
+    function scanDir($cfg) //$view, $tdir , $subdir='', $match)
+    {
+        //echo "TSCAN base= $base subdir =$subdir\n ";
+        $ff = HTML_FlexyFramework::get();
+         
+         $subdir = $cfg['subdir'];
+        $scandir = $cfg['tdir']. (empty($subdir) ? '' : '/') . $subdir;
+       
+        if (in_array($subdir, $cfg['skipdir'])) {
+            return array();
+        }
+        // skip dom_templates
+          
+        if (!file_exists($scandir)) {
+            return array();
+        }
+        $dh = opendir($scandir);
+        if(!$dh){
+            return array(); // something went wrong!?
+        }
+        $ret = array();
+            
+        while (($fn = readdir($dh)) !== false) {
+            // do we care that it will try and parse the template directory??? - not really..
+            // as we are only looking for php files..
+            if(empty($fn) || $fn[0] == '.'){
+                continue;
+            }
+            
+            $fullpath = $scandir.(empty($scandir) ? '' : "/").$fn;
+            // echo "filename:  $fullpath \n";
+           
+            if (is_link($fullpath)) {
+                continue;
+            }
+            
+            if(is_dir($fullpath)){
+                // then recursively call self...
+                $cfg['subdir'] = $subdir . (empty($subdir) ? '' : '/') . $fn;
+                $children = $this->scanDir($cfg);
+                if (count($children)) {
+                    $ret = array_merge($ret, $children);
+                    
+                }
+                continue;
+                 
+            }
+            
+            if (!preg_match($cfg['match'], $fn) || !is_file($fullpath)) {
+                continue;
+            }
+            
+          
+            
+            $ret[] =  $subdir . (empty($subdir) ? '' : '/').  $fn;  /// this used to be strtolower?? why???
+
+            
+            
+        }
+//        print_r($ret);
+        
+        return $ret;
+            
+        
+        
+         
+    }
+    
+}