Browse code

version v0.1.3

frtk authored on 14/02/2016 03:37:31
Showing 18 changed files
... ...
@@ -7,7 +7,7 @@ body {
7 7
 }
8 8
 
9 9
 #main {
10
-  margin-top: 20px;
10
+  margin-top: 10px;
11 11
   background-color: rgba(0, 0, 0, 1);
12 12
   margin-left: auto;
13 13
   margin-right: auto;
... ...
@@ -15,7 +15,7 @@ body {
15 15
 
16 16
 #pong {
17 17
   border: 1px solid rgba(255, 255, 255, 1);
18
-  margin-top: 50px;
18
+  margin-top: 5px;
19 19
 }
20 20
 
21 21
 
... ...
@@ -10,18 +10,20 @@
10 10
   <script type="text/javascript" src="./jquery/jquery-2.1.3.min.js"></script>
11 11
   <script type="text/javascript" src="./lib/npg_client.js"></script>
12 12
   <script type="text/javascript" src="./lib/socket/socketio_handler.js"></script>
13
-  <script type="text/javascript" src="./lib/utils/utils.js"></script>
13
+  <script type="text/javascript" src="./lib/utils/client_utils.js"></script>
14
+  <script type="text/javascript" src="./lib/utils/js_utils.js"></script>
14 15
   <script type="text/javascript" src="./lib/keyboard/event_handler.js"></script>
15 16
   <script type="text/javascript" src="./lib/core/page_base.js"></script>
16 17
   <script type="text/javascript" src="./lib/core/page_handler.js"></script>
17 18
   <script type="text/javascript" src="./lib/ui/ui.js"></script>
18
-  <script type="text/javascript" src="./lib/ui/objects/ui_object.js"></script>
19
+  <script type="text/javascript" src="./lib/ui/objects/ui_shape.js"></script>
19 20
   <script type="text/javascript" src="./lib/ui/objects/ui_style.js"></script>
20 21
   <script type="text/javascript" src="./lib/ui/objects/ui_point2d.js"></script>
21 22
   <script type="text/javascript" src="./lib/ui/objects/ui_rect.js"></script>
22 23
   <script type="text/javascript" src="./lib/ui/objects/ui_label.js"></script>
23 24
   <script type="text/javascript" src="./lib/ui/objects/ui_status_text.js"></script>
24 25
   <script type="text/javascript" src="./lib/ui/objects/ui_input_text.js"></script>
26
+  <script type="text/javascript" src="./lib/ui/objects/ui_cursor.js"></script>
25 27
 </head>
26 28
 
27 29
 <body>  
... ...
@@ -22,6 +22,19 @@ NPGClient.PageHandler = {
22 22
     return self.getPageByName(self.currPage).getUIElems();
23 23
   },
24 24
 
25
+  //
26
+  getCurrPageUIElemByName: function(name) {
27
+ /*
28
+    var self = this;
29
+    if (self.pages.length > 0) {
30
+      for (var i = 0; i < self.pages.length; i++) {
31
+        if (name == self.pages[i].name) return self.pages[i];
32
+      }
33
+    }
34
+    return undefined;
35
+*/
36
+  },
37
+
25 38
 
26 39
   //
27 40
   getPageByName: function(name) {
... ...
@@ -37,17 +50,19 @@ NPGClient.PageHandler = {
37 37
   // create login page
38 38
   createLoginPage: function() {
39 39
     //
40
+    console.log('[NPGClient] Creating Login Page');
40 41
     var self = this;
41 42
     var p = new NPGClient.AppPage('login');
42 43
     // Title label     
43 44
     p.addUIObject(new NPGClient.UILabel('login_title', NPGClient.LOGIN.TITLE));
44
-    self.pages.push(p);
45 45
     // name input
46 46
     p.addUIObject(new NPGClient.UIInputText('login_input', NPGClient.LOGIN.INPUT));
47 47
     // Server status
48 48
     p.addUIObject(new NPGClient.UIStatusText('login_servstat', NPGClient.LOGIN.SERVSTATUS));    
49
-
50
-    
49
+    // test cursor
50
+    p.addUIObject(new NPGClient.UICursor('login_cursor', NPGClient.LOGIN.CURSOR)); 
51
+    //
52
+    self.pages.push(p);  
51 53
   },
52 54
 
53 55
 }; 
... ...
@@ -5,17 +5,6 @@
5 5
 
6 6
 NPGClient.evtHandler = {
7 7
 
8
-  keysList: {
9
-    F1 : 112,
10
-    SPACE : 32,
11
-    ESC : 27,
12
-    ARROW_UP : 38,
13
-    ARROW_DOWN : 40,
14
-    ENTER : 13,
15
-    DELETE : 46,
16
-    BACKSPACE : 8,
17
-  },  
18
-    
19 8
   keyState: {},
20 9
   
21 10
   //
... ...
@@ -23,8 +12,8 @@ NPGClient.evtHandler = {
23 23
     var self = this;
24 24
     //
25 25
     self.keyState = {};
26
-    for (k in self.keyList) {
27
-      self.keyState[self.keysList[k]] = false;
26
+    for (k in NPGClient.KEYS) {
27
+      self.keyState[NPGClient[k]] = false;
28 28
     }               
29 29
     //
30 30
     document.addEventListener('keydown',function(e) {
... ...
@@ -38,14 +27,72 @@ NPGClient.evtHandler = {
38 38
   },
39 39
 
40 40
   // 
41
-  loginValidKey: function(k) {
42
-    return (key >= 48 && key <= 90);
41
+  isValidKey: function(k) {
42
+    return (k >= 48 && k <= 90);
43 43
   },
44 44
    
45 45
   //
46
-  onKeyDown : function(evt) {
47
-    //console.log(evt.keyCode); 
46
+  onKeyDown: function(evt) {
47
+    var self = this;
48
+    if (evt.keyCode == NPGClient.KEYS.ESC) {
49
+      //self.playerLogout();   // player logout
50
+    } else if (evt.keyCode == NPGClient.KEYS.F1) {
51
+      //self.sendToMenuPage(); // back to previous page
52
+    } else {
53
+      switch (NPGClient.PageHandler.currPage) {
54
+        case 'login':
55
+          self.userLogin(evt);            
56
+          break;
57
+        default:
58
+          break;
59
+      }
60
+    }
48 61
   },
49 62
 
50 63
 
64
+  /*
65
+   * 
66
+   */
67
+  //
68
+  userLogin : function (evt) {
69
+    //
70
+    var self = this;
71
+    var oldNameWidth, newNameWidth;
72
+    var size = NPGClient.PageHandler.getPageByName('login').ctx.measureText(NPGClient.userName).width;
73
+    oldNameWidth = 2.1*size; // corr factor 2.1
74
+    switch (evt.keyCode) {
75
+      case NPGClient.KEYS.ENTER:
76
+        if (NPGClient.SocketIO.isConnected) {                         
77
+          if (NPGClient.userName.length != 0) {
78
+            NPGClient.SocketIO.sendMsg('registration', NPGClient.userName);
79
+          }
80
+        } else {
81
+          //self.serverExit();
82
+        }                               
83
+        break;
84
+      case NPGClient.KEYS.BACKSPACE:
85
+        //--- remove a character        
86
+        evt.preventDefault();
87
+        NPGClient.Utils.removeChar();
88
+        newNameWidth = NPGClient.PageHandler.getPageByName('login').ctx.measureText(NPGClient.userName).width
89
+          
90
+         // newNameWidth = 2.1*self.ctx.measureText(self.tmpName).width; // corr factor 2.1
91
+//          self.cursor.shiftX(newNameWidth - oldNameWidth);
92
+        break;
93
+      default:
94
+        //console.log(evt.keyCode + ' ' + self.isValidKey(evt.keyCode));
95
+        //--- add character
96
+        if (self.isValidKey(evt.keyCode)) {
97
+          //self.cursor.stopBlink;
98
+          NPGClient.Utils.addChar(evt.keyCode);
99
+          //newNameWidth = 2.1*self.ctx.measureText(self.tmpName).width; // corr factor 2.1
100
+          //if (self.validName()) {
101
+          //  self.cursor.shiftX(newNameWidth - oldNameWidth);
102
+          //}
103
+          //self.cursor.startBlink;
104
+        }
105
+        break;
106
+    }
107
+  },
108
+
51 109
 }
... ...
@@ -15,12 +15,25 @@ NPGClient.CAN_H = 500;
15 15
 NPGClient.CAN_COL = '#000000';
16 16
 
17 17
 
18
-// counters
19
-NPGClient.pageCount = -1;
20
-
21
-
18
+/**
19
+ * Keyboard events
20
+ */ 
21
+NPGClient.KEYS = {
22
+  F1 : 112,
23
+  SPACE : 32,
24
+  ESC : 27,
25
+  ARROW_UP : 38,
26
+  ARROW_DOWN : 40,
27
+  ENTER : 13,
28
+  DELETE : 46,
29
+  BACKSPACE : 8,
30
+};
22 31
 
23 32
 
33
+/**
34
+ * APP PAGES
35
+ */ 
36
+NPGClient.pageCount = -1;
24 37
 // Login Page
25 38
 NPGClient.LOGIN = {
26 39
   SERVSTATUS: { 
... ...
@@ -48,14 +61,30 @@ NPGClient.LOGIN = {
48 48
   },
49 49
   INPUT: {
50 50
     'text': 'enter a name: ',
51
-    'x': 400,
51
+    'x': 265,
52 52
     'y': 300,
53 53
     'style': { 
54 54
       'font': '25px Lucida Console',
55 55
       'col': '#FFFFFF',
56
-      'align': 'center'
56
+      'align': 'left'
57 57
     }
58 58
   }, 
59
+  CURSOR: {
60
+    'w': 19,
61
+    'h': 19,
62
+    'pos': {
63
+      'x': 435,
64
+      'y': 283,
65
+    },
66
+    'style': { 
67
+      'fm': true,
68
+      'fc': '#FFFFFF',
69
+      'bm': false,
70
+      'bw': 0,
71
+      'bc': '',
72
+    }
73
+  },
74
+
59 75
   
60 76
 };
61 77
 
... ...
@@ -17,11 +17,13 @@ NPGClient.SocketIO = {
17 17
       console.log();  
18 18
       self.startConnectLoop();
19 19
   },
20
+
20 21
   // start connection loop
21 22
   startConnectLoop:  function() { 
22 23
     var self = this;
23 24
     self.conn_IntervalID = setInterval(function() { self.connect(); }, 1500); 
24 25
   },
26
+
25 27
   // stop connection loop
26 28
   stopConnectLoop:  function() { 
27 29
     var self =  this;
... ...
@@ -29,6 +31,7 @@ NPGClient.SocketIO = {
29 29
     self.conn_IntervalID = 0;
30 30
     self.conn_nAttempts = 0;
31 31
   },
32
+
32 33
   // connect socket
33 34
   connect: function() {
34 35
     var self = this;  
... ...
@@ -49,6 +52,7 @@ NPGClient.SocketIO = {
49 49
       self.socket.socket.connect();   
50 50
     }
51 51
   },
52
+
52 53
   // Define Socket Messages
53 54
   defineSocketMsgs: function() {
54 55
     var self = this;  
... ...
@@ -72,6 +76,12 @@ NPGClient.SocketIO = {
72 72
       self.startConnectLoop();
73 73
       self.isConnected = false;
74 74
     });     
75
+  },
76
+
77
+  // send message to server
78
+  sendMsg: function(name, data) {
79
+    var self = this;  
80
+    self.socket.emit(name, data);
75 81
   }
76 82
   
77 83
 };
78 84
new file mode 100644
... ...
@@ -0,0 +1,43 @@
0
+/**
1
+ * @file ui_cursor.js
2
+ * @author frtk@tetalab
3
+ */
4
+
5
+NPGClient.UICursor = function(n, o) { 
6
+
7
+  //
8
+  this.rect = new NPGClient.UIRect(n, o); 
9
+  // obj name
10
+  this.name = n !== undefined ? n : '';
11
+  // state
12
+  this.bState = true;
13
+  this.bCount = 0;
14
+  this.bCountMax = 5;
15
+
16
+};
17
+
18
+NPGClient.UICursor.prototype = {
19
+   
20
+  // Constructor
21
+  constructor: NPGClient.UICursor,
22
+    
23
+  //
24
+  draw: function(ctx) {
25
+    var self = this;
26
+    if (self.bState) {
27
+      if (self.bCount == self.bCountMax) {
28
+        self.bCount = 0;
29
+        self.bState = false;
30
+      } else self.rect.draw(ctx);
31
+      self.bCount++;
32
+    } else {
33
+      if (self.bCount == self.bCountMax) {
34
+        self.bCount = 0;
35
+        self.bState = true;
36
+        self.rect.draw(ctx);
37
+      } else self.bCount++;
38
+    }  
39
+  },
40
+
41
+};
42
+
... ...
@@ -28,16 +28,15 @@ NPGClient.UIInputText.prototype = {
28 28
   constructor: NPGClient.UIInputText,
29 29
   
30 30
   //
31
-  updateState: function() {
31
+  updateInput: function() {
32 32
     var self = this;
33
-    if (NPGClient.SocketIO.isConnected) self.currText = self.text.online;
34
-    else self.currText = self.text.offline;
33
+    self.input = NPGClient.userName;     
35 34
   },
36 35
 
37 36
   //
38 37
   draw: function(ctx, state) {
39 38
     var self = this;
40
-    self.updateState();  
39
+    self.updateInput();  
41 40
     NPGClient.Utils.setTxtStyle(ctx, self.s);
42 41
     ctx.fillText(self.text + self.input, self.x, self.y);    
43 42
   }
... ...
@@ -29,14 +29,8 @@ NPGClient.UILabel.prototype = {
29 29
   //
30 30
   draw: function(ctx) {
31 31
     var self = this;
32
-    //self.rect.draw(ctx); 
33
-      NPGClient.Utils.setTxtStyle(ctx, self.s);
34
-      ctx.fillText(self.text, self.x, self.y);    
35
-/*
36
-    ctx.font = self.font
37
-    ctx.fillStyle = self.col;
38
-    ctx.fillText(self.text, self.x, self.y);  
39
-*/
32
+    NPGClient.Utils.setTxtStyle(ctx, self.s);
33
+    ctx.fillText(self.text, self.x, self.y);    
40 34
   }
41 35
 
42 36
 };
... ...
@@ -35,11 +35,11 @@ NPGClient.UIMenu.prototype = {
35 35
     var self = this;
36 36
     var y = self.y  
37 37
     if (self.items !== undefined && self.items.length > 0) {
38
-	for (var i = 0; i < self.items.length; i++) {
39
-	    ctx.font = self.items[i].font;
40
-	    ctx.fillStyle = self.items[i].col;
41
-	    ctx.fillText(self.text, self.x, self.y);
42
-	}      
38
+      for (var i = 0; i < self.items.length; i++) {
39
+        ctx.font = self.items[i].font;
40
+        ctx.fillStyle = self.items[i].col;
41
+        ctx.fillText(self.text, self.x, self.y);
42
+      }      
43 43
     }
44 44
   },
45 45
 
... ...
@@ -3,20 +3,18 @@
3 3
  * @author frtk@tetalab
4 4
  */
5 5
 
6
-NPGClient.UIRect = function(n, p, w, h, s) { 
6
+NPGClient.UIRect = function(n, o) { 
7 7
 
8 8
   //
9
-  //NPGClient.UIObject.call(this, n, s);
10
-
9
+  NPGClient.UIShape.call(this);
11 10
   // obj name
12 11
   this.name = n !== undefined ? n : '';
13 12
   // geom
14
-  this.pos = p !== undefined ? p : new NPGClient.UIPoint2D();  
15
-  this.w = w !== undefined ? w : 0;
16
-  this.h = h !== undefined ? h : 0;
13
+  this.pos = o.pos !== undefined ? o.pos : {};  
14
+  this.w = o.w !== undefined ? o.w : 0;
15
+  this.h = o.h !== undefined ? o.h : 0;
17 16
   // style
18
-  this.style = s !== undefined ? s : new NPGclient.UIStyle(); 
19
-
17
+  this.style = o.style !== undefined ? o.style : new NPGClient.UIStyle(); 
20 18
 };
21 19
 
22 20
 NPGClient.UIRect.prototype = {
... ...
@@ -24,23 +22,20 @@ NPGClient.UIRect.prototype = {
24 24
   // Constructor
25 25
   constructor: NPGClient.UIRect,
26 26
     
27
-  //
28
-
29
-
30 27
   //
31 28
   draw: function(ctx) {
32 29
     var self = this;
33
-    if (!self.s.fillMode()) {
34
-      drawNoFill(ctx, self.x, self.y, self.w, self.h, self.lw, self.lc);
30
+    if (!self.style.fm) {
31
+      self.drawNoFill(ctx, self.pos.x, self.pos.y, self.w, self.h, self.style.lw, self.style.lc);
35 32
     } else {
36
-      drawFill(ctx, self.x, self.y, self.w, self.h, self.fc);
33
+      self.drawFill(ctx, self.pos.x, self.pos.y, self.w, self.h, self.style.fc);
37 34
     }
38 35
   },
39 36
 
40 37
   //
41 38
   drawFill: function(ctx) {
42 39
     var self = this;  
43
-    self.applyStyle(ctx);
40
+    NPGClient.Utils.applyStyle(ctx, self.style);
44 41
     ctx.fillRect(self.pos.x, self.pos.y, self.w, self.h);
45 42
   },
46 43
 
... ...
@@ -48,7 +43,7 @@ NPGClient.UIRect.prototype = {
48 48
   drawNoFill: function(ctx, x1, y1, w, h, lw, c) {
49 49
     var self = this;      
50 50
     ctx.beginPath();
51
-    self.applyStyle(ctx);
51
+    NPGClient.Utils.applyStyle(ctx, self.style);
52 52
     ctx.rect(self.pos.x, self.pos.y, self.w, self.h);
53 53
     ctx.stroke();
54 54
   },
55 55
new file mode 100644
... ...
@@ -0,0 +1,45 @@
0
+/**
1
+ * @file ui_shape.js
2
+ * @author frtk@tetalab
3
+ */
4
+//
5
+
6
+NPGClient.UIShape = function() { 
7
+  this.x = 0;  // x position
8
+  this.y = 0;  // y position
9
+};
10
+
11
+
12
+/**
13
+ * 
14
+ */
15
+NPGClient.UIShape.prototype = {
16
+
17
+  // Constructor
18
+  constructor: NPGClient.UIShape,
19
+
20
+  //
21
+  moveTo: function(x, y) {
22
+    var self = this;
23
+    self.x = x;
24
+    self.y = y;
25
+  },
26
+
27
+  //
28
+  move: function(x, y) {
29
+    var self = this;
30
+    self.x += x;
31
+    self.y += y;
32
+  },
33
+
34
+  //
35
+  shiftX: function(x) {    
36
+    this.x += x;
37
+  }, 
38
+   
39
+  //
40
+  shiftY: function(y) {
41
+    this.y += y;
42
+  }
43
+
44
+}; 
... ...
@@ -3,20 +3,21 @@
3 3
  * @author frtk@tetalab
4 4
  */
5 5
 
6
-NPGClient.UIStyle = function(fm, fc, bm, bw, bc) { 
7
-
8
-  this.fm = fm !== undefined ? fm : false;
9
-  this.fc = fc !== undefined ? fc : '';
10
-  this.bm = bm !== undefined ? bm : false;
11
-  this.bw = bw !== undefined ? bw : 0;
12
-  this.bc = bc !== undefined ? bc : '';
13
-
6
+NPGClient.UIStyle = function(o) { 
7
+/*
8
+  this.fm = o.fm !== undefined ? o.fm : false;
9
+  this.fc = o.fc !== undefined ? o.fc : '';
10
+  this.bm = o.bm !== undefined ? o.bm : false;
11
+  this.bw = o.bw !== undefined ? o.bw : 0;
12
+  this.bc = o.bc !== undefined ? o.bc : '';
13
+*/
14 14
 };
15 15
 
16 16
 NPGClient.UIStyle.prototype = {
17 17
     
18 18
   constructor: NPGClient.UIStyle,
19
-  
19
+
20
+/*  
20 21
   borderMode: function() {
21 22
     return this.bm;
22 23
   },
... ...
@@ -39,13 +40,14 @@ NPGClient.UIStyle.prototype = {
39 39
   applyStyle: function(ctx) {
40 40
     var self = this;
41 41
     // fill style
42
-    if (fm == true) ctx.fillStyle = self.fc; 	
42
+    if (self.fm == true) ctx.fillStyle = self.fc; 	
43 43
     // border mode	  
44 44
     if (bm == true) {
45
-      ctx.lineWidth = bw;
46
-      ctx.strokeStyle = bc;
45
+      ctx.lineWidth = self.bw;
46
+      ctx.strokeStyle = self.bc;
47 47
     }	
48 48
   }
49
-    
49
+  
50
+*/  
50 51
 };
51 52
 
52 53
new file mode 100644
... ...
@@ -0,0 +1,68 @@
0
+/**
1
+ * @file client_utils.js
2
+ * @author frtk@tetalab
3
+ */
4
+
5
+NPGClient.Utils = {
6
+
7
+  /**
8
+   * UI
9
+   */
10
+  //  
11
+  setTxtStyle : function(ctx, style) {
12
+    ctx.font = style.font;
13
+    ctx.fillStyle = style.col;       
14
+    ctx.textAlign = style.align;               
15
+  },      
16
+
17
+  //  
18
+  applyStyle : function(ctx, style) {
19
+    //
20
+    if (style.bm) {
21
+      ctx.lineWidth = style.bw;
22
+      ctx.strokeStyle = style.bc;
23
+    }
24
+    //
25
+    if (style.fm) {
26
+      ctx.fillStyle = style.fc;
27
+    }
28
+  },      
29
+
30
+
31
+  /**
32
+   * User Name 
33
+   */
34
+  //  
35
+  addChar : function(key) {
36
+    //console.log(key + ' ' + NPGClient.userName);
37
+    if (NPGClient.userName.length < NPGClient.NAMEMAXSIZE) {
38
+      NPGClient.userName = NPGClient.userName + String.fromCharCode(key).toLowerCase();   
39
+      console.log(NPGClient.userName);
40
+    }
41
+  },
42
+
43
+  //
44
+  removeChar : function(key) {
45
+    if (NPGClient.userName.length > 0) {
46
+      NPGClient.userName = NPGClient.userName.substring(0, NPGClient.userName.length - 1);      
47
+      console.log(NPGClient.userName);
48
+    }                                                               
49
+  },
50
+  
51
+  //
52
+  validChar : function(key) {
53
+    return NPGClient.evtHandler.loginValidKey(key);
54
+  },
55
+
56
+  //
57
+  validName : function(key) {
58
+    var len = NPGClient.userName.length;
59
+    return (len >= 0 && len <= NPGClient.NAMEMAXSIZE);
60
+  },              
61
+
62
+  //
63
+  resetName : function() {
64
+    NPGClient.userName = '';
65
+  },
66
+
67
+}
0 68
new file mode 100644
... ...
@@ -0,0 +1,12 @@
0
+/**
1
+ * @file js_utils.js
2
+ * @author frtk@tetalab
3
+ */
4
+
5
+function countProperties(obj) {
6
+  var count = 0;
7
+  for (var prop in obj) {
8
+    if (obj.hasOwnProperty(prop)) count++;
9
+  }
10
+  return count;
11
+}
... ...
@@ -1,6 +1,6 @@
1 1
 {
2 2
   "name": "npg_app.js",
3
-  "version": "0.1.2",
3
+  "version": "0.1.3",
4 4
   "description": "Multiplayer online Pong Game using nodejs and socket.io",
5 5
   "directories": {
6 6
     "server": "server",
... ...
@@ -4,7 +4,7 @@
4 4
  */
5 5
 
6 6
 var Config = {
7
-  VERSION : '0.1.2',
7
+  VERSION : '0.1.3',
8 8
   HTTP: {
9 9
     host: '127.0.0.1',
10 10
     port: 8042
... ...
@@ -1,13 +1,35 @@
1 1
 
2
+
3
+### **v0.1.3:**
4
+-------------------------- 
5
+focus: client ui lib - keyboard handling
6
+-------------------------- 
7
+---- /client/utils
8
+- renamed utils.js -> client_utils.js
9
+- added js_utils.js (global methods)
10
+---- keyboard handling on login page
11
+- input name feature (add and remove char)
12
+---- added in /client/ui/objects
13
+- ui_shape.js (base shape object)
14
+- ui_cursor.js
15
+---- removed in /client/ui/objects
16
+- ui_line.js
17
+- ui_object.js 
18
+---- changed UIRect object
19
+- inherits from UIShape
20
+---- cursor object
21
+- blinking cursor blinks (need to implement movement with name input)
22
+
23
+
2 24
 ### **v0.1.2:**
3 25
 -------------------------- 
4 26
 focus: client ui lib
5 27
 -------------------------- 
6 28
 ---- added ui objects in /client/ui/objects
7
-ui_input_text.js
8
-ui_menu.js
9
-ui_status_text.js
10
-ui_text_style_.js
29
+- ui_input_text.js
30
+- ui_menu.js
31
+- ui_status_text.js
32
+- ui_text_style_.js
11 33
 ---- Login page
12 34
 - changed convention for parameters in npg_client.js (by 'page' object)
13 35
 - title label and server status working