瀏覽代碼

모바일 기초작업

juney 2 年之前
父節點
當前提交
4cc18af981

+ 1 - 0
src/main/webapp/js/app/stinfo/ITP_STINFO03010.js

@@ -552,6 +552,7 @@ let createObj = {
552 552
 			const formId = '#ITP_FORM_STINFO03010_DETAIL';
553 553
 			itp_fn_form_clear_validate(null, formId);
554 554
 			if (createObj.isValid(formId)) {
555
+				itp_fn_grid_save_rows(STINFO03010_DETAIL_GRID_ID);
555 556
 				let gridInsertData = [];
556 557
 				let gridUpdateData = [];
557 558
 				let gridDeleteData = [];

+ 27 - 14
src/main/webapp/mobile/app/login.html

@@ -5,43 +5,56 @@
5 5
     <meta http-equiv="X-UA-Compatible" content="IE=edge">
6 6
     <meta name="viewport" content="width=device-width, initial-scale=1.0">
7 7
     <title>로그인</title>
8
-    <link rel="stylesheet" href="/style.css">
8
+    <link rel="stylesheet" href="../css/style.css">
9
+
10
+    <script>
11
+      const VIEW_PAGE = 'LOGIN'; //config.js 에서 로그인 페이지 인지 아닌지 확인하기 위한 변수
12
+      var CONN_KEY; //Jwt 토큰을 담기위한 변수
13
+    </script>
14
+
15
+    <script src="../js/properties.js"></script>
16
+    <script src="../../js/require.min.js" data-main="../js/config.js"></script>
9 17
   </head>
10 18
     <div id="ITP_LOGIN">
19
+      <form id="ITP_FORM_MOBILE_LOGIN" class="form-horizontal" action="" method="post" onsubmit="return false;">
20
+        <input id="userId" name="userId" type="hidden" value="" />
21
+        <input id="password" name="password" type="hidden" value="" />
22
+        <!--<input id="brandId" name="brandId" type="hidden" value="" />-->
11 23
       <div class="login_popup">
12 24
         <div class="login_info">
13 25
           <h1>서비스<br>VISUAL IMAGE</h1>
14 26
         </div>
15 27
         <div class="num_area">
16 28
           <div class="input_area">
17
-            <input type="text" name="id" id="id"  required>
18
-            <label for="id">사업자번호</label>
19
-            <button>연결</button>
29
+            <input type="text" name="bsnsRegNo" id="ITP_FORM_LOGIN_BSNS_REG_NO" required>
30
+            <label for="ITP_FORM_LOGIN_BSNS_REG_NO">사업자번호</label>
31
+            <button type="button" id="ITP_BTN_LOGIN_BSNS_REG_NO">연결</button>
20 32
           </div>
21 33
           <div class="brand_list">
22
-            <select name="" id="">
23
-              <option>브랜드 리스트</option>
24
-              <option>asdfasdf</option>
34
+            <select name="brandId" id="ITP_FORM_LOGIN_BRAND_ID">
35
+              <option value="">선택</option>
25 36
             </select>
26 37
           </div>
27 38
         </div>
28 39
         <div class="login_page">
29 40
           <div class="input_area">
30
-            <input type="text" name="id" id="id"  required>
31
-            <label for="id">아이디</label>
41
+            <input type="text" id="ITP_FORM_LOGIN_USER_ID"  required>
42
+            <label for="ITP_FORM_LOGIN_USER_ID">아이디</label>
32 43
           </div>
33 44
           <div class="input_area">
34
-            <input type="password" name="pw" id="pw"  required>
35
-            <label for="pw">비밀번호</label>
45
+            <input type="password" id="ITP_FORM_LOGIN_USER_PW"  required>
46
+            <label for="ITP_FORM_LOGIN_USER_PW">비밀번호</label>
36 47
           </div>
37 48
         </div>
38 49
         <div class="error">
39 50
           <label>사업자번호와 관련된 브랜드 정보가 없습니다.</label>
40 51
         </div>
41
-      </div> 
52
+      </div>
42 53
       <div class="login_btn">
43
-        <button>로그인</button>
54
+        <button type="submit" id="login_btn" class="btn btn-primary btn-lg itp_btn">로그인</button>
44 55
       </div>
45
-    </div>   
56
+      </form>
57
+    </div>
58
+  <script src="../js/app/login.js?version=20210826"></script>
46 59
 </html>
47 60
 

+ 101 - 16
src/main/webapp/mobile/app/main.html

@@ -5,15 +5,42 @@
5 5
 	<meta http-equiv="X-UA-Compatible" content="IE=edge">
6 6
 	<meta name="viewport" content="width=device-width, initial-scale=1.0">
7 7
 	<title>모바일 수발주</title>
8
-	<link rel="stylesheet" href="/style.css">
8
+	<link rel="stylesheet" href="../css/style.css">
9
+	<style>
10
+
11
+		/* ITP_SIDEBAR */
12
+		#ITP_SIDEBAR {width:0px; float:left; margin-left:-2px; height:calc(100vh - 68px); background:#ddd; transition:all .25s ease; border-style:solid; border-color:#ddd; border-width:0 1px 1px 1px;}
13
+		#ITP_SIDEBAR.itp_open_nav {width:360px;}
14
+		#ITP_SIDEBAR .itp_nav {list-style:none; margin:0; padding:0; height:100%; overflow-y:scroll; overflow-x:hidden; visibility:hidden;}
15
+		#ITP_SIDEBAR.itp_open_nav .itp_nav {visibility:visible;}
16
+		#ITP_SIDEBAR .itp_nav.panel-group .panel+.panel {margin-top:0;}
17
+		#ITP_SIDEBAR .itp_nav .panel-heading {padding:0;}
18
+		#ITP_SIDEBAR .itp_nav .panel-title {line-height:1.1; border-bottom:1px solid #ddd;}
19
+		#ITP_SIDEBAR .itp_nav .panel-title a {font-size:14px; display:block; padding:13px 15px; color:#333;}
20
+		#ITP_SIDEBAR .itp_nav .panel-title a .glyphicon {font-size:12px;}
21
+		#ITP_SIDEBAR .itp_nav .panel-default {margin-bottom:0; border:none;}
22
+		#ITP_SIDEBAR .itp_nav * {border-radius:0; border-width:1px 0 1px 0;}
23
+		#ITP_SIDEBAR .itp_nav .itp_svgs_body {padding:0; border-top:0; border-bottom:1px solid #ddd;}
24
+		#ITP_SIDEBAR .itp_nav .itp_svgs {list-style:none; margin:0; padding:0;}
25
+		#ITP_SIDEBAR .itp_nav .itp_svgs .itp_svg_in {position:relative;}
26
+		#ITP_SIDEBAR .itp_nav .itp_svgs li a {display:block; width:100%; color:#333; padding:5px 10px 5px 17px;}
27
+		#ITP_SIDEBAR .itp_nav .itp_svgs li:first-child a {padding-top:10px;}
28
+		#ITP_SIDEBAR .itp_nav .itp_svgs li:last-child a {padding-bottom:10px;}
29
+		#ITP_SIDEBAR .itp_nav .itp_svgs li a:hover, #ITP_SIDEBAR .itp_nav .itp_svgs li a:active {color:#000; font-weight:bold;}
30
+		#ITP_SIDEBAR .itp_nav .itp_svgs li a .glyphicon {font-size:9px; float:left; margin:4px 6px 0 0;}
31
+		#ITP_SIDEBAR .itp_nav .itp_svgs li a .itp_icon {font-size:9px; float:left; margin:4px 6px 0 15px;}
32
+		#ITP_SIDEBAR .itp_nav .itp_svgs li a .itp_icon_5 {font-size:9px; float:left; margin:4px 6px 0 25px;}
33
+		#ITP_SIDEBAR .itp_nav .itp_svgs li a .itp_tt {float:left;}
34
+
35
+	</style>
9 36
 </head>
10 37
 	<body>
11 38
 		<div id="ITP_WRAPPER">
12 39
 			<header>
13 40
 				<div class="header_wrap">
14 41
 					<div class="menu_logo">
15
-						<button id="ITP_BTN_MENU"><img src="/img/menu.png" alt=""></button>
16
-						<button id="ITP_BTN_HOME"><img src="/img/home.png" alt=""></button>
42
+						<button id="ITP_BTN_MENU"><img src="../img/menu.png" alt=""></button>
43
+						<button id="ITP_BTN_HOME"><img src="../img/home.png" alt=""></button>
17 44
 					</div>
18 45
 					<div class="logout">
19 46
 						<button id="ITP_BTN_LOGOUT">로그<br>아웃</button>
@@ -31,14 +58,68 @@
31 58
 					</div>
32 59
 				</div>
33 60
 			</header>
34
-			<div id="ITP_MENU" style="display: block;">
61
+
62
+			<nav id="ITP_SIDEBAR" class="itp_open_nav">
63
+
64
+				<ul class="panel-group itp_nav"></ul>
65
+
66
+				<textarea id="ITP_AJAX_MAIN_SIDE_LEVEL2_ROWCOPY" rows="0" cols="0" style="display:none;">
67
+				<li class="panel panel-default">
68
+					<div class="panel-heading">
69
+						<div class="panel-title">
70
+							<a class="accordion-toggle" data-toggle="collapse" href="">
71
+								<span class="fnMenuNm">메뉴명</span>
72
+								<i class="indicator glyphicon glyphicon-chevron-down pull-right"></i>
73
+							</a>
74
+						</div>
75
+					</div>
76
+					<div class="panel-collapse collapse" id="">
77
+						<div class="panel-body itp_svgs_body">
78
+							<ul class="itp_svgs fnLevelBottomList"></ul>
79
+						</div>
80
+					</div>
81
+				</li>
82
+				</textarea>
83
+				<textarea id="ITP_AJAX_MAIN_SIDE_LEVEL3_ROWCOPY" rows="0" cols="0" style="display:none;">
84
+				<li>
85
+					<div class="itp_svg_in">
86
+						<a href="javascript:void(0)" data-itp-nav-id="" data-conn-url="" id="" class="itp_nav_link fix">
87
+							<i class="glyphicon glyphicon-chevron-right"></i>
88
+							<span class="itp_tt fnMenuNm">메뉴명</span>
89
+						</a>
90
+					</div>
91
+				</li>
92
+				</textarea>
93
+				<textarea id="ITP_AJAX_MAIN_SIDE_LEVEL4_ROWCOPY" rows="0" cols="0" style="display:none;">
94
+				<li>
95
+					<div class="itp_svg_in">
96
+						<a href="javascript:void(0)" data-itp-nav-id="" data-conn-url="" id="" class="itp_nav_link fix">
97
+							<i class="itp_icon">└</i>
98
+							<span class="itp_tt fnMenuNm">메뉴명</span>
99
+						</a>
100
+					</div>
101
+				</li>
102
+				</textarea>
103
+				<textarea id="ITP_AJAX_MAIN_SIDE_LEVEL5_ROWCOPY" rows="0" cols="0" style="display:none;">
104
+				<li>
105
+					<div class="itp_svg_in">
106
+						<a href="javascript:void(0)" data-itp-nav-id="" data-conn-url="" id="" class="itp_nav_link fix">
107
+							<i class="itp_icon_5">*</i>
108
+							<span class="itp_tt fnMenuNm">메뉴명</span>
109
+						</a>
110
+					</div>
111
+				</li>
112
+				</textarea>
113
+			</nav>
114
+
115
+			<!--<div id="ITP_MENU" style="display: block;">
35 116
 				<div class="menu_area">
36
-					<button class="ITP_BTN_CLOSE"><img src="/img/close2.png"></button>
117
+					<button class="ITP_BTN_CLOSE"><img src="../img/close2.png"></button>
37 118
 				</div>
38 119
 				<div class="menu_bar">
39 120
 					<div class="menu_header">
40 121
 						<div class="brand_img">
41
-							<img src="/img/naver.png">
122
+							<img src="../img/naver.png">
42 123
 						</div>
43 124
 						<div class="user_info">
44 125
 							<div class="">홍길동</div>
@@ -46,7 +127,7 @@
46 127
 							<div class="id">asdf1234</div>
47 128
 						</div>
48 129
 						<div class="setting">
49
-							<button><img src="/img/gear.png"></button>
130
+							<button><img src="../img/gear.png"></button>
50 131
 						</div>
51 132
 					</div>
52 133
 					<div class="menu_select">
@@ -59,25 +140,25 @@
59 140
 									<ul>
60 141
 										<li>
61 142
 											<div class="itp_svg_in">
62
-												<i><img src="/img/arrow_right.png"></i>
143
+												<i><img src="../img/arrow_right.png"></i>
63 144
 												<span class="fnMenuNm">구매요청생성</span>
64 145
 											</div>
65 146
 										</li>
66 147
 										<li>
67 148
 											<div class="itp_svg_in">
68
-												<i><img src="/img/arrow_right.png"></i>
149
+												<i><img src="../img/arrow_right.png"></i>
69 150
 												<span class="fnMenuNm">구매요청현황</span>
70 151
 											</div>
71 152
 										</li>
72 153
 										<li>
73 154
 											<div class="itp_svg_in">
74
-												<i><img src="/img/arrow_right.png"></i>
155
+												<i><img src="../img/arrow_right.png"></i>
75 156
 												<span class="fnMenuNm">입고처리</span>
76 157
 											</div>
77 158
 										</li>
78 159
 										<li>
79 160
 											<div class="itp_svg_in">
80
-												<i><img src="/img/arrow_right.png"></i>
161
+												<i><img src="../img/arrow_right.png"></i>
81 162
 												<span class="fnMenuNm">입고현황</span>
82 163
 											</div>
83 164
 										</li>
@@ -92,31 +173,31 @@
92 173
 									<ul>
93 174
 										<li>
94 175
 											<div class="itp_svg_in">
95
-												<i><img src="/img/arrow_right.png"></i>
176
+												<i><img src="../img/arrow_right.png"></i>
96 177
 												<span class="fnMenuNm">반품요청</span>
97 178
 											</div>
98 179
 										</li>
99 180
 										<li>
100 181
 											<div class="itp_svg_in">
101
-												<i><img src="/img/arrow_right.png"></i>
182
+												<i><img src="../img/arrow_right.png"></i>
102 183
 												<span class="fnMenuNm">반품요청현황</span>
103 184
 											</div>
104 185
 										</li>
105 186
 										<li>
106 187
 											<div class="itp_svg_in">
107
-												<i><img src="/img/arrow_right.png"></i>
188
+												<i><img src="../img/arrow_right.png"></i>
108 189
 												<span class="fnMenuNm">반품발주현황</span>
109 190
 											</div>
110 191
 										</li>
111 192
 										<li>
112 193
 											<div class="itp_svg_in">
113
-												<i><img src="/img/arrow_right.png"></i>
194
+												<i><img src="../img/arrow_right.png"></i>
114 195
 												<span class="fnMenuNm">반품처리</span>
115 196
 											</div>
116 197
 										</li>
117 198
 										<li>
118 199
 											<div class="itp_svg_in">
119
-												<i><img src="/img/arrow_right.png"></i>
200
+												<i><img src="../img/arrow_right.png"></i>
120 201
 												<span class="fnMenuNm">반품현황</span>
121 202
 											</div>
122 203
 										</li>
@@ -143,7 +224,11 @@
143 224
 						</ul>
144 225
 					</div>
145 226
 				</div>
227
+			</div>-->
228
+			<div id="ITP_CONTAINER">
229
+
146 230
 			</div>
231
+			<script src="../js/app/main.js?version=20210826"></script>
147 232
 		</div>
148 233
 	</body>
149 234
 </html>

+ 2 - 2
src/main/webapp/mobile/css/style.css

@@ -1,4 +1,4 @@
1
-@font-face { font-family: 'NanumBarunGothic';src: url('/fonts/NanumBarunGothic.eot');src: url('/fonts/NanumBarunGothic.eot') format('embedded-opentype'),url('/fonts/NanumBarunGothic.woff') format('woff');}
1
+@font-face { font-family: 'NanumBarunGothic';src: url('../fonts/NanumBarunGothic.eot');src: url('../fonts/NanumBarunGothic.eot') format('embedded-opentype'),url('../fonts/NanumBarunGothic.woff') format('woff');}
2 2
 * {margin: 0; padding: 0; box-sizing: border-box; text-align: center; font-family: 'NanumBarunGothic', 'serif'; list-style: none;}
3 3
 section {}
4 4
 body{background: #fff; position: relative; width: 100%; height: 500px;}
@@ -101,7 +101,7 @@ body.eee {height: 700px; background: #eee;}
101 101
 #ITP_LOGIN .login_popup .num_area .input_area {margin-bottom: 10px;}
102 102
 #ITP_LOGIN .login_popup .num_area .input_area input {width:52%; font-size: 0.8rem; }
103 103
 #ITP_LOGIN .login_popup .num_area .input_area button {font-weight: 700; margin-left: 0.1%; width: 16.5%; height: 40px; background-color: blue; color: #eee; font-size: 1rem; padding: 0;}
104
-#ITP_LOGIN .login_popup .num_area .brand_list select {padding-left: 10px; width: 70%; height: 40px; font-size: 0.8rem; background: url(/img/down.png)no-repeat 100% 50%/40px auto; -webkit-appearance:none; appearance:none;} 
104
+#ITP_LOGIN .login_popup .num_area .brand_list select {padding-left: 10px; width: 70%; height: 40px; font-size: 0.8rem; background: url(../img/down.png)no-repeat 100% 50%/40px auto; -webkit-appearance:none; appearance:none;}
105 105
 #ITP_LOGIN .login_popup .num_area .brand_list select option {text-align: left; width: 70%; height: 50px; border: 1px solid #000; font-size: 20px;} 
106 106
 
107 107
 #ITP_LOGIN .login_page {position: relative; width: 100%;  margin-bottom: 30px;}

+ 38 - 17
src/main/webapp/mobile/js/app/login.js

@@ -8,25 +8,29 @@ require(['config'], function() {
8 8
 	    }
9 9
 
10 10
 		// itp_fn_login_init();
11
-		
11
+
12 12
 		$('#ITP_LOGIN').on('keyup', 'input, textarea', function() {
13 13
 			var $th = $(this);
14
-	        $th.val($th.val().replace(/(<([^>]+)>)/ig, function() {return '';}));
14
+			$th.val($th.val().replace(/(<([^>]+)>)/ig, function() {return '';}));
15
+		});
16
+
17
+		$('#ITP_BTN_LOGIN_BSNS_REG_NO').on('click', function() {
18
+			itp_fn_login_reg_no();
15 19
 		});
16
-		
20
+
17 21
 		$('#login_btn').click(function() {
18 22
 			if(itp_fn_login_validate()) {
19 23
 				itp_fn_login_proc();
20 24
 			}
21 25
 		});
22
-		
23
-		var callbackFn = function(result) {
24
-			POP_LIST = result.popList;
25
-			fn_proc_popup_view('L');
26
-		};
27
-		const key = {sViewTargetCd: 'L'};
28
-		var param = $.param(key);
29
-		fn_ajax_call('/api/pop/open-pop', param, callbackFn, 'GET');
26
+
27
+		// var callbackFn = function(result) {
28
+		// 	POP_LIST = result.popList;
29
+		// 	fn_proc_popup_view('L');
30
+		// };
31
+		// const key = {sViewTargetCd: 'L'};
32
+		// var param = $.param(key);
33
+		// fn_ajax_call('/api/pop/open-pop', param, callbackFn, 'GET');
30 34
 	});
31 35
 });
32 36
 
@@ -36,20 +40,34 @@ function itp_fn_login_init() {
36 40
     if (save_id !== null) {
37 41
     	$('#ITP_FORM_LOGIN_USER_ID').val(save_id);
38 42
     }
39
-};
43
+}
44
+
45
+function itp_fn_login_reg_no() {
46
+	if ($('#ITP_FORM_LOGIN_BSNS_REG_NO').val() === '') {
47
+		$('#ITP_FORM_LOGIN_ERROR_REG_NO').show();
48
+	} else {
49
+		$('#ITP_FORM_LOGIN_ERROR_REG_NO').hide();
50
+
51
+		var callbackFn = function(result) {
52
+			fn_make_select_brand(result.gridRows, 'ITP_FORM_LOGIN_BRAND_ID');
53
+		};
54
+		var param = {'bsnsRegNo': $('#ITP_FORM_LOGIN_BSNS_REG_NO').val()};
55
+		fn_ajax_call('/api/member/brand-list-app', $.param(param), callbackFn, 'GET');
56
+	}
57
+}
40 58
 
41 59
 function itp_fn_login_validate() {
42 60
 	$('#ITP_FORM_LOGIN_USER_ID').closest('.form-group').removeClass('has-error');
43 61
 	$('#ITP_FORM_LOGIN_USER_PW').closest('.form-group').removeClass('has-error');
44 62
 	$('#ITP_FORM_LOGIN_ERROR').text(ITP_MSG_LOCALE.message.login.help);
45 63
 
46
-	if ($('#ITP_FORM_LOGIN_USER_ID').val() == '') {
64
+	if ($('#ITP_FORM_LOGIN_USER_ID').val() === '') {
47 65
 		$('#ITP_FORM_LOGIN_USER_ID').closest('.form-group').addClass('has-error');
48 66
 		$('#ITP_FORM_LOGIN_ERROR').text(ITP_MSG_LOCALE.message.login.needId);
49 67
 		return false;
50 68
 	}
51 69
 
52
-	if ($('#ITP_FORM_LOGIN_USER_PW').val() == '') {
70
+	if ($('#ITP_FORM_LOGIN_USER_PW').val() === '') {
53 71
 		$('#ITP_FORM_LOGIN_USER_PW').closest('.form-group').addClass('has-error');
54 72
 		$('#ITP_FORM_LOGIN_ERROR').text(ITP_MSG_LOCALE.message.login.needPw);
55 73
 		return false;
@@ -64,15 +82,17 @@ function itp_fn_login_validate() {
64 82
 	}
65 83
 
66 84
 	return true;
67
-};
85
+}
68 86
 
69 87
 function itp_fn_login_proc() {
70 88
 	var callbackFn = function(result) {
71 89
 		var hashed = fnHashed(result.hashed);
72 90
 		$('#userId').val(CryptoJS.AES.encrypt($('#ITP_FORM_LOGIN_USER_ID').val(), hashed));
73 91
 		$('#password').val(CryptoJS.AES.encrypt($('#ITP_FORM_LOGIN_USER_PW').val(), hashed));
92
+		// $('#brandId').val(CryptoJS.AES.encrypt($('#ITP_FORM_LOGIN_BRAND_ID').val(), hashed));
93
+		console.log('USER_ID ===> ' + CryptoJS.AES.encrypt($('#ITP_FORM_LOGIN_USER_ID').val(), hashed));
74 94
 	    var loginFn = function(result) {
75
-			// alert('SIGN-IN RESULT : ' + JSON.stringify(result));		
95
+			alert('SIGN-IN RESULT : ' + JSON.stringify(result));
76 96
 			sessionStorage.setItem('itp_login_info', JSON.stringify({
77 97
 				timestamp: new Date(),
78 98
 		        connKey: result.connKey		// Jwt키를 가져와서 세션 스토리지에 저장
@@ -80,7 +100,8 @@ function itp_fn_login_proc() {
80 100
 	    	$(location).attr('href', MOBILE_CONTEXTPATH + '/app/main.html');
81 101
 		};
82 102
 		var params = $('#ITP_FORM_MOBILE_LOGIN').serializeObject();
83
-		fn_ajax_call('/api/member/sign-in', JSON.stringify(params), loginFn, 'POST'); //암호화 해서 보내는 경우 먼저 해시키를 가져와서 암호화해서 보낸다
103
+		console.log(JSON.stringify(params));
104
+		fn_ajax_call('/api/member/sign-in-app', JSON.stringify(params), loginFn, 'POST'); //암호화 해서 보내는 경우 먼저 해시키를 가져와서 암호화해서 보낸다
84 105
 	};
85 106
 	fn_ajax_call('/api/session/hashed', null, callbackFn, 'GET'); //Crypto 암호화를 위한 해쉬키.. 로그인 후에는 Jwt 포함인 /api/session/hashedKey 이걸로 호출해서 사용한다.
86 107
 	

+ 7 - 0
src/main/webapp/mobile/js/app/main.js

@@ -26,6 +26,13 @@ require(['config'], function() {
26 26
 	    	// // Barcode
27 27
 			// itp_fn_barcode.init();
28 28
 
29
+			$('#ITP_BTN_MENU').on('click', function() {
30
+				console.log('aaaaaaaaaaaaaa');
31
+				// $('#ITP_MENU').toggle();
32
+				$('#ITP_MENU').toggleClass('itp_open_nav');
33
+				// $('#ITP_CONTAINER').toggleClass('itp_open_conts');
34
+				itp_fn_fire_window_resize();
35
+			});
29 36
 		}, 100);
30 37
 				
31 38
 	});

File diff suppressed because it is too large
+ 44 - 2683
src/main/webapp/mobile/js/config.js