Subversion Repositories php-qbpwcf

Rev

Rev 399 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
3 liveuser 1
<?php
2
 
3
/*
4
 
5
	QBPWCF, Quick Build PHP website Component base on Fedora Linux.
239 liveuser 6
    Copyright (C) 2014~2026 MIN ZHI, CHEN
3 liveuser 7
 
8
    This file is part of QBPWCF.
9
 
10
    QBPWCF is free software: you can redistribute it and/or modify
11
    it under the terms of the GNU General Public License as published by
12
    the Free Software Foundation, either version 3 of the License, or
13
    (at your option) any later version.
14
 
15
    QBPWCF is distributed in the hope that it will be useful,
16
    but WITHOUT ANY WARRANTY; without even the implied warranty of
17
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18
    GNU General Public License for more details.
19
 
20
    You should have received a copy of the GNU General Public License
21
    along with QBPWCF.  If not, see <http://www.gnu.org/licenses/>.
22
 
23
*/
24
namespace qbpwcf;
25
 
26
/*
27
類別說明:
28
javaScript應用的類別.
29
備註:
30
無.
31
*/
32
class javaScript{
33
 
34
	/*
35
	#函式說明:
36
	#當前類別被呼叫的靜態方法不存在時,將會執行該函數,回報該方法不存在.
37
	#回傳結果:
38
	#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
39
	#$reuslt["error"],執行不正常結束的錯訊息陣列.
40
	#$result["function"],當前執行的函式名稱.
41
	#必填參數:
42
	#$method,物件,為物件實體或類別名稱,會自動置入該參數.
43
	#$arguments,陣列,為呼叫方法時所用的參數.
44
	#參考資料:
45
	#__call=>http://php.net/manual/en/language.oop5.overloading.php#object.callstatic
46
	*/
47
	public function __call($method,$arguments){
48
 
49
		#取得當前執行的函式
50
		$result["function"]=__FUNCTION__;
51
 
52
		#設置執行不正常
53
		$result["status"]="false";
54
 
55
		#設置執行錯誤
56
		$result["error"][]=__NAMESPACE__ ."/".$method."() 不存在!";
57
 
58
		#設置所丟入的參數
59
		$result["error"][]=$arguments;
60
 
61
		#回傳結果
62
		return $result;
63
 
64
		}#function __call end
65
 
66
	/*
67
	#函式說明:
68
	#當前類別被呼叫的靜態方法不存在時,將會執行該函數,回報該方法不存在.
69
	#回傳結果:
70
	#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
71
	#$reuslt["error"],執行不正常結束的錯訊息陣列.
72
	#$result["function"],當前執行的函式名稱.
73
	#必填參數:
74
	#$method,物件,為物件實體或類別名稱,會自動置入該參數.
75
	#$arguments,陣列,為呼叫方法時所用的參數.
76
	#參考資料:
77
	#__call=>http://php.net/manual/en/language.oop5.overloading.php#object.callstatic
78
	*/
79
	public static function __callStatic($method,$arguments){
80
 
81
		#取得當前執行的函式
82
		$result["function"]=__FUNCTION__;
83
 
84
		#設置執行不正常
85
		$result["status"]="false";
86
 
87
		#設置執行錯誤
88
		$result["error"][]="欲呼叫的". __NAMESPACE__ ."/".$method."() 不存在!";
89
 
90
		#設置所丟入的參數
91
		$result["error"][]=$arguments;
92
 
93
		#回傳結果
94
		return $result;
95
 
96
		}#function __callStatic end
97
 
98
	/*
99
	#函式說明:
100
	#script 語法開始
101
	#回傳結果:
102
	#$result["status"],執行是否正常,"true"為正常,"false"為不正常.
103
	#$result["error"],錯誤訊息陣列.
104
	#$result["warning"],警告訊息陣列.
105
	#$result["founded"],識別是否有找到要匯入的js檔案,若有指定jsPosition參數才會回傳該結果.
106
	#$result["function"],當前執行的函數名稱.
107
	#$result["content"],javaScript語法.
108
	#$result["argv"], 使用的參數.
109
	#必填參數:
110
	#$conf["include"],字串,是否要匯入外部js庫,"true"爲要匯入;"false"爲沒有要匯入。
111
	$conf["include"]="true";
112
	#可省略參數:
113
	#$conf["fileArgu"],字串,php變數__FILE__的內容,亦即該檔案在檔案系統的絕對路徑,請與參數"jsPosition"一起設置,預設為當前檔案的位置.
114
	#$conf["fileArgu"]=__FILE__;
115
	#$conf["jsPosition"],字串,要匯入的js檔案位置,請與參數"fileArgu"一起設置,用了該參數後,該<script src="jsFileAddr"></script>裡面放的程式將不會運作.
116
	#$conf["jsPosition"]="";
117
	#$conf["web"],字串,true代表是網頁系統的位置,"false"代表是檔案系統的位置,預設為"true".
118
	#$conf["web"]="true";
119
	#$conf["allowNotExist"],字串,預設為"true",代表允許js檔案於server端檢查後不存在的結果;反之為"false".
120
	#$conf["allowNotExist"]="true";
121
	#$conf["importWhenExist"],字串,預設為"true",代表有存在才輸出匯入的語法;反之為"false".
122
	#$conf["importWhenExist"]="true";
123
	#參考資料:
124
	#無.
125
	#備註:
126
	#無.
127
	*/
128
	public static function start(&$conf){
129
 
130
		#初始化要回傳的變數
131
		$result=array();
132
 
133
		#記錄當前執行的函數名稱
134
		$result["function"]=__FUNCTION__;
135
 
136
		#如果 $conf 不為陣列
137
		if(gettype($conf)!="array"){
138
 
139
			#設置執行失敗
140
			$result["status"]="false";
141
 
142
			#設置執行錯誤訊息
143
			$result["error"][]="\$conf變數須為陣列形態";
144
 
145
			#如果傳入的參數為 null
146
			if($conf==null){
147
 
148
				#設置執行錯誤訊息
149
				$result["error"][]="\$conf變數不得為null,請檢查函數「".$result["function"]."」的參數設置有無正確!";
150
 
151
				}#if end
152
 
153
			#回傳結果
154
			return $result;
155
 
156
			}#if end
157
 
158
		#記錄當前執行的函數名稱
159
		$result["argv"]=$conf;
160
 
161
		#檢查參數
162
		#函式說明:
163
		#檢查必填與可省略的參數,可省略參數可指定預設要給與什麼數值內容。
164
		#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
165
		#$reuslt["error"],執行不正常結束的錯訊息陣列.
166
		#$result["function"],當前執行的函式名稱.
167
		#$result["passed"],識別要檢查的全體變數是否存在以及型態是否正確的變數,"true"代表檢查全部通過;"false"代表檢查不通過
168
		#$result[$shouldBtCheckedVarName]["varExist"],所檢查的變數是否存在,"false"代表不存在;"true"代表存在
169
		#$result[$shouldBtCheckedVarName]["varType"],所檢查的變數型態是否正確,"false"代表錯誤;"true"代表正確
170
		#$result[$shouldBtCheckedVarName]["error"],每個參數設定的錯誤訊息
171
		#$result["argu"],字串陣列,目前輸入的參數名稱陣列.
172
		#$result["legalVarName"],字串陣列,合法可用的參數名稱陣列.
173
		#$result["notNeedVar"],字串陣列,多餘的參數名稱.
174
		#必填參數:
175
		#$conf["variableCheck::checkArguments"]["varInput"],陣列變數,要檢查的陣列變數,請在要檢查的參數前面加上&,這樣變動的結果才能被套用。
176
		$conf["variableCheck::checkArguments"]["varInput"]=&$conf;
177
		#$conf["variableCheck::checkArguments"]["mustBeFilledVariableName"],爲必填參數的變數名稱陣列,形態爲陣列變數,例如: $conf["mustBeFilledVariableName"] = array("id","account","password");
178
		$conf["variableCheck::checkArguments"]["mustBeFilledVariableName"]=array("include");
179
		#$conf["variableCheck::checkArguments"]["mustBeFilledVariableType"],爲必填參數的變數陣列應該爲何種變數形態,形態爲陣列 例如: $conf["mustBeFilledVariableType"] = array("string",integer,"double");
180
		$conf["variableCheck::checkArguments"]["mustBeFilledVariableType"]=array("string");
181
		#$conf["variableCheck::checkArguments"]["referenceVarKey"],字串,$conf參數後面的key值,用於移除不要的參考陣列.
182
		$conf["variableCheck::checkArguments"]["referenceVarKey"]="variableCheck::checkArguments";
183
		#可以省略的參數:
184
		#$conf["variableCheck::checkArguments"]["canBeEmptyString"],必填變數內容如果是空字串就不能算是有設置的話,請設為"false",預設爲"true"。
185
		$conf["variableCheck::checkArguments"]["canBeEmptyString"]="false";
186
		#$conf["variableCheck::checkArguments"]["skipableVariableName"],爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableName"] = array("id","account","password");
187
		$conf["variableCheck::checkArguments"]["skipableVariableName"]=array("jsPosition","web","fileArgu","allowNotExist","importWhenExist");
188
		#$conf["variableCheck::checkArguments"]["skipableVariableType"],爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableType"] = array("string",integer,"double");
189
		$conf["variableCheck::checkArguments"]["skipableVariableType"]=array("string","string","string","string","string");
190
		#$conf["variableCheck::checkArguments"]["skipableVarDefaultValue"],字串陣列,每個不存在的可省略變數要初始化為什麼,null與代表不指定,若預設值是必填參數之一,請將$conf["mustBeFilledVar"]改成"\$conf["\mustBeFilledVar\"]".
191
		$conf["variableCheck::checkArguments"]["skipableVarDefaultValue"]=array(null,"true",__FILE__,"true","true");
192
		#$conf["variableCheck::checkArguments"]["arrayCountEqualCheck"],字串陣列,為檢查哪些陣列參數的元素數量要一樣,$conf["arrayCountEqualCheck"][$i]=array()為第$i組key為哪些的變數其元素數量要相等.
193
		#$conf["variableCheck::checkArguments"]["arrayCountEqualCheck"][]=array();
194
		#參考資料來源:
195
		#array_keys=>http://php.net/manual/en/function.array-keys.php
196
		$checkResult=variableCheck::checkArguments($conf["variableCheck::checkArguments"]);
197
		unset($conf["variableCheck::checkArguments"]);
198
 
199
		#如果檢查失敗
200
		if($checkResult["status"]==="false"){
201
 
202
			#設置錯誤狀態
203
			$result["status"]="false";
204
 
205
			#設置錯誤提示
206
			$result["error"]=$checkResult;
207
 
208
			#回傳結果
209
			return $result;
210
 
211
			}#if end
212
 
213
		#如果檢查不通過
214
		if($checkResult["passed"]==="false"){
215
 
216
			#設置錯誤狀態
217
			$result["status"]="false";
218
 
219
			#設置錯誤提示
220
			$result["error"]=$checkResult;
221
 
222
			#回傳結果
223
			return $result;
224
 
225
			}#if end
226
 
227
		#如果 $conf["include"] 其值爲 "true"
228
		if($conf["include"]==="true"){
229
 
230
			#如果 $conf["jsPosition"] 有設定
231
			if(isset($conf["jsPosition"])){
232
 
233
				#var_dump($conf["jsPosition"]);
234
 
235
				#轉換成檔案系統路徑
236
				#函式說明:
237
				#將檔案的位置名稱變成網址,也可以取得檔案位於伺服器上檔案系統的絕對位置.
238
				#回傳結果:
239
				#$result["status"],"true"爲建立成功,"false"爲建立失敗.
240
				#$result["error"],錯誤訊息陣列.
226 liveuser 241
				#$result["function"],函數名稱.
3 liveuser 242
				#$result["argu"],使用的參數.
243
				#$result["content"],網址,若是在命令列執行,則為"null".
244
				#$result["webPathFromRoot"],相對於網頁根目錄的路徑.
245
				#$result["fileSystemAbsoulutePosition"],針對伺服器端的絕對位置,亦即從網頁「document_root」目錄開始的路徑.
246
				#必填參數:
247
				#$conf["address"],字串,檔案的相對位置,若為絕對位置則會自動轉換成相對位置.
248
				$conf["fileAccess::getInternetAddressV2"]["address"]=$conf["jsPosition"];
249
				#$conf["fileArgu"],字串,php變數__FILE__的內容,亦即該檔案在檔案系統的絕對路徑.
250
				$conf["fileAccess::getInternetAddressV2"]["fileArgu"]=$conf["fileArgu"];
251
				#可省略參數:
252
				#$conf["web"],字串,"true"代表檔案是放在web環境;"false"是代表在檔案系統環境,預設為"true".
253
				$conf["fileAccess::getInternetAddressV2"]["web"]=$conf["web"];
254
				#備註:
255
				#建構中,fileSystemRelativePosition尚未實作,檢查參數尚未實作.
256
				$getInternetAddressV2=fileAccess::getInternetAddressV2($conf["fileAccess::getInternetAddressV2"]);
257
				unset($conf["fileAccess::getInternetAddressV2"]);
258
 
259
				#var_dump($getInternetAddressV2);
260
 
261
				#如果檢查不通過
262
				if($getInternetAddressV2["status"]=="false"){
263
 
264
					#設置錯誤狀態
265
					$result["status"]="false";
266
 
267
					#設置錯誤提示
268
					$result["error"]=$getInternetAddressV2;
269
 
270
					#回傳結果
271
					return $result;
272
 
273
					}#if end
226 liveuser 274
 
3 liveuser 275
				#用成網路位置
276
				$conf["jsPosition"]=$getInternetAddressV2["content"];
226 liveuser 277
 
3 liveuser 278
				#檢查要匯入的js檔案是否存在
279
				#函式說明:檢查多個檔案與資料夾是否存在.
280
				#回傳結果:
281
				#$result["status"],執行正常與否,"true"代表正常,"false"代表不正常.
282
				#$result["error"],錯誤訊息陣列.
283
				#$resutl["function"],當前執行的涵式名稱.
284
				#$result["allExist"],所有檔案皆存在的識別,"true"代表皆存在,"false"代表沒有全部都存在.
285
				#$result["varName"][$i],爲第$i個資料夾或檔案的名稱。
286
				#$result["varExist"][$i],爲第$i個資料夾或檔案是否存在,"true"代表存在,"false"代表不存在。
287
				#必填參數:
288
				$conf["fileAccess::checkMultiFileExist"]["fileArray"]=array($conf["jsPosition"]);#要檢查書否存在的檔案有哪些,須爲一維陣列數值。
289
				#$conf["fileArgu"],字串,php變數__FILE__的內容,亦即該檔案在檔案系統的絕對路徑.
290
				$conf["fileAccess::checkMultiFileExist"]["fileArgu"]=$conf["fileArgu"];
291
				#可省略參數
292
				#$conf["disableWebSearch"],"字串",是否取消「當檔案找不到時,改用catchWebContent類別的wget函數來檢查檔案是否存在於網路上」的功能,"false"不取消,若要取消該功能請設為"true",若抓到的內容為空字串則會視為檔案不存在,預設為"true".
293
				$conf["fileAccess::checkMultiFileExist"]["disableWebSearch"]="false";
294
				#$conf["userDir"],字串,網頁是否置放於家目錄底下,"true"為是,"false"為不是,於設為"true".
295
				$conf["fileAccess::checkMultiFileExist"]["web"]="true";
296
				#參考資料來源:
297
				#http://php.net/manual/en/function.file-exists.php
298
				#http://php.net/manual/en/control-structures.foreach.php
299
				$checkMultiFileExist=fileAccess::checkMultiFileExist($conf["fileAccess::checkMultiFileExist"]);
300
				unset($conf["fileAccess::checkMultiFileExist"]);
226 liveuser 301
 
3 liveuser 302
				#debug
303
				#var_dump($checkMultiFileExist);
226 liveuser 304
 
3 liveuser 305
				#如果檢查要匯入的js檔案失敗
306
				if($checkMultiFileExist["status"]=="false"){
307
 
308
					#設置錯誤狀態
309
					$result["status"]="false";
310
 
311
					#設置錯誤提示
312
					$result["error"]=$checkMultiFileExist;
313
 
314
					#回傳結果
315
					return $result;
316
 
317
					}#if end
318
 
319
				#如果檢查要匯入的js檔案不存在
320
				if($checkMultiFileExist["varExist"][0]=="false"){
321
 
322
					#設置沒有找到 js 檔案
323
					$result["founded"]="false";
324
 
325
					#如果不允許 server 端找不到 js 檔案
326
					if($conf["allowNotExist"]==="false"){
226 liveuser 327
 
3 liveuser 328
						#設置錯誤狀態
329
						$result["status"]="false";
330
 
331
						#設置錯誤提示
332
						$result["error"][]="要匯入的js檔案「".$checkMultiFileExist["varName"][0]."」不存在";
333
 
334
						#取得原生的錯誤訊息
335
						$result["error"][]=$checkMultiFileExist;
336
 
337
						#回傳結果
338
						return $result;
339
 
340
						}#if end
341
 
342
					#執行到這邊代表允許 server 端找不到 js 檔案
343
 
344
					#設置警告提示
345
					$result["warning"][]="要匯入的js檔案「".$checkMultiFileExist["varName"][0]."」不存在";
346
 
347
					}#if end
348
 
349
				#反之
350
				else{
351
 
352
					#設置有找到 js 檔案
353
					$result["founded"]="true";
354
 
355
					}#else end
356
 
357
				#設定要匯入的js函式庫
358
				$conf["jsPosition"]=" src=\"".$checkMultiFileExist["varNameWebPath"][0]."\" ";
359
 
360
				}#if end
361
 
362
			#反之
363
			else{
364
 
365
				#將$conf["jsPosition"]設爲空字串
366
				$conf["jsPosition"]="";
367
 
368
				}#else end
369
 
370
			}#if end
371
 
372
		#反之
373
		else{
374
 
375
			#將$conf["jsPosition"]設爲空字串
376
			$conf["jsPosition"]="";
377
 
378
			}#else end
379
 
380
		#debug
381
		#var_dump($result);
382
 
383
		#如果有是找到js檔案的識別
384
		if(isset($result["founded"])){
226 liveuser 385
 
3 liveuser 386
			#如果找不到js檔案,且沒有要求也要輸出匯入js的標籤
387
			if( $result["founded"]==="false" && $conf["importWhenExist"]==="true" ){
226 liveuser 388
 
3 liveuser 389
				#清空匯入js的標籤
390
				$conf["jsPosition"]="";
226 liveuser 391
 
3 liveuser 392
				}#if end
226 liveuser 393
 
3 liveuser 394
			}#if end
395
 
396
		#設置要回傳javascript語法
397
		$result["content"]="<script type=\"text/javascript\" ".$conf["jsPosition"]." >";
398
 
399
		#設置執行正常
400
		$result["status"]="true";
401
 
402
		#回傳結果
403
		return $result;
404
 
405
		}#function start end
406
 
407
	/*
408
	#函式說明:
409
	#script 語法結束
410
	#script 語法開始
411
	#回傳結果:
412
	#javaScript語法
413
	#必填參數:
414
	#無.
415
	#可省略參數:
416
	#無.
417
	#參考資料:
418
	#無.
419
	#備註:
420
	#無.
421
	*/
422
	public static function end(){
423
 
424
		return "</script>";
425
 
426
		}#function end
427
 
428
	/*
429
	#函式說明:
430
	#彈出視窗
431
	#回傳結果:
432
	#$result["status"],執行正確與否,"true"為執行正確,"false"為執行失敗.
433
	#$result["error"],錯誤訊息陣列.
434
	#$result["content"],JavaScript語法.
435
	#$result["function"],當前執行的函數名稱
436
	#必填參數:
437
	#$conf["alertSentence"],字串,爲要彈出式視窗的內容,"\\n"代表換行.
438
	$conf["alertSentence"]="";
439
	#可省略參數:
226 liveuser 440
	#無.
3 liveuser 441
	#參考資料:
442
	#無.
443
	#備註:
444
	#無.
445
	*/
446
	public static function alertWindow(&$conf){
447
 
448
		#初始化要回傳的內容
449
		$result=array();
450
 
451
		#當前執行的函數名稱
452
		$result["function"]=__FUNCTION__;
453
 
454
		#初始化要回傳的語法
455
		$result["content"]="";
456
 
457
		#如果 $conf 不為陣列
458
		if(gettype($conf)!="array"){
459
 
460
			#設置執行失敗
461
			$result["status"]="false";
462
 
463
			#設置執行錯誤訊息
464
			$result["error"][]="\$conf變數須為陣列形態";
465
 
466
			#如果傳入的參數為 null
467
			if($conf==null){
468
 
469
				#設置執行錯誤訊息
470
				$result["error"][]="\$conf變數不得為null,請檢查函數「".$result["function"]."」的參數設置有無正確!";
471
 
472
				}#if end
473
 
474
			#回傳結果
475
			return $result;
476
 
477
			}#if end
478
 
479
		#檢查參數
480
		#函式說明:
481
		#檢查必填與可省略的參數,可省略參數可指定預設要給與什麼數值內容。
482
		#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
483
		#$reuslt["error"],執行不正常結束的錯訊息陣列.
484
		#$result["function"],當前執行的函式名稱.
485
		#$result["passed"],識別要檢查的全體變數是否存在以及型態是否正確的變數,"true"代表檢查全部通過;"false"代表檢查不通過
486
		#$result[$shouldBtCheckedVarName]["varExist"],所檢查的變數是否存在,"false"代表不存在;"true"代表存在
487
		#$result[$shouldBtCheckedVarName]["varType"],所檢查的變數型態是否正確,"false"代表錯誤;"true"代表正確
488
		#$result[$shouldBtCheckedVarName]["error"],每個參數設定的錯誤訊息
489
		#$result["argu"],字串陣列,目前輸入的參數名稱陣列.
490
		#$result["legalVarName"],字串陣列,合法可用的參數名稱陣列.
491
		#$result["notNeedVar"],字串陣列,多餘的參數名稱.
492
		#必填參數:
493
		#$conf["variableCheck::checkArguments"]["varInput"],陣列變數,要檢查的陣列變數,請在要檢查的參數前面加上&,這樣變動的結果才能被套用。
494
		$conf["variableCheck::checkArguments"]["varInput"]=&$conf;
495
		#$conf["variableCheck::checkArguments"]["mustBeFilledVariableName"],爲必填參數的變數名稱陣列,形態爲陣列變數,例如: $conf["mustBeFilledVariableName"] = array("id","account","password");
496
		$conf["variableCheck::checkArguments"]["mustBeFilledVariableName"]=array("alertSentence");
497
		#$conf["variableCheck::checkArguments"]["mustBeFilledVariableType"],爲必填參數的變數陣列應該爲何種變數形態,形態爲陣列 例如: $conf["mustBeFilledVariableType"] = array("string",integer,"double");
498
		$conf["variableCheck::checkArguments"]["mustBeFilledVariableType"]=array("string");
499
		#$conf["variableCheck::checkArguments"]["referenceVarKey"],字串,$conf參數後面的key值,用於移除不要的參考陣列.
500
		$conf["variableCheck::checkArguments"]["referenceVarKey"]="variableCheck::checkArguments";
501
		#可以省略的參數:
502
		#$conf["variableCheck::checkArguments"]["canBeEmptyString"],必填變數內容如果是空字串就不能算是有設置的話,請設為"false",預設爲"true"。
503
		$conf["variableCheck::checkArguments"]["canBeEmptyString"]="false";
504
		#$conf["variableCheck::checkArguments"]["skipableVariableName"],爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableName"] = array("id","account","password");
505
		#$conf["variableCheck::checkArguments"]["skipableVariableName"]=array("closeWindow");
506
		#$conf["variableCheck::checkArguments"]["skipableVariableType"],爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableType"] = array("string",integer,"double");
507
		#$conf["variableCheck::checkArguments"]["skipableVariableType"]=array("string");
508
		#$conf["variableCheck::checkArguments"]["skipableVarDefaultValue"],字串陣列,每個不存在的可省略變數要初始化為什麼,null與代表不指定,若預設值是必填參數之一,請將$conf["mustBeFilledVar"]改成"\$conf["\mustBeFilledVar\"]".
509
		#$conf["variableCheck::checkArguments"]["skipableVarDefaultValue"]=array("false");
510
		#$conf["variableCheck::checkArguments"]["arrayCountEqualCheck"],字串陣列,為檢查哪些陣列參數的元素數量要一樣,$conf["arrayCountEqualCheck"][$i]=array()為第$i組key為哪些的變數其元素數量要相等.
511
		#$conf["variableCheck::checkArguments"]["arrayCountEqualCheck"][]=array();
512
		#參考資料來源:
513
		#array_keys=>http://php.net/manual/en/function.array-keys.php
514
		$checkResult=variableCheck::checkArguments($conf["variableCheck::checkArguments"]);
515
		unset($conf["variableCheck::checkArguments"]);
516
 
517
		#debug
518
		#var_dump($checkResult);
519
		#exit;
520
 
521
		#如果檢查失敗
522
		if($checkResult["status"]=="false"){
523
 
524
			#設置錯誤狀態
525
			$result["status"]="false";
526
 
527
			#設置錯誤提示
528
			$result["error"]=$checkResult;
529
 
530
			#回傳結果
531
			return $result;
532
 
533
			}#if end
534
 
535
		#如果檢查不通過
536
		if($checkResult["passed"]=="false"){
537
 
538
			#設置錯誤狀態
539
			$result["status"]="false";
540
 
541
			#設置錯誤提示
542
			$result["error"]=$checkResult;
543
 
544
			#回傳結果
545
			return $result;
546
 
547
			}#if end
548
 
549
		#如果 $conf["alertSentence"] 不存在的話"
550
		if(!isset($conf["alertSentence"])){
551
 
552
			#設置錯誤識別
553
			$result["status"]="false";
554
 
555
			#設置錯誤訊息
556
			$result["error"][]="\$conf[\"alertSentence\"]參數未設定";
557
 
558
			#回傳結果
559
			return $result;
560
 
561
			}#if end
562
 
563
		#初始化要回傳的語法
564
		$result["content"]="";
565
 
566
		#函式說明:
567
		#script 語法開始
568
		#回傳結果:
569
		#javaScript語法
570
		#必填參數:
571
		$conf["javaScript"]["start"]["include"]="false";#是否要匯入外部js庫。"true"爲要匯入;"false"爲沒有要匯入。
572
		#可省略參數:
573
		#$conf["jsPosition"]="";#要匯入的js檔案位置。
574
		$javaScriptStart=javaScript::start($conf["javaScript"]["start"]);
575
		unset($conf["javaScript"]["start"]);
576
 
577
		#如果 js 語法開始失敗
578
		if($javaScriptStart["status"]=="false"){
579
 
580
			#設置錯誤識別
581
			$result["status"]="false";
582
 
583
			#設置錯誤訊息
584
			$result["error"]=$javaScriptStart;
585
 
586
			#回傳結果
587
			return $result;
588
 
589
			}#if end
590
 
591
		#串接js開始的語法
592
		$result["content"]=$result["content"].$javaScriptStart["content"];
593
 
594
		#增加出現警示視窗的語法
595
		$result["content"]=$result["content"]."alert('".$conf["alertSentence"]."');";
596
 
597
		#javaScript結束
598
		$result["content"]=$result["content"].javaScript::end();
599
 
600
		#執行到這邊代表執行成功
601
 
602
		#設置執行正常
603
		$result["status"]="true";
604
 
605
		#回傳結果
606
		return $result;
607
 
608
		}#function alertWindos end
609
 
610
	/*
611
	#函式說明:
612
	#若存在sessions變數則將其內容用彈出式視窗呈現,並移除session的內容.
613
	#回傳結果:
614
	#$result["status"],執行正確與否,"true"為執行正確,"false"為執行失敗.
615
	#$result["error"],錯誤訊息陣列.
616
	#$result["content"],彈出視窗的語法.
617
	#$result["function"],函式名稱.
618
	#必填參數:
619
	#$conf["sessionName"],字串,session變數的key名稱.
620
	$conf["sessionName"]="";
621
	#可省略參數:
622
	#無.
623
	#參考資料:
624
	#無.
625
	#備註:
626
	#無.
627
	*/
628
	public static function alertWindowFromSession($conf){
629
 
630
		#初始化要回傳的內容
631
		$result=array();
632
 
633
		#當前執行的函數名稱
634
		$result["function"]=__FUNCTION__;
635
 
636
		#初始化要回傳的語法
637
		$result["content"]="";
638
 
639
		#如果 $conf 不為陣列
640
		if(gettype($conf)!="array"){
641
 
642
			#設置執行失敗
643
			$result["status"]="false";
644
 
645
			#設置執行錯誤訊息
646
			$result["error"][]="\$conf變數須為陣列形態";
647
 
648
			#如果傳入的參數為 null
649
			if($conf==null){
650
 
651
				#設置執行錯誤訊息
652
				$result["error"][]="\$conf變數不得為null,請檢查函數「".$result["function"]."」的參數設置有無正確!";
653
 
654
				}#if end
655
 
656
			#回傳結果
657
			return $result;
658
 
659
			}#if end
660
 
661
		#檢查參數
662
		#函式說明:
663
		#檢查必填與可省略的參數,可省略參數可指定預設要給與什麼數值內容。
664
		#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
665
		#$reuslt["error"],執行不正常結束的錯訊息陣列.
666
		#$result["function"],當前執行的函式名稱.
667
		#$result["passed"],識別要檢查的全體變數是否存在以及型態是否正確的變數,"true"代表檢查全部通過;"false"代表檢查不通過
668
		#$result[$shouldBtCheckedVarName]["varExist"],所檢查的變數是否存在,"false"代表不存在;"true"代表存在
669
		#$result[$shouldBtCheckedVarName]["varType"],所檢查的變數型態是否正確,"false"代表錯誤;"true"代表正確
670
		#$result[$shouldBtCheckedVarName]["error"],每個參數設定的錯誤訊息
671
		#$result["argu"],字串陣列,目前輸入的參數名稱陣列.
672
		#$result["legalVarName"],字串陣列,合法可用的參數名稱陣列.
673
		#$result["notNeedVar"],字串陣列,多餘的參數名稱.
674
		#必填參數:
675
		#$conf["variableCheck::checkArguments"]["varInput"],陣列變數,要檢查的陣列變數,請在要檢查的參數前面加上&,這樣變動的結果才能被套用。
676
		$conf["variableCheck::checkArguments"]["varInput"]=&$conf;
677
		#$conf["variableCheck::checkArguments"]["mustBeFilledVariableName"],爲必填參數的變數名稱陣列,形態爲陣列變數,例如: $conf["mustBeFilledVariableName"] = array("id","account","password");
678
		$conf["variableCheck::checkArguments"]["mustBeFilledVariableName"]=array("sessionName");
679
		#$conf["variableCheck::checkArguments"]["mustBeFilledVariableType"],爲必填參數的變數陣列應該爲何種變數形態,形態爲陣列 例如: $conf["mustBeFilledVariableType"] = array("string",integer,"double");
680
		$conf["variableCheck::checkArguments"]["mustBeFilledVariableType"]=array("string");
681
		#$conf["variableCheck::checkArguments"]["referenceVarKey"],字串,$conf參數後面的key值,用於移除不要的參考陣列.
682
		$conf["variableCheck::checkArguments"]["referenceVarKey"]="variableCheck::checkArguments";
683
		#可以省略的參數:
684
		#$conf["variableCheck::checkArguments"]["canBeEmptyString"],必填變數內容如果是空字串就不能算是有設置的話,請設為"false",預設爲"true"。
685
		$conf["variableCheck::checkArguments"]["canBeEmptyString"]="false";
686
		#$conf["variableCheck::checkArguments"]["skipableVariableName"],爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableName"] = array("id","account","password");
687
		#$conf["variableCheck::checkArguments"]["skipableVariableName"]=array("closeWindow");
688
		#$conf["variableCheck::checkArguments"]["skipableVariableType"],爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableType"] = array("string",integer,"double");
689
		#$conf["variableCheck::checkArguments"]["skipableVariableType"]=array("string");
690
		#$conf["variableCheck::checkArguments"]["skipableVarDefaultValue"],字串陣列,每個不存在的可省略變數要初始化為什麼,null與代表不指定,若預設值是必填參數之一,請將$conf["mustBeFilledVar"]改成"\$conf["\mustBeFilledVar\"]".
691
		#$conf["variableCheck::checkArguments"]["skipableVarDefaultValue"]=array("false");
692
		#$conf["variableCheck::checkArguments"]["arrayCountEqualCheck"],字串陣列,為檢查哪些陣列參數的元素數量要一樣,$conf["arrayCountEqualCheck"][$i]=array()為第$i組key為哪些的變數其元素數量要相等.
693
		#$conf["variableCheck::checkArguments"]["arrayCountEqualCheck"][]=array();
694
		#參考資料來源:
695
		#array_keys=>http://php.net/manual/en/function.array-keys.php
696
		$checkResult=variableCheck::checkArguments($conf["variableCheck::checkArguments"]);
697
		unset($conf["variableCheck::checkArguments"]);
698
 
699
		#debug
700
		#var_dump($checkResult);
701
		#exit;
702
 
703
		#如果檢查失敗
704
		if($checkResult["status"]=="false"){
705
 
706
			#設置錯誤狀態
707
			$result["status"]="false";
708
 
709
			#設置錯誤提示
710
			$result["error"]=$checkResult;
711
 
712
			#回傳結果
713
			return $result;
714
 
715
			}#if end
716
 
717
		#如果檢查不通過
718
		if($checkResult["passed"]=="false"){
719
 
720
			#設置錯誤狀態
721
			$result["status"]="false";
722
 
723
			#設置錯誤提示
724
			$result["error"]=$checkResult;
725
 
726
			#回傳結果
727
			return $result;
728
 
729
			}#if end
730
 
731
		#函式說明:
732
		#取得session變數裡面的數值,然後卸除該session變數
733
		#回傳結果:
734
		#$result["status"],執行是否正常,"true"代表正常,"false"代表有誤.
735
		#$result["error"],錯誤訊息
736
		#$result["warning"],警告訊息
737
		#$result["founded"],是否找到session變數,"true"代表找到,"false"代表沒找到.
738
		#$result["content"],取得的變數內容
739
		#必填參數:
740
		$conf["session"]["getSessionValue"]["sessionVarName"]=$conf["sessionName"];#要取得內容的session變數
741
		#可省略參數:
742
		$conf["session"]["getSessionValue"]["unsetSessionVar"]="true";#"true"代表要卸除session變數
743
		#參考資料:
744
		#http://stackoverflow.com/questions/8971261/php-5-4-call-time-pass-by-reference-easy-fix-available
745
		#可變變數->http://emn178.pixnet.net/blog/post/80119035-php%E6%95%99%E5%AD%B8---%E8%AE%8A%E6%95%B8%28variables%29
746
		#卸除參考的原始變數->http://stackoverflow.com/questions/6654538/php-function-to-unset-variables-passed-by-reference
747
		$getSessionValue=session::getSessionValue($conf["session"]["getSessionValue"]);
748
		unset($conf["session"]["getSessionValue"]);
749
 
750
		#如果 $getSessionValue["status"] 等於 "false"
751
		if($getSessionValue["status"]=="false"){
752
 
753
			#設置錯誤識別
754
			$result["status"]="false";
755
 
756
			#設置錯誤訊息
757
			$result["error"]=$getSessionValue;
758
 
759
			#回傳結果
760
			return $result;
761
 
762
			}#if end
763
 
764
		#如果找不到session變數
765
		if($getSessionValue["founded"]=="false"){
766
 
767
			#設置語法為空
768
			$result["content"]="";
769
 
770
			#設置警告訊息
771
			$result["warning"][]="名為「".$conf["sessionName"]."」的session變數不存在";
772
 
773
			#設置執行正常
774
			$result["status"]="true";
775
 
776
			#回傳結果
777
			return $result;
778
 
779
			}#if end
780
 
781
		#取得session變數的內容
782
		$msg=$getSessionValue["content"];
783
 
784
		#函式說明:
785
		#彈出視窗
786
		#回傳結果:
787
		#$result["status"],執行正確與否,"true"為執行正確,"false"為執行失敗.
788
		#$result["error"],錯誤訊息陣列.
789
		#$result["content"],avaScript語法.
790
		#必填的參數
791
		$conf["javaScript"]["alertWindow"]["alertSentence"]=$msg;#爲要彈出式視窗的內容。
792
		$js=javaScript::alertWindow($conf["javaScript"]["alertWindow"]);
793
		unset($conf["javaScript"]["alertWindow"]);
794
 
795
		#如果 $js["status"] 等於 "false"
796
		if($js["status"]=="false"){
797
 
798
			#設置錯誤識別
799
			$result["status"]="false";
800
 
801
			#設置錯誤訊息
802
			$result["error"]=$js;
803
 
804
			#回傳結果
805
			return $result;
806
 
807
			}#if end
808
 
809
		#取得彈出視窗的語法
810
		$result["content"]=$js["content"];
811
 
812
		#設置錯誤識別
813
		$result["status"]="true";
814
 
815
		#回傳結果
816
		return $result;
817
 
818
		}#function alertWindowFromSession end
819
 
820
	/*
821
	#函式說明:
822
	#根據sesssion變數的內容來彈出視窗來進行提示
823
	#回傳內容:
824
	#$result["status"],執行是否正常,"true"代表執行正常,"false"代表執行失敗.
825
	#$result["error"],錯誤訊息陣列.
826
	#$result["content"],javaScript語法,當session變數無法取得時,將會回傳"".
827
	#$result["function"],當前執行的函數名稱
828
	#必填參數:
829
	$conf["sessionName"]="";#要取得的session變數名稱.
830
	#可省略參數:
831
	#$conf["altMethod"]="true";#爲當彈出式視窗無法使用時,可以改用的臨時處理辦法。若爲"true",則代表要採用臨時的應變措施,預設為"false".
832
	#參考資料:
833
	#無.
834
	#備註:
835
	#功能需要確認
836
	*/
837
	public static function alertSessionVarWindows(&$conf){
838
 
839
		#初始化要回傳的內容
840
		$result=array();
841
 
842
		#當前執行的函數名稱
843
		$result["function"]=__FUNCTION__;
844
 
845
		#初始化要回傳的語法
846
		$result["content"]="";
847
 
848
		#如果 $conf 不為陣列
849
		if(gettype($conf)!="array"){
850
 
851
			#設置執行失敗
852
			$result["status"]="false";
853
 
854
			#設置執行錯誤訊息
855
			$result["error"][]="\$conf變數須為陣列形態";
856
 
857
			#如果傳入的參數為 null
858
			if($conf==null){
859
 
860
				#設置執行錯誤訊息
861
				$result["error"][]="\$conf變數不得為null,請檢查函數「".$result["function"]."」的參數設置有無正確!";
862
 
863
				}#if end
864
 
865
			#回傳結果
866
			return $result;
867
 
868
			}#if end
869
 
870
		#檢查參數
871
		#函式說明:
872
		#檢查必填與可省略的參數,可省略參數可指定預設要給與什麼數值內容。
873
		#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
874
		#$reuslt["error"],執行不正常結束的錯訊息陣列.
875
		#$result["function"],當前執行的函式名稱.
876
		#$result["passed"],識別要檢查的全體變數是否存在以及型態是否正確的變數,"true"代表檢查全部通過;"false"代表檢查不通過
877
		#$result[$shouldBtCheckedVarName]["varExist"],所檢查的變數是否存在,"false"代表不存在;"true"代表存在
878
		#$result[$shouldBtCheckedVarName]["varType"],所檢查的變數型態是否正確,"false"代表錯誤;"true"代表正確
879
		#$result[$shouldBtCheckedVarName]["error"],每個參數設定的錯誤訊息
880
		#$result["argu"],字串陣列,目前輸入的參數名稱陣列.
881
		#$result["legalVarName"],字串陣列,合法可用的參數名稱陣列.
882
		#$result["notNeedVar"],字串陣列,多餘的參數名稱.
883
		#必填參數:
884
		#$conf["variableCheck::checkArguments"]["varInput"],陣列變數,要檢查的陣列變數,請在要檢查的參數前面加上&,這樣變動的結果才能被套用。
885
		$conf["variableCheck::checkArguments"]["varInput"]=&$conf;
886
		#$conf["variableCheck::checkArguments"]["mustBeFilledVariableName"],爲必填參數的變數名稱陣列,形態爲陣列變數,例如: $conf["mustBeFilledVariableName"] = array("id","account","password");
887
		$conf["variableCheck::checkArguments"]["mustBeFilledVariableName"]=array("sessionName");
888
		#$conf["variableCheck::checkArguments"]["mustBeFilledVariableType"],爲必填參數的變數陣列應該爲何種變數形態,形態爲陣列 例如: $conf["mustBeFilledVariableType"] = array("string",integer,"double");
889
		$conf["variableCheck::checkArguments"]["mustBeFilledVariableType"]=array("string");
890
		#$conf["variableCheck::checkArguments"]["referenceVarKey"],字串,$conf參數後面的key值,用於移除不要的參考陣列.
891
		$conf["variableCheck::checkArguments"]["referenceVarKey"]="variableCheck::checkArguments";
892
		#可以省略的參數:
893
		#$conf["variableCheck::checkArguments"]["canBeEmptyString"],必填變數內容如果是空字串就不能算是有設置的話,請設為"false",預設爲"true"。
894
		$conf["variableCheck::checkArguments"]["canBeEmptyString"]="false";
895
		#$conf["variableCheck::checkArguments"]["skipableVariableName"],爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableName"] = array("id","account","password");
896
		$conf["variableCheck::checkArguments"]["skipableVariableName"]=array("altMethod");
897
		#$conf["variableCheck::checkArguments"]["skipableVariableType"],爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableType"] = array("string",integer,"double");
898
		$conf["variableCheck::checkArguments"]["skipableVariableType"]=array("string");
899
		#$conf["variableCheck::checkArguments"]["skipableVarDefaultValue"],字串陣列,每個不存在的可省略變數要初始化為什麼,null與代表不指定,若預設值是必填參數之一,請將$conf["mustBeFilledVar"]改成"\$conf["\mustBeFilledVar\"]".
900
		$conf["variableCheck::checkArguments"]["skipableVarDefaultValue"]=array("false");
901
		#$conf["variableCheck::checkArguments"]["arrayCountEqualCheck"],字串陣列,為檢查哪些陣列參數的元素數量要一樣,$conf["arrayCountEqualCheck"][$i]=array()為第$i組key為哪些的變數其元素數量要相等.
902
		#$conf["variableCheck::checkArguments"]["arrayCountEqualCheck"][]=array();
903
		#參考資料來源:
904
		#array_keys=>http://php.net/manual/en/function.array-keys.php
905
		$checkResult=variableCheck::checkArguments($conf["variableCheck::checkArguments"]);
906
		unset($conf["variableCheck::checkArguments"]);
907
 
908
		#如果檢查失敗
909
		if($checkResult["status"]=="false"){
910
 
911
			#設置錯誤狀態
912
			$result["status"]="false";
913
 
914
			#設置錯誤提示
915
			$result["error"]=$checkResult;
916
 
917
			#回傳結果
918
			return $result;
919
 
920
			}#if end
921
 
922
		#如果檢查不通過
923
		if($checkResult["passed"]=="false"){
924
 
925
			#設置錯誤狀態
926
			$result["status"]="false";
927
 
928
			#設置錯誤提示
929
			$result["error"]=$checkResult;
930
 
931
			#回傳結果
932
			return $result;
933
 
934
			}#if end
935
 
936
		#函式說明:
937
		#取得session變數裡面的數值,然後卸除該session變數
938
		#回傳結果:
939
		#$result,取得的變數內容
940
		#必填參數:
941
		$conf["session"]["getSessionValue"]["sessionVarName"]=$conf["sessionName"];#要取得內容的session變數
942
		#可省略參數:
943
		$conf["session"]["getSessionValue"]["unsetSessionVar"]="true";#"true"代表要卸除session變數
944
		#參考資料:
945
		#http://stackoverflow.com/questions/8971261/php-5-4-call-time-pass-by-reference-easy-fix-available
946
		#可變變數->http://emn178.pixnet.net/blog/post/80119035-php%E6%95%99%E5%AD%B8---%E8%AE%8A%E6%95%B8%28variables%29
947
		#卸除參考的原始變數->http://stackoverflow.com/questions/6654538/php-function-to-unset-variables-passed-by-reference
948
		$assignSessionValueToVar=session::getSessionValue($conf["session"]["getSessionValue"]);
949
		unset($conf["session"]["getSessionValue"]);
950
 
951
		#如果 $assignSessionValueToVar["status"] 等於 "false"
952
		if($assignSessionValueToVar["status"]=="false"){
953
 
954
			#設置執行錯誤識別
955
			$result["status"]="false";
956
 
957
			#設置錯誤訊息
958
			$result["error"]=$assignSessionValueToVar;
959
 
960
			#回傳結果
961
			return $result;
962
 
963
			}#if end
964
 
965
		#如果 $assignSessionValueToVar["founded"] 等於 "false"
966
		if($assignSessionValueToVar["founded"]=="false"){
967
 
968
			#設置語法內容
969
			$result["content"]="";
970
 
971
			#執行到這邊代表執行成功,設置執行成功識別
972
			$result["status"]="true";
973
 
974
			#回傳結果
975
			return $result;
976
 
977
			}#if end
978
 
979
		#若 $conf["altMethod"] 爲 "true"
980
		if($conf["altMethod"]=="true"){
981
 
982
			#用應變措施來印出提示文字。
983
			$result["content"]="<center><p><font color=red><strong><b>".$assignSessionValueToVar["content"]."</strong></b></font><p></center>";
984
 
985
			#設置執行成功
986
			$result["status"]="true";
987
 
988
			#回傳結果
989
			return $result;
990
 
991
			}#if end
992
 
993
		#函式說明:
994
		#彈出視窗
995
		#回傳結果:
996
		#$result["status"],執行正確與否,"true"為執行正確,"false"為執行失敗.
997
		#$result["error"],錯誤訊息陣列.
998
		#$result["content"],avaScript語法.
999
		#必填的參數
1000
		$conf["javaScript"]["alertWindow"]["alertSentence"]=$assignSessionValueToVar["content"];#爲要彈出式視窗的內容。
1001
		$javaScript["alertWindow"]=javaScript::alertWindow($conf["javaScript"]["alertWindow"]);
1002
		unset($conf["javaScript"]["alertWindow"]);
1003
 
1004
		#如果 $javaScript["alertWindow"]["status"] 等於 "false"
1005
		if($javaScript["alertWindow"]["status"]=="false"){
1006
 
1007
			#設置執行錯誤識別
1008
			$result["status"]="false";
1009
 
1010
			#設置錯誤訊息
1011
			$result["error"]=$javaScript["alertWindow"];
1012
 
1013
			#回傳結果
1014
			return $result;
1015
 
1016
			}#if end
1017
 
1018
		#設置語法內容
1019
		$result["content"]=$javaScript["alertWindow"]["content"];
1020
 
1021
		#執行到這邊代表執行成功,設置執行成功識別
1022
		$result["status"]="true";
1023
 
1024
		#回傳結果
1025
		return $result;
1026
 
1027
		}#alertSessionVarWindows end
1028
 
1029
	/*
1030
	#函式說明:
1031
	#改變背景顏色
1032
	#回傳結果:
1033
	#$result["status"],執行正確與否,"true"為執行正確,"false"為執行失敗.
1034
	#$result["error"],錯誤訊息陣列.
1035
	#$result["content"],彈出視窗的語法.
1036
	#$result["function"],函式名稱.
1037
	#必填參數:
1038
	#$conf["color"],字串,爲要改變成什麼顏色,ex 'pink' 'blue' 'green' 'white' 'black' 'red' 'orange'
1039
	$conf["color"]="";
1040
	#可省略參數:
1041
	#無.
1042
	#參考資料:
1043
	#無.
1044
	#備註:
1045
	#無.
1046
	*/
1047
	public static function changeBackgroundColor($conf){
1048
 
1049
		#初始化要回傳的內容
1050
		$result=array();
1051
 
1052
		#當前執行的函數名稱
1053
		$result["function"]=__FUNCTION__;
1054
 
1055
		#初始化要回傳的語法
1056
		$result["content"]="";
1057
 
1058
		#如果 $conf 不為陣列
1059
		if(gettype($conf)!="array"){
1060
 
1061
			#設置執行失敗
1062
			$result["status"]="false";
1063
 
1064
			#設置執行錯誤訊息
1065
			$result["error"][]="\$conf變數須為陣列形態";
1066
 
1067
			#如果傳入的參數為 null
1068
			if($conf==null){
1069
 
1070
				#設置執行錯誤訊息
1071
				$result["error"][]="\$conf變數不得為null,請檢查函數「".$result["function"]."」的參數設置有無正確!";
1072
 
1073
				}#if end
1074
 
1075
			#回傳結果
1076
			return $result;
1077
 
1078
			}#if end
1079
 
1080
		#檢查參數
1081
		#函式說明:
1082
		#檢查必填與可省略的參數,可省略參數可指定預設要給與什麼數值內容。
1083
		#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
1084
		#$reuslt["error"],執行不正常結束的錯訊息陣列.
1085
		#$result["function"],當前執行的函式名稱.
1086
		#$result["passed"],識別要檢查的全體變數是否存在以及型態是否正確的變數,"true"代表檢查全部通過;"false"代表檢查不通過
1087
		#$result[$shouldBtCheckedVarName]["varExist"],所檢查的變數是否存在,"false"代表不存在;"true"代表存在
1088
		#$result[$shouldBtCheckedVarName]["varType"],所檢查的變數型態是否正確,"false"代表錯誤;"true"代表正確
1089
		#$result[$shouldBtCheckedVarName]["error"],每個參數設定的錯誤訊息
1090
		#$result["argu"],字串陣列,目前輸入的參數名稱陣列.
1091
		#$result["legalVarName"],字串陣列,合法可用的參數名稱陣列.
1092
		#$result["notNeedVar"],字串陣列,多餘的參數名稱.
1093
		#必填參數:
1094
		#$conf["variableCheck::checkArguments"]["varInput"],陣列變數,要檢查的陣列變數,請在要檢查的參數前面加上&,這樣變動的結果才能被套用。
1095
		$conf["variableCheck::checkArguments"]["varInput"]=&$conf;
1096
		#$conf["variableCheck::checkArguments"]["mustBeFilledVariableName"],爲必填參數的變數名稱陣列,形態爲陣列變數,例如: $conf["mustBeFilledVariableName"] = array("id","account","password");
1097
		$conf["variableCheck::checkArguments"]["mustBeFilledVariableName"]=array("color");
1098
		#$conf["variableCheck::checkArguments"]["mustBeFilledVariableType"],爲必填參數的變數陣列應該爲何種變數形態,形態爲陣列 例如: $conf["mustBeFilledVariableType"] = array("string",integer,"double");
1099
		$conf["variableCheck::checkArguments"]["mustBeFilledVariableType"]=array("string");
1100
		#$conf["variableCheck::checkArguments"]["referenceVarKey"],字串,$conf參數後面的key值,用於移除不要的參考陣列.
1101
		$conf["variableCheck::checkArguments"]["referenceVarKey"]="variableCheck::checkArguments";
1102
		#可以省略的參數:
1103
		#$conf["variableCheck::checkArguments"]["canBeEmptyString"],必填變數內容如果是空字串就不能算是有設置的話,請設為"false",預設爲"true"。
1104
		$conf["variableCheck::checkArguments"]["canBeEmptyString"]="false";
1105
		#$conf["variableCheck::checkArguments"]["skipableVariableName"],爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableName"] = array("id","account","password");
1106
		#$conf["variableCheck::checkArguments"]["skipableVariableName"]=array("closeWindow");
1107
		#$conf["variableCheck::checkArguments"]["skipableVariableType"],爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableType"] = array("string",integer,"double");
1108
		#$conf["variableCheck::checkArguments"]["skipableVariableType"]=array("string");
1109
		#$conf["variableCheck::checkArguments"]["skipableVarDefaultValue"],字串陣列,每個不存在的可省略變數要初始化為什麼,null與代表不指定,若預設值是必填參數之一,請將$conf["mustBeFilledVar"]改成"\$conf["\mustBeFilledVar\"]".
1110
		#$conf["variableCheck::checkArguments"]["skipableVarDefaultValue"]=array("false");
1111
		#$conf["variableCheck::checkArguments"]["arrayCountEqualCheck"],字串陣列,為檢查哪些陣列參數的元素數量要一樣,$conf["arrayCountEqualCheck"][$i]=array()為第$i組key為哪些的變數其元素數量要相等.
1112
		#$conf["variableCheck::checkArguments"]["arrayCountEqualCheck"][]=array();
1113
		#參考資料來源:
1114
		#array_keys=>http://php.net/manual/en/function.array-keys.php
1115
		$checkResult=variableCheck::checkArguments($conf["variableCheck::checkArguments"]);
1116
		unset($conf["variableCheck::checkArguments"]);
1117
 
1118
		#如果檢查失敗
1119
		if($checkResult["status"]=="false"){
1120
 
1121
			#設置錯誤狀態
1122
			$result["status"]="false";
1123
 
1124
			#設置錯誤提示
1125
			$result["error"]=$checkResult;
1126
 
1127
			#回傳結果
1128
			return $result;
1129
 
1130
			}#if end
1131
 
1132
		#如果檢查不通過
1133
		if($checkResult["passed"]=="false"){
1134
 
1135
			#設置錯誤狀態
1136
			$result["status"]="false";
1137
 
1138
			#設置錯誤提示
1139
			$result["error"]=$checkResult;
1140
 
1141
			#回傳結果
1142
			return $result;
1143
 
1144
			}#if end
1145
 
1146
		#設定背景顏色
1147
		$script="document.bgColor='".$conf["color"]."'";
1148
 
1149
		#函式說明:
1150
		#將要執行的script語法透過該函式執行(會在程式外層用<script></script>包起來).
1151
		#回傳結果:
1152
		#$result["status"],執行是否正常,"true"為正常,"false"為不正常.
1153
		#$result["error"],錯誤訊息陣列
1154
		#$result["function"],當前執行的函數名稱
1155
		#$result["content"],要執行的javaScript語法
1156
		#必填參數:
1157
		#$conf["script"],字串,要執行的javaScript語法.
1158
		$conf["javaScript::toScript"]["script"]=$script;
1159
		#可省略參數:
1160
		#$conf["onReady"],字串,是否要在網頁載入完再執行,"false"為不等載入完就先執行,預設為"true"要等載入完再執行.
1161
		#$conf["onReady"]="true";
1162
		#$conf["jsFunciton"],字串陣列,為要放入<script>標籤的js函數.
1163
		#$conf["jsFunciton"]=array();
1164
		#參考資料:
1165
		#http://stackoverflow.com/questions/9899372/pure-javascript-equivalent-to-jquerys-ready-how-to-call-a-function-when-the
1166
		$toScript=javaScript::toScript($conf["javaScript::toScript"]);
1167
		unset($conf["javaScript::toScript"]);
1168
 
1169
		#如果建立script語法失敗
1170
		if($toScript["status"]==="false"){
1171
 
1172
			#設置錯誤狀態
1173
			$result["status"]="false";
1174
 
1175
			#設置錯誤提示
1176
			$result["error"]=$toScript;
1177
 
1178
			#回傳結果
1179
			return $result;
1180
 
1181
			}#if end
1182
 
1183
		#取得js語法
1184
		$result["content"]=$toScript["content"];
1185
 
1186
		#設置執行成功識別
1187
		$result["status"]="true";
1188
 
1189
		#回傳結果
1190
		return $result;
1191
 
1192
		}#function changeBackgroundColor end
1193
 
1194
	/*
1195
	#函式說明:
1196
	#建立透過javaScript傳送post數值到特定頁面,並且取得頁面的回應,將之結果放置在特定的區塊裏面的js函式.
1197
	#回傳結果:
1198
	#$result["status"],執行正確與否,"true"代表執行正確,"false"代表執行失敗.
1199
	#$result["error"],錯誤訊息陣列.
1200
	#$result["content"],JavaScript的語法
1201
	#$result["function"],當前執行的函數名稱
1202
	#必填參數:
1203
	#$conf["receivePage"],字串,要接收數值的頁面.
1204
	$conf["receivePage"]="";
1205
	#$conf["jsFunctionName"],字串,ajax裏面的js涵式名稱.
1206
	$conf["jsFunctionName"]="";
1207
	#可省略參數:
1208
	#$conf["scriptTag"],是否要用<script></script>包住,預設為"false",不包住;"true"為包住.
1209
	#$conf["scriptTag"]="false";
1210
	#$conf["varNameArray"],字串陣列,要傳送的數值名稱,預設為array("is_ajax").
1211
	#$conf["varNameArray"]=array("is_ajax");
1212
	#$conf["varValueArray"],陣列,要傳送的數值內容,預設為array("true");
1213
	#$conf["varValueArray"]=array("true");
1214
	#$conf["jsVarNameArray"],字串陣列,要傳送的js數值名稱.
1215
	$conf["jsVarNameArray"]=array("");
1216
	#$conf["jsVarValueArray"],陣列,要傳送的js數值內容.
1217
	$conf["jsVarValueArray"]=array("");
1218
	#$conf["responsePalaceId"],字串,回傳的內容要呈現於哪個<span id = ? ></span>、<div id= ? ></div>區塊之間。
1219
	#$conf["responsePalaceId"]="";
1220
	#$conf["condition"],字串,立即執行ajax的條件.
1221
	#$conf["condition"]="";
1222
	#$conf["conditionComment"],字串,立即執行ajax的條件註解,預設為$conf["condition"].
1223
	#$conf["conditionComment"]="";
1224
	#$conf["sendNow"],字串,是否要在document.ready後馬上執行ajax,預設為"false",代表不要,"true"代表要.
1225
	#$conf["sendNow"]="false";
1226
	#$conf["redir_url"],字串,是否要在要求成功後進行轉址的動作,轉址到$conf["redir_url"],若存在$conf["successAction"],則以$conf["successAction"]為主.
1227
	#$conf["redir_url"]="";
1228
	#$conf["successAction"],字串,ajax要求成功後做的事情.
1229
	#$conf["successAction"]="";
1230
	#參考資料:
1231
	#http://www.w3school.com.cn/php/php_ajax_suggest.asp
1232
	#建議允許不傳送任何get參數.
1233
	#備註:
1234
	#無.
1235
	*/
1236
	public static function ajaxSendPostValue($conf){
1237
 
1238
		#初始化要回傳的內容
1239
		$result=array();
1240
 
1241
		#當前執行的函數名稱
1242
		$result["function"]=__FUNCTION__;
1243
 
1244
		#初始化要回傳的語法
1245
		$result["content"]="";
1246
 
1247
		#如果 $conf 不為陣列
1248
		if(gettype($conf)!="array"){
1249
 
1250
			#設置執行失敗
1251
			$result["status"]="false";
1252
 
1253
			#設置執行錯誤訊息
1254
			$result["error"][]="\$conf變數須為陣列形態";
1255
 
1256
			#如果傳入的參數為 null
1257
			if($conf==null){
1258
 
1259
				#設置執行錯誤訊息
1260
				$result["error"][]="\$conf變數不得為null,請檢查函數「".$result["function"]."」的參數設置有無正確!";
1261
 
1262
				}#if end
1263
 
1264
			#回傳結果
1265
			return $result;
1266
 
1267
			}#if end
1268
 
1269
		#檢查參數
1270
		#函式說明:
1271
		#檢查必填與可省略的參數,可省略參數可指定預設要給與什麼數值內容。
1272
		#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
1273
		#$reuslt["error"],執行不正常結束的錯訊息陣列.
1274
		#$result["function"],當前執行的函式名稱.
1275
		#$result["passed"],識別要檢查的全體變數是否存在以及型態是否正確的變數,"true"代表檢查全部通過;"false"代表檢查不通過
1276
		#$result[$shouldBtCheckedVarName]["varExist"],所檢查的變數是否存在,"false"代表不存在;"true"代表存在
1277
		#$result[$shouldBtCheckedVarName]["varType"],所檢查的變數型態是否正確,"false"代表錯誤;"true"代表正確
1278
		#$result[$shouldBtCheckedVarName]["error"],每個參數設定的錯誤訊息
1279
		#$result["argu"],字串陣列,目前輸入的參數名稱陣列.
1280
		#$result["legalVarName"],字串陣列,合法可用的參數名稱陣列.
1281
		#$result["notNeedVar"],字串陣列,多餘的參數名稱.
1282
		#必填參數:
1283
		#$conf["variableCheck::checkArguments"]["varInput"],陣列變數,要檢查的陣列變數,請在要檢查的參數前面加上&,這樣變動的結果才能被套用。
1284
		$conf["variableCheck::checkArguments"]["varInput"]=&$conf;
1285
		#$conf["variableCheck::checkArguments"]["mustBeFilledVariableName"],爲必填參數的變數名稱陣列,形態爲陣列變數,例如: $conf["mustBeFilledVariableName"] = array("id","account","password");
1286
		$conf["variableCheck::checkArguments"]["mustBeFilledVariableName"]=array("receivePage","jsFunctionName");
1287
		#$conf["variableCheck::checkArguments"]["mustBeFilledVariableType"],爲必填參數的變數陣列應該爲何種變數形態,形態爲陣列 例如: $conf["mustBeFilledVariableType"] = array("string",integer,"double");
1288
		$conf["variableCheck::checkArguments"]["mustBeFilledVariableType"]=array("string","string");
1289
		#$conf["variableCheck::checkArguments"]["referenceVarKey"],字串,$conf參數後面的key值,用於移除不要的參考陣列.
1290
		$conf["variableCheck::checkArguments"]["referenceVarKey"]="variableCheck::checkArguments";
1291
		#可以省略的參數:
1292
		#$conf["variableCheck::checkArguments"]["canBeEmptyString"],必填變數內容如果是空字串就不能算是有設置的話,請設為"false",預設爲"true"。
1293
		$conf["variableCheck::checkArguments"]["canBeEmptyString"]="false";
1294
		#$conf["variableCheck::checkArguments"]["skipableVariableName"],爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableName"] = array("id","account","password");
1295
		$conf["variableCheck::checkArguments"]["skipableVariableName"]=array("scriptTag","responsePalaceId","sendNow","varNameArray","varValueArray","jsVarNameArray","jsVarValueArray","redir_url","successAction","condition","conditionComment");
1296
		#$conf["variableCheck::checkArguments"]["skipableVariableType"],爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableType"] = array("string",integer,"double");
1297
		$conf["variableCheck::checkArguments"]["skipableVariableType"]=array("string","string","string","array","array","array","array","string","string","string","string");
1298
		#$conf["variableCheck::checkArguments"]["skipableVarDefaultValue"],字串陣列,每個不存在的可省略變數要初始化為什麼,null與代表不指定,若預設值是必填參數之一,請將$conf["mustBeFilledVar"]改成"\$conf["\mustBeFilledVar\"]".
1299
		$conf["variableCheck::checkArguments"]["skipableVarDefaultValue"]=array("false",null,"false",array("is_ajax"),array("true"),null,null,null,null,null,null);
1300
		#$conf["variableCheck::checkArguments"]["arrayCountEqualCheck"],字串陣列,為檢查哪些陣列參數的元素數量要一樣,$conf["arrayCountEqualCheck"][$i]=array()為第$i組key為哪些的變數其元素數量要相等.
1301
		$conf["variableCheck::checkArguments"]["arrayCountEqualCheck"][]=array("varValueArray","jsFunctionName");
1302
		$conf["variableCheck::checkArguments"]["arrayCountEqualCheck"][]=array("jsVarNameArray","jsVarValueArray");
1303
		#參考資料來源:
1304
		#array_keys=>http://php.net/manual/en/function.array-keys.php
1305
		$checkResult=variableCheck::checkArguments($conf["variableCheck::checkArguments"]);
1306
		unset($conf["variableCheck::checkArguments"]);
1307
 
1308
		#如果檢查失敗
1309
		if($checkResult["status"]=="false"){
1310
 
1311
			#設置錯誤狀態
1312
			$result["status"]="false";
1313
 
1314
			#設置錯誤提示
1315
			$result["error"]=$checkResult;
1316
 
1317
			#回傳結果
1318
			return $result;
1319
 
1320
			}#if end
1321
 
1322
		#如果檢查不通過
1323
		if($checkResult["passed"]=="false"){
1324
 
1325
			#設置錯誤狀態
1326
			$result["status"]="false";
1327
 
1328
			#設置錯誤提示
1329
			$result["error"]=$checkResult;
1330
 
1331
			#回傳結果
1332
			return $result;
1333
 
1334
			}#if end
1335
 
1336
		#初始化儲存要傳送的post變數
1337
		$sendStr=array();
1338
 
1339
		#有幾個 $conf["varNameArray"] 就執行幾次
1340
		for($i=0;$i<count($conf["varNameArray"]);$i++){
1341
 
1342
			#設置post變數
1343
			$sendStr[$conf["varNameArray"][$i]]=$conf["varValueArray"][$i];
1344
 
1345
			}#for end
1346
 
1347
		#轉成 url encode 格式
1348
		$sendStr=http_build_query($sendStr);
1349
 
1350
		#如果存在 $conf["jsVarNameArray"]
1351
		if(isset($conf["jsVarNameArray"])){
1352
 
1353
			#針對每個js變數
1354
			for($i=0;$i<count($conf["jsVarNameArray"]);$i++){
1355
 
1356
				#串接js變數
1357
				$sendStr=$sendStr."'+'&".$conf["jsVarNameArray"][$i]."='+".$conf["jsVarValueArray"][$i];
1358
 
1359
				#如果是最後一筆
1360
				if($i===(count($conf["jsVarNameArray"])-1)){
1361
 
1362
					#補上 "+'"
1363
					$sendStr=$sendStr."+'";
1364
 
1365
					}#if end
1366
 
1367
				}#foreach end
1368
 
1369
			}#if end
1370
 
1371
		#初始化馬上執行ajax的js語法
1372
		$sendNow="";
1373
 
1374
		#如果 $conf["sendNow"] 為 "true"...
1375
		if($conf["sendNow"]==="true"){
1376
 
1377
			#設置馬上執行ajax
1378
			$sendNow=$conf["jsFunctionName"]."();";
1379
 
1380
			}#if end
1381
 
1382
		#設置不對回應做處理
1383
		$actionWhenGotResponse="";
1384
 
1385
		#如果有設置 $conf["responsePalaceId"]
1386
		if(isset($conf["responsePalaceId"])){
1387
 
1388
			#設置收到ajax的回應後要把內容吐到特定id的標籤裡面
1389
			$actionWhenGotResponse="document.getElementById('".$conf["responsePalaceId"]."').innerHTML=xmlhttp.responseText;";
1390
 
1391
			}#if end
1392
 
1393
		#如果有設置 $conf["redir_url"]
1394
		if(isset($conf["redir_url"])){
1395
 
1396
			#設置要轉址
1397
			$actionWhenGotResponse="window.location.href='".$conf["redir_url"]."'";
1398
 
1399
			}#if end
1400
 
1401
		#如果有設置 $conf["successAction"]
1402
		if(isset($conf["successAction"])){
1403
 
1404
			#設置ajax成功要做的事情
1405
			$actionWhenGotResponse=$conf["successAction"];
1406
 
1407
			}#if end
1408
 
1409
		//js函數的開頭
1410
		$scriptHead=
1411
		"
1412
		//傳送post變數到指定頁面。
1413
		function ".$conf["jsFunctionName"]."(){
1414
		";
1415
 
1416
		//js函數的結尾
1417
		$scriptTail=
1418
		"
1419
		}//js function end
1420
		";
1421
 
1422
		#建立 XMLDoc,傳值
1423
		$script=
1424
		"
1425
		//建立 XMLDoc
1426
		if(window.XMLHttpRequest){
1427
 
1428
			// code for IE7+, Firefox, Chrome, Opera, Safari
1429
			xmlhttp=new XMLHttpRequest();
1430
 
1431
			}//if end
1432
 
1433
		else{
1434
 
1435
			// code for IE6, IE5
1436
			xmlhttp=new ActiveXObject('Microsoft.XMLHTTP');
1437
 
1438
			}//else end
1439
 
1440
		//如果服務端有回傳完稱的狀態
1441
		xmlhttp.onreadystatechange=function(){
1442
 
1443
			//如果狀態為4且response code為200
1444
			if(xmlhttp.readyState==4 && xmlhttp.status==200){
1445
 
1446
				//將回應進行處理
1447
				".$actionWhenGotResponse."
1448
 
1449
				}//if end
1450
 
1451
			}//function end
1452
 
1453
		//設定要求的屬性、目的、是否不要同步
1454
		xmlhttp.open('POST','".$conf["receivePage"]."',true);
1455
 
1456
		//設定 header
1457
		xmlhttp.setRequestHeader('Content-type','application/x-www-form-urlencoded');
1458
 
1459
		//設定 要求為ajax 的 header
1460
		xmlhttp.setRequestHeader('X-Requested-With','XMLHttpRequest');
1461
 
1462
		//要傳送的數值名稱與數值內容,ex:num1=100&num2=50
1463
		xmlhttp.send('".$sendStr."');
1464
		";
1465
 
1466
		#如果有執行的條件
1467
		if(isset($conf["condition"])){
1468
 
1469
			#函式說明:
1470
			#javascript的if...esle if...判斷式.
1471
			#回傳結果:
1472
			#$result["status"],執行正確與否,"true"代表執行正確,"false"代表執行失敗.
1473
			#$result["error"],錯誤訊息陣列.
1474
			#$result["content"],JavaScript的語法
1475
			#$result["function"],當前執行的函數名稱
1476
			#必填參數:
1477
			#無:
1478
			#可省略參數:
1479
			#$conf["scriptTag"],是否要用<script></script>包住,預設為"false",不包住;"true"為包住.
1480
			#$conf["scriptTag"]="false";
1481
			#$conf["condition"],陣列,每個判斷式的條件,若有多個則會依序判斷下去.
1482
			$conf["javascript::jsIf"]["condition"]=array($conf["condition"]);
1483
 
1484
			#如果有設定條件註解
1485
			if(isset($conf["conditionComment"])){
1486
 
1487
				#$conf["conditionComment"],陣列,每個判斷式的註解,預設為$conf["condition"].
1488
				$conf["javascript::jsIf"]["conditionComment"]=array($conf["conditionComment"]);
1489
 
1490
				}#if end
1491
 
1492
			#$conf["todo"],陣列,每個判斷式成立時要做的事情.
1493
			$conf["javascript::jsIf"]["todo"]=array($script);
1494
			#$conf["todoComment"],陣列,每件要做的事情之註解,預設為"do something...".
1495
			$conf["javascript::jsIf"]["todoComment"]=array("start ajax...");
1496
			$jsIf=javascript::jsIf($conf["javascript::jsIf"]);
1497
			unset($conf["javascript::jsIf"]);
1498
 
1499
			#如果設置條件失敗
1500
			if($jsIf["status"]==="false"){
1501
 
1502
				#設置錯誤狀態
1503
				$result["status"]="false";
1504
 
1505
				#設置錯誤提示
1506
				$result["error"]=$jsIf;
1507
 
1508
				#回傳結果
1509
				return $result;
1510
 
1511
				}#if end
1512
 
1513
			#設置執行函式的條件
1514
			$script=$jsIf["content"];
1515
 
1516
			}#if end
1517
 
1518
		#組合成完整的js函數
1519
		$script=$scriptHead.$script.$scriptTail;
1520
 
1521
		#如果要將script用<script></script>包住.
1522
		if($conf["scriptTag"]==="true"){
1523
 
1524
			#建立完整的<script>
1525
			#函式說明:
1526
			#將要執行的script語法透過該函式執行(會在程式外層用<script></script>包起來).
1527
			#回傳結果:
1528
			#$result["status"],執行是否正常,"true"為正常,"false"為不正常.
1529
			#$result["error"],錯誤訊息陣列
1530
			#$result["function"],當前執行的函數名稱
1531
			#$result["content"],要執行的javaScript語法
1532
			#必填參數:
1533
			#$conf["script"],字串,要執行的javaScript語法,標籤「<script></script>」會自動補上.
1534
			$conf["javaScript::toScript"]["script"]=$sendNow;
1535
			#可省略參數:
1536
			#$conf["onReady"],字串,是否要在網頁載入完再執行,"false"為不等載入完就先執行,預設為"true"要等載入完再執行.
1537
			#$conf["onReady"]="true";
1538
			#$conf["jsFunciton"],字串陣列,為要放入<script>標籤的js函數.
1539
			$conf["javaScript::toScript"]["jsFunciton"]=array($script);
1540
			#參考資料:
1541
			#http://stackoverflow.com/questions/9899372/pure-javascript-equivalent-to-jquerys-ready-how-to-call-a-function-when-the
1542
			$toScript=javaScript::toScript($conf["javaScript::toScript"]);
1543
			unset($conf["javaScript::toScript"]);
1544
 
1545
			#如果建立js語法失敗
1546
			if($toScript["status"]==="false"){
1547
 
1548
				#設置錯誤狀態
1549
				$result["status"]="false";
1550
 
1551
				#設置錯誤提示
1552
				$result["error"]=$toScript;
1553
 
1554
				#回傳結果
1555
				return $result;
1556
 
1557
				}#if end
1558
 
1559
			#取得js語法
1560
			$result["content"]=$toScript["content"];
1561
 
1562
			}#if end
1563
 
1564
		#反之
1565
		else{
1566
 
1567
			#取得js語法
1568
			$result["content"]=$script;
1569
 
1570
			}#else end
1571
 
1572
		#執行到這代表執行成功
1573
		$result["status"]="true";
1574
 
1575
		#回傳javascript語法
1576
		return $result;
1577
 
1578
		}# function sendPostValue end
1579
 
1580
	/*
1581
	#函式說明:
1582
	#透過javaScript傳送get數值到特定頁面,並且取得頁面的回應,將之結果放置在特定的區塊裏面。
1583
	#回傳的內容:
1584
	#$result["status"],執行正確與否,"true"代表執行正確,"false"代表執行失敗.
1585
	#$result["error"],錯誤訊息陣列.
1586
	#$result["content"],JavaScript的語法
1587
	#$result["function"],當前執行的函數名稱
1588
	#必填參數:
1589
	#$conf["receivePage"],字串,要接收數值的頁面。
1590
	$conf["receivePage"]="";
1591
	#$conf["var"],陣列,要傳送的變數名稱與內容,$conf["var"]["name"]=$value,代表變數名為$name,值為$value.
1592
	$conf["var"]=array();
1593
	#$conf["jsFunctionName"],字串,ajax裏面的js涵式名稱,使用該function的範例 jsFunction(this.value) ,這樣就會把表單的數值傳進去
1594
	$conf["jsFunctionName"]="";
1595
	#可省略參數:
1596
	#$conf["responsePalaceId"],字串,回傳的內容要呈現於哪個<span id = ? ></span>、<div id= ? ></div>區塊之間。
1597
	#$conf["responsePalaceId"]="";
1598
	#$conf["sendNow"],字串,是否要在document.ready後馬上執行ajax,預設為"false",代表不要,"true"代表要.
1599
	#$conf["sendNow"]="false";
1600
	#參考資料:
1601
	#http://www.w3school.com.cn/php/php_ajax_suggest.asp
1602
	#http://www.w3schools.com/php/php_ajax_php.asp
1603
	#備註:
1604
	#無.
1605
	*/
1606
	public static function ajaxSendGetValue($conf){
1607
 
1608
		#初始化要回傳的內容
1609
		$result=array();
1610
 
1611
		#初始化要回傳的語法
1612
		$result["content"]="";
1613
 
1614
		#記錄當前執行的函數名稱
1615
		$result["function"]=__FUNCTION__;
1616
 
1617
		#如果 $conf 不為陣列
1618
		if(gettype($conf)!="array"){
1619
 
1620
			#設置執行失敗
1621
			$result["status"]="false";
1622
 
1623
			#設置執行錯誤訊息
1624
			$result["error"][]="\$conf變數須為陣列形態";
1625
 
1626
			#如果傳入的參數為 null
1627
			if($conf==null){
1628
 
1629
				#設置執行錯誤訊息
1630
				$result["error"][]="\$conf變數不得為null,請檢查函數「".$result["function"]."」的參數設置有無正確!";
1631
 
1632
				}#if end
1633
 
1634
			#回傳結果
1635
			return $result;
1636
 
1637
			}#if end
1638
 
1639
		#檢查參數
1640
		#函式說明:
1641
		#檢查必填與可省略的參數,可省略參數可指定預設要給與什麼數值內容。
1642
		#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
1643
		#$reuslt["error"],執行不正常結束的錯訊息陣列.
1644
		#$result["function"],當前執行的函式名稱.
1645
		#$result["passed"],識別要檢查的全體變數是否存在以及型態是否正確的變數,"true"代表檢查全部通過;"false"代表檢查不通過
1646
		#$result[$shouldBtCheckedVarName]["varExist"],所檢查的變數是否存在,"false"代表不存在;"true"代表存在
1647
		#$result[$shouldBtCheckedVarName]["varType"],所檢查的變數型態是否正確,"false"代表錯誤;"true"代表正確
1648
		#$result[$shouldBtCheckedVarName]["error"],每個參數設定的錯誤訊息
1649
		#$result["argu"],字串陣列,目前輸入的參數名稱陣列.
1650
		#$result["legalVarName"],字串陣列,合法可用的參數名稱陣列.
1651
		#$result["notNeedVar"],字串陣列,多餘的參數名稱.
1652
		#必填參數:
1653
		#$conf["variableCheck::checkArguments"]["varInput"],陣列變數,要檢查的陣列變數,請在要檢查的參數前面加上&,這樣變動的結果才能被套用。
1654
		$conf["variableCheck::checkArguments"]["varInput"]=&$conf;
1655
		#$conf["variableCheck::checkArguments"]["mustBeFilledVariableName"],爲必填參數的變數名稱陣列,形態爲陣列變數,例如: $conf["mustBeFilledVariableName"] = array("id","account","password");
1656
		$conf["variableCheck::checkArguments"]["mustBeFilledVariableName"]=array("receivePage","var","jsFunctionName");
1657
		#$conf["variableCheck::checkArguments"]["mustBeFilledVariableType"],爲必填參數的變數陣列應該爲何種變數形態,形態爲陣列 例如: $conf["mustBeFilledVariableType"] = array("string",integer,"double");
1658
		$conf["variableCheck::checkArguments"]["mustBeFilledVariableType"]=array("string","array","string");
1659
		#$conf["variableCheck::checkArguments"]["referenceVarKey"],字串,$conf參數後面的key值,用於移除不要的參考陣列.
1660
		$conf["variableCheck::checkArguments"]["referenceVarKey"]="variableCheck::checkArguments";
1661
		#可以省略的參數:
1662
		#$conf["variableCheck::checkArguments"]["canBeEmptyString"],必填變數內容如果是空字串就不能算是有設置的話,請設為"false",預設爲"true"。
1663
		$conf["variableCheck::checkArguments"]["canBeEmptyString"]="false";
1664
		#$conf["variableCheck::checkArguments"]["skipableVariableName"],爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableName"] = array("id","account","password");
1665
		$conf["variableCheck::checkArguments"]["skipableVariableName"]=array("responsePalaceId","sendNow");
1666
		#$conf["variableCheck::checkArguments"]["skipableVariableType"],爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableType"] = array("string",integer,"double");
1667
		$conf["variableCheck::checkArguments"]["skipableVariableType"]=array("string","string");
1668
		#$conf["variableCheck::checkArguments"]["skipableVarDefaultValue"],字串陣列,每個不存在的可省略變數要初始化為什麼,null與代表不指定,若預設值是必填參數之一,請將$conf["mustBeFilledVar"]改成"\$conf["\mustBeFilledVar\"]".
1669
		$conf["variableCheck::checkArguments"]["skipableVarDefaultValue"]=array(null,"false");
1670
		#$conf["variableCheck::checkArguments"]["arrayCountEqualCheck"],字串陣列,為檢查哪些陣列參數的元素數量要一樣,$conf["arrayCountEqualCheck"][$i]=array()為第$i組key為哪些的變數其元素數量要相等.
1671
		#$conf["variableCheck::checkArguments"]["arrayCountEqualCheck"][]=array();
1672
		#參考資料來源:
1673
		#array_keys=>http://php.net/manual/en/function.array-keys.php
1674
		$checkResult=variableCheck::checkArguments($conf["variableCheck::checkArguments"]);
1675
		unset($conf["variableCheck::checkArguments"]);
1676
 
1677
		#如果檢查失敗
1678
		if($checkResult["status"]=="false"){
1679
 
1680
			#設置錯誤狀態
1681
			$result["status"]="false";
1682
 
1683
			#設置錯誤提示
1684
			$result["error"]=$checkResult;
1685
 
1686
			#回傳結果
1687
			return $result;
1688
 
1689
			}#if end
1690
 
1691
		#如果檢查不通過
1692
		if($checkResult["passed"]=="false"){
1693
 
1694
			#設置錯誤狀態
1695
			$result["status"]="false";
1696
 
1697
			#設置錯誤提示
1698
			$result["error"]=$checkResult;
1699
 
1700
			#回傳結果
1701
			return $result;
1702
 
1703
			}#if end
1704
 
1705
		#初始化馬上執行ajax的js語法
1706
		$sendNow="";
1707
 
1708
		#如果 $conf["sendNow"] 為 "true"...
1709
		if($conf["sendNow"]==="true"){
1710
 
1711
			#設置馬上執行ajax
1712
			$sendNow=$conf["jsFunctionName"]."();";
1713
 
1714
			}#if end
1715
 
1716
		#設置不對回應做處理
1717
		$actionWhenGotResponse="";
1718
 
1719
		#如果有設置 $conf["responsePalaceId"]
1720
		if(isset($conf["responsePalaceId"])){
1721
 
1722
			#設置收到ajax的回應後要把內容吐到特定id的標籤裡面
1723
			$actionWhenGotResponse="document.getElementById('".$conf["responsePalaceId"]."').innerHTML=xmlhttp.responseText;";
1724
 
1725
			}#if end
1726
 
1727
		#url_encode get request
1728
		$conf["var"]="?".http_build_query($conf["var"]);
1729
 
1730
		#建立ajax的script
1731
 
1732
		#傳送post變數到指定頁面的函式開始.
1733
		$script="
1734
		function ".$conf["jsFunctionName"]."(){
1735
 
1736
			if(window.XMLHttpRequest){
1737
 
1738
					// code for IE7+, Firefox, Chrome, Opera, Safari
1739
					xmlhttp=new XMLHttpRequest();
1740
 
1741
				}//if end
1742
 
1743
			else{
1744
 
1745
					// code for IE6, IE5
1746
					xmlhttp=new ActiveXObject('Microsoft.XMLHTTP');
1747
 
1748
				}// else end
1749
 
1750
			//如果服務端有回傳完稱的狀態
1751
			xmlhttp.onreadystatechange=function(){
1752
 
1753
				//如果狀態為4且response code為200
1754
				if(xmlhttp.readyState==4 && xmlhttp.status==200){
1755
 
1756
					//將回應進行處理
1757
					".$actionWhenGotResponse."
1758
 
1759
					}//if end
1760
 
1761
			}//function end
1762
 
1763
		//設定要用get傳送的數值
1764
		xmlhttp.open('GET','".$conf["receivePage"].$conf["var"]."',true);
1765
 
1766
		//設定 header
1767
		xmlhttp.setRequestHeader('Content-type','application/x-www-form-urlencoded');
1768
 
1769
		//設定要求為ajax 的 header
1770
		xmlhttp.setRequestHeader('X-Requested-With','XMLHttpRequest');
1771
 
1772
		//傳送要求
1773
		xmlhttp.send();
1774
 
1775
		}//function end
1776
 
1777
		";
1778
 
1779
		#建立完整的<script>
1780
		#函式說明:
1781
		#將要執行的script語法透過該函式執行(會在程式外層用<script></script>包起來).
1782
		#回傳結果:
1783
		#$result["status"],執行是否正常,"true"為正常,"false"為不正常.
1784
		#$result["error"],錯誤訊息陣列
1785
		#$result["function"],當前執行的函數名稱
1786
		#$result["content"],要執行的javaScript語法
1787
		#必填參數:
1788
		#$conf["script"],字串,要執行的javaScript語法,標籤「<script></script>」會自動補上.
1789
		$conf["javaScript::toScript"]["script"]=$sendNow;
1790
		#可省略參數:
1791
		#$conf["onReady"],字串,是否要在網頁載入完再執行,"false"為不等載入完就先執行,預設為"true"要等載入完再執行.
1792
		#$conf["onReady"]="true";
1793
		#$conf["jsFunciton"],字串陣列,為要放入<script>標籤的js函數.
1794
		$conf["javaScript::toScript"]["jsFunciton"]=array($script);
1795
		#參考資料:
1796
		#http://stackoverflow.com/questions/9899372/pure-javascript-equivalent-to-jquerys-ready-how-to-call-a-function-when-the
1797
		$toScript=javaScript::toScript($conf["javaScript::toScript"]);
1798
		unset($conf["javaScript::toScript"]);
1799
 
1800
		#如果建立js語法失敗
1801
		if($toScript["status"]==="false"){
1802
 
1803
			#設置錯誤狀態
1804
			$result["status"]="false";
1805
 
1806
			#設置錯誤提示
1807
			$result["error"]=$toScript;
1808
 
1809
			#回傳結果
1810
			return $result;
1811
 
1812
			}#if end
1813
 
1814
		#取得js語法
1815
		$result["content"]=$toScript["content"];
1816
 
1817
		#執行到這代表執行成功
1818
		$result["status"]="true";
1819
 
1820
		#回傳javascript語法
1821
		return $result;
1822
 
1823
		}# function sendGetValue end
1824
 
1825
	/*
1826
	#函式說明:
1827
	#建立從當前iframe去增加其他iframe裏面元素的數值內容的js函數.
1828
	#回傳結果:
1829
	#$result["status"],執行是否正常,"true"為正常,"false"為不正常.
1830
	#$result["error"],錯誤訊息陣列.
1831
	#$result["function"],當前執行的函數名稱.
1832
	#$result["content"],javaScript語法.
1833
	#必填參數:
1834
	$conf["idVarName"]="inputElementId";#目標iframe底下的javaScript變數名稱,其變數值應爲元素的id.
1835
	$conf["jsFunctionName"]="sendKey";#該javaScript的涵式名稱.
1836
	#可省略參數:
1837
	#無.
1838
	#參考資料:
1839
	#無.
1840
	#備註:
1841
	#無.
1842
	*/
1843
	public static function addOtherIframeInterElementValueFromThisIframe($conf){
1844
 
1845
		#初始化要回傳的變數
1846
		$result=array();
1847
 
1848
		#初始化javaScript語法
1849
		$result["content"]="";
1850
 
1851
		#記錄當前執行的函數名稱
1852
		$result["function"]=__FUNCTION__;
1853
 
1854
		#如果 $conf 不為陣列
1855
		if(gettype($conf)!="array"){
1856
 
1857
			#設置執行失敗
1858
			$result["status"]="false";
1859
 
1860
			#設置執行錯誤訊息
1861
			$result["error"][]="\$conf變數須為陣列形態";
1862
 
1863
			#如果傳入的參數為 null
1864
			if($conf==null){
1865
 
1866
				#設置執行錯誤訊息
1867
				$result["error"][]="\$conf變數不得為null,請檢查函數「".$result["function"]."」的參數設置有無正確!";
1868
 
1869
				}#if end
1870
 
1871
			#回傳結果
1872
			return $result;
1873
 
1874
			}#if end
1875
 
1876
		#檢查參數
1877
		#函式說明:
1878
		#檢查必填與可省略的參數,可省略參數可指定預設要給與什麼數值內容。
1879
		#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
1880
		#$reuslt["error"],執行不正常結束的錯訊息陣列.
1881
		#$result["function"],當前執行的函式名稱.
1882
		#$result["passed"],識別要檢查的全體變數是否存在以及型態是否正確的變數,"true"代表檢查全部通過;"false"代表檢查不通過
1883
		#$result[$shouldBtCheckedVarName]["varExist"],所檢查的變數是否存在,"false"代表不存在;"true"代表存在
1884
		#$result[$shouldBtCheckedVarName]["varType"],所檢查的變數型態是否正確,"false"代表錯誤;"true"代表正確
1885
		#$result[$shouldBtCheckedVarName]["error"],每個參數設定的錯誤訊息
1886
		#$result["argu"],字串陣列,目前輸入的參數名稱陣列.
1887
		#$result["legalVarName"],字串陣列,合法可用的參數名稱陣列.
1888
		#$result["notNeedVar"],字串陣列,多餘的參數名稱.
1889
		#必填參數:
1890
		#$conf["variableCheck::checkArguments"]["varInput"],陣列變數,要檢查的陣列變數,請在要檢查的參數前面加上&,這樣變動的結果才能被套用。
1891
		$conf["variableCheck::checkArguments"]["varInput"]=&$conf;
1892
		#$conf["variableCheck::checkArguments"]["mustBeFilledVariableName"],爲必填參數的變數名稱陣列,形態爲陣列變數,例如: $conf["mustBeFilledVariableName"] = array("id","account","password");
1893
		$conf["variableCheck::checkArguments"]["mustBeFilledVariableName"]=array("idVarName","jsFunctionName");
1894
		#$conf["variableCheck::checkArguments"]["mustBeFilledVariableType"],爲必填參數的變數陣列應該爲何種變數形態,形態爲陣列 例如: $conf["mustBeFilledVariableType"] = array("string",integer,"double");
1895
		$conf["variableCheck::checkArguments"]["mustBeFilledVariableType"]=array("string","string");
1896
		#$conf["variableCheck::checkArguments"]["referenceVarKey"],字串,$conf參數後面的key值,用於移除不要的參考陣列.
1897
		$conf["variableCheck::checkArguments"]["referenceVarKey"]="variableCheck::checkArguments";
1898
		#可以省略的參數:
1899
		#$conf["variableCheck::checkArguments"]["canBeEmptyString"],必填變數內容如果是空字串就不能算是有設置的話,請設為"false",預設爲"true"。
1900
		$conf["variableCheck::checkArguments"]["canBeEmptyString"]="false";
1901
		#$conf["variableCheck::checkArguments"]["skipableVariableName"],爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableName"] = array("id","account","password");
1902
		#$conf["variableCheck::checkArguments"]["skipableVariableName"]=array("jsPosition");
1903
		#$conf["variableCheck::checkArguments"]["skipableVariableType"],爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableType"] = array("string",integer,"double");
1904
		#$conf["variableCheck::checkArguments"]["skipableVariableType"]=array("string");
1905
		#$conf["variableCheck::checkArguments"]["skipableVarDefaultValue"],字串陣列,每個不存在的可省略變數要初始化為什麼,null與代表不指定,若預設值是必填參數之一,請將$conf["mustBeFilledVar"]改成"\$conf["\mustBeFilledVar\"]".
1906
		#$conf["variableCheck::checkArguments"]["skipableVarDefaultValue"]=array(null);
1907
		#$conf["variableCheck::checkArguments"]["arrayCountEqualCheck"],字串陣列,為檢查哪些陣列參數的元素數量要一樣,$conf["arrayCountEqualCheck"][$i]=array()為第$i組key為哪些的變數其元素數量要相等.
1908
		#$conf["variableCheck::checkArguments"]["arrayCountEqualCheck"][]=array();
1909
		#參考資料來源:
1910
		#array_keys=>http://php.net/manual/en/function.array-keys.php
1911
		$checkResult=variableCheck::checkArguments($conf["variableCheck::checkArguments"]);
1912
		unset($conf["variableCheck::checkArguments"]);
1913
 
1914
		#debug
1915
		#var_dump($checkResult);
1916
		#exit;
1917
 
1918
		#如果檢查失敗
1919
		if($checkResult["status"]=="false"){
1920
 
1921
			#設置錯誤狀態
1922
			$result["status"]="false";
1923
 
1924
			#設置錯誤提示
1925
			$result["error"]=$checkResult;
1926
 
1927
			#回傳結果
1928
			return $result;
1929
 
1930
			}#if end
1931
 
1932
		#如果檢查不通過
1933
		if($checkResult["passed"]=="false"){
1934
 
1935
			#設置錯誤狀態
1936
			$result["status"]="false";
1937
 
1938
			#設置錯誤提示
1939
			$result["error"]=$checkResult;
1940
 
1941
			#回傳結果
1942
			return $result;
1943
 
1944
			}#if end
1945
 
1946
		#javaScript開始
1947
		$conf["javaScript"]["start"]["include"]="false";#是否要匯入外部js庫。"true"爲要匯入;"false"爲沒有要匯入。
1948
		$javaScriptStart=javaScript::start($conf["javaScript"]["start"]);
1949
		unset($conf["javaScript"]["start"]);
1950
 
1951
		#javaScript語法開始失敗
1952
		if($javaScriptStart["status"]=="false"){
1953
 
1954
			#設置錯誤狀態
1955
			$result["status"]="false";
1956
 
1957
			#設置錯誤提示
1958
			$result["error"]=$javaScriptStart;
1959
 
1960
			#回傳結果
1961
			return $result;
1962
 
1963
			}#if end
1964
 
1965
		#串接javaScript開始的語法
1966
		$result["content"]=$result["content"].$javaScriptStart["content"];
1967
 
1968
		#從當前iframe去增加其他iframe裏面元素的數值內容的javaScript涵式
1969
		$result["content"]=$result["content"]."
1970
 
1971
			//將數值傳到別到iframe裡的元素
1972
			//必填的參數:
1973
			//frameId,要存取的目標iframe的id
1974
			//key,要增加的數值內容
1975
			//參考資料來源:
1976
			//http://www.dotblogs.com.tw/puma/archive/2008/11/13/5982.aspx
1977
			//http://stackoverflow.com/questions/13757943/access-a-variable-of-iframe-from-parent
1978
			function ".$conf["jsFunctionName"]."(frameId,key){
1979
 
1980
				//將目標iframe元素物件化,並取得其id
1981
				var iframe = parent.document.getElementById(frameId);
1982
 
1983
				//取得其iframe底下的變數
1984
				var id=iframe.contentWindow.".$conf["idVarName"].";
1985
 
1986
				//將目標iframe裏的元素物件化,並取得其id
1987
				var inputField=iframe.contentDocument.getElementById(id);
1988
 
1989
				//將要傳送的數值連在目標iframe裏元素的內容後面。
1990
				inputField.value = inputField.value+key;
1991
 
1992
				}//function sendKey end
1993
 
1994
			";
1995
 
1996
		#javaScript結束
1997
		$result["content"]=$result["content"].javaScript::end();
1998
 
1999
		#設置執行正常
2000
		$result["status"]="true";
2001
 
2002
		#回傳結果
2003
		return $result;
2004
 
2005
		}#function
2006
 
2007
	/*
2008
	#函式說明:
2009
	#建立從當前iframe去刪除其他iframe裏面元素的數值內容的js函數
2010
	#回傳結果:
2011
	#$result["status"],執行是否正常,"true"為正常,"false"為不正常.
2012
	#$result["error"],錯誤訊息陣列.
2013
	#$result["function"],當前執行的函數名稱.
2014
	#$result["content"],javaScript語法.
2015
	#必填參數:
2016
	$conf["idVarName"]="inputElementId";#目標iframe底下的javaScript變數名稱,其變數值應爲元素的id
2017
	$conf["jsFunctionName"]="delOne";#該javaScript的涵式名稱
2018
	#可省略參數:
2019
	#無.
2020
	#參考資料:
2021
	#無.
2022
	#備註:
2023
	#無.
2024
	*/
2025
	public static function delOtherIframeInterElementValueFromThisIframe($conf){
2026
 
2027
		#初始化要回傳的變數
2028
		$result=array();
2029
 
2030
		#初始化javaScript語法
2031
		$result["content"]="";
2032
 
2033
		#記錄當前執行的函數名稱
2034
		$result["function"]=__FUNCTION__;
2035
 
2036
		#如果 $conf 不為陣列
2037
		if(gettype($conf)!="array"){
2038
 
2039
			#設置執行失敗
2040
			$result["status"]="false";
2041
 
2042
			#設置執行錯誤訊息
2043
			$result["error"][]="\$conf變數須為陣列形態";
2044
 
2045
			#如果傳入的參數為 null
2046
			if($conf==null){
2047
 
2048
				#設置執行錯誤訊息
2049
				$result["error"][]="\$conf變數不得為null,請檢查函數「".$result["function"]."」的參數設置有無正確!";
2050
 
2051
				}#if end
2052
 
2053
			#回傳結果
2054
			return $result;
2055
 
2056
			}#if end
2057
 
2058
		#檢查參數
2059
		#函式說明:
2060
		#檢查必填與可省略的參數,可省略參數可指定預設要給與什麼數值內容。
2061
		#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
2062
		#$reuslt["error"],執行不正常結束的錯訊息陣列.
2063
		#$result["function"],當前執行的函式名稱.
2064
		#$result["passed"],識別要檢查的全體變數是否存在以及型態是否正確的變數,"true"代表檢查全部通過;"false"代表檢查不通過
2065
		#$result[$shouldBtCheckedVarName]["varExist"],所檢查的變數是否存在,"false"代表不存在;"true"代表存在
2066
		#$result[$shouldBtCheckedVarName]["varType"],所檢查的變數型態是否正確,"false"代表錯誤;"true"代表正確
2067
		#$result[$shouldBtCheckedVarName]["error"],每個參數設定的錯誤訊息
2068
		#$result["argu"],字串陣列,目前輸入的參數名稱陣列.
2069
		#$result["legalVarName"],字串陣列,合法可用的參數名稱陣列.
2070
		#$result["notNeedVar"],字串陣列,多餘的參數名稱.
2071
		#必填參數:
2072
		#$conf["variableCheck::checkArguments"]["varInput"],陣列變數,要檢查的陣列變數,請在要檢查的參數前面加上&,這樣變動的結果才能被套用。
2073
		$conf["variableCheck::checkArguments"]["varInput"]=&$conf;
2074
		#$conf["variableCheck::checkArguments"]["mustBeFilledVariableName"],爲必填參數的變數名稱陣列,形態爲陣列變數,例如: $conf["mustBeFilledVariableName"] = array("id","account","password");
2075
		$conf["variableCheck::checkArguments"]["mustBeFilledVariableName"]=array("idVarName","jsFunctionName");
2076
		#$conf["variableCheck::checkArguments"]["mustBeFilledVariableType"],爲必填參數的變數陣列應該爲何種變數形態,形態爲陣列 例如: $conf["mustBeFilledVariableType"] = array("string",integer,"double");
2077
		$conf["variableCheck::checkArguments"]["mustBeFilledVariableType"]=array("string","string");
2078
		#$conf["variableCheck::checkArguments"]["referenceVarKey"],字串,$conf參數後面的key值,用於移除不要的參考陣列.
2079
		$conf["variableCheck::checkArguments"]["referenceVarKey"]="variableCheck::checkArguments";
2080
		#可以省略的參數:
2081
		#$conf["variableCheck::checkArguments"]["canBeEmptyString"],必填變數內容如果是空字串就不能算是有設置的話,請設為"false",預設爲"true"。
2082
		$conf["variableCheck::checkArguments"]["canBeEmptyString"]="false";
2083
		#$conf["variableCheck::checkArguments"]["skipableVariableName"],爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableName"] = array("id","account","password");
2084
		#$conf["variableCheck::checkArguments"]["skipableVariableName"]=array("jsPosition");
2085
		#$conf["variableCheck::checkArguments"]["skipableVariableType"],爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableType"] = array("string",integer,"double");
2086
		#$conf["variableCheck::checkArguments"]["skipableVariableType"]=array("string");
2087
		#$conf["variableCheck::checkArguments"]["skipableVarDefaultValue"],字串陣列,每個不存在的可省略變數要初始化為什麼,null與代表不指定,若預設值是必填參數之一,請將$conf["mustBeFilledVar"]改成"\$conf["\mustBeFilledVar\"]".
2088
		#$conf["variableCheck::checkArguments"]["skipableVarDefaultValue"]=array(null);
2089
		#$conf["variableCheck::checkArguments"]["arrayCountEqualCheck"],字串陣列,為檢查哪些陣列參數的元素數量要一樣,$conf["arrayCountEqualCheck"][$i]=array()為第$i組key為哪些的變數其元素數量要相等.
2090
		#$conf["variableCheck::checkArguments"]["arrayCountEqualCheck"][]=array();
2091
		#參考資料來源:
2092
		#array_keys=>http://php.net/manual/en/function.array-keys.php
2093
		$checkResult=variableCheck::checkArguments($conf["variableCheck::checkArguments"]);
2094
		unset($conf["variableCheck::checkArguments"]);
2095
 
2096
		#debug
2097
		#var_dump($checkResult);
2098
		#exit;
2099
 
2100
		#如果檢查失敗
2101
		if($checkResult["status"]=="false"){
2102
 
2103
			#設置錯誤狀態
2104
			$result["status"]="false";
2105
 
2106
			#設置錯誤提示
2107
			$result["error"]=$checkResult;
2108
 
2109
			#回傳結果
2110
			return $result;
2111
 
2112
			}#if end
2113
 
2114
		#如果檢查不通過
2115
		if($checkResult["passed"]=="false"){
2116
 
2117
			#設置錯誤狀態
2118
			$result["status"]="false";
2119
 
2120
			#設置錯誤提示
2121
			$result["error"]=$checkResult;
2122
 
2123
			#回傳結果
2124
			return $result;
2125
 
2126
			}#if end
2127
 
2128
		#javaScript開始
2129
		$conf["javaScript"]["start"]["include"]="false";#是否要匯入外部js庫。"true"爲要匯入;"false"爲沒有要匯入。
2130
		$javaScriptStart=javaScript::start($conf["javaScript"]["start"]);
2131
		unset($conf["javaScript"]["start"]);
2132
 
2133
		#如果 javaScript 開始
2134
		if($javaScriptStart["status"]=="false"){
2135
 
2136
			#設置錯誤狀態
2137
			$result["status"]="false";
2138
 
2139
			#設置錯誤提示
2140
			$result["error"]=$checkResult;
2141
 
2142
			#回傳結果
2143
			return $result;
2144
 
2145
			}#if end
2146
 
2147
		#串接javaScript開始的語法
2148
		$result["content"]=$result["content"].$javaScriptStart["content"];
2149
 
2150
		#從當前iframe去增加其他iframe裏面元素的數值內容的javaScript涵式
2151
		$result["content"]=$result["content"]."
2152
 
2153
			//將別的iframe裡的元素刪除一個字
2154
			//必填的參數:
2155
			//frameId,要存取的目標iframe的id
2156
			//key,要增加的數值內容
2157
			//參考資料來源:
2158
			//http://www.dotblogs.com.tw/puma/archive/2008/11/13/5982.aspx
2159
			//http://stackoverflow.com/questions/13757943/access-a-variable-of-iframe-from-parent
2160
			//http://www.w3school.com.cn/js/jsref_split.asp
2161
			//http://www.w3school.com.cn/js/jsref_join.asp
2162
			function ".$conf["jsFunctionName"]."(frameId){
2163
 
2164
				//將目標iframe元素物件化,並取得其id
2165
				var iframe = parent.document.getElementById(frameId);
2166
 
2167
				//取得其iframe底下的變數
2168
				var id=iframe.contentWindow.".$conf["idVarName"].";
2169
 
2170
				//將目標iframe裏的元素物件化,並取得其id
2171
				var inputField=iframe.contentDocument.getElementById(id);
2172
 
2173
				//取得原始的字串內容
2174
				var strValue=inputField.value;
2175
 
2176
				//將表單原始的字串內容,變成陣列
2177
				var strArray=strValue.split('');
2178
 
2179
				//取得陣列的長度
2180
				var strArrayLength=strArray.length;
2181
 
2182
				//將陣列的最後一個元素移除
2183
				strArray[strArrayLength-1]='';
2184
 
2185
				//將陣列合併爲字串
2186
				var deledStr = strArray.join('');
2187
 
2188
				//更改表單的字串內容爲移除了最後一個字的結果
2189
				inputField.value = deledStr;
2190
 
2191
				}//function sendKey end
2192
 
2193
			";
2194
 
2195
		#javaScript結束
2196
		$result["content"]=$result["content"].javaScript::end();
2197
 
2198
		#設置執行正常
2199
		$result["status"]="true";
2200
 
2201
		#回傳結果
2202
		return $result;
2203
 
2204
		}#function
2205
 
2206
	/*
2207
	#函式說明:
2208
	#列印當前頁面
2209
	#回傳結果:
2210
	#列印的javaScript語法.
2211
	#必填參數:
2212
	#無.
2213
	#可省略參數:
2214
	#無.
2215
	#參考資料:
2216
	#無.
2217
	#備註:
2218
	#無.
2219
	*/
2220
	public static function printWebPage(){
2221
 
2222
		#初始化要回傳的javaScript語法
2223
		$result="<body onload=window.print()>";
2224
 
2225
		#回傳語法
2226
		return $result;
2227
 
2228
		}#function printWebPage end
2229
 
2230
	/*
2231
	#函式說明:
2232
	#確認視窗,回傳的javaScript結果可在要觸發的元素裡面搭配「onclink=本函數回傳的內容」,來使連結或按鈕確定觸發或不觸發.
2233
	#回傳結果:
2234
	#$result["status"],執行是否正常,"true"為正常,"false"為不正常.
2235
	#$result["error"],錯誤訊息陣列.
2236
	#$result["function"],當前執行的函數名稱.
2237
	#$result["content"],javaScript語法,不含<script>標籤.
2238
	#必填參數:
2239
	#$conf["alertSentenceArray"],字串陣列彈出式視窗的內容,每個元素代表每一列的內容.
2240
	$conf["alertSentenceArray"]=array();
2241
	#可省略參數:
2242
	#無.
2243
	#參考資料:
2244
	#無.
2245
	#備註:
2246
	#無.
2247
	*/
2248
	public static function confirmWindow(&$conf){
2249
 
2250
		#初始化要回傳的變數
2251
		$result=array();
2252
 
2253
		#記錄當前執行的函數名稱
2254
		$result["function"]=__FUNCTION__;
2255
 
2256
		#如果 $conf 不為陣列
2257
		if(gettype($conf)!="array"){
2258
 
2259
			#設置執行失敗
2260
			$result["status"]="false";
2261
 
2262
			#設置執行錯誤訊息
2263
			$result["error"][]="\$conf變數須為陣列形態";
2264
 
2265
			#如果傳入的參數為 null
2266
			if($conf==null){
2267
 
2268
				#設置執行錯誤訊息
2269
				$result["error"][]="\$conf變數不得為null,請檢查函數「".$result["function"]."」的參數設置有無正確!";
2270
 
2271
				}#if end
2272
 
2273
			#回傳結果
2274
			return $result;
2275
 
2276
			}#if end
2277
 
2278
		#檢查參數
2279
		#函式說明:
2280
		#檢查必填與可省略的參數,可省略參數可指定預設要給與什麼數值內容。
2281
		#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
2282
		#$reuslt["error"],執行不正常結束的錯訊息陣列.
2283
		#$result["function"],當前執行的函式名稱.
2284
		#$result["passed"],識別要檢查的全體變數是否存在以及型態是否正確的變數,"true"代表檢查全部通過;"false"代表檢查不通過
2285
		#$result[$shouldBtCheckedVarName]["varExist"],所檢查的變數是否存在,"false"代表不存在;"true"代表存在
2286
		#$result[$shouldBtCheckedVarName]["varType"],所檢查的變數型態是否正確,"false"代表錯誤;"true"代表正確
2287
		#$result[$shouldBtCheckedVarName]["error"],每個參數設定的錯誤訊息
2288
		#$result["argu"],字串陣列,目前輸入的參數名稱陣列.
2289
		#$result["legalVarName"],字串陣列,合法可用的參數名稱陣列.
2290
		#$result["notNeedVar"],字串陣列,多餘的參數名稱.
2291
		#必填參數:
2292
		#$conf["variableCheck::checkArguments"]["varInput"],陣列變數,要檢查的陣列變數,請在要檢查的參數前面加上&,這樣變動的結果才能被套用。
2293
		$conf["variableCheck::checkArguments"]["varInput"]=&$conf;
2294
		#$conf["variableCheck::checkArguments"]["mustBeFilledVariableName"],爲必填參數的變數名稱陣列,形態爲陣列變數,例如: $conf["mustBeFilledVariableName"] = array("id","account","password");
2295
		$conf["variableCheck::checkArguments"]["mustBeFilledVariableName"]=array("alertSentenceArray");
2296
		#$conf["variableCheck::checkArguments"]["mustBeFilledVariableType"],爲必填參數的變數陣列應該爲何種變數形態,形態爲陣列 例如: $conf["mustBeFilledVariableType"] = array("string",integer,"double");
2297
		$conf["variableCheck::checkArguments"]["mustBeFilledVariableType"]=array("array");
2298
		#$conf["variableCheck::checkArguments"]["referenceVarKey"],字串,$conf參數後面的key值,用於移除不要的參考陣列.
2299
		$conf["variableCheck::checkArguments"]["referenceVarKey"]="variableCheck::checkArguments";
2300
		#可以省略的參數:
2301
		#$conf["variableCheck::checkArguments"]["canBeEmptyString"],必填變數內容如果是空字串就不能算是有設置的話,請設為"false",預設爲"true"。
2302
		$conf["variableCheck::checkArguments"]["canBeEmptyString"]="false";
2303
		#$conf["variableCheck::checkArguments"]["skipableVariableName"],爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableName"] = array("id","account","password");
2304
		#$conf["variableCheck::checkArguments"]["skipableVariableName"]=array("alertSentenceArray");
2305
		#$conf["variableCheck::checkArguments"]["skipableVariableType"],爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableType"] = array("string",integer,"double");
2306
		#$conf["variableCheck::checkArguments"]["skipableVariableType"]=array("string");
2307
		#$conf["variableCheck::checkArguments"]["skipableVarDefaultValue"],字串陣列,每個不存在的可省略變數要初始化為什麼,null與代表不指定,若預設值是必填參數之一,請將$conf["mustBeFilledVar"]改成"\$conf["\mustBeFilledVar\"]".
2308
		#$conf["variableCheck::checkArguments"]["skipableVarDefaultValue"]=array();
2309
		#$conf["variableCheck::checkArguments"]["arrayCountEqualCheck"],字串陣列,為檢查哪些陣列參數的元素數量要一樣,$conf["arrayCountEqualCheck"][$i]=array()為第$i組key為哪些的變數其元素數量要相等.
2310
		#$conf["variableCheck::checkArguments"]["arrayCountEqualCheck"][]=array();
2311
		#參考資料來源:
2312
		#array_keys=>http://php.net/manual/en/function.array-keys.php
2313
		$checkResult=variableCheck::checkArguments($conf["variableCheck::checkArguments"]);
2314
		unset($conf["variableCheck::checkArguments"]);
2315
 
2316
		#如果檢查失敗
2317
		if($checkResult["status"]=="false"){
2318
 
2319
			#設置錯誤狀態
2320
			$result["status"]="false";
2321
 
2322
			#設置錯誤提示
2323
			$result["error"]=$checkResult;
2324
 
2325
			#回傳結果
2326
			return $result;
2327
 
2328
			}#if end
2329
 
2330
		#如果檢查不通過
2331
		if($checkResult["passed"]=="false"){
2332
 
2333
			#設置錯誤狀態
2334
			$result["status"]="false";
2335
 
2336
			#設置錯誤提示
2337
			$result["error"]=$checkResult;
2338
 
2339
			#回傳結果
2340
			return $result;
2341
 
2342
			}#if end
2343
 
2344
		#回傳結果的confirm視窗語法開始
2345
		$result["content"]="return confirm('";
2346
 
2347
		#針對每個 $conf["alertSentenceArray"]
2348
		foreach($conf["alertSentenceArray"] as $sentence){
2349
 
2350
			#接上每列內容
2351
			$result["content"]=$result["content"].$sentence."\\n";
2352
 
2353
			}#foreach end
2354
 
2355
		#回傳結果的confirm視窗語法結束
2356
		$result["content"]=$result["content"]."')";
2357
 
2358
		#設置執行正常
2359
		$result["status"]="true";
2360
 
2361
		#回傳結果
2362
		return $result;
2363
 
2364
		}#function confirmWindow end
2365
 
2366
	/*
2367
	#函式說明:
2368
	#依據需要加上<script></script>標籤,並且可以指定要匯入的js檔案.
2369
	#回傳結果:
2370
	#$result["status"],執行是否正常,"true"為正常,"false"為不正常.
2371
	#$result["error"],錯誤訊息陣列
2372
	#$result["function"],當前執行的函數名稱
2373
	#$result["content"],javaScript語法
2374
	#$result["importJS"],匯入js的語法,必定含有<script></script>標籤.
2375
	#必填參數:
2376
	#$conf["jsProgramSection"],陣列字串,不含<script></script>標籤的javsScript程式碼,可以放多個script程式.
2377
	$conf["jsProgramSection"]=array("");
2378
	#可省略參數:
2379
	#$conf["fileArgu"],字串,php變數__FILE__的內容,亦即該檔案在檔案系統的絕對路徑,請與參數"jsPosition"一起設置,預設為當前檔案的位置.
2380
	#$conf["fileArgu"]=__FILE__;
2381
	#$conf["jsPosition"],字串,要匯入的js檔案位置.
2382
	#$conf["jsPosition"]="";
2383
	#$conf["noScriptTag"],字串,是否不要用script tag包住回傳的內容($result["content"]),"true"代表不要用,"false"代表要用,預設為"false".
2384
	#$conf["noScriptTag"]="false";
2385
	#參考資料:
2386
	#無.
2387
	#備註:
2388
	#無.
2389
	*/
2390
	public static function addScriptTag(&$conf){
2391
 
2392
		#初始化要回傳的變數
2393
		$result=array();
2394
 
2395
		#記錄當前執行的函數名稱
2396
		$result["function"]=__FUNCTION__;
2397
 
2398
		#如果 $conf 不為陣列
2399
		if(gettype($conf)!="array"){
2400
 
2401
			#設置執行失敗
2402
			$result["status"]="false";
2403
 
2404
			#設置執行錯誤訊息
2405
			$result["error"][]="\$conf變數須為陣列形態";
2406
 
2407
			#如果傳入的參數為 null
2408
			if($conf==null){
2409
 
2410
				#設置執行錯誤訊息
2411
				$result["error"][]="\$conf變數不得為null,請檢查函數「".$result["function"]."」的參數設置有無正確!";
2412
 
2413
				}#if end
2414
 
2415
			#回傳結果
2416
			return $result;
2417
 
2418
			}#if end
2419
 
2420
		#初始化要回傳的變數
2421
		$result["content"]="";
2422
 
2423
		#檢查參數
2424
		#函式說明:
2425
		#檢查必填與可省略的參數,可省略參數可指定預設要給與什麼數值內容。
2426
		#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
2427
		#$reuslt["error"],執行不正常結束的錯訊息陣列.
2428
		#$result["function"],當前執行的函式名稱.
2429
		#$result["passed"],識別要檢查的全體變數是否存在以及型態是否正確的變數,"true"代表檢查全部通過;"false"代表檢查不通過
2430
		#$result[$shouldBtCheckedVarName]["varExist"],所檢查的變數是否存在,"false"代表不存在;"true"代表存在
2431
		#$result[$shouldBtCheckedVarName]["varType"],所檢查的變數型態是否正確,"false"代表錯誤;"true"代表正確
2432
		#$result[$shouldBtCheckedVarName]["error"],每個參數設定的錯誤訊息
2433
		#$result["argu"],字串陣列,目前輸入的參數名稱陣列.
2434
		#$result["legalVarName"],字串陣列,合法可用的參數名稱陣列.
2435
		#$result["notNeedVar"],字串陣列,多餘的參數名稱.
2436
		#必填參數:
2437
		#$conf["variableCheck::checkArguments"]["varInput"],陣列變數,要檢查的陣列變數,請在要檢查的參數前面加上&,這樣變動的結果才能被套用。
2438
		$conf["variableCheck::checkArguments"]["varInput"]=&$conf;
2439
		#$conf["variableCheck::checkArguments"]["mustBeFilledVariableName"],爲必填參數的變數名稱陣列,形態爲陣列變數,例如: $conf["mustBeFilledVariableName"] = array("id","account","password");
2440
		$conf["variableCheck::checkArguments"]["mustBeFilledVariableName"]=array("jsProgramSection");
2441
		#$conf["variableCheck::checkArguments"]["mustBeFilledVariableType"],爲必填參數的變數陣列應該爲何種變數形態,形態爲陣列 例如: $conf["mustBeFilledVariableType"] = array("string",integer,"double");
2442
		$conf["variableCheck::checkArguments"]["mustBeFilledVariableType"]=array("array");
2443
		#$conf["variableCheck::checkArguments"]["referenceVarKey"],字串,$conf參數後面的key值,用於移除不要的參考陣列.
2444
		$conf["variableCheck::checkArguments"]["referenceVarKey"]="variableCheck::checkArguments";
2445
		#可以省略的參數:
2446
		#$conf["variableCheck::checkArguments"]["canBeEmptyString"],必填變數內容如果是空字串就不能算是有設置的話,請設為"false",預設爲"true"。
2447
		$conf["variableCheck::checkArguments"]["canBeEmptyString"]="false";
2448
		#$conf["variableCheck::checkArguments"]["skipableVariableName"],爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableName"] = array("id","account","password");
2449
		$conf["variableCheck::checkArguments"]["skipableVariableName"]=array("jsPosition","fileArgu","noScriptTag");
2450
		#$conf["variableCheck::checkArguments"]["skipableVariableType"],爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableType"] = array("string",integer,"double");
2451
		$conf["variableCheck::checkArguments"]["skipableVariableType"]=array("string","string","string");
2452
		#$conf["variableCheck::checkArguments"]["skipableVarDefaultValue"],字串陣列,每個不存在的可省略變數要初始化為什麼,null與代表不指定,若預設值是必填參數之一,請將$conf["mustBeFilledVar"]改成"\$conf["\mustBeFilledVar\"]".
2453
		$conf["variableCheck::checkArguments"]["skipableVarDefaultValue"]=array(null,__FILE__,"false");
2454
		#$conf["variableCheck::checkArguments"]["arrayCountEqualCheck"],字串陣列,為檢查哪些陣列參數的元素數量要一樣,$conf["arrayCountEqualCheck"][$i]=array()為第$i組key為哪些的變數其元素數量要相等.
2455
		#$conf["variableCheck::checkArguments"]["arrayCountEqualCheck"][]=array();
2456
		#參考資料來源:
2457
		#array_keys=>http://php.net/manual/en/function.array-keys.php
2458
		$checkResult=variableCheck::checkArguments($conf["variableCheck::checkArguments"]);
2459
		unset($conf["variableCheck::checkArguments"]);
2460
 
2461
		#如果檢查失敗
2462
		if($checkResult["status"]=="false"){
2463
 
2464
			#設置錯誤狀態
2465
			$result["status"]="false";
2466
 
2467
			#設置錯誤提示
2468
			$result["error"]=$checkResult;
2469
 
2470
			#回傳結果
2471
			return $result;
2472
 
2473
			}#if end
2474
 
2475
		#如果檢查不通過
2476
		if($checkResult["passed"]=="false"){
2477
 
2478
			#設置錯誤狀態
2479
			$result["status"]="false";
2480
 
2481
			#設置錯誤提示
2482
			$result["error"]=$checkResult;
2483
 
2484
			#回傳結果
2485
			return $result;
2486
 
2487
			}#if end
2488
 
2489
		#如果 $conf["jsPosition"] 存在
2490
		if(isset($conf["jsPosition"])){
2491
 
2492
			#函式說明:
2493
			#script 語法開始
2494
			#回傳結果:
2495
			#$result["status"],執行是否正常,"true"為正常,"false"為不正常.
2496
			#$result["error"],錯誤訊息陣列
2497
			#$result["function"],當前執行的函數名稱
2498
			#$result["content"],javaScript語法
2499
			#必填參數:
2500
 
2501
			#如果 $conf["jsPosition"] 存在
2502
			if(isset($conf["jsPosition"])){
2503
 
2504
				#$conf["include"],字串,是否要匯入外部js庫,"true"爲要匯入;"false"爲沒有要匯入。
2505
				$conf["javaScript::start"]["include"]="true";
2506
 
2507
				}#if end
2508
 
2509
			#反之
2510
			else{
2511
 
2512
				#$conf["include"],字串,是否要匯入外部js庫,"true"爲要匯入;"false"爲沒有要匯入。
2513
				$conf["javaScript::start"]["include"]="false";
2514
 
2515
				}#else end
2516
 
2517
			#可省略參數:
2518
 
2519
			#如果有設置 $conf["fileArgu"]
2520
			if(isset($conf["fileArgu"])){
2521
 
2522
				#$conf["fileArgu"],字串,php變數__FILE__的內容,亦即該檔案在檔案系統的絕對路徑,請與參數"jsPosition"一起設置,預設為當前檔案的位置.
2523
				$conf["javaScript::start"]["fileArgu"]=$conf["fileArgu"];
2524
 
2525
				}#if end
2526
 
2527
			#如果 $conf["jsPosition"] 存在
2528
			if(isset($conf["jsPosition"])){
2529
 
2530
				#$conf["jsPosition"],字串,要匯入的js檔案位置,請與參數"fileArgu"一起設置.
2531
				$conf["javaScript::start"]["jsPosition"]=$conf["jsPosition"];
2532
 
2533
				}#if end
2534
 
2535
			#$conf["userDir"],字串,網頁是否置放於家目錄底下,"true"為是,"false"為不是,於設為"true".
2536
			#$conf["userDir"]="true";
2537
			$start=javaScript::start($conf["javaScript::start"]);
2538
			unset($conf["javaScript::start"]);
2539
 
2540
			#如果建立匯入js的語法失敗
2541
			if($start["status"]=="false"){
2542
 
2543
				#設置錯誤狀態
2544
				$result["status"]="false";
2545
 
2546
				#設置錯誤提示
2547
				$result["error"]=$start;
2548
 
2549
				#回傳結果
2550
				return $result;
2551
 
2552
				}#if end
2553
 
2554
			#取得匯入js的語法
2555
			$result["importJS"]=$result["content"].$start["content"];
2556
 
2557
			#script結束
2558
			#函式說明:
2559
			#script 語法結束
2560
			#回傳結果:
2561
			#javaScript語法
2562
			$result["importJS"]=$result["importJS"].javaScript::end();
2563
 
2564
			}#if end
2565
 
2566
		#如果要 script tag
2567
		if($conf["noScriptTag"]==="false"){
2568
 
2569
			#函式說明:
2570
			#script 語法開始
2571
			#回傳結果:
2572
			#$result["status"],執行是否正常,"true"為正常,"false"為不正常.
2573
			#$result["error"],錯誤訊息陣列
2574
			#$result["function"],當前執行的函數名稱
2575
			#$result["content"],javaScript語法
2576
			#必填參數:
2577
			#$conf["include"],字串,是否要匯入外部js庫,"true"爲要匯入;"false"爲沒有要匯入。
2578
			$conf["javaScript::start"]["include"]="true";
2579
			#可省略參數:
2580
			#$conf["fileArgu"],字串,php變數__FILE__的內容,亦即該檔案在檔案系統的絕對路徑,請與參數"jsPosition"一起設置,預設為當前檔案的位置.
2581
			#$conf["fileArgu"]=__FILE__;
2582
			#$conf["jsPosition"],字串,要匯入的js檔案位置,請與參數"fileArgu"一起設置.
2583
			$conf["javaScript::start"]["jsPosition"]=$conf["jsPosition"];
2584
			#$conf["userDir"],字串,網頁是否置放於家目錄底下,"true"為是,"false"為不是,於設為"true".
2585
			#$conf["userDir"]="true";
2586
			$start=javaScript::start($conf["javaScript::start"]);
2587
			unset($conf["javaScript::start"]);
2588
 
2589
			#如果建立匯入js的語法失敗
2590
			if($start["status"]=="false"){
2591
 
2592
				#設置錯誤狀態
2593
				$result["status"]="false";
2594
 
2595
				#設置錯誤提示
2596
				$result["error"]=$start;
2597
 
2598
				#回傳結果
2599
				return $result;
2600
 
2601
				}#if end
2602
 
2603
			#反之
2604
			else{
2605
 
2606
				#取得匯入js的語法
2607
				$result["content"]=$result["content"].$start["content"];
2608
 
2609
				}#else end
2610
 
2611
			#$conf["jsProgramSection"] 有幾個元素就執行幾次
2612
			foreach($conf["jsProgramSection"] as $script){
2613
 
2614
				#換行,然後加上script程式
2615
				$result["content"]=$result["content"]."\r\n".$script;
2616
 
2617
				}#foreach end
2618
 
2619
			#script結束
2620
			#函式說明:
2621
			#script 語法結束
2622
			#回傳結果:
2623
			#javaScript語法
2624
			$result["content"]=$result["content"]."\r\n".javaScript::end();
2625
 
2626
			}#if end
2627
 
2628
		#反之不要 script tag
2629
		else{
2630
 
2631
			#$conf["jsProgramSection"] 有幾個元素就執行幾次
2632
			foreach($conf["jsProgramSection"] as $script){
2633
 
2634
				#換行,然後加上script程式
2635
				$result["content"]=$result["content"]."\r\n".$script;
2636
 
2637
				}#foreach end
2638
 
2639
			}#else end
2640
 
2641
		#設置執行正常
2642
		$result["status"]="true";
2643
 
2644
		#回傳結果
2645
		return $result;
2646
 
2647
		}#function addScriptTag end
2648
 
2649
	/*
2650
	#函式說明:
2651
	#匯入js檔案
2652
	#回傳結果:
2653
	#$result["status"],字串,執行否正常,"true"代表正常,"false"代表不正常.
2654
	#$result["functin"],字串,當前函數的名稱.
2655
	#$result["error"],陣列,錯訊訊息.
2656
	#$result["argu"],陣列,使用的參數.
2657
	#$result["content"],字串,匯入js的語法.
2658
	#必填參數:
2659
	#$conf["jsFileLocation"],陣列字串,多個js檔案的位置與名稱,每個元素代表一個js檔案的位置,js副檔名會自動補上.
2660
	$conf["jsFileLocation"]=array("");
2661
	#$conf["fileArgu"],字串,php變數__FILE__的內容,亦即該檔案在檔案系統的絕對路徑.
2662
	$conf["fileArgu"]=__FILE__;
2663
	#可省略參數:
2664
	#$conf["web"],字串,true代表是網頁系統的位置,"false"代表是檔案系統的位置,預設為"true".
2665
	#$conf["web"]="true";
2666
	#參考資料:
2667
	#php預設常數=>http://php.net/manual/zh/language.constants.predefined.php
2668
	#備註:
2669
	#無.
2670
	*/
2671
	public static function import(&$conf){
2672
 
2673
		#初始化要回傳的內容
2674
		$result=array();
2675
 
2676
		#設置當前執行的函數
2677
		$result["function"]=__FUNCTION__;
2678
 
2679
		#如果 $conf 不為陣列
2680
		if(gettype($conf)!="array"){
2681
 
2682
			#設置執行失敗
2683
			$result["status"]="false";
2684
 
2685
			#設置執行錯誤訊息
2686
			$result["error"][]="\$conf變數須為陣列形態";
2687
 
2688
			#如果傳入的參數為 null
2689
			if($conf==null){
2690
 
2691
				#設置執行錯誤訊息
2692
				$result["error"][]="\$conf變數不得為null,請檢查函數「".$result["function"]."」的參數設置有無正確!";
2693
 
2694
				}#if end
2695
 
2696
			#回傳結果
2697
			return $result;
2698
 
2699
			}#if end
2700
 
2701
		#取得參數
2702
		$result["argv"]=$conf;
2703
 
2704
		#檢查參數
2705
		#函式說明:
2706
		#檢查必填與可省略的參數,可省略參數可指定預設要給與什麼數值內容。
2707
		#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
2708
		#$reuslt["error"],執行不正常結束的錯訊息陣列.
2709
		#$result["function"],當前執行的函式名稱.
2710
		#$result["passed"],識別要檢查的全體變數是否存在以及型態是否正確的變數,"true"代表檢查全部通過;"false"代表檢查不通過
2711
		#$result[$shouldBtCheckedVarName]["varExist"],所檢查的變數是否存在,"false"代表不存在;"true"代表存在
2712
		#$result[$shouldBtCheckedVarName]["varType"],所檢查的變數型態是否正確,"false"代表錯誤;"true"代表正確
2713
		#$result[$shouldBtCheckedVarName]["error"],每個參數設定的錯誤訊息
2714
		#必填參數:
2715
		#$conf["varInput"],陣列變數,要檢查的陣列變數,請在要檢查的參數前面加上&,這樣變動的結果才能被套用。
2716
		$conf["variableCheck::checkArguments"]["varInput"]=&$conf;
2717
		#$conf["mustBeFilledVariableName"],爲必填參數的變數名稱陣列,形態爲陣列變數,例如: $conf["mustBeFilledVariableName"] = array("id","account","password");
2718
		$conf["variableCheck::checkArguments"]["mustBeFilledVariableName"]=array("jsFileLocation","fileArgu");
2719
		#$conf["mustBeFilledVariableType"],爲必填參數的變數陣列應該爲何種變數形態,形態爲陣列 例如: $conf["mustBeFilledVariableType"] = array("string",integer,"double");
2720
		$conf["variableCheck::checkArguments"]["mustBeFilledVariableType"]=array("array","string");
2721
		#$conf["variableCheck::checkArguments"]["referenceVarKey"],字串,$conf參數後面的key值,用於移除不要的參考陣列.
2722
		$conf["variableCheck::checkArguments"]["referenceVarKey"]="variableCheck::checkArguments";
2723
		#可以省略的參數:
2724
		#$conf["canBeEmptyString"],必填變數內容如果是空字串就不能算是有設置的話,請設為"false",預設爲"true"。
2725
		#$conf["variableCheck::checkArguments"]["canBeEmptyString"]="true";
2726
		#$conf["skipableVariableName"],爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableName"] = array("id","account","password");
2727
		$conf["variableCheck::checkArguments"]["skipableVariableName"]=array("web");
2728
		#$conf["skipableVariableType"],爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableType"] = array("string",integer,"double");
2729
		$conf["variableCheck::checkArguments"]["skipableVariableType"]=array("string");
2730
		#$conf["skipableVarDefaultValue"],字串陣列,每個不存在的可省略變數要初始化為什麼,null代表不指定,若預設值是必填參數之一,請將$conf["mustBeFilledVar"]改成"\$conf["\mustBeFilledVar\"]".
2731
		$conf["variableCheck::checkArguments"]["skipableVarDefaultValue"]=array("true");
2732
		#$conf["arrayCountEqualCheck"],字串陣列,為檢查哪些陣列參數的元素數量要一樣,$conf["arrayCountEqualCheck"][$i]=array()為第$i組key為哪些的變數其元素數量要相等.
2733
		#$conf["arrayCountEqualCheck"][]=array();
2734
		$checkResult=variableCheck::checkArguments($conf["variableCheck::checkArguments"]);
2735
		unset($conf["variableCheck::checkArguments"]);
2736
 
2737
		#如果檢查失敗
2738
		if($checkResult["status"]=="false"){
2739
 
2740
			#設置執行不正常
2741
			$result["status"]="false";
2742
 
2743
			#設置錯誤訊息
2744
			$result["error"]=$checkResult;
2745
 
2746
			#回傳結果
2747
			return $result;
2748
 
2749
			}#if end
2750
 
2751
		#如果檢查不通過
2752
		if($checkResult["passed"]=="false"){
2753
 
2754
			#設置執行不正常
2755
			$result["status"]="false";
2756
 
2757
			#設置錯誤訊息
2758
			$result["error"]=$checkResult;
2759
 
2760
			#回傳結果
2761
			return $result;
2762
 
2763
			}#if end
2764
 
2765
		#初始化匯入js檔案的語法
2766
		$result["content"]="";
2767
 
2768
		#針對每個要匯入的javaScript樣式
2769
		foreach($conf["jsFileLocation"] as $jsLocation){
2770
 
2771
			#補上 js 副檔名
2772
			$jsLocation=$jsLocation.".js";
2773
 
2774
			#取得網頁位置
2775
			#函式說明:
2776
			#將檔案的位置名稱變成網址,也可以取得檔案位於伺服器上檔案系統的絕對位置.
2777
			#回傳結果:
2778
			#$result["status"],"true"爲建立成功,"false"爲建立失敗.
2779
			#$result["error"],錯誤訊息陣列.
226 liveuser 2780
			#$result["function"],函數名稱.
3 liveuser 2781
			#$result["argu"],使用的參數.
2782
			#$result["content"],網址,若是在命令列執行,則為"null".
2783
			#$result["webPathFromRoot"],相對於網頁根目錄的路徑.
2784
			#$result["fileSystemAbsoulutePosition"],針對伺服器端的絕對位置,亦即從網頁「document_root」目錄開始的路徑.
2785
			#$result["fileSystemRelativePosition"],針對伺服器檔案系統的相對位置.
2786
			#必填參數:
2787
			#$conf["address"],字串,檔案的相對位置,若為絕對位置則會自動轉換成相對位置.
2788
			$conf["fileAccess::getInternetAddressV2"]["address"]=$jsLocation;
2789
			#$conf["fileArgu"],字串,php變數__FILE__的內容,亦即該檔案在檔案系統的絕對路徑.
2790
			$conf["fileAccess::getInternetAddressV2"]["fileArgu"]=$conf["fileArgu"];
2791
			#可省略參數:
2792
			#$conf["web"],字串,"true"代表檔案是放在web環境;"false"是代表在檔案系統環境,預設為"true".
2793
			$conf["fileAccess::getInternetAddressV2"]["web"]=$conf["web"];
2794
			#備註:
2795
			#建構中,fileSystemRelativePosition尚未實作,檢查參數尚未實作.
2796
			$getInternetAddressV2=fileAccess::getInternetAddressV2($conf["fileAccess::getInternetAddressV2"]);
2797
			unset($conf["fileAccess::getInternetAddressV2"]);
2798
 
2799
			#如果執行失敗
2800
			if($getInternetAddressV2["status"]==="false"){
226 liveuser 2801
 
3 liveuser 2802
				#設置執行不正常
2803
				$result["status"]="false";
2804
 
2805
				#設置錯誤訊息
2806
				$result["error"]=$getInternetAddressV2;
2807
 
2808
				#回傳結果
2809
				return $result;
226 liveuser 2810
 
3 liveuser 2811
				}#if end
226 liveuser 2812
 
2813
			#取得網頁位置
3 liveuser 2814
			$jsLocation=$getInternetAddressV2["content"];
2815
 
2816
			#var_dump($jsLocation);
2817
 
2818
			#函式說明:
2819
			#script 語法開始
2820
			#回傳結果:
2821
			#$result["status"],執行是否正常,"true"為正常,"false"為不正常.
2822
			#$result["error"],錯誤訊息陣列
2823
			#$result["function"],當前執行的函數名稱
2824
			#$result["content"],javaScript語法
2825
			#必填參數:
2826
			$conf["javaScript::start"]["include"]="true";#是否要匯入外部js庫。"true"爲要匯入;"false"爲沒有要匯入。
2827
			#可省略參數:
2828
			$conf["javaScript::start"]["jsPosition"]=$jsLocation;#要匯入的js檔案位置。
2829
			#$conf["javaScript::start"]["fileArgu"],字串,php變數__FILE__的內容,亦即該檔案在檔案系統的絕對路徑.
2830
			$conf["javaScript::start"]["fileArgu"]=$conf["fileArgu"];
2831
			#$conf["javaScript::start"]["web"],字串,網頁是否置放於家目錄底下,"true"為是,"false"為不是,於設為"true".
2832
			$conf["javaScript::start"]["web"]=$conf["web"];
2833
			$start=javaScript::start($conf["javaScript::start"]);
2834
			unset($conf["javaScript::start"]);
2835
 
2836
			#如果script語法開始失敗
2837
			if($start["status"]=="false"){
2838
 
2839
				#設置執行不正常
2840
				$result["status"]="false";
2841
 
2842
				#設置錯誤訊息
2843
				$result["error"]=$start;
2844
 
2845
				#回傳結果
2846
				return $result;
2847
 
2848
				}#if end
2849
 
2850
			#串接每個要匯入js檔案的語法
2851
			$result["content"]=$result["content"].$start["content"].javaScript::end();
2852
 
2853
			}#foreach end
2854
 
2855
		#設置執行正常
2856
		$result["status"]="true";
2857
 
2858
		#回傳結果
2859
		return $result;
2860
 
2861
		}#function import end
2862
 
2863
	/*
2864
	#函式說明:
2865
	#將要執行的script語法透過該函式執行(會在程式外層用<script></script>包起來).
2866
	#回傳結果:
2867
	#$result["status"],執行是否正常,"true"為正常,"false"為不正常.
2868
	#$result["error"],錯誤訊息陣列
2869
	#$result["function"],當前執行的函數名稱
2870
	#$result["content"],要執行的javaScript語法
2871
	#必填參數:
2872
	#$conf["script"],字串,要執行的javaScript語法.
2873
	$conf["script"]="";
2874
	#可省略參數:
2875
	#$conf["onReady"],字串,是否要在網頁完全載入後再執行,"false"為不等載入完就先執行,預設為"true"要等載入完再執行.
2876
	#$conf["onReady"]="true";
2877
	#$conf["globalJs"],字串陣列,為要放入<script>標籤的js全域變數.
2878
	#$conf["globalJs"]=array();
2879
	#$conf["jsFunciton"],字串陣列,為要放入<script>標籤的js函數.
2880
	#$conf["jsFunciton"]=array();
2881
	#$conf["noScriptTag"],字串,是否不要輸出<script></script>,預設為"false",代表要輸出;反之為"true",代表不要輸出.
2882
	#$conf["noScriptTag"]="false";
2883
	#參考資料:
2884
	#http://stackoverflow.com/questions/9899372/pure-javascript-equivalent-to-jquerys-ready-how-to-call-a-function-when-the
2885
	#備註:
2886
	#無.
2887
	*/
2888
	public static function toScript(&$conf){
2889
 
2890
		#初始化要回傳的變數
2891
		$result=array();
2892
 
2893
		#初始化javaScript語法
2894
		$result["content"]="";
2895
 
2896
		#記錄當前執行的函數名稱
2897
		$result["function"]=__FUNCTION__;
2898
 
2899
		#如果 $conf 不為陣列
2900
		if(gettype($conf)!="array"){
2901
 
2902
			#設置執行失敗
2903
			$result["status"]="false";
2904
 
2905
			#設置執行錯誤訊息
2906
			$result["error"][]="\$conf變數須為陣列形態";
2907
 
2908
			#如果傳入的參數為 null
2909
			if($conf==null){
2910
 
2911
				#設置執行錯誤訊息
2912
				$result["error"][]="\$conf變數不得為null,請檢查函數「".$result["function"]."」的參數設置有無正確!";
2913
 
2914
				}#if end
2915
 
2916
			#回傳結果
2917
			return $result;
2918
 
2919
			}#if end
2920
 
2921
		#檢查參數
2922
		#函式說明:
2923
		#檢查必填與可省略的參數,可省略參數可指定預設要給與什麼數值內容。
2924
		#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
2925
		#$reuslt["error"],執行不正常結束的錯訊息陣列.
2926
		#$result["function"],當前執行的函式名稱.
2927
		#$result["passed"],識別要檢查的全體變數是否存在以及型態是否正確的變數,"true"代表檢查全部通過;"false"代表檢查不通過
2928
		#$result[$shouldBtCheckedVarName]["varExist"],所檢查的變數是否存在,"false"代表不存在;"true"代表存在
2929
		#$result[$shouldBtCheckedVarName]["varType"],所檢查的變數型態是否正確,"false"代表錯誤;"true"代表正確
2930
		#$result[$shouldBtCheckedVarName]["error"],每個參數設定的錯誤訊息
2931
		#$result["argu"],字串陣列,目前輸入的參數名稱陣列.
2932
		#$result["legalVarName"],字串陣列,合法可用的參數名稱陣列.
2933
		#$result["notNeedVar"],字串陣列,多餘的參數名稱.
2934
		#必填參數:
2935
		#$conf["variableCheck::checkArguments"]["varInput"],陣列變數,要檢查的陣列變數,請在要檢查的參數前面加上&,這樣變動的結果才能被套用。
2936
		$conf["variableCheck::checkArguments"]["varInput"]=&$conf;
2937
		#$conf["variableCheck::checkArguments"]["mustBeFilledVariableName"],爲必填參數的變數名稱陣列,形態爲陣列變數,例如: $conf["mustBeFilledVariableName"] = array("id","account","password");
2938
		$conf["variableCheck::checkArguments"]["mustBeFilledVariableName"]=array("script");
2939
		#$conf["variableCheck::checkArguments"]["mustBeFilledVariableType"],爲必填參數的變數陣列應該爲何種變數形態,形態爲陣列 例如: $conf["mustBeFilledVariableType"] = array("string",integer,"double");
2940
		$conf["variableCheck::checkArguments"]["mustBeFilledVariableType"]=array("string");
2941
		#$conf["variableCheck::checkArguments"]["referenceVarKey"],字串,$conf參數後面的key值,用於移除不要的參考陣列.
2942
		$conf["variableCheck::checkArguments"]["referenceVarKey"]="variableCheck::checkArguments";
2943
		#可以省略的參數:
2944
		#$conf["variableCheck::checkArguments"]["canBeEmptyString"],必填變數內容如果是空字串就不能算是有設置的話,請設為"false",預設爲"true"。
2945
		$conf["variableCheck::checkArguments"]["canBeEmptyString"]="true";
2946
		#$conf["variableCheck::checkArguments"]["skipableVariableName"],爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableName"] = array("id","account","password");
2947
		$conf["variableCheck::checkArguments"]["skipableVariableName"]=array("onReady","jsFunciton","globalJs","noScriptTag");
2948
		#$conf["variableCheck::checkArguments"]["skipableVariableType"],爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableType"] = array("string",integer,"double");
2949
		$conf["variableCheck::checkArguments"]["skipableVariableType"]=array("string","array","array","string");
2950
		#$conf["variableCheck::checkArguments"]["skipableVarDefaultValue"],字串陣列,每個不存在的可省略變數要初始化為什麼,null與代表不指定,若預設值是必填參數之一,請將$conf["mustBeFilledVar"]改成"\$conf["\mustBeFilledVar\"]".
2951
		$conf["variableCheck::checkArguments"]["skipableVarDefaultValue"]=array("true",null,null,"false");
2952
		#$conf["variableCheck::checkArguments"]["arrayCountEqualCheck"],字串陣列,為檢查哪些陣列參數的元素數量要一樣,$conf["arrayCountEqualCheck"][$i]=array()為第$i組key為哪些的變數其元素數量要相等.
2953
		#$conf["variableCheck::checkArguments"]["arrayCountEqualCheck"][]=array();
2954
		#參考資料來源:
2955
		#array_keys=>http://php.net/manual/en/function.array-keys.php
2956
		$checkResult=variableCheck::checkArguments($conf["variableCheck::checkArguments"]);
2957
		unset($conf["variableCheck::checkArguments"]);
2958
 
2959
		#如果檢查失敗
2960
		if($checkResult["status"]=="false"){
2961
 
2962
			#設置錯誤狀態
2963
			$result["status"]="false";
2964
 
2965
			#設置錯誤提示
2966
			$result["error"]=$checkResult;
2967
 
2968
			#回傳結果
2969
			return $result;
2970
 
2971
			}#if end
2972
 
2973
		#如果檢查不通過
2974
		if($checkResult["passed"]=="false"){
2975
 
2976
			#設置錯誤狀態
2977
			$result["status"]="false";
2978
 
2979
			#設置錯誤提示
2980
			$result["error"]=$checkResult;
2981
 
2982
			#回傳結果
2983
			return $result;
2984
 
2985
			}#if end
2986
 
2987
		#如果不要script標籤
2988
		if($conf["noScriptTag"]==="true"){
226 liveuser 2989
 
3 liveuser 2990
			#如果存在 $conf["globalJs"]
2991
			if(isset($conf["globalJs"])){
226 liveuser 2992
 
3 liveuser 2993
				#針對每個全域js
2994
				foreach($conf["globalJs"] as $jsSection){
226 liveuser 2995
 
3 liveuser 2996
					#取得javaScript開始的語法
2997
					$result["content"]=$result["content"].$jsSection;
226 liveuser 2998
 
3 liveuser 2999
					}#foreach end
226 liveuser 3000
 
3 liveuser 3001
				}#if end
226 liveuser 3002
 
3 liveuser 3003
			#如果存在 $conf["jsFunciton"]
3004
			if(isset($conf["jsFunciton"])){
226 liveuser 3005
 
3 liveuser 3006
				#針對每個js函式
3007
				foreach($conf["jsFunciton"] as $jsSection){
226 liveuser 3008
 
3 liveuser 3009
					#取得javaScript開始的語法
3010
					$result["content"]=$result["content"].$jsSection;
226 liveuser 3011
 
3 liveuser 3012
					}#foreach end
226 liveuser 3013
 
3 liveuser 3014
				}#if end
226 liveuser 3015
 
3 liveuser 3016
			#如果 $conf["onReady"] 為 "true"
3017
			if($conf["onReady"]==="true"){
3018
 
3019
				#用ready條件包住要執行的script內容
3020
				$conf["script"]=
3021
					"
3022
					//run in last
3023
					window.addEventListener('load',async function(event){
3024
						//console.log('All resources finished loading!');
3025
						".$conf["script"]."
3026
					});
3027
					";
3028
 
3029
				#串接要執行的script
3030
				$result["content"]=$result["content"].$conf["script"];
3031
 
3032
				}#if end
226 liveuser 3033
 
3 liveuser 3034
			}#if end
226 liveuser 3035
 
3 liveuser 3036
		#反之
3037
		else{
226 liveuser 3038
 
3 liveuser 3039
			#javaScript開始
3040
			$conf["javaScript"]["start"]["include"]="false";#是否要匯入外部js庫。"true"爲要匯入;"false"爲沒有要匯入。
3041
			#$conf["fileArgu"],字串,php變數__FILE__的內容,亦即該檔案在檔案系統的絕對路徑,請與參數"jsPosition"一起設置.
3042
			#$conf["javaScript"]["start"]["fileArgu"]=$conf["fileArgu"];
3043
			$javaScriptStart=javaScript::start($conf["javaScript"]["start"]);
3044
			unset($conf["javaScript"]["start"]);
3045
 
3046
			#如果 javaScript 開始失敗
3047
			if($javaScriptStart["status"]=="false"){
3048
 
3049
				#設置錯誤狀態
3050
				$result["status"]="false";
3051
 
3052
				#設置錯誤提示
3053
				$result["error"]=$javaScriptStart;
3054
 
3055
				#回傳結果
3056
				return $result;
3057
 
3058
				}#if end
3059
 
3060
			#取得javaScript開始的語法
3061
			$result["content"]=$result["content"].$javaScriptStart["content"];
3062
 
3063
			#如果存在 $conf["globalJs"]
3064
			if(isset($conf["globalJs"])){
3065
 
3066
				#針對每個要放置的js全域變數宣告
3067
				foreach($conf["globalJs"] as $gloJs){
3068
 
3069
					#串接js全域變數宣告
3070
					$result["content"]=$result["content"].$gloJs;
3071
 
3072
					}#foreach end
3073
 
3074
				}#if end
3075
 
3076
			#如果存在 $conf["jsFunciton"]
3077
			if(isset($conf["jsFunciton"])){
3078
 
3079
				#針對每個要放置的js函數
3080
				foreach($conf["jsFunciton"] as $jsFunc){
3081
 
3082
					#串接js函數
3083
					$result["content"]=$result["content"].$jsFunc;
3084
 
3085
					}#foreach end
3086
 
3087
				}#if end
226 liveuser 3088
 
3 liveuser 3089
			#如果 $conf["onReady"] 為 "true"
3090
			if($conf["onReady"]==="true"){
3091
 
3092
				#用ready條件包住要執行的script內容
3093
				$conf["script"]=
3094
					"
3095
					//run in last
3096
					window.addEventListener('load',async function(event){
3097
						//console.log('All resources finished loading!');
3098
						".$conf["script"]."
3099
					});
3100
					";
3101
 
3102
				#串接要執行的script
3103
				$result["content"]=$result["content"].$conf["script"];
3104
 
3105
				}#if end
3106
 
3107
			#反之
3108
			else{
3109
 
3110
				#串接要執行的script
3111
				$result["content"]=$result["content"].$conf["script"];
3112
 
3113
				}#elsd end
3114
 
3115
			#串接 <script>
3116
			$result["content"]=$result["content"].javaScript::end();
226 liveuser 3117
 
3 liveuser 3118
			}#else end
3119
 
3120
		#設置執行正常
3121
		$result["status"]="true";
3122
 
3123
		#回傳結果
3124
		return $result;
3125
 
3126
		}#function toScript end
3127
 
3128
	/*
3129
	#函式說明:
3130
	#測試 webStorage 是否有支援,若印出'Web Storage supported'則代表有支援;若為'Sorry! No Web Storage support..'則代表不支援.
3131
	#回傳結果:
3132
	#$result["status"],執行是否正常,"true"為正常,"false"為不正常.
3133
	#$result["error"],錯誤訊息陣列
3134
	#$result["function"],當前執行的函數名稱
3135
	#$result["content"],要執行的javaScript語法
3136
	#必填參數:
3137
	#無.
3138
	#可省略參數:
3139
	#無.
3140
	#參考資料:
3141
	#無.
3142
	#備註:
3143
	#無.
3144
	*/
3145
	public static function localStorageTest(){
3146
 
3147
		#初始化要回傳的變數
3148
		$result=array();
3149
 
3150
		#記錄當前執行的函數名稱
3151
		$result["function"]=__FUNCTION__;
3152
 
3153
		#測試 web storage js
3154
		$jsStr="
3155
			if(typeof(Storage) !== undefined){
3156
				// Code for localStorage/sessionStorage.
3157
				document.write('Web Storage supported');
3158
				}
3159
			else{
3160
				document.write('Sorry! No Web Storage support..');
3161
			}";
3162
 
3163
		#函式說明:
3164
		#將要執行的script語法透過該函式執行
3165
		#回傳結果:
3166
		#$result["status"],執行是否正常,"true"為正常,"false"為不正常.
3167
		#$result["error"],錯誤訊息陣列
3168
		#$result["function"],當前執行的函數名稱
3169
		#$result["content"],要執行的javaScript語法
3170
		#必填參數:
3171
		#$conf["script"],字串,要執行的javaScript語法,標籤「<script></script>」會自動補上.
3172
		$conf["javaScript::toScript"]["script"]=$jsStr;
3173
		$toScript=javaScript::toScript($conf["javaScript::toScript"]);
3174
		unset($conf["javaScript::toScript"]);
3175
 
3176
		#如果轉換成js語法失敗
3177
		if($toScript["status"]==="false"){
3178
 
3179
			#設置錯誤狀態
3180
			$result["status"]="false";
3181
 
3182
			#設置錯誤提示
3183
			$result["error"]=$toScript;
3184
 
3185
			#回傳結果
3186
			return $result;
3187
 
3188
			}#if end
3189
 
3190
		#取得js語法
3191
		$result["content"]=$toScript["content"];
3192
 
3193
		#設置執行正常
3194
		$result["status"]="true";
3195
 
3196
		#回傳結果
3197
		return $result;
3198
 
3199
		}#function webStorageTest end
3200
 
3201
	/*
3202
	#函式說明:
3203
	#儲存變數到local storage
3204
	#回傳結果:
3205
	#$result["status"],執行是否正常,"true"為正常,"false"為不正常.
3206
	#$result["error"],錯誤訊息陣列
3207
	#$result["function"],當前執行的函數名稱
3208
	#$result["content"],要執行的javaScript語法
3209
	#必填參數:
3210
	#$conf["key"],字串,要儲存的key為何.
3211
	$conf["key"]="";
3212
	#$conf["val"],字串,要儲存的val為何.
3213
	$conf["val"]="";
3214
	#可省略參數:
3215
	#$conf["json"],字串,要儲存的內容是否為json,亦即javascript的物件,"true"代表是,會將$conf["val"]用json_encode函數處理;"false"代表不是,預設為"false".
3216
	#$conf["json"]="";
3217
	#$conf["noScriptTag"],字串,是否不要用script tag包住回傳的內容($result["content"]),"true"代表不要用,"false"代表要用,預設為"false".
3218
	#$conf["noScriptTag"]="false";
3219
	#參考資料:
3220
	#無.
3221
	#備註:
3222
	#無.
3223
	*/
3224
	public static function saveToLocalStorage(&$conf){
3225
 
3226
		#初始化要回傳的結果
3227
		$result=array();
3228
 
3229
		#取得當前執行的函數名稱
3230
		$result["function"]=__FUNCTION__;
3231
 
3232
		#如果沒有參數
3233
		if(func_num_args()==0){
3234
 
3235
			#設置執行失敗
3236
			$result["status"]="false";
3237
 
3238
			#設置執行錯誤訊息
3239
			$result["error"]="函數".$result["function"]."需要參數";
3240
 
3241
			#回傳結果
3242
			return $result;
3243
 
3244
			}#if end
3245
 
3246
		#取得參數
3247
		$result["argu"]=$conf;
3248
 
3249
		#如果 $conf 不為陣列
3250
		if(gettype($conf)!="array"){
3251
 
3252
			#設置執行失敗
3253
			$result["status"]="false";
3254
 
3255
			#設置執行錯誤訊息
3256
			$result["error"][]="\$conf變數須為陣列形態";
3257
 
3258
			#如果傳入的參數為 null
3259
			if($conf==null){
3260
 
3261
				#設置執行錯誤訊息
3262
				$result["error"][]="\$conf變數不得為null,請檢查函數「".$result["function"]."」的參數設置有無正確!";
3263
 
3264
				}#if end
3265
 
3266
			#回傳結果
3267
			return $result;
3268
 
3269
			}#if end
3270
 
3271
		#檢查參數
3272
		#函式說明:
3273
		#檢查必填與可省略的參數,可省略參數可指定預設要給與什麼數值內容。
3274
		#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
3275
		#$reuslt["error"],執行不正常結束的錯訊息陣列.
3276
		#$result["function"],當前執行的函式名稱.
3277
		#$result["passed"],識別要檢查的全體變數是否存在以及型態是否正確的變數,"true"代表檢查全部通過;"false"代表檢查不通過
3278
		#$result[$shouldBtCheckedVarName]["varExist"],所檢查的變數是否存在,"false"代表不存在;"true"代表存在
3279
		#$result[$shouldBtCheckedVarName]["varType"],所檢查的變數型態是否正確,"false"代表錯誤;"true"代表正確
3280
		#$result[$shouldBtCheckedVarName]["error"],每個參數設定的錯誤訊息
3281
		#$result["argu"],字串陣列,目前輸入的參數名稱陣列.
3282
		#$result["legalVarName"],字串陣列,合法可用的參數名稱陣列.
3283
		#$result["notNeedVar"],字串陣列,多餘的參數名稱.
3284
		#必填參數:
3285
		#$conf["variableCheck::checkArguments"]["varInput"],陣列變數,要檢查的陣列變數,請在要檢查的參數前面加上&,這樣變動的結果才能被套用。
3286
		$conf["variableCheck::checkArguments"]["varInput"]=&$conf;
3287
		#$conf["variableCheck::checkArguments"]["mustBeFilledVariableName"],爲必填參數的變數名稱陣列,形態爲陣列變數,例如: $conf["mustBeFilledVariableName"] = array("id","account","password");
3288
		$conf["variableCheck::checkArguments"]["mustBeFilledVariableName"]=array("key","val");
3289
		#$conf["variableCheck::checkArguments"]["mustBeFilledVariableType"],爲必填參數的變數陣列應該爲何種變數形態,形態爲陣列 例如: $conf["mustBeFilledVariableType"] = array("string",integer,"double");
3290
		$conf["variableCheck::checkArguments"]["mustBeFilledVariableType"]=array("string","string");
3291
		#$conf["variableCheck::checkArguments"]["referenceVarKey"],字串,$conf參數後面的key值,用於移除不要的參考陣列.
3292
		$conf["variableCheck::checkArguments"]["referenceVarKey"]="variableCheck::checkArguments";
3293
		#可以省略的參數:
3294
		#$conf["variableCheck::checkArguments"]["canBeEmptyString"],必填變數內容如果是空字串就不能算是有設置的話,請設為"false",預設爲"true"。
3295
		$conf["variableCheck::checkArguments"]["canBeEmptyString"]="true";
3296
		#$conf["canNotBeEmpty"],字串陣列,哪些必填參數的內容不得為空字串或空陣列,僅當$conf["canBeEmptyString"]為"true"時會生效.
3297
		$conf["variableCheck::checkArguments"]["canNotBeEmpty"]=array("key");
3298
		#$conf["canBeEmpty"],字串陣列,哪些必填參數的內容可為空字串或空陣列,僅當$conf["canBeEmptyString"]為"false"時會生效.
3299
		#$conf["canBeEmpty"]=array();
3300
		#$conf["variableCheck::checkArguments"]["skipableVariableName"],爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableName"] = array("id","account","password");
3301
		$conf["variableCheck::checkArguments"]["skipableVariableName"]=array("json","noScriptTag");
3302
		#$conf["variableCheck::checkArguments"]["skipableVariableType"],爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableType"] = array("string",integer,"double");
3303
		$conf["variableCheck::checkArguments"]["skipableVariableType"]=array("string","string");
3304
		#$conf["variableCheck::checkArguments"]["skipableVarDefaultValue"],字串陣列,每個不存在的可省略變數要初始化為什麼,null與代表不指定,若預設值是必填參數之一,請將$conf["mustBeFilledVar"]改成"\$conf["\mustBeFilledVar\"]".
3305
		$conf["variableCheck::checkArguments"]["skipableVarDefaultValue"]=array("false","false");
3306
		#$conf["variableCheck::checkArguments"]["arrayCountEqualCheck"],字串陣列,為檢查哪些陣列參數的元素數量要一樣,$conf["arrayCountEqualCheck"][$i]=array()為第$i組key為哪些的變數其元素數量要相等.
3307
		#$conf["variableCheck::checkArguments"]["arrayCountEqualCheck"][]=array();
3308
		#參考資料來源:
3309
		#array_keys=>http://php.net/manual/en/function.array-keys.php
3310
		$checkResult=variableCheck::checkArguments($conf["variableCheck::checkArguments"]);
3311
		unset($conf["variableCheck::checkArguments"]);
3312
 
3313
		#如果檢查失敗
3314
		if($checkResult["status"]=="false"){
3315
 
3316
			#設置錯誤狀態
3317
			$result["status"]="false";
3318
 
3319
			#設置錯誤提示
3320
			$result["error"]=$checkResult;
3321
 
3322
			#回傳結果
3323
			return $result;
3324
 
3325
			}#if end
3326
 
3327
		#如果檢查不通過
3328
		if($checkResult["passed"]=="false"){
3329
 
3330
			#設置錯誤狀態
3331
			$result["status"]="false";
3332
 
3333
			#設置錯誤提示
3334
			$result["error"]=$checkResult;
3335
 
3336
			#回傳結果
3337
			return $result;
3338
 
3339
			}#if end
3340
 
3341
		#如果要轉成json字串
3342
		if($conf["json"]==="true"){
3343
 
3344
			#javascript 字串
3345
			$jsStr="localStorage.".$conf["key"]." = '".json_encode($conf["val"])."';";
3346
 
3347
			}#if end
3348
 
3349
		#反之不用轉換
3350
		else{
3351
 
3352
			#javascript 字串
3353
			$jsStr="localStorage.".$conf["key"]." = '".$conf["val"]."';";
3354
 
3355
			}#else end
3356
 
3357
		#如果要 script tag
3358
		if($conf["noScriptTag"]=="false"){
3359
 
3360
			#函式說明:
3361
			#將要執行的script語法透過該函式執行
3362
			#回傳結果:
3363
			#$result["status"],執行是否正常,"true"為正常,"false"為不正常.
3364
			#$result["error"],錯誤訊息陣列
3365
			#$result["function"],當前執行的函數名稱
3366
			#$result["content"],要執行的javaScript語法
3367
			#必填參數:
3368
			#$conf["script"],字串,要執行的javaScript語法,標籤「<script></script>」會自動補上.
3369
			$conf["javaScript::toScript"]["script"]=$jsStr;
3370
			$toScript=javaScript::toScript($conf["javaScript::toScript"]);
3371
			unset($conf["javaScript::toScript"]);
3372
 
3373
			#如果轉換成js語法失敗
3374
			if($toScript["status"]==="false"){
3375
 
3376
				#設置錯誤狀態
3377
				$result["status"]="false";
3378
 
3379
				#設置錯誤提示
3380
				$result["error"]=$toScript;
3381
 
3382
				#回傳結果
3383
				return $result;
3384
 
3385
				}#if end
3386
 
3387
			#取得js語法
3388
			$result["content"]=$toScript["content"];
3389
 
3390
			}#if end
3391
 
3392
		#反之不要 script tag
3393
		else{
3394
 
3395
			#取得js語法
3396
			$result["content"]=$jsStr;
3397
 
3398
			}#else end
3399
 
3400
		#設置執行正常
3401
		$result["status"]="true";
3402
 
3403
		#回傳結果
3404
		return $result;
3405
 
3406
		}#function saveToLocalStorage end
3407
 
3408
	/*
3409
	#函式說明:
3410
	#儲存變數到session storage
3411
	#回傳結果:
3412
	#$result["status"],執行是否正常,"true"為正常,"false"為不正常.
3413
	#$result["error"],錯誤訊息陣列
3414
	#$result["function"],當前執行的函數名稱
3415
	#$result["content"],要執行的javaScript語法
3416
	#必填參數:
3417
	#$conf["key"],字串,要儲存的key為何.
3418
	$conf["key"]="";
3419
	#$conf["val"],字串,要儲存的val為何.
3420
	$conf["val"]="";
3421
	#可省略參數:
3422
	#$conf["json"],字串,要儲存的內容是否為json,亦即javascript的物件,"true"代表是,會將$conf["val"]用json_encode函數處理;"false"代表不是,預設為"false".
3423
	#$conf["json"]="";
3424
	#$conf["noScriptTag"],字串,是否不要用script tag包住回傳的內容($result["content"]),"true"代表不要用,"false"代表要用,預設為"false".
3425
	#$conf["noScriptTag"]="false";
3426
	#參考資料:
3427
	#無.
3428
	#備註:
3429
	#無.
3430
	*/
3431
	public static function saveToSessionStorage(&$conf){
3432
 
3433
		#初始化要回傳的結果
3434
		$result=array();
3435
 
3436
		#取得當前執行的函數名稱
3437
		$result["function"]=__FUNCTION__;
3438
 
3439
		#如果沒有參數
3440
		if(func_num_args()==0){
3441
 
3442
			#設置執行失敗
3443
			$result["status"]="false";
3444
 
3445
			#設置執行錯誤訊息
3446
			$result["error"]="函數".$result["function"]."需要參數";
3447
 
3448
			#回傳結果
3449
			return $result;
3450
 
3451
			}#if end
3452
 
3453
		#取得參數
3454
		$result["argu"]=$conf;
3455
 
3456
		#如果 $conf 不為陣列
3457
		if(gettype($conf)!="array"){
3458
 
3459
			#設置執行失敗
3460
			$result["status"]="false";
3461
 
3462
			#設置執行錯誤訊息
3463
			$result["error"][]="\$conf變數須為陣列形態";
3464
 
3465
			#如果傳入的參數為 null
3466
			if($conf==null){
3467
 
3468
				#設置執行錯誤訊息
3469
				$result["error"][]="\$conf變數不得為null,請檢查函數「".$result["function"]."」的參數設置有無正確!";
3470
 
3471
				}#if end
3472
 
3473
			#回傳結果
3474
			return $result;
3475
 
3476
			}#if end
3477
 
3478
		#檢查參數
3479
		#函式說明:
3480
		#檢查必填與可省略的參數,可省略參數可指定預設要給與什麼數值內容。
3481
		#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
3482
		#$reuslt["error"],執行不正常結束的錯訊息陣列.
3483
		#$result["function"],當前執行的函式名稱.
3484
		#$result["passed"],識別要檢查的全體變數是否存在以及型態是否正確的變數,"true"代表檢查全部通過;"false"代表檢查不通過
3485
		#$result[$shouldBtCheckedVarName]["varExist"],所檢查的變數是否存在,"false"代表不存在;"true"代表存在
3486
		#$result[$shouldBtCheckedVarName]["varType"],所檢查的變數型態是否正確,"false"代表錯誤;"true"代表正確
3487
		#$result[$shouldBtCheckedVarName]["error"],每個參數設定的錯誤訊息
3488
		#$result["argu"],字串陣列,目前輸入的參數名稱陣列.
3489
		#$result["legalVarName"],字串陣列,合法可用的參數名稱陣列.
3490
		#$result["notNeedVar"],字串陣列,多餘的參數名稱.
3491
		#必填參數:
3492
		#$conf["variableCheck::checkArguments"]["varInput"],陣列變數,要檢查的陣列變數,請在要檢查的參數前面加上&,這樣變動的結果才能被套用。
3493
		$conf["variableCheck::checkArguments"]["varInput"]=&$conf;
3494
		#$conf["variableCheck::checkArguments"]["mustBeFilledVariableName"],爲必填參數的變數名稱陣列,形態爲陣列變數,例如: $conf["mustBeFilledVariableName"] = array("id","account","password");
3495
		$conf["variableCheck::checkArguments"]["mustBeFilledVariableName"]=array("key","val");
3496
		#$conf["variableCheck::checkArguments"]["mustBeFilledVariableType"],爲必填參數的變數陣列應該爲何種變數形態,形態爲陣列 例如: $conf["mustBeFilledVariableType"] = array("string",integer,"double");
3497
		$conf["variableCheck::checkArguments"]["mustBeFilledVariableType"]=array("string","string");
3498
		#$conf["variableCheck::checkArguments"]["referenceVarKey"],字串,$conf參數後面的key值,用於移除不要的參考陣列.
3499
		$conf["variableCheck::checkArguments"]["referenceVarKey"]="variableCheck::checkArguments";
3500
		#可以省略的參數:
3501
		#$conf["variableCheck::checkArguments"]["canBeEmptyString"],必填變數內容如果是空字串就不能算是有設置的話,請設為"false",預設爲"true"。
3502
		$conf["variableCheck::checkArguments"]["canBeEmptyString"]="true";
3503
		#$conf["canNotBeEmpty"],字串陣列,哪些必填參數的內容不得為空字串或空陣列,僅當$conf["canBeEmptyString"]為"true"時會生效.
3504
		$conf["variableCheck::checkArguments"]["canNotBeEmpty"]=array("key");
3505
		#$conf["canBeEmpty"],字串陣列,哪些必填參數的內容可為空字串或空陣列,僅當$conf["canBeEmptyString"]為"false"時會生效.
3506
		#$conf["canBeEmpty"]=array();
3507
		#$conf["variableCheck::checkArguments"]["skipableVariableName"],爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableName"] = array("id","account","password");
3508
		$conf["variableCheck::checkArguments"]["skipableVariableName"]=array("json","noScriptTag");
3509
		#$conf["variableCheck::checkArguments"]["skipableVariableType"],爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableType"] = array("string",integer,"double");
3510
		$conf["variableCheck::checkArguments"]["skipableVariableType"]=array("string","string");
3511
		#$conf["variableCheck::checkArguments"]["skipableVarDefaultValue"],字串陣列,每個不存在的可省略變數要初始化為什麼,null與代表不指定,若預設值是必填參數之一,請將$conf["mustBeFilledVar"]改成"\$conf["\mustBeFilledVar\"]".
3512
		$conf["variableCheck::checkArguments"]["skipableVarDefaultValue"]=array("false","false");
3513
		#$conf["variableCheck::checkArguments"]["arrayCountEqualCheck"],字串陣列,為檢查哪些陣列參數的元素數量要一樣,$conf["arrayCountEqualCheck"][$i]=array()為第$i組key為哪些的變數其元素數量要相等.
3514
		#$conf["variableCheck::checkArguments"]["arrayCountEqualCheck"][]=array();
3515
		#參考資料來源:
3516
		#array_keys=>http://php.net/manual/en/function.array-keys.php
3517
		$checkResult=variableCheck::checkArguments($conf["variableCheck::checkArguments"]);
3518
		unset($conf["variableCheck::checkArguments"]);
3519
 
3520
		#如果檢查失敗
3521
		if($checkResult["status"]=="false"){
3522
 
3523
			#設置錯誤狀態
3524
			$result["status"]="false";
3525
 
3526
			#設置錯誤提示
3527
			$result["error"]=$checkResult;
3528
 
3529
			#回傳結果
3530
			return $result;
3531
 
3532
			}#if end
3533
 
3534
		#如果檢查不通過
3535
		if($checkResult["passed"]=="false"){
3536
 
3537
			#設置錯誤狀態
3538
			$result["status"]="false";
3539
 
3540
			#設置錯誤提示
3541
			$result["error"]=$checkResult;
3542
 
3543
			#回傳結果
3544
			return $result;
3545
 
3546
			}#if end
3547
 
3548
		#如果要轉成json字串
3549
		if($conf["json"]==="true"){
3550
 
3551
			#javascript 字串
3552
			$jsStr="sessionStorage.".$conf["key"]." = '".json_encode($conf["val"])."';";
3553
 
3554
			}#if end
3555
 
3556
		#反之不用轉換
3557
		else{
3558
 
3559
			#javascript 字串
3560
			$jsStr="sessionStorage.".$conf["key"]." = '".$conf["val"]."';";
3561
 
3562
			}#else end
3563
 
3564
		#如果要 script tag
3565
		if($conf["noScriptTag"]=="false"){
3566
 
3567
			#函式說明:
3568
			#將要執行的script語法透過該函式執行
3569
			#回傳結果:
3570
			#$result["status"],執行是否正常,"true"為正常,"false"為不正常.
3571
			#$result["error"],錯誤訊息陣列
3572
			#$result["function"],當前執行的函數名稱
3573
			#$result["content"],要執行的javaScript語法
3574
			#必填參數:
3575
			#$conf["script"],字串,要執行的javaScript語法,標籤「<script></script>」會自動補上.
3576
			$conf["javaScript::toScript"]["script"]=$jsStr;
3577
			$toScript=javaScript::toScript($conf["javaScript::toScript"]);
3578
			unset($conf["javaScript::toScript"]);
3579
 
3580
			#如果轉換成js語法失敗
3581
			if($toScript["status"]==="false"){
3582
 
3583
				#設置錯誤狀態
3584
				$result["status"]="false";
3585
 
3586
				#設置錯誤提示
3587
				$result["error"]=$toScript;
3588
 
3589
				#回傳結果
3590
				return $result;
3591
 
3592
				}#if end
3593
 
3594
			#取得js語法
3595
			$result["content"]=$toScript["content"];
3596
 
3597
			}#if end
3598
 
3599
		#反之不要 script tag
3600
		else{
3601
 
3602
			#取得js語法
3603
			$result["content"]=$jsStr;
3604
 
3605
			}#else end
3606
 
3607
		#設置執行正常
3608
		$result["status"]="true";
3609
 
3610
		#回傳結果
3611
		return $result;
3612
 
3613
		}#function saveToSessionStorage end
3614
 
3615
	/*
3616
	#函式說明:
3617
	#取得儲存在local storage的變數
3618
	#回傳結果:
3619
	#$result["status"],執行是否正常,"true"為正常,"false"為不正常.
3620
	#$result["error"],錯誤訊息陣列
3621
	#$result["function"],當前執行的函數名稱
3622
	#$result["content"],要執行的javaScript語法
3623
	#必填參數:
3624
	#$conf["key"],字串,要儲存的key為何.
3625
	$conf["key"]="";
3626
	#$conf["storeVar"],字串,要儲存到哪個javascript變數裡面.
3627
	$conf["storeVar"]="";
3628
	#可省略參數:
3629
	#$conf["noScriptTag"],字串,是否不要<script></script>,"true"代表不要,"false"代表不用,預設為"false".
3630
	#$conf["noScriptTag"]="false";
3631
	#$conf["json"],字串要取出的資料是否json,"true"代表是,"false"代表不是,預設為"false".
3632
	#$conf["json"]="false";
3633
	#參考資料:
3634
	#無.
3635
	#備註:
3636
	#無.
3637
	*/
3638
	public static function getLocalStorage(&$conf){
3639
 
3640
		#初始化要回傳的結果
3641
		$result=array();
3642
 
3643
		#取得當前執行的函數名稱
3644
		$result["function"]=__FUNCTION__;
3645
 
3646
		#如果沒有參數
3647
		if(func_num_args()==0){
3648
 
3649
			#設置執行失敗
3650
			$result["status"]="false";
3651
 
3652
			#設置執行錯誤訊息
3653
			$result["error"]="函數".$result["function"]."需要參數";
3654
 
3655
			#回傳結果
3656
			return $result;
3657
 
3658
			}#if end
3659
 
3660
		#取得參數
3661
		$result["argu"]=$conf;
3662
 
3663
		#如果 $conf 不為陣列
3664
		if(gettype($conf)!="array"){
3665
 
3666
			#設置執行失敗
3667
			$result["status"]="false";
3668
 
3669
			#設置執行錯誤訊息
3670
			$result["error"][]="\$conf變數須為陣列形態";
3671
 
3672
			#如果傳入的參數為 null
3673
			if($conf==null){
3674
 
3675
				#設置執行錯誤訊息
3676
				$result["error"][]="\$conf變數不得為null,請檢查函數「".$result["function"]."」的參數設置有無正確!";
3677
 
3678
				}#if end
3679
 
3680
			#回傳結果
3681
			return $result;
3682
 
3683
			}#if end
3684
 
3685
		#檢查參數
3686
		#函式說明:
3687
		#檢查必填與可省略的參數,可省略參數可指定預設要給與什麼數值內容。
3688
		#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
3689
		#$reuslt["error"],執行不正常結束的錯訊息陣列.
3690
		#$result["function"],當前執行的函式名稱.
3691
		#$result["passed"],識別要檢查的全體變數是否存在以及型態是否正確的變數,"true"代表檢查全部通過;"false"代表檢查不通過
3692
		#$result[$shouldBtCheckedVarName]["varExist"],所檢查的變數是否存在,"false"代表不存在;"true"代表存在
3693
		#$result[$shouldBtCheckedVarName]["varType"],所檢查的變數型態是否正確,"false"代表錯誤;"true"代表正確
3694
		#$result[$shouldBtCheckedVarName]["error"],每個參數設定的錯誤訊息
3695
		#$result["argu"],字串陣列,目前輸入的參數名稱陣列.
3696
		#$result["legalVarName"],字串陣列,合法可用的參數名稱陣列.
3697
		#$result["notNeedVar"],字串陣列,多餘的參數名稱.
3698
		#必填參數:
3699
		#$conf["variableCheck::checkArguments"]["varInput"],陣列變數,要檢查的陣列變數,請在要檢查的參數前面加上&,這樣變動的結果才能被套用。
3700
		$conf["variableCheck::checkArguments"]["varInput"]=&$conf;
3701
		#$conf["variableCheck::checkArguments"]["mustBeFilledVariableName"],爲必填參數的變數名稱陣列,形態爲陣列變數,例如: $conf["mustBeFilledVariableName"] = array("id","account","password");
3702
		$conf["variableCheck::checkArguments"]["mustBeFilledVariableName"]=array("key","storeVar");
3703
		#$conf["variableCheck::checkArguments"]["mustBeFilledVariableType"],爲必填參數的變數陣列應該爲何種變數形態,形態爲陣列 例如: $conf["mustBeFilledVariableType"] = array("string",integer,"double");
3704
		$conf["variableCheck::checkArguments"]["mustBeFilledVariableType"]=array("string","string");
3705
		#$conf["variableCheck::checkArguments"]["referenceVarKey"],字串,$conf參數後面的key值,用於移除不要的參考陣列.
3706
		$conf["variableCheck::checkArguments"]["referenceVarKey"]="variableCheck::checkArguments";
3707
		#可以省略的參數:
3708
		#$conf["variableCheck::checkArguments"]["canBeEmptyString"],必填變數內容如果是空字串就不能算是有設置的話,請設為"false",預設爲"true"。
3709
		$conf["variableCheck::checkArguments"]["canBeEmptyString"]="false";
3710
		#$conf["canNotBeEmpty"],字串陣列,哪些必填參數的內容不得為空字串或空陣列,僅當$conf["canBeEmptyString"]為"true"時會生效.
3711
		#$conf["variableCheck::checkArguments"]["canNotBeEmpty"]=array("key");
3712
		#$conf["canBeEmpty"],字串陣列,哪些必填參數的內容可為空字串或空陣列,僅當$conf["canBeEmptyString"]為"false"時會生效.
3713
		#$conf["canBeEmpty"]=array();
3714
		#$conf["variableCheck::checkArguments"]["skipableVariableName"],爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableName"] = array("id","account","password");
3715
		$conf["variableCheck::checkArguments"]["skipableVariableName"]=array("noScriptTag","json");
3716
		#$conf["variableCheck::checkArguments"]["skipableVariableType"],爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableType"] = array("string",integer,"double");
3717
		$conf["variableCheck::checkArguments"]["skipableVariableType"]=array("string","string");
3718
		#$conf["variableCheck::checkArguments"]["skipableVarDefaultValue"],字串陣列,每個不存在的可省略變數要初始化為什麼,null與代表不指定,若預設值是必填參數之一,請將$conf["mustBeFilledVar"]改成"\$conf["\mustBeFilledVar\"]".
3719
		$conf["variableCheck::checkArguments"]["skipableVarDefaultValue"]=array("false","false");
3720
		#$conf["variableCheck::checkArguments"]["arrayCountEqualCheck"],字串陣列,為檢查哪些陣列參數的元素數量要一樣,$conf["arrayCountEqualCheck"][$i]=array()為第$i組key為哪些的變數其元素數量要相等.
3721
		#$conf["variableCheck::checkArguments"]["arrayCountEqualCheck"][]=array();
3722
		#參考資料來源:
3723
		#array_keys=>http://php.net/manual/en/function.array-keys.php
3724
		$checkResult=variableCheck::checkArguments($conf["variableCheck::checkArguments"]);
3725
		unset($conf["variableCheck::checkArguments"]);
3726
 
3727
		#如果檢查失敗
3728
		if($checkResult["status"]=="false"){
3729
 
3730
			#設置錯誤狀態
3731
			$result["status"]="false";
3732
 
3733
			#設置錯誤提示
3734
			$result["error"]=$checkResult;
3735
 
3736
			#回傳結果
3737
			return $result;
3738
 
3739
			}#if end
3740
 
3741
		#如果檢查不通過
3742
		if($checkResult["passed"]=="false"){
3743
 
3744
			#設置錯誤狀態
3745
			$result["status"]="false";
3746
 
3747
			#設置錯誤提示
3748
			$result["error"]=$checkResult;
3749
 
3750
			#回傳結果
3751
			return $result;
3752
 
3753
			}#if end
3754
 
3755
		#如果要抓的變數不是json
3756
		if($conf["json"]==="false"){
3757
 
3758
			#設置抓取local storage 變數的 js 語法
3759
			$jsStr="
3760
			//判斷 local storage 變數是否存在
3761
			if(localStorage.".$conf["key"]."!=undefined)
3762
			{
3763
				//取得 local storage 變數
3764
				".$conf["storeVar"]."=localStorage.".$conf["key"].";
3765
			}";
3766
 
3767
			}#if end
3768
 
3769
		#反之為json變數
3770
		else{
3771
 
3772
			#設置抓取local storage 變數的 js 語法
3773
			$jsStr="
3774
			//判斷 local storage 變數是否存在
3775
			if(localStorage.".$conf["key"]."!=undefined)
3776
			{
3777
				//取得 local storage 變數
3778
				".$conf["storeVar"]."=JSON.parse(localStorage.".$conf["key"].");
3779
			}";
3780
 
3781
			}#else end
3782
 
3783
		#如果要 script tag
3784
		if($conf["noScriptTag"]==="false"){
3785
 
3786
			#函式說明:
3787
			#將要執行的script語法透過該函式執行
3788
			#回傳結果:
3789
			#$result["status"],執行是否正常,"true"為正常,"false"為不正常.
3790
			#$result["error"],錯誤訊息陣列
3791
			#$result["function"],當前執行的函數名稱
3792
			#$result["content"],要執行的javaScript語法
3793
			#必填參數:
3794
			#$conf["script"],字串,要執行的javaScript語法,標籤「<script></script>」會自動補上.
3795
			$conf["javaScript::toScript"]["script"]=$jsStr;
3796
			$toScript=javaScript::toScript($conf["javaScript::toScript"]);
3797
			unset($conf["javaScript::toScript"]);
3798
 
3799
			#如果轉換成js語法失敗
3800
			if($toScript["status"]==="false"){
3801
 
3802
				#設置錯誤狀態
3803
				$result["status"]="false";
3804
 
3805
				#設置錯誤提示
3806
				$result["error"]=$toScript;
3807
 
3808
				#回傳結果
3809
				return $result;
3810
 
3811
				}#if end
3812
 
3813
			#取得js語法
3814
			$result["content"]=$toScript["content"];
3815
 
3816
			}#if end
3817
 
3818
		#反之不要<script></script>
3819
		else{
3820
 
3821
			$result["content"]=$jsStr;
3822
 
3823
			}#else end
3824
 
3825
		#設置執行正常
3826
		$result["status"]="true";
3827
 
3828
		#回傳結果
3829
		return $result;
3830
 
3831
		}#function getLocalStorage end
3832
 
3833
	/*
3834
	#函式說明:
3835
	#取得儲存在session storage的變數
3836
	#回傳結果:
3837
	#$result["status"],執行是否正常,"true"為正常,"false"為不正常.
3838
	#$result["error"],錯誤訊息陣列
3839
	#$result["function"],當前執行的函數名稱
3840
	#$result["content"],要執行的javaScript語法
3841
	#必填參數:
3842
	#$conf["key"],字串,要儲存的key為何.
3843
	$conf["key"]="";
3844
	#$conf["storeVar"],字串,要儲存到哪個javascript變數裡面.
3845
	$conf["storeVar"]="";
3846
	#可省略參數:
3847
	#$conf["noScriptTag"],字串,是否不要<script></script>,"true"代表不要,"false"代表不用,預設為"false".
3848
	#$conf["noScriptTag"]="false";
3849
	#$conf["json"],字串要取出的資料是否json,"true"代表是,"false"代表不是,預設為"false".
3850
	#$conf["json"]="false";
3851
	#參考資料:
3852
	#無.
3853
	#備註:
3854
	#無.
3855
	*/
3856
	public static function getSessionStorage(&$conf){
3857
 
3858
		#初始化要回傳的結果
3859
		$result=array();
3860
 
3861
		#取得當前執行的函數名稱
3862
		$result["function"]=__FUNCTION__;
3863
 
3864
		#如果沒有參數
3865
		if(func_num_args()==0){
3866
 
3867
			#設置執行失敗
3868
			$result["status"]="false";
3869
 
3870
			#設置執行錯誤訊息
3871
			$result["error"]="函數".$result["function"]."需要參數";
3872
 
3873
			#回傳結果
3874
			return $result;
3875
 
3876
			}#if end
3877
 
3878
		#取得參數
3879
		$result["argu"]=$conf;
3880
 
3881
		#如果 $conf 不為陣列
3882
		if(gettype($conf)!="array"){
3883
 
3884
			#設置執行失敗
3885
			$result["status"]="false";
3886
 
3887
			#設置執行錯誤訊息
3888
			$result["error"][]="\$conf變數須為陣列形態";
3889
 
3890
			#如果傳入的參數為 null
3891
			if($conf==null){
3892
 
3893
				#設置執行錯誤訊息
3894
				$result["error"][]="\$conf變數不得為null,請檢查函數「".$result["function"]."」的參數設置有無正確!";
3895
 
3896
				}#if end
3897
 
3898
			#回傳結果
3899
			return $result;
3900
 
3901
			}#if end
3902
 
3903
		#檢查參數
3904
		#函式說明:
3905
		#檢查必填與可省略的參數,可省略參數可指定預設要給與什麼數值內容。
3906
		#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
3907
		#$reuslt["error"],執行不正常結束的錯訊息陣列.
3908
		#$result["function"],當前執行的函式名稱.
3909
		#$result["passed"],識別要檢查的全體變數是否存在以及型態是否正確的變數,"true"代表檢查全部通過;"false"代表檢查不通過
3910
		#$result[$shouldBtCheckedVarName]["varExist"],所檢查的變數是否存在,"false"代表不存在;"true"代表存在
3911
		#$result[$shouldBtCheckedVarName]["varType"],所檢查的變數型態是否正確,"false"代表錯誤;"true"代表正確
3912
		#$result[$shouldBtCheckedVarName]["error"],每個參數設定的錯誤訊息
3913
		#$result["argu"],字串陣列,目前輸入的參數名稱陣列.
3914
		#$result["legalVarName"],字串陣列,合法可用的參數名稱陣列.
3915
		#$result["notNeedVar"],字串陣列,多餘的參數名稱.
3916
		#必填參數:
3917
		#$conf["variableCheck::checkArguments"]["varInput"],陣列變數,要檢查的陣列變數,請在要檢查的參數前面加上&,這樣變動的結果才能被套用。
3918
		$conf["variableCheck::checkArguments"]["varInput"]=&$conf;
3919
		#$conf["variableCheck::checkArguments"]["mustBeFilledVariableName"],爲必填參數的變數名稱陣列,形態爲陣列變數,例如: $conf["mustBeFilledVariableName"] = array("id","account","password");
3920
		$conf["variableCheck::checkArguments"]["mustBeFilledVariableName"]=array("key","storeVar");
3921
		#$conf["variableCheck::checkArguments"]["mustBeFilledVariableType"],爲必填參數的變數陣列應該爲何種變數形態,形態爲陣列 例如: $conf["mustBeFilledVariableType"] = array("string",integer,"double");
3922
		$conf["variableCheck::checkArguments"]["mustBeFilledVariableType"]=array("string","string");
3923
		#$conf["variableCheck::checkArguments"]["referenceVarKey"],字串,$conf參數後面的key值,用於移除不要的參考陣列.
3924
		$conf["variableCheck::checkArguments"]["referenceVarKey"]="variableCheck::checkArguments";
3925
		#可以省略的參數:
3926
		#$conf["variableCheck::checkArguments"]["canBeEmptyString"],必填變數內容如果是空字串就不能算是有設置的話,請設為"false",預設爲"true"。
3927
		$conf["variableCheck::checkArguments"]["canBeEmptyString"]="false";
3928
		#$conf["canNotBeEmpty"],字串陣列,哪些必填參數的內容不得為空字串或空陣列,僅當$conf["canBeEmptyString"]為"true"時會生效.
3929
		#$conf["variableCheck::checkArguments"]["canNotBeEmpty"]=array("key");
3930
		#$conf["canBeEmpty"],字串陣列,哪些必填參數的內容可為空字串或空陣列,僅當$conf["canBeEmptyString"]為"false"時會生效.
3931
		#$conf["canBeEmpty"]=array();
3932
		#$conf["variableCheck::checkArguments"]["skipableVariableName"],爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableName"] = array("id","account","password");
3933
		$conf["variableCheck::checkArguments"]["skipableVariableName"]=array("noScriptTag","json");
3934
		#$conf["variableCheck::checkArguments"]["skipableVariableType"],爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableType"] = array("string",integer,"double");
3935
		$conf["variableCheck::checkArguments"]["skipableVariableType"]=array("string","string");
3936
		#$conf["variableCheck::checkArguments"]["skipableVarDefaultValue"],字串陣列,每個不存在的可省略變數要初始化為什麼,null與代表不指定,若預設值是必填參數之一,請將$conf["mustBeFilledVar"]改成"\$conf["\mustBeFilledVar\"]".
3937
		$conf["variableCheck::checkArguments"]["skipableVarDefaultValue"]=array("false","false");
3938
		#$conf["variableCheck::checkArguments"]["arrayCountEqualCheck"],字串陣列,為檢查哪些陣列參數的元素數量要一樣,$conf["arrayCountEqualCheck"][$i]=array()為第$i組key為哪些的變數其元素數量要相等.
3939
		#$conf["variableCheck::checkArguments"]["arrayCountEqualCheck"][]=array();
3940
		#參考資料來源:
3941
		#array_keys=>http://php.net/manual/en/function.array-keys.php
3942
		$checkResult=variableCheck::checkArguments($conf["variableCheck::checkArguments"]);
3943
		unset($conf["variableCheck::checkArguments"]);
3944
 
3945
		#如果檢查失敗
3946
		if($checkResult["status"]=="false"){
3947
 
3948
			#設置錯誤狀態
3949
			$result["status"]="false";
3950
 
3951
			#設置錯誤提示
3952
			$result["error"]=$checkResult;
3953
 
3954
			#回傳結果
3955
			return $result;
3956
 
3957
			}#if end
3958
 
3959
		#如果檢查不通過
3960
		if($checkResult["passed"]=="false"){
3961
 
3962
			#設置錯誤狀態
3963
			$result["status"]="false";
3964
 
3965
			#設置錯誤提示
3966
			$result["error"]=$checkResult;
3967
 
3968
			#回傳結果
3969
			return $result;
3970
 
3971
			}#if end
3972
 
3973
		#如果要抓的變數不是json
3974
		if($conf["json"]==="false"){
3975
 
3976
			#設置抓取local storage 變數的 js 語法
3977
			$jsStr="
3978
			//判斷 local storage 變數是否存在
3979
			if(sessionStorage.".$conf["key"]."!=undefined)
3980
			{
3981
				//取得 local storage 變數
3982
				".$conf["storeVar"]."=sessionStorage.".$conf["key"].";
3983
			}";
3984
 
3985
			}#if end
3986
 
3987
		#反之為json變數
3988
		else{
3989
 
3990
			#設置抓取local storage 變數的 js 語法
3991
			$jsStr="
3992
			//判斷 local storage 變數是否存在
3993
			if(localStorage.".$conf["key"]."!=undefined)
3994
			{
3995
				//取得 local storage 變數
3996
				".$conf["storeVar"]."=JSON.parse(localStorage.".$conf["key"].");
3997
			}";
3998
 
3999
			}#else end
4000
 
4001
		#如果要 script tag
4002
		if($conf["noScriptTag"]==="false"){
4003
 
4004
			#函式說明:
4005
			#將要執行的script語法透過該函式執行
4006
			#回傳結果:
4007
			#$result["status"],執行是否正常,"true"為正常,"false"為不正常.
4008
			#$result["error"],錯誤訊息陣列
4009
			#$result["function"],當前執行的函數名稱
4010
			#$result["content"],要執行的javaScript語法
4011
			#必填參數:
4012
			#$conf["script"],字串,要執行的javaScript語法,標籤「<script></script>」會自動補上.
4013
			$conf["javaScript::toScript"]["script"]=$jsStr;
4014
			$toScript=javaScript::toScript($conf["javaScript::toScript"]);
4015
			unset($conf["javaScript::toScript"]);
4016
 
4017
			#如果轉換成js語法失敗
4018
			if($toScript["status"]==="false"){
4019
 
4020
				#設置錯誤狀態
4021
				$result["status"]="false";
4022
 
4023
				#設置錯誤提示
4024
				$result["error"]=$toScript;
4025
 
4026
				#回傳結果
4027
				return $result;
4028
 
4029
				}#if end
4030
 
4031
			#取得js語法
4032
			$result["content"]=$toScript["content"];
4033
 
4034
			}#if end
4035
 
4036
		#反之不要<script></script>
4037
		else{
4038
 
4039
			$result["content"]=$jsStr;
4040
 
4041
			}#else end
4042
 
4043
		#設置執行正常
4044
		$result["status"]="true";
4045
 
4046
		#回傳結果
4047
		return $result;
4048
 
4049
		}#function getSessionStorage end
4050
 
4051
	/*
4052
	#函式說明:
4053
	#移除儲存在local storage的變數
4054
	#回傳結果:
4055
	#$result["status"],執行是否正常,"true"為正常,"false"為不正常.
4056
	#$result["error"],錯誤訊息陣列
4057
	#$result["function"],當前執行的函數名稱
4058
	#$result["content"],要執行的javaScript語法
4059
	#必填參數:
4060
	#$conf["key"],字串,要儲存的key為何.
4061
	$conf["key"]="";
4062
	#可省略參數:
4063
	#$conf["noScriptTag"],字串,是否不要用script tag包住回傳的內容($result["content"]),"true"代表不要用,"false"代表要用,預設為"false".
4064
	#$conf["noScriptTag"]="false";
4065
	#參考資料:
4066
	#無.
4067
	#備註:
4068
	#無.
4069
	*/
4070
	public static function rmLocalStorage(&$conf){
4071
 
4072
		#初始化要回傳的結果
4073
		$result=array();
4074
 
4075
		#取得當前執行的函數名稱
4076
		$result["function"]=__FUNCTION__;
4077
 
4078
		#如果沒有參數
4079
		if(func_num_args()==0){
4080
 
4081
			#設置執行失敗
4082
			$result["status"]="false";
4083
 
4084
			#設置執行錯誤訊息
4085
			$result["error"]="函數".$result["function"]."需要參數";
4086
 
4087
			#回傳結果
4088
			return $result;
4089
 
4090
			}#if end
4091
 
4092
		#取得參數
4093
		$result["argu"]=$conf;
4094
 
4095
		#如果 $conf 不為陣列
4096
		if(gettype($conf)!="array"){
4097
 
4098
			#設置執行失敗
4099
			$result["status"]="false";
4100
 
4101
			#設置執行錯誤訊息
4102
			$result["error"][]="\$conf變數須為陣列形態";
4103
 
4104
			#如果傳入的參數為 null
4105
			if($conf==null){
4106
 
4107
				#設置執行錯誤訊息
4108
				$result["error"][]="\$conf變數不得為null,請檢查函數「".$result["function"]."」的參數設置有無正確!";
4109
 
4110
				}#if end
4111
 
4112
			#回傳結果
4113
			return $result;
4114
 
4115
			}#if end
4116
 
4117
		#檢查參數
4118
		#函式說明:
4119
		#檢查必填與可省略的參數,可省略參數可指定預設要給與什麼數值內容。
4120
		#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
4121
		#$reuslt["error"],執行不正常結束的錯訊息陣列.
4122
		#$result["function"],當前執行的函式名稱.
4123
		#$result["passed"],識別要檢查的全體變數是否存在以及型態是否正確的變數,"true"代表檢查全部通過;"false"代表檢查不通過
4124
		#$result[$shouldBtCheckedVarName]["varExist"],所檢查的變數是否存在,"false"代表不存在;"true"代表存在
4125
		#$result[$shouldBtCheckedVarName]["varType"],所檢查的變數型態是否正確,"false"代表錯誤;"true"代表正確
4126
		#$result[$shouldBtCheckedVarName]["error"],每個參數設定的錯誤訊息
4127
		#$result["argu"],字串陣列,目前輸入的參數名稱陣列.
4128
		#$result["legalVarName"],字串陣列,合法可用的參數名稱陣列.
4129
		#$result["notNeedVar"],字串陣列,多餘的參數名稱.
4130
		#必填參數:
4131
		#$conf["variableCheck::checkArguments"]["varInput"],陣列變數,要檢查的陣列變數,請在要檢查的參數前面加上&,這樣變動的結果才能被套用。
4132
		$conf["variableCheck::checkArguments"]["varInput"]=&$conf;
4133
		#$conf["variableCheck::checkArguments"]["mustBeFilledVariableName"],爲必填參數的變數名稱陣列,形態爲陣列變數,例如: $conf["mustBeFilledVariableName"] = array("id","account","password");
4134
		$conf["variableCheck::checkArguments"]["mustBeFilledVariableName"]=array("key",);
4135
		#$conf["variableCheck::checkArguments"]["mustBeFilledVariableType"],爲必填參數的變數陣列應該爲何種變數形態,形態爲陣列 例如: $conf["mustBeFilledVariableType"] = array("string",integer,"double");
4136
		$conf["variableCheck::checkArguments"]["mustBeFilledVariableType"]=array("string");
4137
		#$conf["variableCheck::checkArguments"]["referenceVarKey"],字串,$conf參數後面的key值,用於移除不要的參考陣列.
4138
		$conf["variableCheck::checkArguments"]["referenceVarKey"]="variableCheck::checkArguments";
4139
		#可以省略的參數:
4140
		#$conf["variableCheck::checkArguments"]["canBeEmptyString"],必填變數內容如果是空字串就不能算是有設置的話,請設為"false",預設爲"true"。
4141
		$conf["variableCheck::checkArguments"]["canBeEmptyString"]="false";
4142
		#$conf["canNotBeEmpty"],字串陣列,哪些必填參數的內容不得為空字串或空陣列,僅當$conf["canBeEmptyString"]為"true"時會生效.
4143
		#$conf["variableCheck::checkArguments"]["canNotBeEmpty"]=array("key");
4144
		#$conf["canBeEmpty"],字串陣列,哪些必填參數的內容可為空字串或空陣列,僅當$conf["canBeEmptyString"]為"false"時會生效.
4145
		#$conf["canBeEmpty"]=array();
4146
		#$conf["variableCheck::checkArguments"]["skipableVariableName"],爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableName"] = array("id","account","password");
4147
		$conf["variableCheck::checkArguments"]["skipableVariableName"]=array("noScriptTag");
4148
		#$conf["variableCheck::checkArguments"]["skipableVariableType"],爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableType"] = array("string",integer,"double");
4149
		$conf["variableCheck::checkArguments"]["skipableVariableType"]=array("string");
4150
		#$conf["variableCheck::checkArguments"]["skipableVarDefaultValue"],字串陣列,每個不存在的可省略變數要初始化為什麼,null與代表不指定,若預設值是必填參數之一,請將$conf["mustBeFilledVar"]改成"\$conf["\mustBeFilledVar\"]".
4151
		$conf["variableCheck::checkArguments"]["skipableVarDefaultValue"]=array("false");
4152
		#$conf["variableCheck::checkArguments"]["arrayCountEqualCheck"],字串陣列,為檢查哪些陣列參數的元素數量要一樣,$conf["arrayCountEqualCheck"][$i]=array()為第$i組key為哪些的變數其元素數量要相等.
4153
		#$conf["variableCheck::checkArguments"]["arrayCountEqualCheck"][]=array();
4154
		#參考資料來源:
4155
		#array_keys=>http://php.net/manual/en/function.array-keys.php
4156
		$checkResult=variableCheck::checkArguments($conf["variableCheck::checkArguments"]);
4157
		unset($conf["variableCheck::checkArguments"]);
4158
 
4159
		#如果檢查失敗
4160
		if($checkResult["status"]=="false"){
4161
 
4162
			#設置錯誤狀態
4163
			$result["status"]="false";
4164
 
4165
			#設置錯誤提示
4166
			$result["error"]=$checkResult;
4167
 
4168
			#回傳結果
4169
			return $result;
4170
 
4171
			}#if end
4172
 
4173
		#如果檢查不通過
4174
		if($checkResult["passed"]=="false"){
4175
 
4176
			#設置錯誤狀態
4177
			$result["status"]="false";
4178
 
4179
			#設置錯誤提示
4180
			$result["error"]=$checkResult;
4181
 
4182
			#回傳結果
4183
			return $result;
4184
 
4185
			}#if end
4186
 
4187
		#javascript 字串
4188
		$jsStr="localStorage.removeItem(\"".$conf["key"]."\");";
4189
 
4190
		#如果要 script tag
4191
		if($conf["noScriptTag"]=="false"){
4192
 
4193
			#函式說明:
4194
			#將要執行的script語法透過該函式執行
4195
			#回傳結果:
4196
			#$result["status"],執行是否正常,"true"為正常,"false"為不正常.
4197
			#$result["error"],錯誤訊息陣列
4198
			#$result["function"],當前執行的函數名稱
4199
			#$result["content"],要執行的javaScript語法
4200
			#必填參數:
4201
			#$conf["script"],字串,要執行的javaScript語法,標籤「<script></script>」會自動補上.
4202
			$conf["javaScript::toScript"]["script"]=$jsStr;
4203
			$toScript=javaScript::toScript($conf["javaScript::toScript"]);
4204
			unset($conf["javaScript::toScript"]);
4205
 
4206
			#如果轉換成js語法失敗
4207
			if($toScript["status"]==="false"){
4208
 
4209
				#設置錯誤狀態
4210
				$result["status"]="false";
4211
 
4212
				#設置錯誤提示
4213
				$result["error"]=$toScript;
4214
 
4215
				#回傳結果
4216
				return $result;
4217
 
4218
				}#if end
4219
 
4220
			#取得js語法
4221
			$result["content"]=$toScript["content"];
4222
 
4223
			}#if end
4224
 
4225
		#反之不要 script tag
4226
		else{
4227
 
4228
			#取得js語法
4229
			$result["content"]=$jsStr;
4230
 
4231
			}#else end
4232
 
4233
		#設置執行正常
4234
		$result["status"]="true";
4235
 
4236
		#回傳結果
4237
		return $result;
4238
 
4239
		}#function rmLocalStorage end
4240
 
4241
	/*
4242
	#函式說明:
4243
	#透過作業系統顯示提示訊息
4244
	#回傳結果:
4245
	#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
4246
	#$result["error"],錯誤訊息.
4247
	#$result["function"],當前執行的函數名稱.
4248
	#$result["argu"],所使用的參數.
4249
	#$result["content"],js語法.
4250
	#$result["jsFuncName"],使用的js函數名稱.
4251
	#必填參數:
4252
	#$conf["name"],字串,提示功能的名稱,用於建立js函數的名稱.
4253
	$conf["name"]="";
4254
	#$conf["text"],陣列字串,提示的內容,每個元素代表一列文字,目前似乎不會換行.
4255
	$conf["text"]=array();
4256
	#可省略參數:
4257
	#$conf["bodyAndIcon"],字串,"true"代表要使用body與icon,預設為"false"代表不使用.
4258
	#$conf["bodyAndIcon"]="false";
4259
	#$conf["body"],字串陣列,提示的body內容,每個元素代表一列文字,預設為空陣列.
4260
	#$conf["body"]=array();
4261
	#$conf["icon"],字串,提示所用的icon位置,預設為null.
4262
	#$conf["icon"]="";
4263
	#$conf["sound"],字串,提示出現要使用的音效,預設為null,目前沒有瀏覽器支援.
4264
	#$conf["sound"]="";
4265
	#$conf["ms"],字串,訊息幾毫秒後要消失,預設為3000毫秒.
4266
	#$conf["ms"]="3000";
4267
	#$conf["runNow"],字串,是否要馬上執行,預設為"true"代表要,"false"代表不要.
4268
	#$conf["runNow"]="true";
4269
	#$conf["scriptTag"],字串,是否要用<script></script>包住js語法,預設為"true"要包住,"false"為不包住.
4270
	#$conf["scriptTag"]="true"
4271
	#參考資料:
4272
	#https://developer.mozilla.org/en-US/docs/Web/API/notification
4273
	#備註:
4274
	#參數bodyAndIcon似乎可以移除
4275
	#建議加上檢查icon與sound是否存在的檢查
4276
	#如果沒有要求瀏覽器使用Notify的權限,則即便之前允許過,第一次也一定會失敗
4277
	*/
4278
	public static function systemNotify(&$conf){
4279
 
4280
		#初始化要回傳的結果
4281
		$result=array();
4282
 
4283
		#取得當前執行的函數名稱
4284
		$result["function"]=__FUNCTION__;
4285
 
4286
		#如果沒有參數
4287
		if(func_num_args()==0){
4288
 
4289
			#設置執行失敗
4290
			$result["status"]="false";
4291
 
4292
			#設置執行錯誤訊息
4293
			$result["error"]="函數".$result["function"]."需要參數";
4294
 
4295
			#回傳結果
4296
			return $result;
4297
 
4298
			}#if end
4299
 
4300
		#取得參數
4301
		$result["argu"]=$conf;
4302
 
4303
		#如果 $conf 不為陣列
4304
		if(gettype($conf)!=="array"){
4305
 
4306
			#設置執行失敗
4307
			$result["status"]="false";
4308
 
4309
			#設置執行錯誤訊息
4310
			$result["error"][]="\$conf變數須為陣列形態";
4311
 
4312
			#如果傳入的參數為 null
4313
			if($conf===null){
4314
 
4315
				#設置執行錯誤訊息
4316
				$result["error"][]="\$conf變數不得為null,請檢查函數「".$result["function"]."」的參數設置有無正確!";
4317
 
4318
				}#if end
4319
 
4320
			#回傳結果
4321
			return $result;
4322
 
4323
			}#if end
4324
 
4325
		#檢查參數
4326
		#函式說明:
4327
		#檢查必填與可省略的參數,可省略參數可指定預設要給與什麼數值內容。
4328
		#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
4329
		#$reuslt["error"],執行不正常結束的錯訊息陣列.
4330
		#$result["function"],當前執行的函式名稱.
4331
		#$result["passed"],識別要檢查的全體變數是否存在以及型態是否正確的變數,"true"代表檢查全部通過;"false"代表檢查不通過
4332
		#$result[$shouldBeCheckedVarName]["varExist"],所檢查的變數是否存在,"false"代表不存在;"true"代表存在
4333
		#$result[$shouldBeCheckedVarName]["varType"],所檢查的變數型態是否正確,"false"代表錯誤;"true"代表正確
4334
		#$result[$shouldBeCheckedVarName]["error"],每個參數設定的錯誤訊息
4335
		#$result["shouldNotBeEmpty"],不應該為空字串或控陣列的變數.
4336
		#$result["argu"],字串陣列,目前輸入的參數名稱陣列.
4337
		#$result["legalVarName"],字串陣列,合法可用的參數名稱陣列.
4338
		#$result["notNeedVar"],字串陣列,多餘的參數名稱.
4339
		#必填參數:
4340
		#$conf["varInput"],陣列變數,要檢查的陣列變數,請在要檢查的參數前面加上&,這樣變動的結果才能被套用。
4341
		$conf["variableCheck::checkArguments"]["varInput"]=&$conf;
4342
		#$conf["mustBeFilledVariableName"],爲必填參數的變數名稱陣列,形態爲陣列變數,元素數量需要跟"mustBeFilledVariableType"參數的元素數量一致,例如: $conf["mustBeFilledVariableName"] = array("id","account","password");
4343
		$conf["variableCheck::checkArguments"]["mustBeFilledVariableName"]=array("name","text");
4344
		#$conf["mustBeFilledVariableType"],爲必填參數的變數陣列應該爲何種變數形態,形態爲陣列,元素數量需要跟"mustBeFilledVariableName"參數的元素數量一致,例如: $conf["mustBeFilledVariableType"] = array("string",integer,"double","resource","object"); , null代表不指定變數形態.
4345
		$conf["variableCheck::checkArguments"]["mustBeFilledVariableType"]=array("string","array");
4346
		#$conf["referenceVarKey"],字串,$conf參數後面的key值,用於移除不要的參考陣列.
4347
		$conf["variableCheck::checkArguments"]["referenceVarKey"]="variableCheck::checkArguments";
4348
		#可以省略的參數:
4349
		#$conf["canBeEmptyString"],字串,必填變數內容如果是空字串就不能算是有設置的話,請設為"false",預設爲"true",可以為空字串.
4350
		#$conf["canBeEmptyString"]="false";
4351
		#$conf["canNotBeEmpty"],字串陣列,哪些必填參數的內容不得為空字串或空陣列,僅當$conf["canBeEmptyString"]為"true"時會生效.
4352
		#$conf["canNotBeEmpty"]=array();
4353
		#$conf["canBeEmpty"],字串陣列,哪些必填參數的內容可為空字串或空陣列,僅當$conf["canBeEmptyString"]為"false"時會生效.
4354
		#$conf["canBeEmpty"]=array();
4355
		#$conf["skipableVariableCanNotBeEmpty"],字串陣列,哪些可省略參數不可以為空字串或空陣列.
4356
		#$conf["skipableVariableCanNotBeEmpty"]=array();
4357
		#$conf["skipableVariableName"],陣列字串,爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableName"] = array("id","account","password");
4358
		$conf["variableCheck::checkArguments"]["skipableVariableName"]=array("bodyAndIcon","body","icon","sound","ms","runNow","scriptTag");
4359
		#$conf["skipableVariableType"],陣列字串,爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableType"] = array("string",integer,"double");
4360
		$conf["variableCheck::checkArguments"]["skipableVariableType"]=array("string","array","string","string","string","string","string");
4361
		#$conf["skipableVarDefaultValue"],字串陣列,每個不存在的可省略變數要初始化為什麼,null與代表不指定,若預設值是參數之一,請將$conf["mustBeFilledVar"]改成"\$conf["\mustBeFilledVar\"]".
4362
		$conf["variableCheck::checkArguments"]["skipableVarDefaultValue"]=array("false",array(),"null","null","3000","true","true");
4363
		#$conf["arrayCountEqualCheck"],字串陣列,為檢查哪些陣列參數的元素數量要一樣,$conf["arrayCountEqualCheck"][$i]=array()為第$i組key為哪些的變數其元素數量要相等.
4364
		#$conf["arrayCountEqualCheck"][]=array();
4365
		#參考資料來源:
4366
		#array_keys=>http://php.net/manual/en/function.array-keys.php
4367
		$checkArguments=variableCheck::checkArguments($conf["variableCheck::checkArguments"]);
4368
		unset($conf["variableCheck::checkArguments"]);
4369
 
4370
		#如果檢查參數失敗
4371
		if($checkArguments["status"]==="false"){
4372
 
4373
			#設置執行失敗
4374
			$result["status"]="false";
4375
 
4376
			#設置執行錯誤訊息
4377
			$result["error"]=$checkArguments;
4378
 
4379
			#回傳結果
4380
			return $result;
4381
 
4382
			}#if end
4383
 
4384
		#如果參數檢查不通過
4385
		if($checkArguments["passed"]==="false"){
4386
 
4387
			#設置執行失敗
4388
			$result["status"]="false";
4389
 
4390
			#設置執行錯誤訊息
4391
			$result["error"]=$checkArguments;
4392
 
4393
			#回傳結果
4394
			return $result;
4395
 
4396
			}#if end
4397
 
4398
		#轉換 $conf["text"] 為字串
4399
		#函式說明:
4400
		#將一維陣列轉換為用特定符號間隔的字串,ex:array("1","2","3") to "a;b;c;".
4401
		#回傳結果:
4402
		#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
4403
		#$result["function"],當前執行的function名稱
4404
		#$result["error"],錯誤訊息陣列.
4405
		#$result["content"],處理好的字串.
4406
		#必填參數:
4407
		#$conf["inputArray"],字串陣列,要轉成字串的一維陣列.
4408
		$conf["arrays::arrayToString"]["inputArray"]=$conf["text"];
4409
		#可省略參數:
4410
		#$conf["spiltSymbol"],字串,用來區隔字串的符號,預設為;
4411
		$conf["arrays::arrayToString"]["spiltSymbol"]=" ";
4412
		$conf["text"]=arrays::arrayToString($conf["arrays::arrayToString"]);
4413
		unset($conf["arrays::arrayToString"]);
4414
 
4415
		#如果轉換失敗
4416
		if($conf["text"]["status"]==="false"){
4417
 
4418
			#設置執行失敗
4419
			$result["status"]="false";
4420
 
4421
			#設置執行錯誤訊息
4422
			$result["error"]=$conf["text"];
4423
 
4424
			#回傳結果
4425
			return $result;
4426
 
4427
			}#if end
4428
 
4429
		#取得處理好的字串
4430
		$conf["text"]=$conf["text"]["content"];
4431
 
4432
		#轉換 $conf["body"] 為字串
4433
		#函式說明:
4434
		#將一維陣列轉換為用特定符號間隔的字串,ex:array("1","2","3") to "a;b;c;".
4435
		#回傳結果:
4436
		#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
4437
		#$result["function"],當前執行的function名稱
4438
		#$result["error"],錯誤訊息陣列.
4439
		#$result["content"],處理好的字串.
4440
		#必填參數:
4441
		#$conf["inputArray"],字串陣列,要轉成字串的一維陣列.
4442
		$conf["arrays::arrayToString"]["inputArray"]=$conf["body"];
4443
		#可省略參數:
4444
		#$conf["spiltSymbol"],字串,用來區隔字串的符號,預設為;
4445
		$conf["arrays::arrayToString"]["spiltSymbol"]=" ";
4446
		$conf["body"]=arrays::arrayToString($conf["arrays::arrayToString"]);
4447
		unset($conf["arrays::arrayToString"]);
4448
 
4449
		#如果轉換失敗
4450
		if($conf["body"]["status"]==="false"){
4451
 
4452
			#設置執行失敗
4453
			$result["status"]="false";
4454
 
4455
			#設置執行錯誤訊息
4456
			$result["error"]=$conf["body"];
4457
 
4458
			#回傳結果
4459
			return $result;
4460
 
4461
			}#if end
4462
 
4463
		#取得轉換好的內容
4464
		$conf["body"]=$conf["body"]["content"];
4465
 
4466
		#初始化js語法
4467
		$js="";
4468
 
4469
		#如果要馬上執行
4470
		if($conf["runNow"]==="true"){
4471
 
4472
			#語法
4473
			$js="
4474
				function notify_".$conf["name"]."()
4475
				{
4476
					// Let's check if the browser supports notifications
4477
					if(!('Notification' in window))
4478
					{
4479
						//This browser does not support system notifications
4480
						return false;
4481
					}
4482
 
4483
					// Let's check whether notification permissions have already been granted
4484
					else if(Notification.permission==='granted')
4485
					{
4486
						useOp='".$conf["bodyAndIcon"]."';
4487
 
4488
						// If the user accepts, let's create a notification
4489
						//arguments
4490
						var options=
4491
						{
4492
							tag:'".$conf["name"]."',
4493
							body:'".$conf["body"]."',
4494
							icon:'".$conf["icon"]."',
4495
							sound:'".$conf["sound"]."',
4496
						}
4497
 
4498
						if(useOp==='false')
4499
						{
4500
							//show notify
4501
							var notification = new Notification('".$conf["text"]."');
4502
						}
4503
						else if(useOp==='true')
4504
						{
4505
							//show notify with options
4506
							var notification = new Notification('".$conf["text"]."',options);
4507
						}
4508
 
4509
						//notify window will disapear in ".$conf["ms"]."
4510
						setTimeout(notification.close.bind(notification),".$conf["ms"].");
4511
 
4512
						//debug
4513
						notification.onerror=function(message, source, lineno, colno, error)
4514
						{
4515
							//alert(message.toSource());
4516
							//alert(source.toSource());
4517
							//alert(lineno.toSource());
4518
							//alert(colno.toSource());
4519
							//alert(error.toSource());
4520
						};
4521
					}
4522
 
4523
					// Otherwise, we need to ask the user for permission
4524
					else if(Notification.permission!=='denied')
4525
					{
4526
						Notification.requestPermission(function(permission)
4527
						{
4528
							useOp='".$conf["bodyAndIcon"]."';
4529
 
4530
							// If the user accepts, let's create a notification
4531
							if(permission==='granted')
4532
							{
4533
								//arguments
4534
								var options=
4535
								{
4536
									tag:'".$conf["name"]."',
4537
									body:'".$conf["body"]."',
4538
									icon:'".$conf["icon"]."',
4539
									sound:'".$conf["sound"]."',
4540
								}
4541
 
4542
								if(useOp==='false')
4543
								{
4544
									//show notify
4545
									var notification = new Notification('".$conf["text"]."');
4546
								}
4547
								else if(useOp==='true')
4548
								{
4549
									//show notify with options
4550
									var notification = new Notification('".$conf["text"]."',options);
4551
								}
4552
 
4553
								//notify window will disapear in ".$conf["ms"]."
4554
								setTimeout(notification.close.bind(notification),".$conf["ms"].");
4555
 
4556
								//debug
4557
								notification.onerror=function(message, source, lineno, colno, error)
4558
								{
4559
									//alert(message.toSource());
4560
									//alert(source.toSource());
4561
									//alert(lineno.toSource());
4562
									//alert(colno.toSource());
4563
									//alert(error.toSource());
4564
								};
4565
							}
4566
						});
4567
					}
4568
				}//notify js function end
4569
 
4570
				//if have icon
4571
				if('".$conf["icon"]."'!=='null')
4572
				{
4573
					//wait for icon to load
4574
					var icon = new Image();
4575
					icon.onload = function()
4576
					{
4577
						notify_".$conf["name"]."();
4578
					}
4579
					icon.src = '".$conf["icon"]."';
4580
				}
4581
				else
4582
				{
4583
					notify_".$conf["name"]."();
4584
				}
4585
				";
4586
 
4587
			}#if end
4588
 
4589
		#如果沒有要馬上執行
4590
		else if($conf["runNow"]==="false"){
4591
 
4592
			#語法
4593
			$js="
4594
				function notify_".$conf["name"]."()
4595
				{
4596
					// Let's check if the browser supports notifications
4597
					if(!('Notification' in window))
4598
					{
4599
						//This browser does not support system notifications
4600
						return false;
4601
					}
4602
 
4603
					// Let's check whether notification permissions have already been granted
4604
					else if(Notification.permission==='granted')
4605
					{
4606
						useOp='".$conf["bodyAndIcon"]."';
4607
 
4608
						// If the user accepts, let's create a notification
4609
						//arguments
4610
						var options=
4611
						{
4612
							tag:'".$conf["name"]."',
4613
							body:'".$conf["body"]."',
4614
							icon:'".$conf["icon"]."',
4615
							sound:'".$conf["sound"]."',
4616
						}
4617
 
4618
						if(useOp==='false')
4619
						{
4620
							//show notify
4621
							var notification = new Notification('".$conf["text"]."');
4622
						}
4623
						else if(useOp==='true')
4624
						{
4625
							//show notify with options
4626
							var notification = new Notification('".$conf["text"]."',options);
4627
						}
4628
 
4629
						//notify window will disapear in ".$conf["ms"]."
4630
						setTimeout(notification.close.bind(notification),".$conf["ms"].");
4631
					}
4632
 
4633
					// Otherwise, we need to ask the user for permission
4634
					else if(Notification.permission!=='denied')
4635
					{
4636
						Notification.requestPermission(function(permission)
4637
						{
4638
							useOp='".$conf["bodyAndIcon"]."';
4639
 
4640
							// If the user accepts, let's create a notification
4641
							if(permission==='granted')
4642
							{
4643
								//arguments
4644
								var options=
4645
								{
4646
									tag:'".$conf["name"]."',
4647
									body:'".$conf["body"]."',
4648
									icon:'".$conf["icon"]."',
4649
									sound:'".$conf["sound"]."',
4650
								}
4651
 
4652
								if(useOp==='false')
4653
								{
4654
									//show notify
4655
									var notification = new Notification('".$conf["text"]."');
4656
								}
4657
								else if(useOp==='true')
4658
								{
4659
									//show notify with options
4660
									var notification = new Notification('".$conf["text"]."',options);
4661
								}
4662
 
4663
								//notify window will disapear in ".$conf["ms"]."
4664
								setTimeout(notification.close.bind(notification),".$conf["ms"].");
4665
							}
4666
						});
4667
					}
4668
				}//notify js function end
4669
				";
4670
 
4671
			}#if end
4672
 
4673
		#轉換 $conf["scriptTag"] 給 javaScript::addScriptTag 使用
4674
		if($conf["scriptTag"]==="true"){
226 liveuser 4675
 
3 liveuser 4676
			$conf["scriptTag"]="false";
226 liveuser 4677
 
3 liveuser 4678
			}#if end
226 liveuser 4679
 
3 liveuser 4680
		else if($conf["scriptTag"]==="false"){
226 liveuser 4681
 
3 liveuser 4682
			$conf["scriptTag"]="true";
226 liveuser 4683
 
3 liveuser 4684
			}#if end
4685
 
4686
		#to js
4687
		#函式說明:
4688
		#依據需要加上<script></script>標籤,並且可以指定要匯入的js檔案.
4689
		#回傳結果:
4690
		#$result["status"],執行是否正常,"true"為正常,"false"為不正常.
4691
		#$result["error"],錯誤訊息陣列
4692
		#$result["function"],當前執行的函數名稱
4693
		#$result["content"],javaScript語法
4694
		#$result["importJS"],匯入js的語法,必定含有<script></script>標籤.
4695
		#必填參數:
4696
		#$conf["jsProgramSection"],陣列字串,不含<script></script>標籤的javsScript程式碼,可以放多個script程式.
4697
		$conf["javaScript::addScriptTag"]["jsProgramSection"]=array($js);
4698
		#可省略參數:
4699
		#$conf["fileArgu"],字串,php變數__FILE__的內容,亦即該檔案在檔案系統的絕對路徑,請與參數"jsPosition"一起設置,預設為當前檔案的位置.
4700
		#$conf["fileArgu"]=__FILE__;
4701
		#$conf["jsPosition"],字串,要匯入的js檔案位置.
4702
		#$conf["jsPosition"]="";
4703
		#$conf["noScriptTag"],字串,是否不要用script tag包住回傳的內容($result["content"]),"true"代表不要用,"false"代表要用,預設為"false".
4704
		$conf["javaScript::addScriptTag"]["noScriptTag"]=$conf["scriptTag"];
4705
		$addScriptTag=javaScript::addScriptTag($conf["javaScript::addScriptTag"]);
4706
		unset($conf["javaScript::addScriptTag"]);
4707
 
4708
		#如果轉成script失敗
4709
		if($addScriptTag["status"]==="false"){
4710
 
4711
			#設置執行失敗
4712
			$result["status"]="false";
4713
 
4714
			#設置執行錯誤訊息
4715
			$result["error"]=$addScriptTag;
4716
 
4717
			#回傳結果
4718
			return $result;
4719
 
4720
			}#if end
4721
 
4722
		#取得js函數名稱
4723
		$result["jsFuncName"]="notify_".$conf["name"];
4724
 
4725
		#取得js語法
4726
		$result["content"]=$addScriptTag["content"];
4727
 
4728
		#設置執行正常
4729
		$result["status"]="true";
4730
 
4731
		#回傳結果
4732
		return $result;
4733
 
4734
		}#function systemNotify end
4735
 
4736
	/*
4737
	#函式說明:
4738
	#開新視窗,可以隱藏瀏覽器的元件。
4739
	#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
4740
	#$result["error"],錯誤訊息.
4741
	#$result["function"],當前執行的函數名稱.
4742
	#$result["argu"],所使用的參數.
4743
	#$result["content"],js語法.
4744
	#$result["jsFuncName"],使用的js函數名稱.
4745
	#必填參數:
4746
	#$conf["url"],字串,要開新視窗的網址.
4747
	$conf["url"]="";
4748
	#$conf["function"],字串,js開新視窗函式的名稱.
4749
	$conf["function"]="";
4750
	#可省略參數:
4751
	#$conf["name"],字串 ,視窗的名稱,指定後可以直接存取其內容.
4752
	#$conf["name"]="";
4753
	#$conf["width"],字串,新視窗的寬度.
4754
	#$conf["width"]="";
4755
	#$conf["height"],字串,新視窗的高度.
4756
	#$conf["height"]="";
4757
	#$conf["toolbar"],字串,是否要工具列,"true"代表要,"false"代表不要,預設為"false".
4758
	#$conf["toolbar"]="";
4759
	#$cpnf["menubar"],字串,是否要選單列,"true"代表要,"false"代表不要,預設為"false".
4760
	#$conf["menubar"]="";
4761
	#$conf["scrollbars"],字串,是否要滾軸,"true"代表要,"false"代表不要,預設為"true".
4762
	#$conf["scrollbars"]="";
4763
	#$conf["resizable"],字串,是否可以改變視窗大小,"true"代表可以,"false"代表不可以,預設為"true".
4764
	#$conf["resizable"]="";
4765
	#$conf["location"],字串,是否要顯示地址列,"true"代表要,"false"代表不要,預設為"false".
4766
	#$conf["location"]="";
4767
	#$conf["status"],字串,是否要顯示狀態列,"true"代表要,"false"代表不要,預設為"false".
4768
	#$conf["status"]="";
4769
	#$conf["titlebar"],字串,是否要顯示視窗標題,"true"代表要,"false"代表不要,預設為"true".
4770
	#$conf["titlebar"]="";
4771
	#$conf["returnWindowVarName"],字串,開啟的視窗要儲存到哪個全域變數,請提供window.後面的名稱即可,預設不使用,直接return.
4772
	#$conf["returnWindowVarName"]="";
4773
	#參考資料:
4774
	#http://www.w3schools.com/jsref/met_win_open.asp
4775
	#http://www.blueshop.com.tw/board/FUM20041006152641OLG/BRD20080107111600L3T.html
4776
	#備註:
4777
	#無.
4778
	*/
4779
	public static function openWindow(&$conf){
4780
 
4781
		#初始化要回傳的結果
4782
		$result=array();
4783
 
4784
		#取得當前執行的函數名稱
4785
		$result["function"]=__FUNCTION__;
4786
 
4787
		#如果沒有參數
4788
		if(func_num_args()==0){
4789
 
4790
			#設置執行失敗
4791
			$result["status"]="false";
4792
 
4793
			#設置執行錯誤訊息
4794
			$result["error"]="函數".$result["function"]."需要參數";
4795
 
4796
			#回傳結果
4797
			return $result;
4798
 
4799
			}#if end
4800
 
4801
		#取得參數
4802
		$result["argu"]=$conf;
4803
 
4804
		#如果 $conf 不為陣列
4805
		if(gettype($conf)!=="array"){
4806
 
4807
			#設置執行失敗
4808
			$result["status"]="false";
4809
 
4810
			#設置執行錯誤訊息
4811
			$result["error"][]="\$conf變數須為陣列形態";
4812
 
4813
			#如果傳入的參數為 null
4814
			if($conf===null){
4815
 
4816
				#設置執行錯誤訊息
4817
				$result["error"][]="\$conf變數不得為null,請檢查函數「".$result["function"]."」的參數設置有無正確!";
4818
 
4819
				}#if end
4820
 
4821
			#回傳結果
4822
			return $result;
4823
 
4824
			}#if end
4825
 
4826
		#檢查參數
4827
		#函式說明:
4828
		#檢查必填與可省略的參數,可省略參數可指定預設要給與什麼數值內容。
4829
		#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
4830
		#$reuslt["error"],執行不正常結束的錯訊息陣列.
4831
		#$result["function"],當前執行的函式名稱.
4832
		#$result["passed"],識別要檢查的全體變數是否存在以及型態是否正確的變數,"true"代表檢查全部通過;"false"代表檢查不通過
4833
		#$result[$shouldBeCheckedVarName]["varExist"],所檢查的變數是否存在,"false"代表不存在;"true"代表存在
4834
		#$result[$shouldBeCheckedVarName]["varType"],所檢查的變數型態是否正確,"false"代表錯誤;"true"代表正確
4835
		#$result[$shouldBeCheckedVarName]["error"],每個參數設定的錯誤訊息
4836
		#$result["shouldNotBeEmpty"],不應該為空字串或控陣列的變數.
4837
		#$result["argu"],字串陣列,目前輸入的參數名稱陣列.
4838
		#$result["legalVarName"],字串陣列,合法可用的參數名稱陣列.
4839
		#$result["notNeedVar"],字串陣列,多餘的參數名稱.
4840
		#必填參數:
4841
		#$conf["varInput"],陣列變數,要檢查的陣列變數,請在要檢查的參數前面加上&,這樣變動的結果才能被套用。
4842
		$conf["variableCheck::checkArguments"]["varInput"]=&$conf;
4843
		#$conf["mustBeFilledVariableName"],爲必填參數的變數名稱陣列,形態爲陣列變數,元素數量需要跟"mustBeFilledVariableType"參數的元素數量一致,例如: $conf["mustBeFilledVariableName"] = array("id","account","password");
4844
		$conf["variableCheck::checkArguments"]["mustBeFilledVariableName"]=array("url","function");
4845
		#$conf["mustBeFilledVariableType"],爲必填參數的變數陣列應該爲何種變數形態,形態爲陣列,元素數量需要跟"mustBeFilledVariableName"參數的元素數量一致,例如: $conf["mustBeFilledVariableType"] = array("string",integer,"double","resource","object"); , null代表不指定變數形態.
4846
		$conf["variableCheck::checkArguments"]["mustBeFilledVariableType"]=array("string","string");
4847
		#$conf["referenceVarKey"],字串,$conf參數後面的key值,用於移除不要的參考陣列.
4848
		$conf["variableCheck::checkArguments"]["referenceVarKey"]="variableCheck::checkArguments";
4849
		#可以省略的參數:
4850
		#$conf["canBeEmptyString"],字串,必填變數內容如果是空字串就不能算是有設置的話,請設為"false",預設爲"true",可以為空字串.
4851
		$conf["variableCheck::checkArguments"]["canBeEmptyString"]="true";
4852
		#$conf["canNotBeEmpty"],字串陣列,哪些必填參數的內容不得為空字串或空陣列,僅當$conf["canBeEmptyString"]為"true"時會生效.
4853
		$conf["variableCheck::checkArguments"]["canNotBeEmpty"]=array("function");
4854
		#$conf["canBeEmpty"],字串陣列,哪些必填參數的內容可為空字串或空陣列,僅當$conf["canBeEmptyString"]為"false"時會生效.
4855
		#$conf["canBeEmpty"]=array();
4856
		#$conf["skipableVariableCanNotBeEmpty"],字串陣列,哪些可省略參數不可以為空字串或空陣列.
4857
		#$conf["variableCheck::checkArguments"]["skipableVariableCanNotBeEmpty"]=array("width","height");
4858
		#$conf["skipableVariableName"],陣列字串,爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableName"] = array("id","account","password");
4859
		$conf["variableCheck::checkArguments"]["skipableVariableName"]=array("name","width","height","toolbar","menubar","scrollbars","resizable","location","status","titlebar","returnWindowVarName");
4860
		#$conf["skipableVariableType"],陣列字串,爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableType"] = array("string",integer,"double");
4861
		$conf["variableCheck::checkArguments"]["skipableVariableType"]=array("string","string","string","string","string","string","string","string","string","string","string");
4862
		#$conf["skipableVarDefaultValue"],字串陣列,每個不存在的可省略變數要初始化為什麼,null與代表不指定,若預設值是參數之一,請將$conf["mustBeFilledVar"]改成"\$conf["\mustBeFilledVar\"]".
4863
		$conf["variableCheck::checkArguments"]["skipableVarDefaultValue"]=array("",null,null,"false","false","true","true","false","false","true",null);
4864
		#$conf["arrayCountEqualCheck"],字串陣列,為檢查哪些陣列參數的元素數量要一樣,$conf["arrayCountEqualCheck"][$i]=array()為第$i組key為哪些的變數其元素數量要相等.
4865
		#$conf["arrayCountEqualCheck"][]=array();
4866
		#參考資料來源:
4867
		#array_keys=>http://php.net/manual/en/function.array-keys.php
4868
		#建議:
4869
		#增加可省略參數全部不能為空字串或空陣列的參數功能.
4870
		$checkArguments=variableCheck::checkArguments($conf["variableCheck::checkArguments"]);
4871
		unset($conf["variableCheck::checkArguments"]);
4872
 
4873
		#如果檢查參數失敗
4874
		if($checkArguments["status"]==="false"){
4875
 
4876
			#設置執行失敗
4877
			$result["status"]="false";
4878
 
4879
			#設置執行錯誤訊息
4880
			$result["error"]=$checkArguments;
4881
 
4882
			#回傳結果
4883
			return $result;
4884
 
4885
			}#if end
4886
 
4887
		#如果參數檢查不通過
4888
		if($checkArguments["passed"]==="false"){
4889
 
4890
			#設置執行失敗
4891
			$result["status"]="false";
4892
 
4893
			#設置執行錯誤訊息
4894
			$result["error"]=$checkArguments;
4895
 
4896
			#回傳結果
4897
			return $result;
4898
 
4899
			}#if end
4900
 
4901
		#取得js函數的名稱
4902
		$result["jsFuncName"]=$conf["function"];
4903
 
4904
		#開新視窗的參數
4905
		$opt=array();
4906
 
4907
		#如果有設定 $conf["width"]
4908
		if(isset($conf["width"])){
4909
 
4910
			#如果不是 "screen"
4911
			if($conf["width"]!=="screen"){
4912
 
4913
				#設定寬度
4914
				$opt[]="width=".$conf["width"];
4915
 
4916
				}#if end
4917
 
4918
			}#if end
4919
 
4920
		#如果有設定 $conf["height"]
4921
		if(isset($conf["height"])){
4922
 
4923
			#如果不是 "screen"
4924
			if($conf["height"]!=="screen"){
4925
 
4926
				#設定高度
4927
				$opt[]="height=".$conf["height"];
4928
 
4929
				}#if end
4930
 
4931
			}#if end
4932
 
4933
		#如果 $conf["toolbar"] 為 "true"
4934
		if($conf["toolbar"]==="true"){
4935
 
4936
			#設為 "yes"
4937
			$conf["toolbar"]="yes";
4938
 
4939
			}#if end
4940
 
4941
		#反之
4942
		else{
4943
 
4944
			#設為 "no"
4945
			$conf["toolbar"]="no";
4946
 
4947
			}#if end
4948
 
4949
		#設定 toolbar
4950
		$opt[]="toolbar=".$conf["toolbar"];
4951
 
4952
		#如果 $conf["menubar"] 為 "true"
4953
		if($conf["menubar"]==="true"){
4954
 
4955
			#設置為 "yes"
4956
			$conf["menubar"]="yes";
4957
 
4958
			}#if end
4959
 
4960
		#反之
4961
		else{
4962
 
4963
			#設置為 "no"
4964
			$conf["menubar"]="no";
4965
 
4966
			}#else end
4967
 
4968
		#設定 menubar
4969
		$opt[]="menubar=".$conf["menubar"];
4970
 
4971
		#如果滾軸要設置
4972
		if($conf["scrollbars"]==="true"){
4973
 
4974
			#設置為 "yes"
4975
			$conf["scrollbars"]="yes";
4976
 
4977
			}#if end
4978
 
4979
		#反之
4980
		else{
4981
 
4982
			#設置為 "no"
4983
			$conf["scrollbars"]="no";
4984
 
4985
			}#else end
4986
 
4987
		#設置 scrollbars
4988
		$opt[]="scrollbars=".$conf["scrollbars"];
4989
 
4990
		#如果 $conf["resizable"] 為 "true"
4991
		if($conf["resizable"]==="true"){
4992
 
4993
			#設置為 "yes"
4994
			$conf["resizable"]="yes";
4995
 
4996
			}#if end
4997
 
4998
		#反之
4999
		else{
5000
 
5001
			#設置為 "no"
5002
			$conf["resizable"]="no";
5003
 
5004
			}#else end
5005
 
5006
		#設置 resizable
5007
		$opt[]="resizable=".$conf["resizable"];
5008
 
5009
		#如果 $conf["location"] 為 "true"
5010
		if($conf["location"]==="true"){
5011
 
5012
			#設置為 "yes"
5013
			$conf["location"]="yes";
5014
 
5015
			}#if end
5016
 
5017
		#反之
5018
		else{
5019
 
5020
			#設置為 "no"
5021
			$conf["location"]="no";
5022
 
5023
			}#else end
5024
 
5025
		#設置 location
5026
		$opt[]="location=".$conf["location"];
5027
 
5028
		#如果 $conf["status"] 為 "true"
5029
		if($conf["status"]==="true"){
5030
 
5031
			#設置為 "yes"
5032
			$conf["status"]="yes";
5033
 
5034
			}#if end
5035
 
5036
		#反之
5037
		else{
5038
 
5039
			#設置為 "no"
5040
			$conf["status"]="no";
5041
 
5042
			}#else end
5043
 
5044
		#設置 status
5045
		$opt[]="status=".$conf["status"];
5046
 
5047
		#如果 $conf["titlebar"] 為 "true"
5048
		if($conf["titlebar"]==="true"){
5049
 
5050
			#設置為 "yes"
5051
			$conf["titlebar"]="yes";
5052
 
5053
			}#if end
5054
 
5055
		#反之
5056
		else{
5057
 
5058
			#設置為 "no"
5059
			$conf["titlebar"]="no";
5060
 
5061
			}#else end
5062
 
5063
		#設置 location
5064
		$opt[]="titlebar=".$conf["titlebar"];
5065
 
5066
		#設置開新視窗的opt
5067
		#函式說明:
5068
		#將一維陣列轉換為用特定符號間隔的字串,ex:array("1","2","3") to "a;b;c;".
5069
		#回傳結果:
5070
		#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
5071
		#$result["function"],當前執行的function名稱
5072
		#$result["error"],錯誤訊息陣列.
5073
		#$result["content"],處理好的字串.
5074
		#必填參數:
5075
		#$conf["inputArray"],字串陣列,要轉成字串的一維陣列.
5076
		$conf["arrays::arrayToString"]["inputArray"]=$opt;
5077
		#可省略參數:
5078
		#$conf["spiltSymbol"],字串,用來區隔字串的符號,預設為;
5079
		$conf["arrays::arrayToString"]["spiltSymbol"]=",";
5080
		#$conf["skipEnd"],字串,結尾是否不要加上符號,預設為"false",要加上符號,"true"代表不要加上符號。
5081
		$conf["arrays::arrayToString"]["skipEnd"]="true";
5082
		$arrayToString=arrays::arrayToString($conf["arrays::arrayToString"]);
5083
		unset($conf["arrays::arrayToString"]);
5084
 
5085
		#如果轉換失敗
5086
		if($arrayToString["status"]==="false"){
5087
 
5088
			#設置執行失敗
5089
			$result["status"]="false";
5090
 
5091
			#設置執行錯誤訊息
5092
			$result["error"]=$arrayToString;
5093
 
5094
			#回傳結果
5095
			return $result;
5096
 
5097
			}#if end
5098
 
5099
		#儲存轉換好的字串
5100
		$opt=$arrayToString["content"];
5101
 
5102
		#如果 $conf["width"] 與 $conf["height"] 都是 "screen"
5103
		if($conf["width"]==="screen" && $conf["height"]==="screen"){
5104
 
5105
			#設置最大大小的視窗寬高
5106
			$cusWidthHeight=",width='+window.screen.width+','+'height='+window.screen.height";
5107
 
5108
			}#if end
5109
 
5110
		#反之
5111
		else{
5112
 
5113
			#設置為 ""
5114
			$cusWidthHeight="'";
5115
 
5116
			}#else end
5117
 
5118
		#如果有指定要儲存到window中的變數
5119
		if(isset($conf["returnWindowVarName"])){
226 liveuser 5120
 
3 liveuser 5121
			#設置儲存到指定的window中變數
5122
			$conf["returnWindowVarName"]="window.".$conf["returnWindowVarName"]."=";
226 liveuser 5123
 
3 liveuser 5124
			}#if end
226 liveuser 5125
 
3 liveuser 5126
		#反之
5127
		else{
226 liveuser 5128
 
3 liveuser 5129
			#設置直接return
5130
			$conf["returnWindowVarName"]="return ";
226 liveuser 5131
 
3 liveuser 5132
			}#else end
5133
 
5134
		#開新視窗的js function
5135
		$js="
5136
			//open window functino ".$conf["function"]."
5137
			function ".$conf["function"]."(){
5138
 
5139
				//開啟新視窗設定
5140
				".$conf["returnWindowVarName"]."window.open('".$conf["url"]."','".$conf["name"]."','".$opt.$cusWidthHeight.");
5141
 
5142
				}//function ".$conf["function"]." end
5143
			";
5144
 
5145
		#轉換成js語法
5146
		#函式說明:
5147
		#將要執行的script語法透過該函式執行(會在程式外層用<script></script>包起來).
5148
		#回傳結果:
5149
		#$result["status"],執行是否正常,"true"為正常,"false"為不正常.
5150
		#$result["error"],錯誤訊息陣列
5151
		#$result["function"],當前執行的函數名稱
5152
		#$result["content"],要執行的javaScript語法
5153
		#必填參數:
5154
		#$conf["script"],字串,要執行的javaScript語法.
5155
		$conf["javaScript::toScript"]["script"]="";
5156
		#可省略參數:
5157
		#$conf["onReady"],字串,是否要在網頁載入完再執行,"false"為不等載入完就先執行,預設為"true"要等載入完再執行.
5158
		#$conf["onReady"]="true";
5159
		#$conf["jsFunciton"],字串陣列,為要放入<script>標籤的js函數.
5160
		$conf["javaScript::toScript"]["jsFunciton"]=array($js);
5161
		#參考資料:
5162
		#http://stackoverflow.com/questions/9899372/pure-javascript-equivalent-to-jquerys-ready-how-to-call-a-function-when-the
5163
		$toScript=javaScript::toScript($conf["javaScript::toScript"]);
5164
		unset($conf["javaScript::toScript"]);
5165
 
5166
		#如果轉換成js失敗
5167
		if($toScript["status"]==="false"){
5168
 
5169
			#設置執行失敗
5170
			$result["status"]="false";
5171
 
5172
			#設置執行錯誤訊息
5173
			$result["error"]=$toScript;
5174
 
5175
			#回傳結果
5176
			return $result;
5177
 
5178
			}#if end
5179
 
5180
		#取得js語法
5181
		$result["content"]=$toScript["content"];
5182
 
5183
		#設置執行正常
5184
		$result["status"]="true";
5185
 
5186
		#回傳結果
5187
		return $result;
5188
 
5189
		}#function openWindows end
5190
 
5191
	/*
5192
	#函式說明:
5193
	#javascript的if...esle if...判斷式.
5194
	#回傳結果:
5195
	#$result["status"],執行正確與否,"true"代表執行正確,"false"代表執行失敗.
5196
	#$result["error"],錯誤訊息陣列.
5197
	#$result["content"],JavaScript的語法
5198
	#$result["function"],當前執行的函數名稱
5199
	#必填參數:
5200
	#無:
5201
	#可省略參數:
5202
	#$conf["scriptTag"],是否要用<script></script>包住,預設為"false",不包住;"true"為包住.
5203
	#$conf["scriptTag"]="false";
5204
	#$conf["condition"],陣列,每個判斷式的條件,若有多個則會依序判斷下去.
5205
	#$conf["condition"]=array();
5206
	#$conf["conditionComment"],陣列,每個判斷式的註解,預設為$conf["condition"].
5207
	#$conf["conditionComment"]=array();
5208
	#$conf["todo"],陣列,每個判斷式成立時要做的事情.
5209
	#$conf["todo"]=array();
5210
	#$conf["todoComment"],陣列,每件要做的事情之註解,預設為"do something...".
5211
	#$conf["todoComment"]=array();
5212
	#參考資料:
5213
	#無.
5214
	#備註:
5215
	#無.
5216
	*/
5217
	public static function jsIf(&$conf=array()){
5218
 
5219
		#初始化要回傳的結果
5220
		$result=array();
5221
 
5222
		#取得當前執行的函數名稱
5223
		$result["function"]=__FUNCTION__;
5224
 
5225
		#取得參數
5226
		$result["argu"]=$conf;
5227
 
5228
		#如果 $conf 不為陣列
5229
		if(gettype($conf)!="array"){
5230
 
5231
			#設置執行失敗
5232
			$result["status"]="false";
5233
 
5234
			#設置執行錯誤訊息
5235
			$result["error"][]="\$conf變數須為陣列形態";
5236
 
5237
			#如果傳入的參數為 null
5238
			if($conf==null){
5239
 
5240
				#設置執行錯誤訊息
5241
				$result["error"][]="\$conf變數不得為null,請檢查函數「".$result["function"]."」的參數設置有無正確!";
5242
 
5243
				}#if end
5244
 
5245
			#回傳結果
5246
			return $result;
5247
 
5248
			}#if end
5249
 
5250
		#檢查參數
5251
		#函式說明:
5252
		#檢查一包含數個可省略變數的陣列變數,其型態是否正確,省略掉的陣列變數可以直接給定預設值。
5253
		#回傳結果:
5254
		#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
5255
		#$result["error"],錯誤訊息陣列.
5256
		#$result["function"],當前執行的函式名稱.
5257
		#$result["passed"],參數是否都通過檢查,"true",代表有通過檢查,"false"代表沒有通過檢查。
5258
		#必填參數:
5259
		#$conf["checkedVar"],陣列,要檢查的變數陣列名稱為?
5260
		$conf["variableCheck::checkSkipableVarType"]["checkedVar"]=$conf;
5261
		#$conf["sikpableVarNameArray"],字串陣列,要檢查型態是否設定正確的變數名稱陣列.
5262
		$conf["variableCheck::checkSkipableVarType"]["sikpableVarNameArray"]=array("scriptTag","condition","conditionComment","todo","todoComment");
5263
		#$argu,要直接存取的陣列變數名稱,變數前面加上「&」,如果要在別的函式裡面使用本函式,請記得將變動過結果($argu)給使用該函式的設定變數(通常是$conf=$argu).
5264
		$argu=&$conf;
5265
		#可省略參數:
5266
		#$conf["skipableVarTypeArray"],字串陣列,要檢查的每個變數,其型態應該要為何,null代表不指定變數形態.
5267
		$conf["variableCheck::checkSkipableVarType"]["skipableVarTypeArray"]=array("string","array","array","array","array");
5268
		#$conf["skipableVarDefaultValue"],字串陣列,每個不存在的變數要初始化為什麼,null代表不指定.
5269
		$conf["variableCheck::checkSkipableVarType"]["skipableVarDefaultValue"]=array("false",null,null,null,null);
5270
		$checkSkipableVarType=variableCheck::checkSkipableVarType($conf["variableCheck::checkSkipableVarType"],$argu);
5271
		unset($conf["variableCheck::checkSkipableVarType"]);
5272
 
5273
		#如果檢查失敗
5274
		if($checkSkipableVarType["status"]=="false"){
5275
 
5276
			#設置錯誤狀態
5277
			$result["status"]="false";
5278
 
5279
			#設置錯誤提示
5280
			$result["error"]=$checkSkipableVarType;
5281
 
5282
			#回傳結果
5283
			return $result;
5284
 
5285
			}#if end
5286
 
5287
		#如果檢查不通過
5288
		if($checkSkipableVarType["passed"]=="false"){
5289
 
5290
			#設置錯誤狀態
5291
			$result["status"]="false";
5292
 
5293
			#設置錯誤提示
5294
			$result["error"]=$checkSkipableVarType;
5295
 
5296
			#回傳結果
5297
			return $result;
5298
 
5299
			}#if end
5300
 
5301
		#初始化js script.
5302
		$script="";
5303
 
5304
		#產生判斷式與要做的事情.
5305
 
5306
		#計數
5307
		$times=0;
5308
 
5309
		#有幾個判斷式就執行幾次
5310
		foreach($conf["condition"] as $index=>$condi){
5311
 
5312
			#如果沒有設置條件的註解
5313
			if(!isset($conf["conditionComment"])){
5314
 
5315
				#設置預設的註解
5316
				$condiComment="if...";
5317
 
5318
				}#if end
5319
 
5320
			#反之單獨這條件沒設定註解
5321
			else if(!isset($conf["conditionComment"][$index])){
5322
 
5323
				#設置預設的註解
5324
				$condiComment="if...";
5325
 
5326
				}#if end
5327
 
5328
			#反之
5329
			else{
5330
 
5331
				#設定條件式註解
5332
				$condiComment=$conf["conditionComment"][$index];
5333
 
5334
				}#else end
5335
 
5336
			#如果沒有設置要做的事之註解
5337
			if(!isset($conf["todoComment"])){
5338
 
5339
				#設置預設的註解
5340
				$todoComment="do something...";
5341
 
5342
				}#if end
5343
 
5344
			#反之單獨這條件沒設定設置要做的事之註解
5345
			else if(!isset($conf["todoComment"][$index])){
5346
 
5347
				#設置預設的註解
5348
				$todoComment="do something...";
5349
 
5350
				}#if end
5351
 
5352
			#反之有設置註解
5353
			else{
5354
 
5355
				#設置的註解
5356
				$todoComment=$conf["todoComment"][$index];
5357
 
5358
				}#else end
5359
 
5360
			#如果存在要做的事情
5361
			if(isset($conf["todo"][$index])){
5362
 
5363
				#計數加1
5364
				$times++;
5365
 
5366
				#判斷是第幾次,來決定if...else if...的呈現.
5367
				switch($times){
5368
 
5369
					#如果是第一個條件
5370
					case 1:
5371
 
5372
						#設置判斷與要做的事情
5373
						$script=$script.
5374
						"
5375
							//if ".$condiComment."
5376
							if(".$condi."){
5377
 
5378
								//".$todoComment."
5379
								".$conf["todo"][$index]."
5380
 
5381
								}//if end
5382
						";
5383
 
5384
						#跳出switch
5385
						break;
5386
 
5387
					default:
5388
 
5389
						#設置判斷與要做的事情
5390
						$script=$script.
5391
						"
5392
							//else if ".$condiComment."
5393
							else if(".$condi."){
5394
 
5395
								//".$todoComment."
5396
								".$conf["todo"][$index]."
5397
 
5398
								}//if end
5399
						";
5400
 
5401
					}#switch end
5402
 
5403
				}#if end
5404
 
5405
			}#foreach end
5406
 
5407
		#判斷有無要加<script></script>
5408
		if($conf["scriptTag"]==="true"){
5409
 
5410
			#函式說明:
5411
			#依據需要加上<script></script>標籤,並且可以指定要匯入的js檔案.
5412
			#回傳結果:
5413
			#$result["status"],執行是否正常,"true"為正常,"false"為不正常.
5414
			#$result["error"],錯誤訊息陣列
5415
			#$result["function"],當前執行的函數名稱
5416
			#$result["content"],javaScript語法
5417
			#$result["importJS"],匯入js的語法,必定含有<script></script>標籤.
5418
			#必填參數:
5419
			#$conf["jsProgramSection"],陣列字串,不含<script></script>標籤的javsScript程式碼,可以放多個script程式.
5420
			$conf["javaScript::addScriptTag"]["jsProgramSection"]=array($script);
5421
			#可省略參數:
5422
			#$conf["fileArgu"],字串,php變數__FILE__的內容,亦即該檔案在檔案系統的絕對路徑,請與參數"jsPosition"一起設置,預設為當前檔案的位置.
5423
			#$conf["fileArgu"]=__FILE__;
5424
			#$conf["jsPosition"],字串,要匯入的js檔案位置.
5425
			#$conf["jsPosition"]="";
5426
			#$conf["noScriptTag"],字串,是否不要用script tag包住回傳的內容($result["content"]),"true"代表不要用,"false"代表要用,預設為"false".
5427
			#$conf["noScriptTag"]="false";
5428
			$addScriptTag=javaScript::addScriptTag($conf["javaScript::addScriptTag"]);
5429
			unset($conf["javaScript::addScriptTag"]);
5430
 
5431
			#如果加上script標籤失敗
5432
			if($addScriptTag["status"]==="false"){
5433
 
5434
				#設置錯誤狀態
5435
				$result["status"]="false";
5436
 
5437
				#設置錯誤提示
5438
				$result["error"]=$addScriptTag;
5439
 
5440
				#回傳結果
5441
				return $result;
5442
 
5443
				}#if end
5444
 
5445
			#取得js語法
5446
			$result["content"]=$addScriptTag["content"];
5447
 
5448
			}#if end
5449
 
5450
		#反之
5451
		else{
5452
 
5453
			#取得js語法
5454
			$result["content"]=$script;
5455
 
5456
			}#else end
5457
 
5458
		#設置執行正常
5459
		$result["status"]="true";
5460
 
5461
		#回傳結果
5462
		return $result;
5463
 
5464
		}#function jsIF end
5465
 
5466
	/*
5467
	#函式說明:
5468
	#建立qbpwcf專屬的js函式庫
5469
	#回傳結果
5470
	#$result["funciton"],當前函式的名稱.
5471
	#$result["status"],執行的狀態,"true"代表正常,"false"代表不正常.
5472
	#$result["error"],錯誤訊息
5473
	#$result["content"],語法.
5474
	#必填參數:
5475
	#無.
5476
	#可省略參數:
5477
	#$conf["noScriptTag"],字串,是否不要輸出<script></script>,預設為"false",代表要輸出;反之為"true",代表不要輸出.
5478
	#$conf["noScriptTag"]="false";
5479
	#參考資料:
5480
	#無.
5481
	#備註:
5482
	#無.
5483
	*/
5484
	public static function qbpwcfJavaScript(&$conf=array()){
5485
 
5486
		#初始化要回傳的結果
5487
		$result=array();
5488
 
5489
		#取得當前執行的函數名稱
5490
		$result["function"]=__FUNCTION__;
5491
 
5492
		#檢查參數
5493
		#函式說明:
5494
		#檢查必填與可省略的參數,可省略參數可指定預設要給與什麼數值內容.
5495
		#回傳結果:
5496
		#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
5497
		#$result["error"],執行不正常結束的錯訊息陣列.
5498
		#$result["simpleError"],簡單表示的錯誤訊息.
5499
		#$result["function"],當前執行的函式名稱.
5500
		#$result["argu"],設置給予的參數.
5501
		#$result["passed"],識別要檢查的全體變數是否存在以及型態是否正確的變數,"true"代表檢查全部通過;"false"代表檢查不通過
5502
		#$result[$shouldBeCheckedVarName]["varExist"],所檢查的變數是否存在,"false"代表不存在;"true"代表存在
5503
		#$result[$shouldBeCheckedVarName]["varType"],所檢查的變數型態是否正確,"false"代表錯誤;"true"代表正確
5504
		#$result[$shouldBeCheckedVarName]["error"],每個參數設定的錯誤訊息
5505
		#$result["shouldNotBeEmpty"],不應該為空字串或控陣列的變數.
5506
		#$result["argu"],字串陣列,目前輸入的參數名稱陣列.
5507
		#$result["legalVarName"],字串陣列,合法可用的參數名稱陣列.
5508
		#$result["notNeedVar"],字串陣列,多餘的參數名稱.
5509
		#必填參數:
5510
		#$conf["varInput"],陣列變數,要檢查的陣列變數,請在要檢查的參數前面加上&,這樣變動的結果才能被套用。
5511
		$conf["variableCheck::checkArguments"]["varInput"]=&$conf;
5512
		#$conf["referenceVarKey"],字串,$conf參數後面的key值,用於移除不要的參考陣列.
5513
		$conf["variableCheck::checkArguments"]["referenceVarKey"]="variableCheck::checkArguments";
5514
		#可省略參數:
5515
		#$conf["mustBeFilledVariableName"],爲必填參數的變數名稱陣列,形態爲陣列變數,元素數量需要跟"mustBeFilledVariableType"參數的元素數量一致,例如: $conf["mustBeFilledVariableName"] = array("id","account","password");
5516
		#$conf["mustBeFilledVariableName"]=array();
5517
		#$conf["mustBeFilledVariableType"],爲必填參數的變數陣列應該爲何種變數形態,形態爲陣列,元素數量需要跟"mustBeFilledVariableName"參數的元素數量一致,例如: $conf["mustBeFilledVariableType"] = array("string",integer,"double","resource","object"); , null、any代表不指定變數形態.其中 resource也包含"resource (closed)".
5518
		#$conf["mustBeFilledVariableType"]=array();
5519
		#$conf["canBeEmptyString"],字串,必填變數內容如果是空字串就不能算是有設置的話,請設為"false",預設爲"true",可以為空字串.
5520
		#$conf["canBeEmptyString"]="false";
5521
		#$conf["canNotBeEmpty"],字串陣列,哪些必填參數的內容不得為空字串或空陣列,僅當$conf["canBeEmptyString"]為"true"時會生效.
5522
		#$conf["canNotBeEmpty"]=array();
5523
		#$conf["canBeEmpty"],字串陣列,哪些必填參數的內容可為空字串或空陣列,僅當$conf["canBeEmptyString"]為"false"時會生效.
5524
		#$conf["canBeEmpty"]=array();
5525
		#$conf["skipableVariableCanNotBeEmpty"],字串陣列,哪些可省略參數不可以為空字串或空陣列.
5526
		#$conf["variableCheck::checkArguments"]["skipableVariableCanNotBeEmpty"]=array();
5527
		#$conf["skipableVariableName"],陣列字串,爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableName"] = array("id","account","password");
5528
		$conf["variableCheck::checkArguments"]["skipableVariableName"]=array("noScriptTag");
5529
		#$conf["skipableVariableType"],陣列字串,爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableType"] = array("string",integer,"double");
5530
		$conf["variableCheck::checkArguments"]["skipableVariableType"]=array("string");
5531
		#$conf["skipableVarDefaultValue"],字串陣列,每個不存在的可省略變數要初始化為什麼,null與代表不指定,若預設值是參數之一,請將$conf["mustBeFilledVar"]改成"\$conf["\mustBeFilledVar\"]".
5532
		$conf["variableCheck::checkArguments"]["skipableVarDefaultValue"]=array("false");
5533
		#$conf["disallowAllSkipableVarIsEmpty"],字串,是否允許每個可省略參數都為空字串,預設為"true"允許,反之為"false".
5534
		#$conf["disallowAllSkipableVarIsEmpty"]="";
5535
		#$conf["disallowAllSkipableVarIsEmptyArray"],字串,是否允許每個可省略參數都為空陣列,預設為"true"允許,反之為"false".
5536
		#$conf["disallowAllSkipableVarIsEmptyArray"]="";
5537
		#$conf["disallowAllSkipableVarNotExist"],字串,是否不允許每個可省略參數都不存在,預設為"false"代表允許,反之為"true".
5538
		#$conf["disallowAllSkipableVarNotExist"]="";
5539
		#$conf["arrayCountEqualCheck"],字串陣列,為檢查哪些陣列參數的元素數量要一樣,$conf["arrayCountEqualCheck"][$i]=array()為第$i組key為哪些的變數其元素數量要相等.
5540
		#$conf["arrayCountEqualCheck"][]=array();
5541
		#參考資料:
5542
		#array_keys=>http://php.net/manual/en/function.array-keys.php
5543
		#備註:
5544
		#無.
5545
		$checkArguments=variableCheck::checkArguments($conf["variableCheck::checkArguments"]);
5546
		unset($conf["variableCheck::checkArguments"]);
5547
 
5548
		#如果執行出錯
5549
		if($checkArguments["status"]==="false"){
5550
 
5551
			#設置錯誤狀態
5552
			$result["status"]="false";
5553
 
5554
			#設置錯誤提示
5555
			$result["error"]=$checkArguments;
5556
 
5557
			#回傳結果
5558
			return $result;
5559
 
5560
			}#if end
226 liveuser 5561
 
3 liveuser 5562
		#如果檢查不通過
5563
		if($checkArguments["passed"]==="false"){
5564
 
5565
			#設置錯誤狀態
5566
			$result["status"]="false";
5567
 
5568
			#設置錯誤提示
5569
			$result["error"]=$checkArguments;
5570
 
5571
			#回傳結果
5572
			return $result;
5573
 
5574
			}#if end
5575
 
5576
		#函式說明:
5577
		#將要執行的script語法透過該函式執行(會在程式外層用<script></script>包起來).
5578
		#回傳結果:
5579
		#$result["status"],執行是否正常,"true"為正常,"false"為不正常.
5580
		#$result["error"],錯誤訊息陣列
5581
		#$result["function"],當前執行的函數名稱
5582
		#$result["content"],要執行的javaScript語法
5583
		#必填參數:
5584
		#$conf["script"],字串,要執行的javaScript語法.
5585
		$conf["javaScript::toScript"]["script"]=
5586
		"
5587
		//debug
5588
		console.log('override addEventListener');
226 liveuser 5589
 
3 liveuser 5590
		//參考資料 https://stackoverflow.com/questions/446892/how-to-find-event-listeners-on-a-dom-node-when-debugging-or-from-the-javascript
5591
		//override addEventListener, when not native code
226 liveuser 5592
		if(Element.prototype.addEventListener.toString().includes('native code')!==true){
3 liveuser 5593
			Element.prototype._addEventListener = Element.prototype.addEventListener;
5594
			Element.prototype.addEventListener = function(a,b,c){
5595
				this._addEventListener(a,b,c);
5596
				if(!this.eventListenerList) {
5597
					this.eventListenerList = {};
5598
					}
5599
				if(!this.eventListenerList[a]) {
5600
					this.eventListenerList[a] = [];
5601
					}
5602
				this.eventListenerList[a].push(b);
5603
				};
5604
			}//if end
226 liveuser 5605
 
3 liveuser 5606
		//debug
5607
		//console.log('add scrollingListMiddleEvent');
5608
 
5609
		//新增當視窗大小改變時的事件
5610
		window.scrollingListMiddleEvent();
5611
 
5612
		//frame 大小調整 - start
5613
 
5614
		//立馬跑一次
5615
		window.changeFrameEleHeightToFullLessSource.run.call();
5616
 
5617
		//綁定事件
5618
		window.addEventListener('resize',window.changeFrameEleHeightToFullLessSource.run);
5619
 
5620
		//frame 大小調整 - end
5621
 
5622
		//div frame 大小調整 - start
5623
 
5624
		//立馬跑一次
5625
		window.changeDivFrameEleHeightToFullLessSource.run.call();
5626
 
5627
		//綁定事件
5628
		window.addEventListener('resize',window.changeDivFrameEleHeightToFullLessSource.run);
5629
 
5630
		//frame 大小調整 - end
5631
 
5632
		//綁定檢查reCAPTCHA的事件
5633
		getGoogle_reCAPTCHA_res_event();
5634
 
5635
		//托移的事件
5636
		window.dragEventHandler.func.call();
5637
 
5638
		//如果沒有 window.qbpwcf
5639
		if(window.qbpwcf===undefined){
226 liveuser 5640
 
3 liveuser 5641
			//初始化為空物件
5642
			window.qbpwcf={};
226 liveuser 5643
 
3 liveuser 5644
			}//if end
5645
 
5646
		//close Icon
5647
		window.qbpwcf.closeIcon='data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhLS0gQ3JlYXRlZCB3aXRoIElua3NjYXBlIChodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy8pIC0tPgoKPHN2ZwogICB4bWxuczpvc2I9Imh0dHA6Ly93d3cub3BlbnN3YXRjaGJvb2sub3JnL3VyaS8yMDA5L29zYiIKICAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIgogICB4bWxuczpjYz0iaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbnMjIgogICB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiCiAgIHhtbG5zOnN2Zz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgeG1sbnM6c29kaXBvZGk9Imh0dHA6Ly9zb2RpcG9kaS5zb3VyY2Vmb3JnZS5uZXQvRFREL3NvZGlwb2RpLTAuZHRkIgogICB4bWxuczppbmtzY2FwZT0iaHR0cDovL3d3dy5pbmtzY2FwZS5vcmcvbmFtZXNwYWNlcy9pbmtzY2FwZSIKICAgd2lkdGg9IjEwNS43ODE3Mm1tIgogICBoZWlnaHQ9IjEwNS4zNDM0NG1tIgogICB2aWV3Qm94PSIwIDAgMTA1Ljc4MTcyIDEwNS4zNDM0NCIKICAgdmVyc2lvbj0iMS4xIgogICBpZD0ic3ZnOCIKICAgaW5rc2NhcGU6dmVyc2lvbj0iMC45MitkZXZlbCB1bmtub3duIgogICBzb2RpcG9kaTpkb2NuYW1lPSJjbG9zZUljb24uc3ZnIj4KICA8ZGVmcwogICAgIGlkPSJkZWZzMiI+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDQzMTUiCiAgICAgICBvc2I6cGFpbnQ9InNvbGlkIj4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzAwMDAwMDtzdG9wLW9wYWNpdHk6MTsiCiAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgaWQ9InN0b3A0MzEzIiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxmaWx0ZXIKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIHN0eWxlPSJjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM6c1JHQiIKICAgICAgIGlkPSJmaWx0ZXI0MzkxIgogICAgICAgeD0iLTAuMDY4OTc3MTAzIgogICAgICAgd2lkdGg9IjEuMTM3OTU0MiIKICAgICAgIHk9Ii0wLjA3NTI5OTk5MyIKICAgICAgIGhlaWdodD0iMS4xNTA2Ij4KICAgICAgPGZlR2F1c3NpYW5CbHVyCiAgICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgICAgc3RkRGV2aWF0aW9uPSIxLjAwNjI1NDMiCiAgICAgICAgIGlkPSJmZUdhdXNzaWFuQmx1cjQzOTMiIC8+CiAgICA8L2ZpbHRlcj4KICAgIDxmaWx0ZXIKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIHN0eWxlPSJjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM6c1JHQiIKICAgICAgIGlkPSJmaWx0ZXI0NDM4IgogICAgICAgeD0iLTAuMDIyNjIyOTA0IgogICAgICAgd2lkdGg9IjEuMDQ1MjQ1OCIKICAgICAgIHk9Ii0wLjAyNTU1NTYxNCIKICAgICAgIGhlaWdodD0iMS4wNTExMTEyIj4KICAgICAgPGZlR2F1c3NpYW5CbHVyCiAgICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgICAgc3RkRGV2aWF0aW9uPSIwLjIyMTcwNjAxIgogICAgICAgICBpZD0iZmVHYXVzc2lhbkJsdXI0NDQwIiAvPgogICAgPC9maWx0ZXI+CiAgICA8ZmlsdGVyCiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgICBzdHlsZT0iY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzOnNSR0IiCiAgICAgICBpZD0iZmlsdGVyNDQ0NiIKICAgICAgIHg9Ii0wLjAyMzIzMjg0NyIKICAgICAgIHdpZHRoPSIxLjA0NjQ2NTgiCiAgICAgICB5PSItMC4wMjQ4MTk1NDUiCiAgICAgICBoZWlnaHQ9IjEuMDQ5NjM5MSI+CiAgICAgIDxmZUdhdXNzaWFuQmx1cgogICAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgICAgIHN0ZERldmlhdGlvbj0iMC4yMjIwOTQyOCIKICAgICAgICAgaWQ9ImZlR2F1c3NpYW5CbHVyNDQ0OCIgLz4KICAgIDwvZmlsdGVyPgogIDwvZGVmcz4KICA8c29kaXBvZGk6bmFtZWR2aWV3CiAgICAgaWQ9ImJhc2UiCiAgICAgcGFnZWNvbG9yPSIjZmZmZmZmIgogICAgIGJvcmRlcmNvbG9yPSIjNjY2NjY2IgogICAgIGJvcmRlcm9wYWNpdHk9IjEuMCIKICAgICBpbmtzY2FwZTpwYWdlb3BhY2l0eT0iMC4wIgogICAgIGlua3NjYXBlOnBhZ2VzaGFkb3c9IjIiCiAgICAgaW5rc2NhcGU6em9vbT0iMS40IgogICAgIGlua3NjYXBlOmN4PSIxMzAuNTY4NjgiCiAgICAgaW5rc2NhcGU6Y3k9IjIwMS4zNDg0NSIKICAgICBpbmtzY2FwZTpkb2N1bWVudC11bml0cz0ibW0iCiAgICAgaW5rc2NhcGU6Y3VycmVudC1sYXllcj0iZzQ0ODgiCiAgICAgaW5rc2NhcGU6ZG9jdW1lbnQtcm90YXRpb249IjAiCiAgICAgc2hvd2dyaWQ9ImZhbHNlIgogICAgIGlua3NjYXBlOndpbmRvdy13aWR0aD0iMTYwMCIKICAgICBpbmtzY2FwZTp3aW5kb3ctaGVpZ2h0PSI4MzYiCiAgICAgaW5rc2NhcGU6d2luZG93LXg9IjAiCiAgICAgaW5rc2NhcGU6d2luZG93LXk9IjI3IgogICAgIGlua3NjYXBlOndpbmRvdy1tYXhpbWl6ZWQ9IjEiIC8+CiAgPG1ldGFkYXRhCiAgICAgaWQ9Im1ldGFkYXRhNSI+CiAgICA8cmRmOlJERj4KICAgICAgPGNjOldvcmsKICAgICAgICAgcmRmOmFib3V0PSIiPgogICAgICAgIDxkYzpmb3JtYXQ+aW1hZ2Uvc3ZnK3htbDwvZGM6Zm9ybWF0PgogICAgICAgIDxkYzp0eXBlCiAgICAgICAgICAgcmRmOnJlc291cmNlPSJodHRwOi8vcHVybC5vcmcvZGMvZGNtaXR5cGUvU3RpbGxJbWFnZSIgLz4KICAgICAgICA8ZGM6dGl0bGUgLz4KICAgICAgPC9jYzpXb3JrPgogICAgPC9yZGY6UkRGPgogIDwvbWV0YWRhdGE+CiAgPGcKICAgICBpbmtzY2FwZTpsYWJlbD0iTGF5ZXIgMSIKICAgICBpbmtzY2FwZTpncm91cG1vZGU9ImxheWVyIgogICAgIGlkPSJsYXllcjEiCiAgICAgc3R5bGU9ImRpc3BsYXk6aW5saW5lIgogICAgIHRyYW5zZm9ybT0idHJhbnNsYXRlKC01MC4wNTQwMzQsLTg5LjA0MzUyMikiPgogICAgPGcKICAgICAgIGlkPSJnNDQ4OCIKICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDIuNjU1MDQ0MywwLDAsMi44NTQ2OTA3LC0xMTAuOTk1MTgsLTMyNi45MjY1MikiPgogICAgICA8ZWxsaXBzZQogICAgICAgICByeT0iMTYuMDM1OTI3IgogICAgICAgICByeD0iMTcuNTA1ODg0IgogICAgICAgICBjeT0iMTY0LjE2NTUxIgogICAgICAgICBjeD0iODAuNTc4NzIiCiAgICAgICAgIGlkPSJwYXRoMzQ3NCIKICAgICAgICAgc3R5bGU9Im9wYWNpdHk6MC4zO2ZpbGw6IzAwMDAwMDtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6MC4yNjQ5OTk5OTtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2Utb3BhY2l0eToxO2ZpbHRlcjp1cmwoI2ZpbHRlcjQzOTEpO2ltYWdlLXJlbmRlcmluZzphdXRvIiAvPgogICAgICA8cmVjdAogICAgICAgICB0cmFuc2Zvcm09InJvdGF0ZSgtNDIuODA4OTU1KSIKICAgICAgICAgcnk9IjAiCiAgICAgICAgIHk9IjE3NC41NTY0OSIKICAgICAgICAgeD0iLTY3LjM5ODc1OCIKICAgICAgICAgaGVpZ2h0PSIyLjE1MjIwNjQiCiAgICAgICAgIHdpZHRoPSIyOS4yNzk2NDgiCiAgICAgICAgIGlkPSJyZWN0NDQxMyIKICAgICAgICAgc3R5bGU9Im9wYWNpdHk6MTtmaWxsOiNmZmZmMDA7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjA7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLW9wYWNpdHk6MTtmaWx0ZXI6dXJsKCNmaWx0ZXI0NDQ2KSIgLz4KICAgICAgPHJlY3QKICAgICAgICAgdHJhbnNmb3JtPSJyb3RhdGUoLTEzOS4wMzQ0MikiCiAgICAgICAgIHJ5PSIwIgogICAgICAgICB5PSItNzMuMDUwOTQ5IgogICAgICAgICB4PSItMTgyLjk2MjUyIgogICAgICAgICBoZWlnaHQ9IjIuMTUyMjA2NCIKICAgICAgICAgd2lkdGg9IjI5LjI3OTY0OCIKICAgICAgICAgaWQ9InJlY3Q0NDEzLTMiCiAgICAgICAgIHN0eWxlPSJvcGFjaXR5OjE7ZmlsbDojZmZmZjAwO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDowO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1vcGFjaXR5OjE7ZmlsdGVyOnVybCgjZmlsdGVyNDQzOCkiIC8+CiAgICA8L2c+CiAgPC9nPgo8L3N2Zz4K';
5648
 
5649
		";
5650
		#可省略參數:
5651
		#$conf["onReady"],字串,是否要在網頁載入完再執行,"false"為不等載入完就先執行,預設為"true"要等載入完再執行.
5652
		$conf["javaScript::toScript"]["onReady"]="true";
5653
		#$conf["globalJs"],字串陣列,為要放入<script>標籤的js全域變數.
5654
		#$conf["globalJs"]=array();
5655
		#$conf["jsFunciton"],字串陣列,為要放入<script>標籤的js函數.
5656
		$conf["javaScript::toScript"]["jsFunciton"][]=
5657
		"
5658
		//調整滾軸表單的置中效果事件
5659
		function scrollingListMiddleEvent(){
5660
 
5661
			//綁定視窗resize的事件
5662
			window.addEventListener('resize',function(event){
5663
 
5664
				//debug
5665
				//console.log('resized');
5666
 
5667
				//調整滾軸表單的置中效果
5668
				scrollingListMiddleFunction();
5669
 
5670
				});
5671
 
5672
			}//function scrollingListMiddleEvent end
5673
		";
5674
		$conf["javaScript::toScript"]["jsFunciton"][]=
5675
		"
5676
		//調整滾軸表單的置中效果
5677
		function scrollingListMiddleFunction(){
5678
 
5679
			//取得下拉式選單的div
5680
			var rootDiv=document.getElementById('scrollingListRootDiv');
5681
 
5682
			//如果沒有下拉式選單的div
5683
			if(rootDiv===null){
5684
 
5685
				//debug
5686
				//console.log('沒有下拉式選單的div');
5687
 
5688
				return false;
5689
 
5690
				}//if end
5691
 
5692
			//取得下拉式選單的外框高度
5693
			var listOutterDivHeight=rootDiv.children[0].clientHeight;
5694
 
5695
			//下拉式選單的外框高度
5696
			//console.log(listOutterDivHeight);
5697
 
5698
			//取得下拉式選單的內寬高度
5699
			var listInnerDivHeight=rootDiv.children[0].children[0].clientHeight;
5700
 
5701
			//下拉式選單的內寬高度
5702
			//console.log(listInnerDivHeight);
5703
 
5704
			//如果有滾軸
5705
			if(rootDiv.children[0].scrollTopMax!==0 && rootDiv.children[0].scrollTopMax!==undefined){
5706
 
5707
				//debug
5708
				//console.log('有滾軸');
5709
 
5710
				//debug
5711
				//console.log(rootDiv.children[0].scrollTopMax);
5712
 
5713
				//取消選項內框與選單外框的高度
5714
				rootDiv.children[0].children[0].style['margin-top']='unset';
5715
 
5716
				//結束 event
5717
				return false;
5718
 
5719
				}//if end
5720
 
5721
			//沒有滾軸
5722
 
5723
			//debug
5724
			//console.log('沒有滾軸');
5725
 
5726
			//計算選項內框與選單外框的高度
5727
			var marginTop=((listOutterDivHeight-listInnerDivHeight)/2).toString()+'px';
5728
 
5729
			//debug
5730
			//console.log(marginTop);
5731
 
5732
			//如果是火狐瀏覽器
5733
			if(navigator.userAgent.includes('Firefox')){
5734
 
5735
				//設置選項內框與選單外框的高度,已便讓選項列表上下置中於選單外框
5736
				rootDiv.children[0].children[0].style.marginTop=marginTop;
226 liveuser 5737
 
3 liveuser 5738
				}//if end
5739
 
226 liveuser 5740
 
3 liveuser 5741
			}//function scrollingListMiddleFunction end
5742
		";
5743
		$conf["javaScript::toScript"]["jsFunciton"][]=
5744
		"
5745
		//變更iframe自己的高度為螢幕高度減去來源iframe高度的function
5746
		var changeFrameEleHeightToFullLessSource={
5747
 
5748
			changeSizeFrameId:null,
5749
			fixedSizeFrameId:null,
5750
			run:function(){
5751
 
5752
				var changeSizeFrameId=window.changeFrameEleHeightToFullLessSource.changeSizeFrameId;
5753
				var fixedSizeFrameId=window.changeFrameEleHeightToFullLessSource.fixedSizeFrameId;
5754
 
5755
				//如果未設置則結束函式
5756
				if(changeSizeFrameId===null || fixedSizeFrameId===null)
5757
				{
5758
					return false;
5759
				}
5760
 
5761
				var bottomDiv=document.getElementById(fixedSizeFrameId).parentElement;
5762
				var bottomDivH=bottomDiv.clientHeight;
5763
 
5764
				var windowH=document.body.clientHeight;
5765
 
5766
				var topDiv=document.getElementById(changeSizeFrameId).parentElement;
5767
				var topDivH=topDiv.clientHeight;
5768
 
5769
				var bottomDivStyle=window.getComputedStyle(bottomDiv,null);
5770
				//console.log('original height is '+bottomDivStyle['height']);
5771
 
5772
				//console.log('var windowH is '+windowH);
5773
				//console.log('var topDivH is '+topDivH);
5774
				var newBottomDivH=windowH-topDivH+'px';
5775
				bottomDiv.style.height=windowH-topDivH+'px';
5776
				//console.log('altered height is '+newBottomDivH);
5777
				}
5778
			}
5779
		";
5780
		$conf["javaScript::toScript"]["jsFunciton"][]=
5781
		"
5782
		//變更div frame 自己的高度為螢幕高度減去來源 div frame 高度的 function
5783
		var changeDivFrameEleHeightToFullLessSource={
5784
 
5785
			changeSizeFrameId:null,
5786
			fixedSizeFrameId:null,
5787
			run:function(){
5788
 
5789
				var changeSizeFrameId=window.changeDivFrameEleHeightToFullLessSource.changeSizeFrameId;
5790
				var fixedSizeFrameId=window.changeDivFrameEleHeightToFullLessSource.fixedSizeFrameId;
5791
 
5792
				//如果未設置則結束函式
5793
				if(changeSizeFrameId===null || fixedSizeFrameId===null)
5794
				{
5795
					//console.log('no target');
5796
					return false;
5797
				}
5798
 
5799
				var bottomDiv=document.getElementById(fixedSizeFrameId);
5800
				var bottomDivH=bottomDiv.clientHeight;
5801
 
5802
				var windowH=document.body.clientHeight;
5803
 
5804
				var topDiv=document.getElementById(changeSizeFrameId);
5805
				var topDivH=topDiv.clientHeight;
5806
 
5807
				var bottomDivStyle=window.getComputedStyle(bottomDiv,null);
5808
				//console.log('original height is '+bottomDivStyle['height']);
5809
 
5810
				//console.log('var windowH is '+windowH);
5811
				//console.log('var topDivH is '+topDivH);
5812
				var newBottomDivH=windowH-topDivH+'px';
5813
				bottomDiv.style.height=windowH-topDivH+'px';
5814
				//console.log('altered height is '+newBottomDivH);
5815
				}
5816
			}
5817
		";
5818
		$conf["javaScript::toScript"]["jsFunciton"][]=
5819
		"
5820
		// custom blob function start
5821
 
5822
		var MyBlobBuilder = function() {
5823
			this.parts = [];
5824
			}
5825
 
5826
		MyBlobBuilder.prototype.append = function(part) {
5827
			this.parts.push(part);
5828
			this.blob = undefined; // Invalidate the blob
5829
			};
5830
 
5831
		MyBlobBuilder.prototype.getBlob = function(mimeType) {
5832
			if(mimeType===''){
5833
				mimeType=\"text/plain\";
5834
				}
5835
			if (!this.blob) {
5836
				this.blob = new Blob(this.parts, { type: mimeType });
5837
				}
5838
			return this.blob;
5839
			};
5840
 
5841
		// custom blob function end
5842
		";
5843
		$conf["javaScript::toScript"]["jsFunciton"][]=
5844
		"
5845
		// 建構子 conDownloadAgent start
5846
		var conDownloadAgent=function(){
5847
 
5848
			this.xmlhttp=''; //XMLHttpRequest
5849
			this.fileUrl=''; //要下載的檔案url
5850
			this.resHeaders=''; //回傳的header
5851
			this.resHeadersArray=[];//回傳的header array
5852
			this.fileContent=new Blob(); //檔案的2元碼
5853
			this.filePartContent=[]; //2元碼檔案內容的片段陣列.
5854
			this.fileContentBase64=''; //檔案的base64碼
5855
			this.fileMimeType=''; //檔案的mime tpye
5856
			this.fileName=''; //檔案的名稱
5857
			this.start=0; //要下載的檔案部分bytes位置開頭
5858
			this.end=0; //要下載的檔案部分bytes位置結束
5859
			this.total=0; //要下載的檔案總共bytes數
5860
			this.partSize=1024; //一次要下載多少bytes
5861
			this.retryIn=3; //當下載的長度不對,或下載失敗,幾秒後重新連線.
5862
 
5863
			this.getPart=function(){
5864
 
5865
				//如果沒有指定檔案的網址
5866
				if(this.fileUrl===''){
5867
 
5868
					//提示錯誤
5869
					console.log('fileUrl 未指定!');
5870
 
5871
					//結束程式
5872
					return false;
5873
 
5874
					}//if end
5875
 
5876
				//檢查檔案下載好了沒
5877
				if(this.validateFile===false){
5878
 
5879
					//結束程式
5880
					return false;
5881
 
5882
					}//if end
5883
 
5884
				//如果存在 xml http request 屬性
5885
				if(window.XMLHttpRequest){
5886
 
5887
					// code for IE7+, Firefox, Chrome, Opera, Safari
5888
					xmlhttp=new XMLHttpRequest();
5889
 
5890
					}//if end
5891
 
5892
				//反之代表為ie 5,6
5893
				else{
5894
 
5895
					// code for IE6, IE5
5896
					xmlhttp=new ActiveXObject('Microsoft.XMLHTTP');
5897
 
5898
					}// else end
5899
 
5900
				//取得當前物件
5901
				var thisClone=this;
5902
 
5903
				//如果服務端有回傳完稱的狀態
5904
				xmlhttp.addEventListener('loadend',function(){
5905
 
5906
					//取得 xmlhttp 的回應
5907
					var xmlhttp=this;
5908
 
5909
					//取得 conDownloadAgent 的物件
5910
					var conDownloadAgent=thisClone;
5911
 
5912
					//將取得的內容用2元碼儲存
5913
					var blob = new Blob([xmlhttp.response]);
5914
 
5915
					//儲存該段的2元碼
5916
					conDownloadAgent.filePartContent.push(blob);
5917
 
5918
					//取得回傳的 header
5919
					conDownloadAgent.resHeaders=xmlhttp.getAllResponseHeaders();
5920
 
5921
					//取得回傳的 header 陣列
5922
					conDownloadAgent.resHeadersArray=conDownloadAgent.resHeaders.split('\\r\\n');
5923
 
5924
					//另存 header
5925
					var headerArray=conDownloadAgent.resHeadersArray;
5926
 
5927
					//針對每個 header
5928
					for(var i=0;i<headerArray.length;i++){
5929
 
5930
						//取得其中一個 header
5931
						var oneHeader=headerArray[i];
5932
 
5933
						//檢查有無關鍵字 'Content-Range: bytes '
5934
						var foundKeyWord=oneHeader.includes('Content-Range: bytes ');
5935
 
5936
						//如果有找到關鍵字
5937
						if(foundKeyWord===true){
5938
 
5939
							//取得實際應該要取得的 bytes 跟總共有多少 bytes
5940
							var contentRange=oneHeader.split('Content-Range: bytes ');
5941
							var contentRange=contentRange[1];
5942
							var bytesInfo=contentRange.split('/');
5943
 
5944
							//實際上的檔案總bytes
5945
							conDownloadAgent.total=parseInt(bytesInfo[1]);
5946
 
5947
							//解析本次取得的bytes位置開頭與結尾
5948
							var revInfo=bytesInfo[0].split('-');
5949
 
5950
							//本次取得的bytes位置開頭
5951
							conDownloadAgent.start=parseInt(revInfo[0]);
5952
 
5953
							//本次取得的bytes位置結束
5954
							conDownloadAgent.end=parseInt(revInfo[1]);
5955
 
5956
							}//if end
5957
 
5958
						//檢查有無關鍵字 'Content-Disposition: inline; filename='
5959
						var foundKeyWord=oneHeader.includes('Content-Disposition: inline; filename=');
5960
 
5961
						//如果有找到關鍵字且尚未取得檔單的名稱
5962
						if(foundKeyWord===true && conDownloadAgent.fileName===''){
5963
 
5964
							//解析檔案的名稱
5965
							var fileInfo=oneHeader.split('Content-Disposition: inline; filename=');
5966
 
5967
							//取得檔案名稱
5968
							conDownloadAgent.fileName=fileInfo[1];
5969
 
5970
							}//if end
5971
 
5972
						//檢查有無關鍵字 'Content-Type: '
5973
						var foundKeyWord=oneHeader.includes('Content-Type: ');
5974
 
5975
						//如果有找到關鍵字且尚未取得檔案的mimeType
5976
						if(foundKeyWord===true && conDownloadAgent.fileMimeType===''){
5977
 
5978
							//解析檔案的mimeType
5979
							var fileInfo=oneHeader.split('Content-Type: ');
5980
 
5981
							//取得檔案mimeType
5982
							conDownloadAgent.fileMimeType=fileInfo[1];
5983
 
5984
							}//if end
5985
 
5986
						}//for end
5987
 
5988
					//如果取得的檔案內容長度不為header提供的總長度.
5989
					if(conDownloadAgent.filePartContent[conDownloadAgent.filePartContent.length-1].size!==conDownloadAgent.end-conDownloadAgent.start+1){
5990
 
5991
						//換算要多少豪秒
5992
						var retryInNms=conDownloadAgent.retryIn*1000;
5993
 
5994
						//debug
5995
						console.log('該段長度不對,'+conDownloadAgent.retryIn+'秒後重新下載');
5996
 
5997
						//conDownloadAgent.retryIn秒後再度嘗試下載
5998
						setTimeout(function(){
5999
 
6000
							//遞迴呼叫自己,繼續下載
6001
							conDownloadAgent.getPart();
6002
 
6003
							},retryInNms);
6004
 
6005
						//結束程式
6006
						return;
6007
 
6008
						}//if end
6009
 
6010
					//如果取得的長度結尾不為 實際上的檔案總bytes-1
6011
					if(conDownloadAgent.end!==conDownloadAgent.total-1){
6012
 
6013
						//取得尚未下載到的bytes
6014
						var unDownBytes=conDownloadAgent.total-1-conDownloadAgent.end;
6015
 
6016
						//如果剩下的bytes大於 conDownloadAgent.partSize
6017
						if(unDownBytes>conDownloadAgent.partSize){
6018
 
6019
							//設置新的要下載bytes位置開頭
6020
							conDownloadAgent.start=parseInt(conDownloadAgent.end)+1;
6021
 
6022
							//設置新的要下載bytes位置結束
6023
							conDownloadAgent.end=parseInt(conDownloadAgent.end)+parseInt(conDownloadAgent.partSize);
6024
 
6025
							}//if end
6026
 
6027
						//反之剩下不到 conDownloadAgent.partSize 未下載
6028
						else{
6029
 
6030
							//設置新的要下載bytes位置開頭
6031
							conDownloadAgent.start=parseInt(conDownloadAgent.end)+1;
6032
 
6033
							//設置新的要下載bytes位置結束
6034
							conDownloadAgent.end=parseInt(conDownloadAgent.end)+unDownBytes;
6035
 
6036
							}//else end
6037
 
6038
						//遞迴呼叫自己,繼續下載
6039
						conDownloadAgent.getPart();
6040
 
6041
						}//if end
6042
 
6043
					//反之代表下載完成
6044
					else{
6045
 
6046
						//debug
6047
						console.log('下載完成');
6048
 
6049
						//下載檔案
6050
						conDownloadAgent.get();
6051
 
6052
						}//else end
6053
 
6054
					});
6055
 
6056
				//設定要用get傳送的數值
6057
				xmlhttp.open('GET',this.fileUrl,true);
6058
 
6059
				//預設 mimeType
6060
				var mimeType='application/x-www-form-urlencoded';
6061
 
6062
				//如果有 fileMimeType
6063
				if(this.fileMimeType!==''){
6064
 
6065
					//另存 mimeType
6066
					var mimeType=this.fileMimeType;
6067
 
6068
					}//if end
6069
 
6070
				//設定 header
6071
				xmlhttp.setRequestHeader('Content-type',mimeType);
6072
 
6073
				//設定要求為ajax 的 header
6074
				xmlhttp.setRequestHeader('X-Requested-With','XMLHttpRequest');
6075
 
6076
				//設置取得的回應為blob(2元密)
6077
				xmlhttp.responseType = 'blob';
6078
 
6079
				//設置要求的範圍
6080
				xmlhttp.setRequestHeader('Range','bytes='+this.start+'-'+this.end);
6081
 
6082
				//設置request的timeout(毫秒)
6083
				//xmlhttp.timeout=this.timeout*1000;
6084
 
6085
				//傳送要求
6086
				xmlhttp.send();
6087
 
6088
				};//function get part end
6089
 
6090
			//產生下載檔案的連結,並點擊之
6091
			this.get=function(){
6092
 
6093
				//取得當前物件
6094
				var conDownloadAgent=this;
6095
 
6096
				//debug
6097
				console.log('建立base64的link來下載檔案');
6098
 
6099
				//檢查檔案下載好了沒
6100
				if(this.validateFile===false){
6101
 
6102
					//結束程式
6103
					return false;
6104
 
6105
					}//if end
6106
 
6107
				//建立blob物件
6108
				var myBlobBuilder = new MyBlobBuilder();
6109
 
6110
				//針對每個blob部分
6111
				for(var i=0;i<conDownloadAgent.filePartContent.length;i++){
6112
 
6113
					//append該部分的blob
6114
					myBlobBuilder.append(conDownloadAgent.filePartContent[i]);
6115
 
6116
					}//for end
6117
 
6118
				//取得append後的內容
6119
				conDownloadAgent.fileContent = myBlobBuilder.getBlob(conDownloadAgent.fileMimeType);
6120
 
6121
				//讀取blob的內容
6122
				var reader = new FileReader();
6123
 
6124
				//增加讀取完檔案後要做的事情
6125
				reader.addEventListener('loadend',function(){
6126
 
6127
					//return false;
6128
 
6129
					//儲存base64的檔案內容
6130
					conDownloadAgent.fileContentBase64=reader.result;
6131
 
6132
					//建立元素a
6133
					var aNode = document.createElement('a');
6134
 
6135
					//組成link的內容
6136
					aNode.href=conDownloadAgent.fileContentBase64;
6137
 
6138
					//設置link為不顯示的樣式
6139
					aNode.style.display='none';
6140
 
6141
					//設置link的id為
6142
					aNode.id='conDownloadLink';
6143
 
6144
					//放置link
6145
					document.body.appendChild(aNode);
6146
 
6147
					//點擊下載的link
6148
					document.getElementById(aNode.id).click();
6149
 
6150
					//移除下載的link
6151
					document.getElementById(aNode.id).remove();
6152
 
6153
					});//reader.addEventListener end
6154
 
6155
				//讀取檔案的2元碼
6156
				reader.readAsDataURL(conDownloadAgent.fileContent);
6157
 
6158
				};//function get end
6159
 
6160
			//檢查檔案是否下載好了, return true/false
6161
			this.validateFile=function(){
6162
 
6163
				//如果沒有檔案大小
6164
				if(conDownloadAgent.total===''){
6165
 
6166
					//debug
6167
					console.log('檔案未下載完成');
6168
 
6169
					//結束程式
6170
					return false;
6171
 
6172
					}//if end
6173
 
6174
				//取得所下載檔案的大小
6175
				var fileSize=conDownloadAgent.total;
6176
 
6177
				//初始化取得的檔案大小
6178
				var gettedFileSize=0;
6179
 
6180
				//檢查是否有下載完成檔案,針對每個blob部分
6181
				for(var i=0;i<conDownloadAgent.filePartContent.length;i++){
6182
 
6183
					//累加取得的檔案大小
6184
					gettedFileSize=gettedFileSize+conDownloadAgent.filePartContent[i].size;
6185
 
6186
					}//for end
6187
 
6188
				//如果要下載檔案的大小不等於實際上所下載到的長度
6189
				if(fileSize!==gettedFileSize){
6190
 
6191
					//debug
6192
					console.log('檔案未下載完成');
6193
 
6194
					//結束程式
6195
					return false;
6196
 
6197
					}//if end
6198
 
6199
				//回傳 true 檔案已經下載好了
6200
				return true;
6201
 
6202
				}//function validateFile end
6203
 
6204
			};//function conDownloadAgent end
6205
		";
6206
		$conf["javaScript::toScript"]["jsFunciton"][]=
6207
		"
6208
		/*
6209
		函式說明:
6210
		驗證 gGoogle reCAPTCHA 的回應
6211
		回傳結果:
6212
		false,代表驗證失敗.
6213
		true,代表有進行驗證流程
6214
		必填參數
6215
		key,session key
6216
		value,value store in session key
6217
		*/
6218
		var getGoogle_reCAPTCHA_res=function(key='google_reCAPTCHA_pass',val=document.URL){
6219
 
6220
			//如果沒有 recaptcha 元素存在
6221
			if(document.getElementById('g-recaptcha-response')===null){
6222
 
6223
				//回傳結果
6224
				return false;
6225
 
6226
				}//if end
6227
 
6228
			//取得 reCAPTCHA 的回應
6229
			res=document.getElementById('g-recaptcha-response').value;
6230
 
6231
			//如果數值是空的,代表用戶沒有驗證
6232
			if(res===''){
6233
 
6234
				//回傳結果
6235
				return false;
6236
 
6237
				}//if end
6238
 
6239
			//反之用 ajax 跟 Server 端驗證
6240
			else{
6241
 
6242
				//建立 XMLDoc
6243
				if(window.XMLHttpRequest){
6244
 
6245
					// code for IE7+, Firefox, Chrome, Opera, Safari
6246
					xmlhttp=new XMLHttpRequest();
6247
 
6248
					//設置 server 應該要回傳 json
6249
					xmlhttp.responseType='json';
6250
 
6251
					}//if end
6252
 
6253
				else{
6254
 
6255
					// code for IE6, IE5
6256
					xmlhttp=new ActiveXObject('Microsoft.XMLHTTP');
6257
 
6258
					}//else end
6259
 
6260
				//如果服務端有回傳完成的狀態
6261
				xmlhttp.onreadystatechange=function(){
6262
 
6263
					//如果狀態為4且response code為200
6264
					if(xmlhttp.readyState==4 && xmlhttp.status==200){
6265
 
6266
						//如果回應為通過
6267
						if(xmlhttp.response.status==='true' || xmlhttp.response.status===true){
6268
 
6269
							//將 recaptcha 移除
6270
							document.getElementsByClassName('g-recaptcha')[0].remove();
6271
 
6272
							}//if end
6273
 
6274
						}//if end
6275
 
6276
					}//function end
6277
 
6278
				//設定要求的屬性、目的、是否不要同步
6279
				xmlhttp.open('POST','../json/authenticate/gl_reCAPTCHA_server.php',true);
6280
 
6281
				//設定 header
6282
				xmlhttp.setRequestHeader('Content-type','application/x-www-form-urlencoded');
6283
 
6284
				//設定 要求為ajax 的 header
6285
				xmlhttp.setRequestHeader('X-Requested-With','XMLHttpRequest');
6286
 
6287
				//要傳送的數值名稱與數值內容,ex:num1=100&num2=50
6288
				xmlhttp.send('response='+res+'&key='+key+'&val='+val);
6289
 
6290
				}//else end
6291
 
6292
			//有進入驗證流程
6293
			return true;
6294
 
6295
			}
6296
		";
6297
		$conf["javaScript::toScript"]["jsFunciton"][]=
6298
		"
6299
		/*
6300
		涵式說明:
6301
		提供偵測可能已經通過reCAPCHA,接着進行驗證回傳的結果是否正確.
6302
		*/
6303
		var getGoogle_reCAPTCHA_res_event=function(){
6304
 
6305
			//如果沒有 recaptcha 元素存在
6306
			if(document.getElementsByClassName('g-recaptcha').length===0){
6307
 
6308
				//回傳結果
6309
				return false;
6310
 
6311
				}//if end
6312
 
6313
			//取得產生reCAPCHA內容的div
6314
			grdiv=document.getElementsByClassName('g-recaptcha')[0];
6315
 
6316
			//滑鼠進來
6317
			grdiv.addEventListener('mouseenter',function(){
6318
 
6319
				//檢查有無通過驗證
6320
				getGoogle_reCAPTCHA_res();
6321
 
6322
				});
6323
 
6324
			//滑鼠離開
6325
			grdiv.addEventListener('mouseout',function(){
6326
 
6327
				//檢查有無通過驗證
6328
				getGoogle_reCAPTCHA_res();
6329
 
6330
				});
6331
			}
6332
		";
6333
		$conf["javaScript::toScript"]["jsFunciton"][]=
6334
		"
6335
		//如果 window.qbpwcf 不存在
6336
		if(window.qbpwcf===undefined){
6337
 
6338
			//初始化 window qbpwcf 物件
6339
			window.qbpwcf={};
6340
 
6341
			}//if end
226 liveuser 6342
 
3 liveuser 6343
		/*
6344
		涵式說明:
6345
		將同 data-form-id 的input/textarea內容用表單的方式傳送出去(POST)
6346
		params.ele, 要綁定事件的元素.
6347
		params.formId, 用來識別表單群體的名稱.
6348
		params.url, 表單要傳送到的地方.
6349
		params.method, GET or POST.
6350
		*/
6351
		window.qbpwcf.sendByDataFormId=function(params){
226 liveuser 6352
 
3 liveuser 6353
			//如果沒有ele
6354
			if(params.ele===undefined){
226 liveuser 6355
 
3 liveuser 6356
				//結束執行
6357
				return;
226 liveuser 6358
 
3 liveuser 6359
				}//if end
226 liveuser 6360
 
3 liveuser 6361
			//取得要取得的ele
6362
			var ele=params.ele;
226 liveuser 6363
 
3 liveuser 6364
			//如果沒有formId
6365
			if(params.formId===undefined){
226 liveuser 6366
 
3 liveuser 6367
				//預設為 'qbpwcf_form'
6368
				params.formId='qbpwcf_form';
226 liveuser 6369
 
6370
				}//if end
6371
 
3 liveuser 6372
			//取得要取得的formId
6373
			var formId=params.formId;
226 liveuser 6374
 
3 liveuser 6375
			//如果沒有formId
6376
			if(params.url===undefined){
226 liveuser 6377
 
3 liveuser 6378
				//預設為當前網址
6379
				params.url=location.href;
226 liveuser 6380
 
3 liveuser 6381
				}//if end
226 liveuser 6382
 
3 liveuser 6383
			//取得表單要傳送到的地方
6384
			var url=params.url;
226 liveuser 6385
 
3 liveuser 6386
			//如果沒有method
6387
			if(params.method===undefined){
226 liveuser 6388
 
3 liveuser 6389
				//預設為post
6390
				params.method='POST';
226 liveuser 6391
 
3 liveuser 6392
				}//if end
226 liveuser 6393
 
3 liveuser 6394
			//限定為post
6395
			var method=params.method;
226 liveuser 6396
 
3 liveuser 6397
			//綁定點擊事件
6398
			params.ele.addEventListener('click',async function(event){
226 liveuser 6399
 
3 liveuser 6400
				//如果沒有鎖頭
6401
				if(this.dataset.lock===undefined){
226 liveuser 6402
 
3 liveuser 6403
					//設置為上鎖
6404
					this.dataset.lock==='false';
226 liveuser 6405
 
3 liveuser 6406
					}//if end
226 liveuser 6407
 
3 liveuser 6408
				//如果已經上鎖了
6409
				if(this.dataset.lock==='true'){
226 liveuser 6410
 
3 liveuser 6411
					//結束執行
6412
					return false;
226 liveuser 6413
 
3 liveuser 6414
					}//if end
226 liveuser 6415
 
3 liveuser 6416
				//上鎖
6417
				this.dataset.lock='true';
226 liveuser 6418
 
3 liveuser 6419
				//取得所有 inputs
6420
				var dataFormId='data-form-id=\"'+formId+'\"';
6421
				dataFormId='input['+dataFormId+']';
6422
				eval('var inputDataFormId=\''+dataFormId+'\'');
6423
				var inputs=document.querySelectorAll(inputDataFormId);
226 liveuser 6424
 
3 liveuser 6425
				//取得所有 textarea
6426
				var dataFormId='data-form-id=\"'+formId+'\"';
6427
				dataFormId='textarea['+dataFormId+']';
6428
				eval('var textareaDataFormId=\''+dataFormId+'\'');
6429
				var textareas=document.querySelectorAll(textareaDataFormId);
226 liveuser 6430
 
3 liveuser 6431
				//debug
6432
				console.log(inputs,textareas);
226 liveuser 6433
 
3 liveuser 6434
				//初始化查詢的字串
6435
				var queryStr='';
226 liveuser 6436
 
3 liveuser 6437
				//如果有input
6438
				if(inputs.length!==0){
226 liveuser 6439
 
3 liveuser 6440
					//針對每個input
6441
					for(var i=0;i<inputs.length;i++){
226 liveuser 6442
 
3 liveuser 6443
						//如果不是空的
6444
						if(queryStr!==''){
226 liveuser 6445
 
3 liveuser 6446
							//串接'&'
6447
							queryStr=queryStr+'&';
226 liveuser 6448
 
3 liveuser 6449
							}//if end
226 liveuser 6450
 
3 liveuser 6451
						//加上查詢內容
6452
						queryStr=queryStr+inputs[i].name+'='+encodeURIComponent(inputs[i].value);
226 liveuser 6453
 
3 liveuser 6454
						}//for end
226 liveuser 6455
 
3 liveuser 6456
					}//if end
226 liveuser 6457
 
3 liveuser 6458
				//如果有textarea
6459
				if(textareas.length!==0){
226 liveuser 6460
 
3 liveuser 6461
					//針對每個textarea
6462
					for(var i=0;i<textareas.length;i++){
226 liveuser 6463
 
3 liveuser 6464
						//如果不是空的
6465
						if(queryStr!==''){
226 liveuser 6466
 
3 liveuser 6467
							//串接'&'
6468
							queryStr=queryStr+'&';
226 liveuser 6469
 
3 liveuser 6470
							}//if end
226 liveuser 6471
 
3 liveuser 6472
						//加上查詢內容
6473
						queryStr=queryStr+textareas[i].name+'='+encodeURIComponent(textareas[i].value);
226 liveuser 6474
 
3 liveuser 6475
						}//for end
226 liveuser 6476
 
3 liveuser 6477
					}//if end
226 liveuser 6478
 
3 liveuser 6479
				//初始化查詢的字串
6480
				console.log('queryStr='+queryStr);
226 liveuser 6481
 
3 liveuser 6482
				//如果沒有任何input
6483
				if(inputs.length===0  && textareas.length===0){
226 liveuser 6484
 
3 liveuser 6485
					//結束執行
226 liveuser 6486
					return;
6487
 
3 liveuser 6488
					}//if end
226 liveuser 6489
 
3 liveuser 6490
				//debug
6491
				console.log('params.method='+params.method);
6492
				console.log('params.url='+params.url);
226 liveuser 6493
 
3 liveuser 6494
				//傳送表單
6495
				/*
6496
				設置 window.qbpwcf.ajaxP 函數
6497
				說明:
6498
				傳送ajax,指定傳送前要做什麼事情,然後回傳一個Promise.
6499
				參數:
6500
				params={};
6501
				params.method='POST' or 'GET' or 'HEAD' or 'OPTIONS';
6502
				params.headers={name:value};
6503
				params.url='url to request';
6504
				params.preAc='function name to call before send request';
6505
				params.data='data to contain','key1=encodeURIComponent(val1)&key2=encodeURIComponent(val2)';if no data please use {};
6506
				參考資料:
6507
				https://eyesofkids.gitbooks.io/javascript-start-es6-promise/content/contents/ch11_snippets.html
6508
				https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise
6509
				*/
6510
				ajaxP_params={};
6511
				ajaxP_params.data=queryStr;
6512
				ajaxP_params.method=params.method;
6513
				ajaxP_params.url=params.url;
6514
				var res = await window.qbpwcf.ajaxP.call(this,ajaxP_params);
226 liveuser 6515
 
3 liveuser 6516
				//debug
6517
				console.log(res);
226 liveuser 6518
 
3 liveuser 6519
				//解鎖
6520
				this.dataset.lock='false';
226 liveuser 6521
 
3 liveuser 6522
				});
226 liveuser 6523
 
3 liveuser 6524
			}
6525
		";
6526
		$conf["javaScript::toScript"]["jsFunciton"][]=
6527
		"
6528
		//如果 window.qbpwcf 不存在
6529
		if(window.qbpwcf===undefined){
6530
 
6531
			//初始化 window qbpwcf 物件
6532
			window.qbpwcf={};
6533
 
6534
			}//if end
226 liveuser 6535
 
3 liveuser 6536
		//初始化物件
6537
		window.qbpwcf.postDataAttr={};
6538
 
6539
		/*
226 liveuser 6540
		函式說明:
3 liveuser 6541
		設置點擊元素後會傳遞data屬性為名稱與其數值為表單數值給特定url,然後依照片段show到當前頁面.
6542
		參數說明:
6543
		element,要綁定事件的元素.
6544
		url,表單要傳送到的位置.
226 liveuser 6545
		method,傳送的方法,有POST跟GET兩種
3 liveuser 6546
		範例用法:
6547
		element=document.getElementsByClassName('quickDayLog')[0];
6548
		window.qbpwcf.postDataAttr.func.call(this,element,'logRes.php','POST','rootDiv');
226 liveuser 6549
		*/
3 liveuser 6550
		window.qbpwcf.postDataAttr.func=function(element,url,method,rootDiv){
6551
 
6552
			//綁定事件到元素上
6553
			element.addEventListener('click',function(event){
6554
 
6555
				//取得目標url
6556
				window.qbpwcf.postDataAttr.url=url;
6557
 
6558
				//取得表單傳遞方式
226 liveuser 6559
				window.qbpwcf.postDataAttr.method=method;
6560
 
3 liveuser 6561
				//取得抓取回應並要放置到哪個id的div裡面
6562
				window.qbpwcf.postDataAttr.rootDiv=rootDiv;
6563
 
6564
				//初始化要傳送的表單物件
6565
				window.qbpwcf.postDataAttr.params={};
226 liveuser 6566
 
3 liveuser 6567
				//取得元素的data
6568
				dataset=element.dataset;
6569
 
6570
				//針對每個表單名稱
6571
				for(i=0;i<Object.keys(dataset).length;i++){
6572
 
6573
					//取得表單名稱
6574
					key=Object.keys(dataset)[i];
6575
 
6576
					//取得表單內容
6577
					val=eval('dataset.'+key);
6578
 
6579
					//取得表單的內容
6580
					eval('window.qbpwcf.postDataAttr.params.'+key+'='+val);
6581
 
6582
					}//for end
226 liveuser 6583
 
3 liveuser 6584
				//遞迴取得回應並放在特定div裡面
226 liveuser 6585
				window.qbpwcf.tailAny.func.call(this,window.qbpwcf.postDataAttr.params,window.qbpwcf.postDataAttr.url,window.qbpwcf.postDataAttr.method,window.qbpwcf.postDataAttr.rootDiv);
3 liveuser 6586
 
6587
				});//function end
6588
			};
6589
		";
6590
		$conf["javaScript::toScript"]["jsFunciton"][]=
6591
		"
6592
		/*
6593
		涵式說明:
6594
		統一處理托移事件
6595
		*/
6596
		// drag event handler start
6597
		window.dragEventHandler={};
226 liveuser 6598
 
3 liveuser 6599
		//儲存被拖移的元素
6600
		window.dragEventHandler.dragged={};
6601
 
6602
		//儲存被壓住的元素
6603
		window.dragEventHandler.dropped={};
6604
 
6605
		/*
6606
		可以被托移的物件範例
6607
		<style>
6608
		.dropzone {
6609
			width: 200px;
6610
			height: 20px;
6611
			color: white;
6612
			background: blue;
6613
			margin-bottom: 10px;
6614
			}
6615
		</style>
226 liveuser 6616
		<div class='dropzone'>
6617
		  <div draggable='true'>
6618
		    This div is draggable
6619
		  </div>
6620
		</div>
3 liveuser 6621
		<div class='dropzone'></div>
6622
		<div class='dropzone'></div>
226 liveuser 6623
		<div class='dropzone'></div>
3 liveuser 6624
		*/
6625
 
6626
		/*
6627
		處理被拖移元素壓住其他元素後的事件處理函式,宣告即可設定如何處理.
6628
		參數
6629
		被托移的元素
6630
		obj.dragged
6631
		被壓住的元素
6632
		obj.dropped
6633
		window.dragEventHandler.handler=function(param){};
6634
		若不宣告則,如果被壓住的div有 'dropzone' 類別,才會動作.
6635
		*/
226 liveuser 6636
 
3 liveuser 6637
		/*
6638
		參考資料:
6639
		https://developer.mozilla.org/en-US/docs/Web/API/Document/drag_event
6640
		*/
6641
 
6642
		//事件綁定的函式
6643
		window.dragEventHandler.func=function(){
226 liveuser 6644
 
3 liveuser 6645
			//events fired on the draggable target
6646
			document.addEventListener('drag', function(event) {
6647
 
6648
				});
6649
 
6650
			//開始托移
6651
			document.addEventListener('dragstart', function(event) {
6652
 
6653
				//讓被托移的目標可以被被看到
6654
				event.dataTransfer.setData('text/plain',null);
6655
 
6656
				// store a ref. on the dragged elem
6657
				window.dragEventHandler.dragged = event.target;
226 liveuser 6658
 
3 liveuser 6659
				// make it half transparent
6660
				event.target.style.opacity = .5;
226 liveuser 6661
 
3 liveuser 6662
				});
226 liveuser 6663
 
3 liveuser 6664
			//在被托移物品上移動時.
6665
			/* events fired on the drop targets */
6666
			document.addEventListener('dragover', function(event) {
226 liveuser 6667
 
3 liveuser 6668
				// prevent default to allow drop
6669
				event.preventDefault();
6670
 
6671
				});
6672
 
6673
			//移到別的元素時觸發
6674
			document.addEventListener('dragenter', function(event) {
6675
 
6676
				// highlight potential drop target when the draggable element enters it
6677
				if (event.target.className == 'dropzone'){
226 liveuser 6678
 
3 liveuser 6679
					event.target.style.opacity = .5;
226 liveuser 6680
 
3 liveuser 6681
					}
226 liveuser 6682
 
3 liveuser 6683
				});
6684
 
6685
			//移開移動到的元素時觸發
6686
			document.addEventListener('dragleave', function(event) {
6687
 
226 liveuser 6688
				// unhighlight of potential drop target when the draggable element leaves it
3 liveuser 6689
				if (event.target.className == 'dropzone') {
226 liveuser 6690
 
3 liveuser 6691
					//設置不透明
6692
					event.target.style.opacity = 1.0;
226 liveuser 6693
 
3 liveuser 6694
					}
226 liveuser 6695
 
3 liveuser 6696
				});
226 liveuser 6697
 
3 liveuser 6698
			//放開移動中的元素時觸發
6699
			document.addEventListener('drop', function(event) {
226 liveuser 6700
 
3 liveuser 6701
				// prevent default action (open as link for some elements)
6702
				event.preventDefault();
6703
 
6704
				// 取得被壓的元素
6705
				window.dragEventHandler.dropped=event.target
6706
 
6707
				// move dragged elem to the selected drop target
6708
				if (event.target.className == 'dropzone') {
226 liveuser 6709
 
3 liveuser 6710
					//設置不透明
6711
					event.target.style.opacity = 1.0;
226 liveuser 6712
 
3 liveuser 6713
			  		}
226 liveuser 6714
 
3 liveuser 6715
				});
226 liveuser 6716
 
3 liveuser 6717
			}
226 liveuser 6718
 
3 liveuser 6719
			//托移結束
6720
			document.addEventListener('dragend', function(event) {
6721
 
6722
				// reset the transparency
6723
				event.target.style.opacity = '';
226 liveuser 6724
 
3 liveuser 6725
				//初始化要回傳的元素
6726
				obj={};
226 liveuser 6727
 
3 liveuser 6728
				//設置被托移的元素
6729
				obj.dragged=window.dragEventHandler.dragged;
226 liveuser 6730
 
3 liveuser 6731
				//設置被壓住的元素
6732
				obj.dropped=window.dragEventHandler.dropped;
226 liveuser 6733
 
3 liveuser 6734
				//debug
6735
				console.log(obj);
6736
 
6737
				if(window.dragEventHandler.handler!==undefined){
6738
 
226 liveuser 6739
					if(typeof(window.dragEventHandler.handler)==='function'){
6740
 
3 liveuser 6741
						window.dragEventHandler.handler.call(this,obj);
6742
 
6743
						}
6744
 
6745
					}
226 liveuser 6746
 
6747
				//採用預設的做法
3 liveuser 6748
				else{
6749
					//被壓住的不是div就停止
6750
					if(window.dragEventHandler.dropped.tagName!=='DIV'){
226 liveuser 6751
 
3 liveuser 6752
						return false;
226 liveuser 6753
 
3 liveuser 6754
						}
226 liveuser 6755
 
3 liveuser 6756
					//目標div有幾個類別就執行幾次
6757
					for(i=0;i<window.dragEventHandler.dropped.classList.length;i++){
226 liveuser 6758
 
3 liveuser 6759
						//如果被壓住的div有 'dropzone' 類別,才會動作.
6760
						if(window.dragEventHandler.dropped.classList[i]==='dropzone'){
226 liveuser 6761
 
3 liveuser 6762
							//覆蓋到目標元素
6763
							window.dragEventHandler.dropped.innerHTML=window.dragEventHandler.dragged.outerHTML;
226 liveuser 6764
 
3 liveuser 6765
							//移除被移開的元素
6766
							window.dragEventHandler.dragged.innerHTML='';
226 liveuser 6767
 
3 liveuser 6768
							//結束迴圈
6769
							break;
226 liveuser 6770
 
3 liveuser 6771
							}
6772
						}
6773
					}
6774
				});
6775
				// drag event handler end
6776
		";
6777
		$conf["javaScript::toScript"]["jsFunciton"][]=
6778
		"
6779
		/*
6780
		導頁的函式:
6781
		*/
6782
 
174 liveuser 6783
		//如果沒有 window.qbpwcf.redirectURL
6784
		if(window.qbpwcf.redirectURL===undefined){
226 liveuser 6785
 
174 liveuser 6786
			//宣告 window.qbpwcf.`redirectURL 為空物件
6787
			window.qbpwcf.redirectURL={};
3 liveuser 6788
 
6789
			}//if end
6790
 
6791
		//設置 window.redirectURL 變數為 function,參數為 params
174 liveuser 6792
		window.qbpwcf.redirectURL=function(params){
3 liveuser 6793
 
6794
			//如果 params.url 未定義
6795
			if(params.url===undefined){
6796
 
6797
				//設置要回傳的物件
6798
				result={};
6799
 
6800
				//設置執行錯誤
6801
				result.status=false;
6802
 
6803
				//設置錯誤訊息陣列
6804
				result.error=[];
6805
 
6806
				//設置錯誤訊息
6807
				result.error.push('params.url undefined');
6808
 
6809
				//回傳結果
6810
				return result;
6811
 
6812
				}//if end
6813
 
6814
			//如果 params.countdownSec 未定義
6815
			if(params.countdownSec===undefined){
6816
 
6817
				//直接導頁到 params.url
6818
				window.location.href=params.url;
6819
 
6820
				}//if end
6821
 
6822
			//反之
6823
			else{
6824
 
6825
				//設置過了 params.countdownSec 秒後要做的事情.
6826
				setTimeout(function(){
226 liveuser 6827
 
3 liveuser 6828
					//導頁到 params.url
174 liveuser 6829
					window.location.href=params.url;
226 liveuser 6830
 
3 liveuser 6831
					},params.countdownSec*1000);
6832
 
6833
				}//else end
6834
 
174 liveuser 6835
			}//if end
3 liveuser 6836
		";
6837
		$conf["javaScript::toScript"]["jsFunciton"][]=
6838
		"
6839
		/*
6840
		說明:
6841
		遞迴取得特定頁面產生的內容.
6842
		參數:
6843
		parmas,要傳送的參數名稱與其數值.
6844
		url,要求的網址.
6845
		method,要求的方法,GET或POST二擇一.
6846
		resRootDivId,回應的內容要放在div的id為resRootDivId的地方裡面.
6847
		範例用法:
6848
		params={};
6849
		params.key=val;//用於查尋的變數名稱與數值內容
6850
		continue=true;//是否要不斷執行.
6851
		window.tailAny.func.call(this,params,'/tailLogRes.php','POST','rootDiv');
6852
		要求的網址回應如下:
6853
		res,回應的物件
6854
		res.lines,回應的內容列.
6855
		res.id,最新識別欄位與數值.
6856
		*/
6857
 
6858
		//如果未設定 window.qbpwcf 物件
6859
		if(window.qbpwcf===undefined){
6860
 
6861
			//設置 window.qbpwcf 為空物件
6862
			window.qbpwcf={};
6863
 
6864
			}//if end
6865
 
6866
		//初始化 window.tailAny 物件
6867
		window.qbpwcf.tailAny={};
226 liveuser 6868
 
3 liveuser 6869
		//初始化 window.qbpwcf.tailAny.continue 為 true,代表遞迴執行.
6870
		window.qbpwcf.tailAny.continue=true;
226 liveuser 6871
 
3 liveuser 6872
		//初始化 將結果輸出到畫面上的函式
6873
		//res,為ajax抓到的結果json.
6874
		//rootDivId,為回應要放到id為rootDivId的div裡面.
6875
		window.qbpwcf.tailAny.outputFunc=function(res,rootDivId){
226 liveuser 6876
 
3 liveuser 6877
			//針對每個輸出的行
6878
			for(var i=0;i<res.lines.length;i++){
226 liveuser 6879
 
3 liveuser 6880
				//如果內容不為空
6881
				if(res.lines[i]!==''){
226 liveuser 6882
 
3 liveuser 6883
					//set output line
6884
					div=document.createElement('div');
6885
					text=document.createTextNode(res.lines[i]);
6886
					div.appendChild(text);
226 liveuser 6887
 
3 liveuser 6888
					}//if end
226 liveuser 6889
 
3 liveuser 6890
				//反之
6891
				else{
226 liveuser 6892
 
3 liveuser 6893
					//set output line
6894
					div=document.createElement('div');
226 liveuser 6895
 
3 liveuser 6896
					//建立換行語法
6897
					p=document.createElement('p');
226 liveuser 6898
 
3 liveuser 6899
					//放置換行語法
6900
					div.appendChild(p);
226 liveuser 6901
 
3 liveuser 6902
					}//else end
226 liveuser 6903
 
3 liveuser 6904
				//show output line
6905
				rootDiv=document.getElementById(xmlhttp.mother.rootDivId);
6906
				rootDiv.prepend(div);
6907
 
6908
				}//for end
226 liveuser 6909
 
3 liveuser 6910
			}//function window.qbpwcf.tailAny.outputFunc end
226 liveuser 6911
 
3 liveuser 6912
		//初始化 window.tailAny 函式
6913
		window.qbpwcf.tailAny.func=function(params,url,method,resRootDivId){
6914
 
6915
			//取得使用的參數 params
6916
			this.params=params;
6917
 
6918
			//初始化儲存新的get and post變數
6919
			this.newParams='';
226 liveuser 6920
 
3 liveuser 6921
			//初始化要查尋的 url
6922
			this.url=url;
6923
 
6924
			//取得method
6925
			this.method=method;
6926
 
6927
			//初始化持續執行
6928
			this.continue=window.qbpwcf.tailAny.continue;
226 liveuser 6929
 
3 liveuser 6930
			//放置回應的 div id 字串
6931
			this.rootDivId=resRootDivId;
6932
 
6933
			//取得query參數長度
6934
			pl=Object.keys(params).length;
6935
 
6936
			//針對每隔 query 參數
6937
			for(var i=0;i<pl;i++){
226 liveuser 6938
 
3 liveuser 6939
				//&符號字串
6940
				var andStr='&';
226 liveuser 6941
 
3 liveuser 6942
				//如果是第一個 query 參數
6943
				if(i===0){
226 liveuser 6944
 
3 liveuser 6945
					//&符號字串
6946
					andStr=''
226 liveuser 6947
 
3 liveuser 6948
					}//if end
226 liveuser 6949
 
3 liveuser 6950
				//串接查詢字串,並 url encode
6951
				this.newParams=this.newParams+andStr+encodeURIComponent(Object.keys(params)[i])+'='+encodeURIComponent(Object.values(params)[i]);
226 liveuser 6952
 
3 liveuser 6953
				}//for end
6954
 
6955
			//如果是 GET 方法
6956
			if(method==='GET'){
6957
 
6958
				//設置查詢的url
6959
				this.url=this.url+'?'+this.newParams;
6960
 
6961
				}//if end
226 liveuser 6962
 
3 liveuser 6963
			xmlhttp=new XMLHttpRequest();
6964
			xmlhttp.mother=this;
6965
			xmlhttp.responseType='json';
6966
			xmlhttp.open(method,this.url,true);
6967
			xmlhttp.setRequestHeader('Content-type','application/x-www-form-urlencoded');
6968
			xmlhttp.setRequestHeader('X-Requested-With','XMLHttpRequest');
6969
			xmlhttp.onreadystatechange=function(){
6970
 
6971
				//如果狀態為4且response code為200
6972
				if(xmlhttp.readyState===4 && xmlhttp.status===200){
6973
 
226 liveuser 6974
					//get response
3 liveuser 6975
					res=xmlhttp.response;
226 liveuser 6976
 
3 liveuser 6977
					//將結果放到畫面上
226 liveuser 6978
					window.qbpwcf.tailAny.outputFunc.call(this,res,xmlhttp.mother.rootDivId);
6979
 
3 liveuser 6980
					//如果有新的識別欄位與數值
6981
					if(res.id!==undefined){
6982
 
226 liveuser 6983
						//取消舊的識別欄位
6984
						xmlhttp.mother.params={};
3 liveuser 6985
 
6986
						//如果有新的識別欄位
6987
						for(i=0;i<Object.keys(res.id).length;i++){
6988
 
6989
							//取得識別欄位
6990
							col=Object.keys(res.id)[i];
6991
 
6992
							//取得新的識別號碼
6993
							val=eval('res.id.'+col);
6994
 
6995
							//放上新的識別碼
6996
							eval('xmlhttp.mother.params.'+col+'='+val);
6997
 
6998
							}//for end
6999
 
7000
						}//if end
7001
 
226 liveuser 7002
					//如果要繼續
3 liveuser 7003
					if(xmlhttp.mother.continue){
7004
 
7005
						//遞迴
7006
						window.qbpwcf.tailAny.func(xmlhttp.mother.params,xmlhttp.mother.url,xmlhttp.mother.method,xmlhttp.mother.rootDivId);
226 liveuser 7007
 
3 liveuser 7008
						}//if end
226 liveuser 7009
 
3 liveuser 7010
					//反之要暫停
7011
					else{
226 liveuser 7012
 
3 liveuser 7013
						//設置無限等待
7014
						var intervalTail = window.setInterval(function(){
226 liveuser 7015
 
3 liveuser 7016
							//console.log(window.qbpwcf.tailAny.continue);
226 liveuser 7017
 
3 liveuser 7018
							//如果要繼續了
7019
							if(xmlhttp.mother.continue){
226 liveuser 7020
 
3 liveuser 7021
								//清除無限等待
7022
								clearInterval(intervalTail);
226 liveuser 7023
 
3 liveuser 7024
								//遞迴
7025
								window.qbpwcf.tailAny.func(xmlhttp.mother.params,xmlhttp.mother.url,xmlhttp.mother.method,xmlhttp.mother.rootDivId);
226 liveuser 7026
 
3 liveuser 7027
								}//if end
226 liveuser 7028
 
3 liveuser 7029
							},1000);
226 liveuser 7030
 
3 liveuser 7031
						}//else end
226 liveuser 7032
 
3 liveuser 7033
					}//if end
7034
 
7035
				}//function end
226 liveuser 7036
 
3 liveuser 7037
			//如果是 GET 方法
7038
			if(method==='GET'){
7039
 
7040
				//不夾帶內容
7041
				xmlhttp.send();
226 liveuser 7042
 
3 liveuser 7043
				}//if end
7044
 
7045
			//反之是 POST 方法
7046
			else{
7047
 
7048
				//夾帶內容
7049
				xmlhttp.send(this.newParams);
7050
 
7051
				}//else end
226 liveuser 7052
 
3 liveuser 7053
			}//function end
7054
		";
7055
		$conf["javaScript::toScript"]["jsFunciton"][]=
7056
		"
7057
		//如果未設定 window.qbpwcf 物件
7058
		if(window.qbpwcf===undefined){
7059
 
7060
			//設置 window.qbpwcf 為空物件
7061
			window.qbpwcf={};
7062
 
7063
			}//if end
7064
 
7065
		//設置 window.qbpwcf.gatDataDynamic 物件
7066
		window.qbpwcf.gatDataDynamic={};
7067
 
7068
		/*
7069
		函式說明:
7070
		當按下案鍵後放開時若元素數值長度符合則要連續取得資料.
7071
		參數說明:
7072
		element,要綁定事件的元素.
7073
		length,目標算術數值長度要為多少才要執行
7074
		params,篩選資料的參數物件.
7075
		url,要求的網址.
7076
		method,要求的方法,有'POST'跟'GET'.
7077
		rootDiv,要放置回應到id為rootDiv的div裡面.
7078
		範例呼叫方式:
7079
		element=document.getElementById('customTime');
7080
		params={};
7081
		params.start=element.value;
7082
		window.qbpwcf.gatDataDynamic.func.call(this,element,8,params,'/logRes.php','POST','rootDiv');
7083
		*/
7084
 
7085
		//設置當前函式的變數
7086
		window.qbpwcf.gatDataDynamic.func=function(element,length,params,url,method,rootDiv){
226 liveuser 7087
 
3 liveuser 7088
			//debug
7089
			//console.log(element,length,params,url,method,rootDiv);
226 liveuser 7090
 
3 liveuser 7091
			//儲存內容長度要為多少
7092
			window.qbpwcf.gatDataDynamic.length=length;
7093
 
7094
			//儲存要傳遞的條件
7095
			window.qbpwcf.gatDataDynamic.params=params;
7096
 
7097
			//儲存要傳送要求到哪個頁面
7098
			window.qbpwcf.gatDataDynamic.url=url;
7099
 
7100
			//儲存傳遞的方式
7101
			window.qbpwcf.gatDataDynamic.method=method;
7102
 
7103
			//儲存回應的div id
7104
			window.qbpwcf.gatDataDynamic.rootDiv=rootDiv;
7105
 
7106
			//初始化暫存的物件
7107
			window.qbpwcf.gatDataDynamic.tmp={};
226 liveuser 7108
 
3 liveuser 7109
			//初始化暫存最新表單數值的長度
7110
			window.qbpwcf.gatDataDynamic.tmp.latestValueLength=0;
7111
 
7112
			//綁定事件到該元素身上
7113
			element.addEventListener('keyup',function(event){
7114
 
7115
				//取得使用的參數名稱
7116
				paramName=Object.keys(window.qbpwcf.gatDataDynamic.params)[0];
226 liveuser 7117
 
3 liveuser 7118
				//取得事件觸發後的參數數值
7119
				eval('window.qbpwcf.gatDataDynamic.params.'+paramName+'=\''+event.target.value+'\'');
7120
 
7121
				//誤觸
7122
				if(event.isComposing || event.keyCode === 229) {
226 liveuser 7123
 
3 liveuser 7124
					//取消執行
7125
					return false;
226 liveuser 7126
 
3 liveuser 7127
 					}//if end
226 liveuser 7128
 
3 liveuser 7129
				//如果長度跟之前比沒有變化,且按下的不為Enter鍵
7130
				if(event.target.value.length===window.qbpwcf.gatDataDynamic.tmp.latestValueLength && event.keyCode !== 13){
226 liveuser 7131
 
3 liveuser 7132
					//取消執行
7133
					return false;
226 liveuser 7134
 
3 liveuser 7135
					}//if end
226 liveuser 7136
 
3 liveuser 7137
				//反之長度有變化
7138
				else{
226 liveuser 7139
 
3 liveuser 7140
					//更新最新變化後的數值長度
7141
					window.qbpwcf.gatDataDynamic.tmp.latestValueLength=event.target.value.length;
226 liveuser 7142
 
3 liveuser 7143
					}//else end
226 liveuser 7144
 
3 liveuser 7145
				//如果長度不對
7146
				if(event.target.value.length!==window.qbpwcf.gatDataDynamic.length){
7147
 
7148
					//取消執行
7149
					return false;
7150
 
7151
					}//if end
7152
 
7153
				//連續取得內容
7154
				window.qbpwcf.tailAny.func.call(this,window.qbpwcf.gatDataDynamic.params,window.qbpwcf.gatDataDynamic.url,window.qbpwcf.gatDataDynamic.method,window.qbpwcf.gatDataDynamic.rootDiv);
7155
 
7156
				});//event end
7157
 
7158
			}//function end
7159
		";
7160
		$conf["javaScript::toScript"]["jsFunciton"][]=
7161
		"
7162
		//如果未設定 window.qbpwcf 物件
7163
		if(window.qbpwcf===undefined){
7164
 
7165
			//設置 window.qbpwcf 為空物件
7166
			window.qbpwcf={};
7167
 
7168
			}//if end
7169
 
7170
		//設置 window.qbpwcf.sequenceQuery 物件
7171
		window.qbpwcf.sequenceQuery={};
7172
 
7173
		/*
7174
		涵式說明:
7175
		循序query避免timeout.
7176
		參數說明:
7177
		url,字串,要query的網址.
7178
		name,字串,欲傳送的post變數名稱.
7179
		queue,代辦事項,陣列,遇到元素內容為'null'者,代表結束query;初次查詢設置為[]即可.
7180
		callback,物件,要呼叫的涵式名稱與參數,結構如下:
7181
		{
7182
			func:'function name';
7183
			params:'params';
7184
		}
7185
		範例:
7186
		url='path2query';
7187
		name='action';
7188
		queue=[];
7189
		callback=
7190
		{
7191
			name:'console.log',
7192
			params:'debug',
7193
		};
7194
		window.qbpwcf.sequenceQuery.func.call(this,url,name,queue,callback);
7195
		*/
226 liveuser 7196
 
3 liveuser 7197
		//設置當前函式的變數
7198
		window.qbpwcf.sequenceQuery.func=function(url,name,queue,callback){
7199
 
7200
			//如果網址未指定
7201
			if(url===undefined){
226 liveuser 7202
 
3 liveuser 7203
				//結束執行
7204
				return false;
226 liveuser 7205
 
3 liveuser 7206
				}//if end
7207
 
7208
			//save url to global
7209
			window.qbpwcf.sequenceQuery.url=url;
7210
 
7211
			//save name to global
7212
			window.qbpwcf.sequenceQuery.name=name;
7213
 
7214
			//save callback to global
7215
			window.qbpwcf.sequenceQuery.callback={};
7216
			window.qbpwcf.sequenceQuery.callback.name=callback.name;
7217
			window.qbpwcf.sequenceQuery.callback.params=callback.params;
226 liveuser 7218
 
3 liveuser 7219
			//debug
7220
			//console.log(window.qbpwcf.sequenceQuery.callback);
7221
 
7222
			//初始化參數
7223
			params={};
7224
 
7225
			//設置參數
7226
			eval('params.'+name+'=queue');
226 liveuser 7227
 
3 liveuser 7228
			//debug
7229
			//console.log(params);
7230
 
7231
			//初始化參數 window.tailAny.params 字串
7232
			window.qbpwcf.sequenceQuery.params='';
7233
 
7234
			//針對物件中的每個key
7235
			Object.keys(params).forEach(function(key){
7236
 
7237
				//&符號字串
7238
				andStr='';
7239
 
7240
				//如果參數目前不為空
7241
				if(window.qbpwcf.sequenceQuery.params!==''){
226 liveuser 7242
 
3 liveuser 7243
					//&符號字串
7244
					andStr='\&';
226 liveuser 7245
 
3 liveuser 7246
					}//if end
7247
 
7248
				//串接查詢字串,並 url encode
7249
				window.qbpwcf.sequenceQuery.params=window.qbpwcf.sequenceQuery.params+andStr+encodeURIComponent(key)+'='+encodeURIComponent(eval('params.'+key));
7250
 
7251
				//debug
7252
				//console.log(window.qbpwcf.sequenceQuery);
7253
 
7254
				});
7255
 
7256
			//debug
7257
			//console.log(window.qbpwcf.sequenceQuery.params);
226 liveuser 7258
 
3 liveuser 7259
			xmlhttp=new XMLHttpRequest();
7260
			xmlhttp.responseType='json';
7261
			xmlhttp.timeout=60000;
7262
			xmlhttp.open('POST',url,true);
7263
			xmlhttp.setRequestHeader('Content-type','application/x-www-form-urlencoded');
7264
			xmlhttp.setRequestHeader('X-Requested-With','XMLHttpRequest');
7265
			xmlhttp.onreadystatechange=function(){
7266
 
7267
				//如果狀態為4且response code為200
7268
				if(xmlhttp.readyState===4 && xmlhttp.status===200){
7269
 
226 liveuser 7270
					//get response
3 liveuser 7271
					res=xmlhttp.response;
226 liveuser 7272
 
3 liveuser 7273
					//debug
7274
					//console.log(res);
226 liveuser 7275
 
3 liveuser 7276
					//如果執行失敗
7277
					if(res.status==='false'){
226 liveuser 7278
 
3 liveuser 7279
						//結束執行
7280
						return false;
226 liveuser 7281
 
3 liveuser 7282
						}//if end
226 liveuser 7283
 
3 liveuser 7284
					//取得回應的內容
7285
					content=res.content;
226 liveuser 7286
 
3 liveuser 7287
					//debug
7288
					//console.log(content);
226 liveuser 7289
 
3 liveuser 7290
					//如果遇到null元素
7291
					if(content[0]==='null'){
226 liveuser 7292
 
3 liveuser 7293
						//callback
7294
						eval(window.qbpwcf.sequenceQuery.callback.name+'.call(this,window.qbpwcf.sequenceQuery.callback.params)');
226 liveuser 7295
 
3 liveuser 7296
						//結束執行
7297
						return true;
226 liveuser 7298
 
3 liveuser 7299
						}//if end
226 liveuser 7300
 
3 liveuser 7301
					//遞迴
7302
					window.qbpwcf.sequenceQuery.func.call(this,window.qbpwcf.sequenceQuery.url,window.qbpwcf.sequenceQuery.name,content,window.qbpwcf.sequenceQuery.callback);
7303
 
7304
					}//if end
7305
 
7306
				}//function end
7307
 
7308
			//夾帶內容
7309
			xmlhttp.send(window.qbpwcf.sequenceQuery.params);
226 liveuser 7310
 
3 liveuser 7311
			};
7312
 
7313
		";
7314
		$conf["javaScript::toScript"]["jsFunciton"][]=
7315
		"
7316
		//如果未設定 window.qbpwcf 物件
7317
		if(window.qbpwcf===undefined){
7318
 
7319
			//設置 window.qbpwcf 為空物件
7320
			window.qbpwcf={};
7321
 
7322
			}//if end
7323
 
7324
		//設置 window.qbpwcf.modal 物件
7325
		window.qbpwcf.modal={};
226 liveuser 7326
 
3 liveuser 7327
		//預設的 modal 標題是由 div 組成
7328
		window.qbpwcf.modal.title=document.createElement('div');
7329
 
7330
		//預設的 modal 標題
7331
		window.qbpwcf.modal.title.innerText='Confirm window';
226 liveuser 7332
 
3 liveuser 7333
		//預設的 modal 標題樣式
7334
		window.qbpwcf.modal.title.style.fontWeight='bold';
226 liveuser 7335
 
3 liveuser 7336
		//預設的 modal 標題背景顏色
7337
		window.qbpwcf.modal.bgColor='#DDDDFF';
226 liveuser 7338
 
3 liveuser 7339
		//預設的 modal 內文
7340
		window.qbpwcf.modal.content=document.createTextNode('Are you sure?');
226 liveuser 7341
 
3 liveuser 7342
		//預設的 取消 按鈕內容
7343
		window.qbpwcf.modal.cancle='Cancel';
226 liveuser 7344
 
3 liveuser 7345
		//預設的 取消 按鈕背景顏色
7346
		window.qbpwcf.modal.cancleBgColor='#FFDDDD';
226 liveuser 7347
 
3 liveuser 7348
		//預設的取消按鈕點擊後要做的事情
7349
		window.qbpwcf.modal.cancelAction=function(e)
7350
		{
7351
			//delete whole confirm window
7352
			document.getElementById('qbpwcf.bgDiv').remove();
7353
			document.getElementById('qbpwcf.modalRootDiv').remove();
7354
		}
226 liveuser 7355
 
3 liveuser 7356
		//預設的 確認 按鈕內容
7357
		window.qbpwcf.modal.confirm='Confirm';
226 liveuser 7358
 
3 liveuser 7359
		//預設的 確認 按鈕背景顏色
7360
		window.qbpwcf.modal.confirmBgColor='#DDFFFF';
226 liveuser 7361
 
3 liveuser 7362
		//預設的確認按鈕要做的事情
7363
		window.qbpwcf.modal.confirmAction=function(e)
7364
		{
7365
			alert('you click confirm');
7366
			window.qbpwcf.modal.cancelAction.call(this);
7367
		}
226 liveuser 7368
 
3 liveuser 7369
		//modal的最寬高設定物件
7370
		window.qbpwcf.modal.RootDiv={};
226 liveuser 7371
 
3 liveuser 7372
		//modal的寬度比例,1~99
7373
		window.qbpwcf.modal.RootDiv.width='80';
226 liveuser 7374
 
3 liveuser 7375
		//modal距離高度的比例
7376
		window.qbpwcf.modal.RootDiv.top='10';
226 liveuser 7377
 
3 liveuser 7378
		//建立顯示 qbpwcf modal 的函式
7379
		window.qbpwcf.modal.show=function(){
226 liveuser 7380
 
3 liveuser 7381
			//建立背景div
7382
			bgDiv=document.createElement('div');
226 liveuser 7383
 
3 liveuser 7384
			//設定樣式為全螢幕
7385
			bgDiv.style.width='100vw';
7386
			bgDiv.style.height='100vh';
7387
			bgDiv.style.backgroundColor='grey';
7388
			bgDiv.style.opacity='0.7';
7389
			bgDiv.style.position='fixed';
7390
			bgDiv.style.top='0px';
7391
			bgDiv.style.left='0px';
7392
			bgDiv.style.zIndex='10000';
226 liveuser 7393
 
3 liveuser 7394
			//設定id
7395
			bgDiv.id='qbpwcf.bgDiv';
226 liveuser 7396
 
3 liveuser 7397
			//確認視窗的div
7398
			modalRootDiv=document.createElement('div');
226 liveuser 7399
 
3 liveuser 7400
			//設定id
7401
			modalRootDiv.id='qbpwcf.modalRootDiv';
226 liveuser 7402
 
3 liveuser 7403
			//確認視窗的modal樣式
7404
			modalRootDiv.style.width=window.qbpwcf.modal.RootDiv.width+'vw';
7405
			modalRootDiv.style.top=window.qbpwcf.modal.RootDiv.top+'vh';
7406
			modalRootDiv.style.backgroundColor='white';
7407
			modalRootDiv.style.position='fixed';
7408
			modalRootDiv.style.left=((100-window.qbpwcf.modal.RootDiv.width)/2)+'vw';
7409
			modalRootDiv.style.zIndex='10001';
7410
			modalRootDiv.style.borderRadius='10px';
226 liveuser 7411
 
3 liveuser 7412
			//modal title div
7413
			modalTitleDiv=document.createElement('div');
226 liveuser 7414
 
3 liveuser 7415
			//set modal title content
7416
			modalTitleDiv.appendChild(window.qbpwcf.modal.title);
226 liveuser 7417
 
3 liveuser 7418
			//set modal title bg color
7419
			modalTitleDiv.style.backgroundColor=window.qbpwcf.modal.bgColor;
226 liveuser 7420
 
3 liveuser 7421
			//set modal title line height attr
7422
			modalTitleDiv.style.minHeight='20px';
226 liveuser 7423
 
3 liveuser 7424
			//set modal title line height attr
7425
			modalTitleDiv.style.borderRadius='inherit';
226 liveuser 7426
 
3 liveuser 7427
			//set modal title line height attr
7428
			modalTitleDiv.style.paddingLeft='5px';
226 liveuser 7429
 
3 liveuser 7430
			//put modal title to modal root div
7431
			modalRootDiv.appendChild(modalTitleDiv);
226 liveuser 7432
 
3 liveuser 7433
			//modal content div
7434
			modalContentDiv=document.createElement('div');
226 liveuser 7435
 
3 liveuser 7436
			//set modal content text
7437
			modalContentDiv.appendChild(window.qbpwcf.modal.content);
226 liveuser 7438
 
3 liveuser 7439
			//set modal content style
7440
			modalContentDiv.style.textAlign='center';
7441
			modalContentDiv.style.lineHeight=(window.qbpwcf.modal.RootDiv.height-10)+'vh';
226 liveuser 7442
 
3 liveuser 7443
			//put modal content to modal root div
7444
			modalRootDiv.appendChild(modalContentDiv);
226 liveuser 7445
 
3 liveuser 7446
			//modal bottom div
226 liveuser 7447
			modalBottomDiv=document.createElement('div');
7448
 
3 liveuser 7449
			//set modal bottom line height
7450
			modalBottomDiv.style.lineHeight='6vh';
226 liveuser 7451
 
3 liveuser 7452
			//set modal bptton text align style to right
7453
			modalBottomDiv.style.textAlign='right';
226 liveuser 7454
 
3 liveuser 7455
			//set modal bottom 圓角
226 liveuser 7456
			modalBottomDiv.style.borderRadius='5px';
7457
 
3 liveuser 7458
			//set modal bottom background color
226 liveuser 7459
			modalBottomDiv.style.backgroundColor=modalRootDiv.style.backgroundColor;
7460
 
3 liveuser 7461
			//modal close button
226 liveuser 7462
			cancleSpan=document.createElement('span');
7463
 
3 liveuser 7464
			//字體為粗體字
226 liveuser 7465
			cancleSpan.style.fontWeight='bold';
7466
 
3 liveuser 7467
			//set model close button text content
226 liveuser 7468
			cancleSpan.innerText=window.qbpwcf.modal.cancle;
7469
 
3 liveuser 7470
			//set cancle button background color
7471
			cancleSpan.style.backgroundColor=window.qbpwcf.modal.cancleBgColor;
226 liveuser 7472
 
3 liveuser 7473
			//cancle button 元素間的距離
7474
			cancleSpan.style.marging='5vw';
226 liveuser 7475
 
3 liveuser 7476
			//cancle button 元素的範圍
7477
			cancleSpan.style.padding='1vh';
226 liveuser 7478
 
3 liveuser 7479
			//cancle button 不超出範圍
7480
			cancleSpan.style.position='relative';
7481
			cancleSpan.style.bottom='4vh';
226 liveuser 7482
 
3 liveuser 7483
			//cancle button 圓角
7484
			cancleSpan.style.borderRadius='100px';
226 liveuser 7485
 
3 liveuser 7486
			//cancle button pointer
226 liveuser 7487
			cancleSpan.style.cursor='pointer';
7488
 
3 liveuser 7489
			//okSpan button right top & bottom
7490
			cancleSpan.style.top='0px';
7491
			cancleSpan.style.bottom='0px';
226 liveuser 7492
 
3 liveuser 7493
			//設置點擊 cancle button 要做的事情.
7494
			cancleSpan.addEventListener('click',function(e)
7495
			{
7496
				window.qbpwcf.modal.cancelAction(e);
7497
			});
226 liveuser 7498
 
3 liveuser 7499
			//modal ok button
226 liveuser 7500
			okSpan=document.createElement('span');
7501
 
3 liveuser 7502
			//字體為粗體字
7503
			okSpan.style.fontWeight='bold';
226 liveuser 7504
 
3 liveuser 7505
			//set model ok button text content
226 liveuser 7506
			okSpan.innerText=window.qbpwcf.modal.confirm;
7507
 
3 liveuser 7508
			//set ok button background color
226 liveuser 7509
			okSpan.style.backgroundColor=window.qbpwcf.modal.confirmBgColor;
7510
 
3 liveuser 7511
			//okSpan button 元素間的距離
7512
			okSpan.style.marginLeft='5vw';
7513
			okSpan.style.marginRight='5vw';
226 liveuser 7514
 
3 liveuser 7515
			//okSpan button 元素的範圍
226 liveuser 7516
			okSpan.style.padding='1vh';
7517
 
3 liveuser 7518
			//okSpan button 不超出範圍
7519
			okSpan.style.position='relative';
226 liveuser 7520
			okSpan.style.bottom='4vh';
7521
 
3 liveuser 7522
			//okSpan button 圓角
7523
			okSpan.style.borderRadius='100px';
226 liveuser 7524
 
3 liveuser 7525
			//okSpan button pointer
226 liveuser 7526
			okSpan.style.cursor='pointer';
7527
 
3 liveuser 7528
			//okSpan button right top & bottom
7529
			okSpan.style.top='0px';
7530
			okSpan.style.bottom='0px';
226 liveuser 7531
 
3 liveuser 7532
			//設置點擊 cancle button 要做的事情.
7533
			okSpan.addEventListener('click',function(e)
7534
			{
7535
				window.qbpwcf.modal.confirmAction(e);
7536
			});
226 liveuser 7537
 
3 liveuser 7538
			//put cancle and ok button to modal bottom div
7539
			modalBottomDiv.appendChild(cancleSpan);
7540
			modalBottomDiv.appendChild(okSpan);
226 liveuser 7541
 
3 liveuser 7542
			//put modal bottom div to modal root div
226 liveuser 7543
			modalRootDiv.appendChild(modalBottomDiv);
7544
 
3 liveuser 7545
			//bgDiv放置到當前 window
7546
			document.body.appendChild(bgDiv);
226 liveuser 7547
 
3 liveuser 7548
			//put root modal div to body
7549
			document.body.appendChild(modalRootDiv);
226 liveuser 7550
 
7551
			}//if end
3 liveuser 7552
		";
7553
		$conf["javaScript::toScript"]["jsFunciton"][]=
7554
		"
7555
		//如果未設定 window.qbpwcf 物件
7556
		if(window.qbpwcf===undefined){
7557
 
7558
			//設置 window.qbpwcf 為空物件
7559
			window.qbpwcf={};
7560
 
7561
			}//if end
7562
 
7563
		//如果未設定 window.qbpwcf.form  物件
7564
		if(window.qbpwcf.form===undefined){
7565
 
7566
			//設置 window.qbpwcf.form  為空物件
7567
			window.qbpwcf.form={};
7568
 
7569
			}//if end
226 liveuser 7570
 
3 liveuser 7571
		/*
174 liveuser 7572
		如果回覆的結果是json,且具有error屬性,則會進行需要手動消除的提示.
7573
		如果回覆的結果是json,且具有content性,則會進行會自動消失的提示.
3 liveuser 7574
		如果回覆的結果是json,且具有location屬性,則會進行導頁.
7575
		window.qbpwcf.form.fakeScrollingList(),建構子,初始化fakeScrollingList.
174 liveuser 7576
		window.qbpwcf.form.eleId,選單呈現的元素 id 為什麼,亦即要點擊的元素其id,若有設定則忽略targetEle.
7577
		window.qbpwcf.form.targetEle,選單呈現的元素為,若 eleId 為 '' 且該變數不等於 '' 就會採用,若有設定則忽略eleId.
7578
		window.qbpwcf.from.autoStart,布林,若eleId與targetEle均未設定,則預設為true,代表要網頁載入後自動觸發;反之設置為false代表不會網頁載入後自動觸發.
7579
		window.qbpwcf.form.closeIcon,關閉按鈕的設定.
7580
		window.qbpwcf.form.disallowClose,布林,true代表不允許關閉選單;預設為false,代表允許關閉選單.
200 liveuser 7581
		window.qbpwcf.form.redirectAfterClose,字串,若有設定則會在按下關閉按鈕後進行導頁.
174 liveuser 7582
		window.qbpwcf.form.noActionOption,物件,選擇哪些選項不用動作,name為顯示的內容;value為選單的數值.
3 liveuser 7583
		window.qbpwcf.form.sendOnClickWhenOnly2options,布林值,預設為false,不啟用;反之為true代表點選元素後就直接送出最後一個選項的數值.啟用條件為window.qbpwcf.form.options只有一個元素.
7584
		window.qbpwcf.form.donotSendFrom,布林值,預設為false,代表選擇了要傳送的項目後,會傳送表單,設置為true代表不會傳送表單只會將選項對應的數值內容交給 window.qbpwcf.form.callback 陣列中的 callback 處理.
7585
		window.qbpwcf.form.hiddenVar,陣列,每個元素為物件,物件的屬性有name為變數的名稱;value為選單的數值.
7586
		window.qbpwcf.form.defaultOption,物件,name為顯示的內容;value為選單的數值.
7587
		window.qbpwcf.form.options,陣列,每個元素為物件,物件的屬性有name為顯示的內容;value為選單的數值.
7588
		window.qbpwcf.form.recPage,字串,為接收要求的網址,預設為當前頁面.
7589
		window.qbpwcf.form.sendVarName,傳送表單時的選項對應的變數名稱,預設為'variable'.
7590
		window.qbpwcf.form.callback,針對所選擇的選項內容,要交由哪些函式處理,形態為陣列.
7591
		window.qbpwcf.form.getTarget(),抓要變成fakeScrolling List的元素.
174 liveuser 7592
		window.qbpwcf.from.replaceCurrentPageToDomResponse,布林,預設為true,代表得到ajax回應為非json的dom時,會將其結果呈現到當前畫面;反之為false.
7593
		window.qbpwcf.form.active(),啟用fake Scrolling list.
3 liveuser 7594
		*/
7595
		//設置 this 物件,建構子.
7596
		window.qbpwcf.form.fakeScrollingList=function(){
226 liveuser 7597
 
3 liveuser 7598
			//要用 fake scrolling list 選單呈現的元素 id 為?
7599
			this.eleId='';
226 liveuser 7600
 
3 liveuser 7601
			//要用 fake scrolling list 選單呈現的元素為,若 eleId 為 '' 且該變數不等於 '' 就會採用.
174 liveuser 7602
			this.targetEle='';
226 liveuser 7603
 
3 liveuser 7604
			//fake scrolling list 預設選單關閉的 叉叉按鈕
7605
			this.closeIcon='data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhLS0gQ3JlYXRlZCB3aXRoIElua3NjYXBlIChodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy8pIC0tPgoKPHN2ZwogICB4bWxuczpvc2I9Imh0dHA6Ly93d3cub3BlbnN3YXRjaGJvb2sub3JnL3VyaS8yMDA5L29zYiIKICAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIgogICB4bWxuczpjYz0iaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbnMjIgogICB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiCiAgIHhtbG5zOnN2Zz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgeG1sbnM6c29kaXBvZGk9Imh0dHA6Ly9zb2RpcG9kaS5zb3VyY2Vmb3JnZS5uZXQvRFREL3NvZGlwb2RpLTAuZHRkIgogICB4bWxuczppbmtzY2FwZT0iaHR0cDovL3d3dy5pbmtzY2FwZS5vcmcvbmFtZXNwYWNlcy9pbmtzY2FwZSIKICAgd2lkdGg9IjEwNS43ODE3Mm1tIgogICBoZWlnaHQ9IjEwNS4zNDM0NG1tIgogICB2aWV3Qm94PSIwIDAgMTA1Ljc4MTcyIDEwNS4zNDM0NCIKICAgdmVyc2lvbj0iMS4xIgogICBpZD0ic3ZnOCIKICAgaW5rc2NhcGU6dmVyc2lvbj0iMC45MitkZXZlbCB1bmtub3duIgogICBzb2RpcG9kaTpkb2NuYW1lPSJjbG9zZUljb24uc3ZnIj4KICA8ZGVmcwogICAgIGlkPSJkZWZzMiI+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDQzMTUiCiAgICAgICBvc2I6cGFpbnQ9InNvbGlkIj4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzAwMDAwMDtzdG9wLW9wYWNpdHk6MTsiCiAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgaWQ9InN0b3A0MzEzIiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxmaWx0ZXIKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIHN0eWxlPSJjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM6c1JHQiIKICAgICAgIGlkPSJmaWx0ZXI0MzkxIgogICAgICAgeD0iLTAuMDY4OTc3MTAzIgogICAgICAgd2lkdGg9IjEuMTM3OTU0MiIKICAgICAgIHk9Ii0wLjA3NTI5OTk5MyIKICAgICAgIGhlaWdodD0iMS4xNTA2Ij4KICAgICAgPGZlR2F1c3NpYW5CbHVyCiAgICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgICAgc3RkRGV2aWF0aW9uPSIxLjAwNjI1NDMiCiAgICAgICAgIGlkPSJmZUdhdXNzaWFuQmx1cjQzOTMiIC8+CiAgICA8L2ZpbHRlcj4KICAgIDxmaWx0ZXIKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIHN0eWxlPSJjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM6c1JHQiIKICAgICAgIGlkPSJmaWx0ZXI0NDM4IgogICAgICAgeD0iLTAuMDIyNjIyOTA0IgogICAgICAgd2lkdGg9IjEuMDQ1MjQ1OCIKICAgICAgIHk9Ii0wLjAyNTU1NTYxNCIKICAgICAgIGhlaWdodD0iMS4wNTExMTEyIj4KICAgICAgPGZlR2F1c3NpYW5CbHVyCiAgICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgICAgc3RkRGV2aWF0aW9uPSIwLjIyMTcwNjAxIgogICAgICAgICBpZD0iZmVHYXVzc2lhbkJsdXI0NDQwIiAvPgogICAgPC9maWx0ZXI+CiAgICA8ZmlsdGVyCiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgICBzdHlsZT0iY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzOnNSR0IiCiAgICAgICBpZD0iZmlsdGVyNDQ0NiIKICAgICAgIHg9Ii0wLjAyMzIzMjg0NyIKICAgICAgIHdpZHRoPSIxLjA0NjQ2NTgiCiAgICAgICB5PSItMC4wMjQ4MTk1NDUiCiAgICAgICBoZWlnaHQ9IjEuMDQ5NjM5MSI+CiAgICAgIDxmZUdhdXNzaWFuQmx1cgogICAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgICAgIHN0ZERldmlhdGlvbj0iMC4yMjIwOTQyOCIKICAgICAgICAgaWQ9ImZlR2F1c3NpYW5CbHVyNDQ0OCIgLz4KICAgIDwvZmlsdGVyPgogIDwvZGVmcz4KICA8c29kaXBvZGk6bmFtZWR2aWV3CiAgICAgaWQ9ImJhc2UiCiAgICAgcGFnZWNvbG9yPSIjZmZmZmZmIgogICAgIGJvcmRlcmNvbG9yPSIjNjY2NjY2IgogICAgIGJvcmRlcm9wYWNpdHk9IjEuMCIKICAgICBpbmtzY2FwZTpwYWdlb3BhY2l0eT0iMC4wIgogICAgIGlua3NjYXBlOnBhZ2VzaGFkb3c9IjIiCiAgICAgaW5rc2NhcGU6em9vbT0iMS40IgogICAgIGlua3NjYXBlOmN4PSIxMzAuNTY4NjgiCiAgICAgaW5rc2NhcGU6Y3k9IjIwMS4zNDg0NSIKICAgICBpbmtzY2FwZTpkb2N1bWVudC11bml0cz0ibW0iCiAgICAgaW5rc2NhcGU6Y3VycmVudC1sYXllcj0iZzQ0ODgiCiAgICAgaW5rc2NhcGU6ZG9jdW1lbnQtcm90YXRpb249IjAiCiAgICAgc2hvd2dyaWQ9ImZhbHNlIgogICAgIGlua3NjYXBlOndpbmRvdy13aWR0aD0iMTYwMCIKICAgICBpbmtzY2FwZTp3aW5kb3ctaGVpZ2h0PSI4MzYiCiAgICAgaW5rc2NhcGU6d2luZG93LXg9IjAiCiAgICAgaW5rc2NhcGU6d2luZG93LXk9IjI3IgogICAgIGlua3NjYXBlOndpbmRvdy1tYXhpbWl6ZWQ9IjEiIC8+CiAgPG1ldGFkYXRhCiAgICAgaWQ9Im1ldGFkYXRhNSI+CiAgICA8cmRmOlJERj4KICAgICAgPGNjOldvcmsKICAgICAgICAgcmRmOmFib3V0PSIiPgogICAgICAgIDxkYzpmb3JtYXQ+aW1hZ2Uvc3ZnK3htbDwvZGM6Zm9ybWF0PgogICAgICAgIDxkYzp0eXBlCiAgICAgICAgICAgcmRmOnJlc291cmNlPSJodHRwOi8vcHVybC5vcmcvZGMvZGNtaXR5cGUvU3RpbGxJbWFnZSIgLz4KICAgICAgICA8ZGM6dGl0bGUgLz4KICAgICAgPC9jYzpXb3JrPgogICAgPC9yZGY6UkRGPgogIDwvbWV0YWRhdGE+CiAgPGcKICAgICBpbmtzY2FwZTpsYWJlbD0iTGF5ZXIgMSIKICAgICBpbmtzY2FwZTpncm91cG1vZGU9ImxheWVyIgogICAgIGlkPSJsYXllcjEiCiAgICAgc3R5bGU9ImRpc3BsYXk6aW5saW5lIgogICAgIHRyYW5zZm9ybT0idHJhbnNsYXRlKC01MC4wNTQwMzQsLTg5LjA0MzUyMikiPgogICAgPGcKICAgICAgIGlkPSJnNDQ4OCIKICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDIuNjU1MDQ0MywwLDAsMi44NTQ2OTA3LC0xMTAuOTk1MTgsLTMyNi45MjY1MikiPgogICAgICA8ZWxsaXBzZQogICAgICAgICByeT0iMTYuMDM1OTI3IgogICAgICAgICByeD0iMTcuNTA1ODg0IgogICAgICAgICBjeT0iMTY0LjE2NTUxIgogICAgICAgICBjeD0iODAuNTc4NzIiCiAgICAgICAgIGlkPSJwYXRoMzQ3NCIKICAgICAgICAgc3R5bGU9Im9wYWNpdHk6MC4zO2ZpbGw6IzAwMDAwMDtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6MC4yNjQ5OTk5OTtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2Utb3BhY2l0eToxO2ZpbHRlcjp1cmwoI2ZpbHRlcjQzOTEpO2ltYWdlLXJlbmRlcmluZzphdXRvIiAvPgogICAgICA8cmVjdAogICAgICAgICB0cmFuc2Zvcm09InJvdGF0ZSgtNDIuODA4OTU1KSIKICAgICAgICAgcnk9IjAiCiAgICAgICAgIHk9IjE3NC41NTY0OSIKICAgICAgICAgeD0iLTY3LjM5ODc1OCIKICAgICAgICAgaGVpZ2h0PSIyLjE1MjIwNjQiCiAgICAgICAgIHdpZHRoPSIyOS4yNzk2NDgiCiAgICAgICAgIGlkPSJyZWN0NDQxMyIKICAgICAgICAgc3R5bGU9Im9wYWNpdHk6MTtmaWxsOiNmZmZmMDA7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjA7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLW9wYWNpdHk6MTtmaWx0ZXI6dXJsKCNmaWx0ZXI0NDQ2KSIgLz4KICAgICAgPHJlY3QKICAgICAgICAgdHJhbnNmb3JtPSJyb3RhdGUoLTEzOS4wMzQ0MikiCiAgICAgICAgIHJ5PSIwIgogICAgICAgICB5PSItNzMuMDUwOTQ5IgogICAgICAgICB4PSItMTgyLjk2MjUyIgogICAgICAgICBoZWlnaHQ9IjIuMTUyMjA2NCIKICAgICAgICAgd2lkdGg9IjI5LjI3OTY0OCIKICAgICAgICAgaWQ9InJlY3Q0NDEzLTMiCiAgICAgICAgIHN0eWxlPSJvcGFjaXR5OjE7ZmlsbDojZmZmZjAwO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDowO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1vcGFjaXR5OjE7ZmlsdGVyOnVybCgjZmlsdGVyNDQzOCkiIC8+CiAgICA8L2c+CiAgPC9nPgo8L3N2Zz4K';
226 liveuser 7606
 
3 liveuser 7607
			//fake scrolling list 預設選項選到哪個就不傳送表單
7608
			this.noActionOption={name:'Please select one option',value:''};
226 liveuser 7609
 
3 liveuser 7610
			//布林值,預設為false,不啟用;反之為true代表點選元素後就直接送出最後一個選項的數值.啟用條件為window.qbpwcf.form.options只有一個元素.
7611
			this.sendOnClickWhenOnly2options=false;
226 liveuser 7612
 
3 liveuser 7613
			//預設選擇了要傳送的項目後,會傳送表單,設置為true代表不會傳送表單只會將選項對應的數值內容交給 this.callback 陣列中的 callback 處理.
7614
			this.donotSendFrom=false;
226 liveuser 7615
 
3 liveuser 7616
			//fake scrolling list 選單傳送出去時要加上的隱藏變陣列
7617
			this.hiddenVar=[];
226 liveuser 7618
 
3 liveuser 7619
			//fake scrolling list 選單傳送出去時要加上的隱藏變數名稱與內容,預設為hiddenVarName數值為hiddenVarValue
7620
			this.hiddenVar.push({name:'hiddenVarName',value:'hidenVarValue'});
226 liveuser 7621
 
3 liveuser 7622
			//fake scrolling list 選項的預設項目
7623
			this.defaultOption=this.noActionOption;
226 liveuser 7624
 
3 liveuser 7625
			//fake scrolling list 的選項資訊
7626
			this.options=[];
226 liveuser 7627
 
3 liveuser 7628
			//預設只有一個選擇了不會送出的選項
7629
			this.options.push(this.noActionOption);
226 liveuser 7630
 
3 liveuser 7631
			//接受要求的頁面,預設為當前頁面
7632
			this.recPage=location.href;
226 liveuser 7633
 
3 liveuser 7634
			//傳送表單時的選項對應的變數名稱,預設為'variable'.
7635
			this.sendVarName='variable';
226 liveuser 7636
 
3 liveuser 7637
			//選項送出後,取得的回應要作為參數呼叫哪些 callback
7638
			this.callback=[];
226 liveuser 7639
 
3 liveuser 7640
			//預設的 callback 為 console.log
7641
			this.callback.push(console.log);
226 liveuser 7642
 
174 liveuser 7643
			//預設不自動觸發
7644
			this.autoStart=false;
226 liveuser 7645
 
174 liveuser 7646
			//預設為true,代表得到ajax回應為非json的dom時,會將其結果呈現到當前畫面;
7647
			this.replaceCurrentPageToDomResponse=true;
226 liveuser 7648
 
174 liveuser 7649
			//預設為false,代表允許關閉選單.
7650
			this.disallowClose=false;
226 liveuser 7651
 
200 liveuser 7652
			//預設關閉選單後不要進行轉地址.
7653
			this.redirectAfterClose=false;
226 liveuser 7654
 
3 liveuser 7655
			//取得目標元素的涵式
7656
			this.getTarget=function(){
226 liveuser 7657
 
174 liveuser 7658
				//如果有設置目標id
7659
				if(this.eleId!==''){
226 liveuser 7660
 
174 liveuser 7661
					//設置 targetEle
7662
					this.targetEle=document.getElementById('this.eleId');
226 liveuser 7663
 
174 liveuser 7664
					}//if end
226 liveuser 7665
 
174 liveuser 7666
				//如果元素變數為空字串的話
7667
				if(this.targetEle===''){
226 liveuser 7668
 
174 liveuser 7669
					//設置要自動觸發
7670
					this.autoStart=true;
226 liveuser 7671
 
174 liveuser 7672
					}//if end
3 liveuser 7673
 
174 liveuser 7674
				//反之元素如果是body
7675
				else if(this.targetEle.tagName==='BODY'){
226 liveuser 7676
 
174 liveuser 7677
					//提示錯誤
7678
					console.error('Please define targetEle other than BODY');
226 liveuser 7679
 
174 liveuser 7680
					//結束執行
7681
					return false;
226 liveuser 7682
 
174 liveuser 7683
					}//if end
226 liveuser 7684
 
174 liveuser 7685
				//如果要自動觸發
7686
				if(this.autoStart===true){
226 liveuser 7687
 
174 liveuser 7688
					//建立div元素
7689
					this.targetEle=document.createElement('div');
226 liveuser 7690
 
174 liveuser 7691
					}//if end
226 liveuser 7692
 
174 liveuser 7693
				//存元素參考
7694
				var fakeScrollingList=this.targetEle;
226 liveuser 7695
 
3 liveuser 7696
				//回傳點擊要觸發fakeScrollingList效果的元素
7697
				return fakeScrollingList;
226 liveuser 7698
 
3 liveuser 7699
				}//function end
226 liveuser 7700
 
7701
			//啟用 fake scrolling list
174 liveuser 7702
			this.active=function(){
226 liveuser 7703
 
3 liveuser 7704
				//取得要綁定事件的元素
7705
				var fakeScrollingList=this.getTarget();
226 liveuser 7706
 
174 liveuser 7707
				//如果異常
7708
				if(fakeScrollingList===false){
226 liveuser 7709
 
174 liveuser 7710
					//結束執行
7711
					return;
226 liveuser 7712
 
174 liveuser 7713
					}//if end
226 liveuser 7714
 
3 liveuser 7715
				//可以下拉的項目用手指頭圖示
7716
				fakeScrollingList.style.cursor='pointer';
226 liveuser 7717
 
3 liveuser 7718
				//設置 this 給 fakeScrollingList 的 addEventListener 事件
7719
				fakeScrollingList.mother=this;
226 liveuser 7720
 
3 liveuser 7721
				//點擊選單之後
7722
				fakeScrollingList.addEventListener('click',function(event){
226 liveuser 7723
 
3 liveuser 7724
					//取消預設點擊的效果
7725
					event.preventDefault();
226 liveuser 7726
 
3 liveuser 7727
					//取得下拉式選單內容
7728
					var inputSelect=event.target;
7729
 
7730
					//讓下拉式選單趕緊隱藏
7731
					inputSelect.style.opacity='0';
7732
 
7733
					//解析選項的資訊
7734
					var optionsInfo=fakeScrollingList.mother.options;
7735
 
7736
					//取得選項的數目
7737
					var opLen=optionsInfo.length;
7738
 
7739
					//新增覆蓋全螢幕的div
7740
					var root=document.createElement('div');
7741
 
7742
					//設置最外層div的id
7743
					root.id='scrollingListRootDiv';
7744
 
7745
					//移除重複的選單
7746
					if(document.getElementById('scrollingListRootDiv')!==null){
226 liveuser 7747
 
3 liveuser 7748
						//移除之
7749
						document.getElementById('scrollingListRootDiv').remove();
226 liveuser 7750
 
3 liveuser 7751
						}//if end
7752
 
7753
					//設置最外層div的樣式
7754
					root.classList.add('__qbpwcf_scrollingListRootDiv');
7755
 
7756
					//新增為了將不足divForMiddle可見高度的選項們置中的div
7757
					var divForMiddle=document.createElement('div');
7758
 
7759
					//設置為了上下置中的div樣式
7760
					divForMiddle.classList.add('__qbpwcf_scrollingListOutterDiv');
7761
 
7762
					//初始化記錄選擇的選項index
7763
					var selectedOptionIndex=0;
7764
 
7765
					//針對每個選項
7766
					for(var i=0;i<opLen;i++){
226 liveuser 7767
 
3 liveuser 7768
						//取得選項實際數值
7769
						var opVal=optionsInfo[i].value;
7770
 
7771
						//取得選項顯示名稱
7772
						var opShow=optionsInfo[i].name;
7773
 
7774
						//建立選項的div
7775
						var opDiv=document.createElement('div');
7776
 
7777
						//讓選項上下置中
7778
						opDiv.style.paddingTop='15px';
7779
 
174 liveuser 7780
						//如果是不可以點選的選項
7781
						if(fakeScrollingList.mother.noActionOption.name==opShow && fakeScrollingList.mother.noActionOption.value==opVal){
226 liveuser 7782
 
174 liveuser 7783
							//設置選項div的class
7784
							opDiv.setAttribute('class','__qbpwcf_inputSelect');
226 liveuser 7785
 
174 liveuser 7786
							}//if end
7787
 
7788
						//反之為可以點選的選項
7789
						else{
226 liveuser 7790
 
174 liveuser 7791
							//設置選項div的class
7792
							opDiv.setAttribute('class','__qbpwcf_inputSelect __qbpwcf_inputSelect_hover');
226 liveuser 7793
 
174 liveuser 7794
							}//else end
226 liveuser 7795
 
3 liveuser 7796
						//設置裡面的文字要換行的時候改用...表示
7797
						opDiv.style.whiteSpace='nowrap';
174 liveuser 7798
						opDiv.style.width='100%';
3 liveuser 7799
						opDiv.style.overflow='hidden';
7800
						opDiv.style.textOverflow='ellipsis';
226 liveuser 7801
 
3 liveuser 7802
						//偶數欄位
174 liveuser 7803
						if(i%2===0){
226 liveuser 7804
 
3 liveuser 7805
							//設置選項div底色為藍色
7806
							opDiv.style.backgroundColor='CCCCFF';
226 liveuser 7807
 
174 liveuser 7808
							}//if end
226 liveuser 7809
 
3 liveuser 7810
						//反之為奇數欄位
174 liveuser 7811
						else{
226 liveuser 7812
 
3 liveuser 7813
							//設置選項div底色為紅色
7814
							opDiv.style.backgroundColor='FFCCCC';
226 liveuser 7815
 
174 liveuser 7816
							}//else end
3 liveuser 7817
 
7818
						//解析選項的資訊
7819
						var oriOptionsInfo=this.options;
7820
 
7821
						//建立選項名稱文字節點
7822
						var textnode = document.createTextNode(opShow);
7823
 
7824
						//將文字放進選項的div
7825
						opDiv.appendChild(textnode);
7826
 
7827
						//設置選項對應的實際數值
7828
						opDiv.dataset.val=opVal;
226 liveuser 7829
 
3 liveuser 7830
						//設置選項對應的索引
7831
						opDiv.dataset.index=i;
226 liveuser 7832
 
3 liveuser 7833
						//將選項放進為了上下左右置中的div
7834
						divForMiddle.appendChild(opDiv);
7835
 
7836
						}//for end
7837
 
7838
					//新增為了上下左右置中的div
7839
					var divForCenterMiddle=document.createElement('div');
7840
 
7841
					//設置為了內部元素都上下左右置中的div樣式
7842
					divForCenterMiddle.classList.add('__qbpwcf_scrollingListInnerDiv');
7843
 
7844
					//將上下置中的選項們放進可以上下左右置中的div
7845
					divForCenterMiddle.appendChild(divForMiddle);
7846
 
7847
					//將選項放進最外層的div
7848
					root.appendChild(divForCenterMiddle);
7849
 
7850
					//將整個div放到body裡面
7851
					document.body.appendChild(root);
7852
 
7853
					//調整滾軸表單的置中效果
7854
					scrollingListMiddleFunction();
7855
 
7856
					//取得所有選項
7857
					var allOptions=document.getElementsByClassName('__qbpwcf_inputSelect_hover');
7858
 
7859
					//移動滾軸讓原本選擇的選項盡量置中
7860
 
7861
					//取得選單的滾軸上端位置最大值
7862
					var scrollingListScrollTopMax=document.getElementById('scrollingListRootDiv').children[0].scrollTopMax;
7863
 
7864
					//如果有滾軸
7865
					if(scrollingListScrollTopMax!==0){
7866
 
7867
						//如果是第一個選項
7868
						if(selectedOptionIndex===0){
7869
 
7870
							//滾軸拉到最上面
7871
							document.getElementById('scrollingListRootDiv').children[0].scrollTop=0;
7872
 
7873
							}//if end
7874
 
7875
						//如果之前選擇的選項索引剛好等於 opLen/2
7876
						else if(((selectedOptionIndex+1)===(opLen/2))){
7877
 
7878
							//取得新的滾軸高度
7879
							var newScrollTop=scrollingListScrollTopMax/2;
7880
 
7881
							//設置滾軸的上端位置
7882
							document.getElementById('scrollingListRootDiv').children[0].scrollTop=newScrollTop;
7883
 
7884
							}//if end
7885
 
7886
						//如果之前選擇的選項索引小於半
7887
						else if((selectedOptionIndex+1)<(opLen/2)){
7888
 
7889
							//取得新的滾軸高度
7890
							var newScrollTop=scrollingListScrollTopMax/opLen*selectedOptionIndex+1;
7891
 
7892
							//設置滾軸的上端位置
7893
							document.getElementById('scrollingListRootDiv').children[0].scrollTop=newScrollTop;
7894
 
7895
							}//if end
7896
 
7897
						//如果之前選擇的選項索引過半
7898
						else if((selectedOptionIndex+1)>(opLen/2)){
7899
 
7900
							//取得新的滾軸高度
7901
							var newScrollTop=scrollingListScrollTopMax-scrollingListScrollTopMax/opLen*(opLen-selectedOptionIndex-1);
7902
 
7903
							//設置滾軸的上端位置
7904
							document.getElementById('scrollingListRootDiv').children[0].scrollTop=newScrollTop;
7905
 
7906
							}//if end
7907
 
7908
						//如果是最後一個選項
7909
						else if(selectedOptionIndex===opLen){
7910
 
7911
							//如果是最後一個選項
7912
							document.getElementById('scrollingListRootDiv').children[0].scrollTop=scrollingListScrollTopMax;
7913
 
7914
							}//if end
7915
 
7916
						//不應該跑到的地方
7917
						else{
7918
 
7919
							//debug
174 liveuser 7920
							console.error('error occur!');
3 liveuser 7921
 
7922
							}//else end
7923
 
7924
						}//if end
7925
 
7926
					//針對每個選項
7927
					for(var i=0;i<allOptions.length;i++){
7928
 
7929
						//取得this設定
7930
						allOptions[i].mother=fakeScrollingList.mother;
7931
 
7932
						//綁定所有選項的 'click' 事件
7933
						allOptions[i].addEventListener('click',async function(event){
7934
 
7935
							//取得點擊到的選項
7936
							var clickedOption=event.target;
7937
 
7938
							//取得點擊到的選項數值
7939
							var clickedValue=clickedOption.dataset.val;
7940
 
7941
							//取得點擊到的選項索引
7942
							var clickedNo=clickedOption.dataset.index;
7943
 
7944
							//取得點擊到的選項名稱
7945
							var clickedName=clickedOption.innerHTML;
7946
 
7947
							//如果不需要傳送表單
7948
							if(this.mother.donotSendFrom){
226 liveuser 7949
 
3 liveuser 7950
								//取得要移除 scrolling list 的 div
7951
								var divToDel=document.getElementById('scrollingListRootDiv');
7952
 
7953
								//移除 scrolling list div
7954
								divToDel.remove();
226 liveuser 7955
 
3 liveuser 7956
								//針對每個要呼叫的 callback func
7957
								for(var j=0;j<this.mother.callback.length;j++){
226 liveuser 7958
 
3 liveuser 7959
									//callback
7960
									this.mother.callback[j].call(this,clickedValue);
226 liveuser 7961
 
3 liveuser 7962
									}//for end
7963
 
7964
								//復原下拉式選單
7965
								inputSelect.style.opacity='unset';
226 liveuser 7966
 
3 liveuser 7967
								//結束執行
7968
								return true;
226 liveuser 7969
 
3 liveuser 7970
								}//if end
7971
 
7972
							//如果不是不需要傳送數值的選項
7973
							if(fakeScrollingList.mother.noActionOption.name!==clickedName && fakeScrollingList.mother.noActionOption.value!==clickedValue){
226 liveuser 7974
 
3 liveuser 7975
								//建立表單物件
7976
								var queryStr='';
7977
 
7978
								//新增表單的名稱與對應的數值
7979
								queryStr=queryStr+fakeScrollingList.mother.sendVarName+'='+encodeURIComponent(clickedValue);
7980
 
7981
								//針對每個隱藏的表單變數
7982
								for(var j=0;j<fakeScrollingList.mother.hiddenVar.length;j++){
226 liveuser 7983
 
3 liveuser 7984
									//附加到要傳算的表單變數裡面
7985
									queryStr=queryStr+'&'+fakeScrollingList.mother.hiddenVar[j].name+'='+encodeURIComponent(fakeScrollingList.mother.hiddenVar[j].value);
226 liveuser 7986
 
3 liveuser 7987
									}//for end
226 liveuser 7988
 
3 liveuser 7989
								//復原下拉式選單
7990
								inputSelect.style.opacity='unset';
226 liveuser 7991
 
3 liveuser 7992
								/*
7993
								設置 window.qbpwcf.ajaxP 函數
7994
								說明:
7995
								傳送ajax,指定傳送前要做什麼事情,然後回傳一個Promise.
7996
								參數:
7997
								params={};
7998
								params.method='POST' or 'GET' or 'HEAD' or 'OPTIONS';
7999
								params.headers={name:value};
8000
								params.url='url to request';
8001
								params.preAc='function name to call before send request';
8002
								params.data='data to contain','key1=encodeURIComponent(val1)&key2=encodeURIComponent(val2)';if no data please use {};
8003
								參考資料:
8004
								https://eyesofkids.gitbooks.io/javascript-start-es6-promise/content/contents/ch11_snippets.html
8005
								https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise
8006
								*/
8007
								var params={};
8008
								params.method='POST';
8009
								params.url=fakeScrollingList.mother.recPage;
8010
								params.data=queryStr;
226 liveuser 8011
 
3 liveuser 8012
								//取得回應
8013
								var res = await window.qbpwcf.ajaxP.call(this,params);
226 liveuser 8014
 
3 liveuser 8015
								//取得要移除 scrolling list 的 div
8016
								var divToDel=document.getElementById('scrollingListRootDiv');
8017
 
8018
								//移除 scrolling list div
8019
								divToDel.remove();
226 liveuser 8020
 
3 liveuser 8021
								//針對每個要呼叫的 callback func
8022
								for(var j=0;j<fakeScrollingList.mother.callback.length;j++){
226 liveuser 8023
 
3 liveuser 8024
									//callback
8025
									fakeScrollingList.mother.callback[j].call(this,res);
226 liveuser 8026
 
3 liveuser 8027
									}//for end
226 liveuser 8028
 
174 liveuser 8029
								//如果回應是合法的json
8030
								if(res.compliantJson==true){
226 liveuser 8031
 
174 liveuser 8032
									//如果json的回應有error屬性
8033
									if(res.json.hasOwnProperty('error')){
226 liveuser 8034
 
174 liveuser 8035
										//警示訊息
8036
										alert(res.json.error);
226 liveuser 8037
 
174 liveuser 8038
										}//if end
226 liveuser 8039
 
174 liveuser 8040
									//如果json的回應有content屬性
8041
									else if(res.json.hasOwnProperty('content')){
226 liveuser 8042
 
174 liveuser 8043
										//警示訊息
8044
										alert(res.json.content);
226 liveuser 8045
 
174 liveuser 8046
										}//else end
226 liveuser 8047
 
174 liveuser 8048
									//如果json的回應有 location屬性
8049
									if(res.json.hasOwnProperty('location')){
226 liveuser 8050
 
174 liveuser 8051
										//導頁
8052
										location.href=res.json.location;
226 liveuser 8053
 
174 liveuser 8054
										}//if end
226 liveuser 8055
 
174 liveuser 8056
									}//if end
226 liveuser 8057
 
174 liveuser 8058
								//反之為非json,且要將dom取代當前頁面的內容
8059
								else if(replaceCurrentPageToDomResponse==true){
226 liveuser 8060
 
174 liveuser 8061
									//清空畫面
8062
									document.replaceChildren();
226 liveuser 8063
 
174 liveuser 8064
									//建立html
8065
									var html=document.createElement('html');
226 liveuser 8066
 
174 liveuser 8067
									//建立head
8068
									var head=document.createElement('head');
226 liveuser 8069
 
174 liveuser 8070
									//建立body
8071
									var body=document.createElement('body');
226 liveuser 8072
 
174 liveuser 8073
									//將回應的dom放到body
8074
									body.append(res.dom);
226 liveuser 8075
 
174 liveuser 8076
									//將head放到html裡面
8077
									html.append(head);
226 liveuser 8078
 
174 liveuser 8079
									//將body放到html裡面
8080
									html.append(body);
226 liveuser 8081
 
174 liveuser 8082
									//置換畫面為新的內榮
8083
									document.replaceChildren(html);
226 liveuser 8084
 
174 liveuser 8085
									}//if end
226 liveuser 8086
 
3 liveuser 8087
								}//if end
8088
 
8089
							});//function end
8090
 
8091
						}//for end
8092
 
174 liveuser 8093
					//如果允許關閉選單
8094
					if(fakeScrollingList.mother.disallowClose==false){
226 liveuser 8095
 
174 liveuser 8096
						//建立 close icon
8097
						var closeIcon = document.createElement('img');
3 liveuser 8098
 
174 liveuser 8099
						//設置 close icon 的樣式
8100
						closeIcon.style['position']='fixed';
8101
						closeIcon.style['top']='15%';
8102
						closeIcon.style['left']='85%';
8103
						closeIcon.style['width']='5%';
8104
						closeIcon.style['min-width']='30px';
8105
						closeIcon.style['max-width']='50px';
8106
						closeIcon.style['cursor']='pointer';
3 liveuser 8107
 
174 liveuser 8108
						//設置 close icon img 的 src 屬性
8109
						closeIcon.src=fakeScrollingList.mother.closeIcon;
3 liveuser 8110
 
174 liveuser 8111
						//設置 close icon img 的id
8112
						closeIcon.id='qbpwcfScrollingListCloseIcon';
3 liveuser 8113
 
174 liveuser 8114
						//取得 scrollingList 的 root div
8115
						var slrd=document.getElementById('scrollingListRootDiv');
3 liveuser 8116
 
174 liveuser 8117
						//將 close icon 放到 scrollingList 的 root div 裡面
8118
						document.getElementById('scrollingListRootDiv').appendChild(closeIcon);
3 liveuser 8119
 
174 liveuser 8120
						//取得 close icon img
8121
						var closeIcon=document.getElementById('qbpwcfScrollingListCloseIcon');
3 liveuser 8122
 
174 liveuser 8123
						//新增 close icon img 的點擊事件
8124
						closeIcon.addEventListener('click',function(){
3 liveuser 8125
 
174 liveuser 8126
							//取得要移除 scrolling list 的 div
8127
							var divToDel=document.getElementById('scrollingListRootDiv');
3 liveuser 8128
 
174 liveuser 8129
							//移除 scrolling list div
8130
							divToDel.remove();
3 liveuser 8131
 
174 liveuser 8132
							//復原下拉式選單
8133
							inputSelect.style.opacity='unset';
226 liveuser 8134
 
200 liveuser 8135
							//如果有設置要到導頁到的位置
8136
							if(fakeScrollingList.mother.redirectAfterClose!=false){
226 liveuser 8137
 
200 liveuser 8138
								//進行導頁
8139
								window.location.href=fakeScrollingList.mother.redirectAfterClose;
226 liveuser 8140
 
200 liveuser 8141
								}//if end
3 liveuser 8142
 
174 liveuser 8143
							});//addEventLister
3 liveuser 8144
 
174 liveuser 8145
						//如果有啟用且只有一個選項則自動點擊最後一個選項
8146
						if(fakeScrollingList.mother.sendOnClickWhenOnly2options && opLen===2){
226 liveuser 8147
 
174 liveuser 8148
							//debug
8149
							console.log('try auto click last option');
226 liveuser 8150
 
174 liveuser 8151
							//取得選項們的外框
8152
							var optionOutBoderDiv=document.querySelector('div#scrollingListRootDiv').children[0].children[0];
226 liveuser 8153
 
174 liveuser 8154
							//點擊最後一個選項
8155
							optionOutBoderDiv.children[1].click();
226 liveuser 8156
 
174 liveuser 8157
							}//if end
226 liveuser 8158
 
3 liveuser 8159
						}//if end
8160
 
8161
					});//function end
226 liveuser 8162
 
174 liveuser 8163
				//如果要自動觸發
8164
				if(this.autoStart===true){
226 liveuser 8165
 
174 liveuser 8166
					//觸發之
8167
					this.targetEle.click();
226 liveuser 8168
 
174 liveuser 8169
					}//if end
226 liveuser 8170
 
174 liveuser 8171
				}//function active end
226 liveuser 8172
 
3 liveuser 8173
			}//function end
226 liveuser 8174
 
3 liveuser 8175
		";
8176
		#js function
8177
		$conf["javaScript::toScript"]["jsFunciton"][]=
8178
		"
8179
		//如果未設定 window.qbpwcf 物件
8180
		if(window.qbpwcf===undefined){
8181
 
8182
			//設置 window.qbpwcf 為空物件
8183
			window.qbpwcf={};
8184
 
8185
			}//if end
8186
 
8187
		//如果未設定 window.qbpwcf.ajax  物件
8188
		if(window.qbpwcf.ajax===undefined){
8189
 
8190
			//設置 window.qbpwcf.ajax  為空物件
8191
			window.qbpwcf.ajax={};
8192
 
8193
			}//if end
226 liveuser 8194
 
3 liveuser 8195
		/*
8196
		設置 window.qbpwcf.ajax 函數
8197
		說明:
8198
		傳送ajax,指定傳送前要做什麼事情,傳送後要做什麼事情.
8199
		參數:
8200
		params={};
8201
		params.method='POST' or 'GET' or 'HEAD' or 'OPTIONS';
8202
		params.headers={name:value};
8203
		params.url='url to request';
8204
		params.resType='json';
8205
		params.preAc='function name to call before send request';
8206
		params.aftAc='function name to call after send request,default params is data to send';
8207
		params.data='data to contain','key1=encodeURIComponent(val1)&key2=encodeURIComponent(val2)';if no data please use {};
8208
		*/
8209
		window.qbpwcf.ajax=function(params){
226 liveuser 8210
 
3 liveuser 8211
			//檢查參數 params.method
8212
			if(params.method===undefined){
226 liveuser 8213
 
3 liveuser 8214
				//初始化為 'POST'
8215
				params.method='POST';
226 liveuser 8216
 
3 liveuser 8217
				}//if end
226 liveuser 8218
 
3 liveuser 8219
			//檢查參數 params.url
8220
			if(params.url===undefined){
226 liveuser 8221
 
3 liveuser 8222
				//初始化為當前頁面
8223
				params.url=location.href;
226 liveuser 8224
 
3 liveuser 8225
				}//if end
226 liveuser 8226
 
3 liveuser 8227
			//檢查參數 params.resType
8228
			if(params.resType===undefined){
226 liveuser 8229
 
3 liveuser 8230
				//初始化為'json'
8231
				params.resType='json';
226 liveuser 8232
 
3 liveuser 8233
				}//if end
226 liveuser 8234
 
3 liveuser 8235
			//檢查參數 params.preAc
8236
			if(params.preAc===undefined){
226 liveuser 8237
 
3 liveuser 8238
				//初始化為提示傳送 ajax 前
8239
				params.preAc=function(){
226 liveuser 8240
 
3 liveuser 8241
					//debug
8242
					if(window.debug){
226 liveuser 8243
 
3 liveuser 8244
						//提示傳送 ajax 前
8245
						console.log('before sand request...');
226 liveuser 8246
 
3 liveuser 8247
						}//if end
226 liveuser 8248
 
3 liveuser 8249
					};//funcitno end
226 liveuser 8250
 
3 liveuser 8251
				}//if end
226 liveuser 8252
 
3 liveuser 8253
			//檢查參數 params.aftAc
8254
			if(params.aftAc===undefined){
226 liveuser 8255
 
3 liveuser 8256
				//初始化為提示傳送 ajax 後
8257
				params.aftAc=function(){
226 liveuser 8258
 
3 liveuser 8259
					//debug
8260
					if(window.debug){
226 liveuser 8261
 
3 liveuser 8262
						//提示傳送 ajax 後
8263
						console.log('after sand request...');
226 liveuser 8264
 
3 liveuser 8265
						}//if end
226 liveuser 8266
 
3 liveuser 8267
					};//funcitno end
226 liveuser 8268
 
3 liveuser 8269
				}//if end
226 liveuser 8270
 
3 liveuser 8271
			//檢查參數 params.data
8272
			if(params.data===undefined){
226 liveuser 8273
 
3 liveuser 8274
				//初始化變數q
8275
				key1='q';
226 liveuser 8276
 
3 liveuser 8277
				//初始化變數q的數值內容為'test by qbpwcf'
8278
				v1='test by qbpwcf';
226 liveuser 8279
 
3 liveuser 8280
				//初始要傳送的參數
8281
				params.data=key1+'='+encodeURIComponent(v1);
226 liveuser 8282
 
3 liveuser 8283
				}//if end
226 liveuser 8284
 
3 liveuser 8285
			//如果支援 ajax
8286
			if(window.XMLHttpRequest){
8287
 
8288
				// code for IE7+, Firefox, Chrome, Opera, Safari
8289
				var xmlhttp=new XMLHttpRequest();
8290
 
8291
				}//if end
8292
 
8293
			//不支援,應該是IE5、IE6
8294
			else{
8295
 
8296
				// code for IE6, IE5
8297
				var xmlhttp=new ActiveXObject('Microsoft.XMLHTTP');
8298
 
8299
				}// else end
8300
 
8301
			//如果服務端有回傳完稱的狀態
8302
			xmlhttp.onreadystatechange=function(){
8303
 
8304
				//debug
8305
				//console.log(xmlhttp);
8306
 
8307
				//如果狀態為1
8308
				if(xmlhttp.readyState==1){
8309
 
8310
					//傳送 ajax 前要做的事情
8311
					params.preAc.call(this);
8312
 
8313
					}//if end
8314
 
8315
				//如果狀態為4
8316
				if(xmlhttp.readyState==4){
8317
 
8318
					//且response code為200
8319
					if(xmlhttp.status==200){
8320
 
8321
						//得到回傳結果後要做的事情,參數為回傳的結果.
8322
						params.aftAc.call(this,xmlhttp.response);
8323
 
8324
 
226 liveuser 8325
 
3 liveuser 8326
						}//if end
226 liveuser 8327
 
8328
					//反之回傳狀態碼
3 liveuser 8329
					else{
226 liveuser 8330
 
3 liveuser 8331
						//得到回傳結果後要做的事情,參數為回傳的結果.
8332
						params.aftAc.call(this,xmlhttp.status);
226 liveuser 8333
 
3 liveuser 8334
						}//else end
8335
 
8336
					}//if end
8337
 
8338
				}//function end
8339
 
8340
			//設定回傳的資料形態
8341
			xmlhttp.responseType=params.resType;
8342
 
226 liveuser 8343
			//如果是 'GET'
3 liveuser 8344
			if(params.method==='GET'){
226 liveuser 8345
 
3 liveuser 8346
				//如果data不為空物件
8347
				if(params.data.toString()!=='[object Object]'){
226 liveuser 8348
 
3 liveuser 8349
					//加上get用的'?'
8350
					params.url=params.url+'?'+params.data;
226 liveuser 8351
 
3 liveuser 8352
					}//if end
226 liveuser 8353
 
3 liveuser 8354
				}//if end
8355
 
8356
			//設定要用get傳送的數值
8357
			xmlhttp.open(params.method,params.url,true);
8358
 
8359
			//如果有設置 header
8360
			if(params.headers!==undefined){
226 liveuser 8361
 
3 liveuser 8362
				//儲存迴圈的次數
8363
				var count=Object.keys(params.headers).length;
226 liveuser 8364
 
3 liveuser 8365
				//針對每個自己加的 header
8366
				for(var i=0;i<count;i++){
226 liveuser 8367
 
3 liveuser 8368
					//加上自定的 header
8369
					xmlhttp.setRequestHeader(Object.keys(params.headers)[i],Object.values(params.headers)[i]);
226 liveuser 8370
 
3 liveuser 8371
					}//for end
226 liveuser 8372
 
3 liveuser 8373
				}//if end
8374
 
8375
			//設定 header
8376
			xmlhttp.setRequestHeader('Content-type','application/x-www-form-urlencoded');
8377
 
8378
			//設定要求為ajax 的 header
8379
			xmlhttp.setRequestHeader('X-Requested-With','XMLHttpRequest');
8380
 
226 liveuser 8381
			//如果是 'POST'
3 liveuser 8382
			if(params.method==='POST'){
8383
 
8384
				//如果data不為空物件
8385
				if(params.data.toString()!=='[object Object]'){
8386
 
8387
					//傳送要求
8388
					xmlhttp.send(params.data);
8389
 
8390
					}//if end
226 liveuser 8391
 
8392
				//反之data存在資料
3 liveuser 8393
				else{
8394
					//傳送要求,POST為空
8395
					xmlhttp.send();
226 liveuser 8396
 
3 liveuser 8397
					}//else end
8398
 
8399
				}//if end
8400
 
8401
			//反之是 GET 或 HEAD 或 OPTIONS
8402
			else if(params.method==='GET' || params.method==='HEAD' || params.method==='OPTIONS'){
226 liveuser 8403
 
3 liveuser 8404
				//直接傳送要求
8405
				xmlhttp.send();
226 liveuser 8406
 
3 liveuser 8407
				}//else end
226 liveuser 8408
 
3 liveuser 8409
			}//function window.qbpwcf.ajax end
8410
		";
8411
		#js function
8412
		$conf["javaScript::toScript"]["jsFunciton"][]=
8413
		"
8414
		//如果未設定 window.qbpwcf 物件
8415
		if(window.qbpwcf===undefined){
8416
 
8417
			//設置 window.qbpwcf 為空物件
8418
			window.qbpwcf={};
8419
 
8420
			}//if end
8421
 
8422
		//如果未設定 window.qbpwcf.ajaxP  物件
8423
		if(window.qbpwcf.ajaxP===undefined){
8424
 
8425
			//設置 window.qbpwcf.ajax  為空物件
8426
			window.qbpwcf.ajaxP={};
8427
 
8428
			}//if end
226 liveuser 8429
 
3 liveuser 8430
		/*
8431
		設置 window.qbpwcf.ajaxP 函數
8432
		說明:
8433
		傳送ajax,指定傳送前要做什麼事情,然後回傳一個Promise.
174 liveuser 8434
		await完成後的回傳結果為一物件(res).
232 liveuser 8435
		res.status,'true' means run smoothly;'false' means failed occur.
174 liveuser 8436
		res.dom,content of html which can be directly access.
8437
		res.json,json string
8438
		res.compliantJson,true代表合法的json;false代表不合法的.
8439
		res.text,plain test
3 liveuser 8440
		參數:
8441
		params={};
8442
		params.method='POST' or 'GET' or 'HEAD' or 'OPTIONS';
8443
		params.headers={name:value};
8444
		params.url='url to request';
8445
		params.preAc='function name to call before send request';
8446
		params.data='data to contain','key1=encodeURIComponent(val1)&key2=encodeURIComponent(val2)';if no data please use {};
8447
		參考資料:
8448
		https://eyesofkids.gitbooks.io/javascript-start-es6-promise/content/contents/ch11_snippets.html
8449
		https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise
8450
		*/
8451
		window.qbpwcf.ajaxP=function(params){
226 liveuser 8452
 
3 liveuser 8453
			return new Promise(function(resolve, reject){
226 liveuser 8454
 
3 liveuser 8455
				//檢查參數 params.method
8456
				if(params.method===undefined){
226 liveuser 8457
 
3 liveuser 8458
					//初始化為 'POST'
8459
					params.method='POST';
226 liveuser 8460
 
3 liveuser 8461
					}//if end
226 liveuser 8462
 
3 liveuser 8463
				//檢查參數 params.url
8464
				if(params.url===undefined){
226 liveuser 8465
 
3 liveuser 8466
					//初始化為當前頁面
8467
					params.url=location.href;
226 liveuser 8468
 
3 liveuser 8469
					}//if end
226 liveuser 8470
 
3 liveuser 8471
				//檢查參數 params.preAc
8472
				if(params.preAc===undefined){
226 liveuser 8473
 
3 liveuser 8474
					//初始化為提示傳送 ajax 前
8475
					params.preAc=function(){
226 liveuser 8476
 
3 liveuser 8477
						//debug
8478
						if(window.debug){
226 liveuser 8479
 
3 liveuser 8480
							//提示傳送 ajax 前
8481
							console.log('before sand request...');
226 liveuser 8482
 
3 liveuser 8483
							}//if end
226 liveuser 8484
 
3 liveuser 8485
						};//funcitno end
226 liveuser 8486
 
3 liveuser 8487
					}//if end
226 liveuser 8488
 
3 liveuser 8489
				//檢查參數 params.data
8490
				if(params.data===undefined){
226 liveuser 8491
 
3 liveuser 8492
					//初始化變數q
8493
					key1='q';
226 liveuser 8494
 
3 liveuser 8495
					//初始化變數q的數值內容為'test by qbpwcf'
8496
					v1='test by qbpwcf';
226 liveuser 8497
 
3 liveuser 8498
					//初始要傳送的參數
8499
					params.data=key1+'='+encodeURIComponent(v1);
226 liveuser 8500
 
3 liveuser 8501
					}//if end
226 liveuser 8502
 
3 liveuser 8503
				//如果支援 ajax
8504
				if(window.XMLHttpRequest){
8505
 
8506
					// code for IE7+, Firefox, Chrome, Opera, Safari
8507
					var xmlhttp=new XMLHttpRequest();
8508
 
8509
					}//if end
8510
 
8511
				//不支援,應該是IE5、IE6
8512
				else{
8513
 
8514
					// code for IE6, IE5
8515
					var xmlhttp=new ActiveXObject('Microsoft.XMLHTTP');
8516
 
8517
					}// else end
8518
 
232 liveuser 8519
				//如果服務端有回傳完成的狀態
3 liveuser 8520
				xmlhttp.onreadystatechange=function(){
8521
 
8522
					//debug
8523
					//console.log(xmlhttp);
8524
 
8525
					//如果狀態為1
8526
					if(xmlhttp.readyState==1){
8527
 
8528
						//傳送 ajax 前要做的事情
8529
						params.preAc.call(this);
8530
 
8531
						}//if end
8532
 
8533
					//如果狀態為4
8534
					if(xmlhttp.readyState==4){
8535
 
8536
						//且response code為200
8537
						if(xmlhttp.status===200){
8538
 
8539
							var tmp=document.createElement('div');
8540
							tmp.innerHTML=xmlhttp.response;
226 liveuser 8541
 
3 liveuser 8542
							//初始化記錄結果的變數
8543
							var res={};
226 liveuser 8544
 
3 liveuser 8545
							//記錄指定解讀格式的內容
8546
							res.dom=tmp;
8547
 
8548
							//記錄得到的純文字內容
8549
							res.text=xmlhttp.responseText;
8550
 
8551
							//嘗試
8552
							try{
226 liveuser 8553
 
3 liveuser 8554
								//記錄json格式的內容
8555
								res.json=JSON.parse(res.text);
226 liveuser 8556
 
232 liveuser 8557
								}//try end
3 liveuser 8558
 
8559
							//抓取例外
8560
							catch(exception){
226 liveuser 8561
 
3 liveuser 8562
								//記錄錯誤訊息
8563
								res.json=exception;
226 liveuser 8564
 
232 liveuser 8565
								}//catch end
3 liveuser 8566
 
174 liveuser 8567
							//設置回應內容為合規的json
8568
							res.compliantJson=true;
8569
 
8570
							//如果json的回應有name屬性
8571
							if(res.json.hasOwnProperty('name')){
226 liveuser 8572
 
174 liveuser 8573
								//如果是 SyntaxError
8574
								if(res.json.name=='SyntaxError'){
226 liveuser 8575
 
174 liveuser 8576
									//設置回應內容不為合規的json
8577
									res.compliantJson=false;
226 liveuser 8578
 
174 liveuser 8579
									}//if end
226 liveuser 8580
 
174 liveuser 8581
								}//if end
226 liveuser 8582
 
232 liveuser 8583
							//設置執行正常
8584
							res.status='true';
8585
 
3 liveuser 8586
							//receive
8587
							resolve(res);
226 liveuser 8588
 
3 liveuser 8589
							}//if end
226 liveuser 8590
 
8591
						//反之回傳狀態碼
3 liveuser 8592
						else{
226 liveuser 8593
 
3 liveuser 8594
							//reject
8595
							reject(xmlhttp.status);
226 liveuser 8596
 
3 liveuser 8597
							}//else end
8598
 
8599
						}//if end
8600
 
8601
					}//function end
8602
 
226 liveuser 8603
				//如果是 'GET'
3 liveuser 8604
				if(params.method==='GET'){
226 liveuser 8605
 
3 liveuser 8606
					//如果data不為空物件
8607
					if(params.data.toString()!=='[object Object]'){
226 liveuser 8608
 
3 liveuser 8609
						//加上get用的'?'
8610
						params.url=params.url+'?'+params.data;
226 liveuser 8611
 
3 liveuser 8612
						}//if end
226 liveuser 8613
 
3 liveuser 8614
					}//if end
8615
 
8616
				//設定要用get傳送的數值
8617
				xmlhttp.open(params.method,params.url,true);
8618
 
8619
				//如果有設置 header
8620
				if(params.headers!==undefined){
226 liveuser 8621
 
3 liveuser 8622
					//儲存迴圈的次數
8623
					var count=Object.keys(params.headers).length;
226 liveuser 8624
 
3 liveuser 8625
					//針對每個自己加的 header
8626
					for(var i=0;i<count;i++){
226 liveuser 8627
 
3 liveuser 8628
						//加上自定的 header
8629
						xmlhttp.setRequestHeader(Object.keys(params.headers)[i],Object.values(params.headers)[i]);
226 liveuser 8630
 
3 liveuser 8631
						}//for end
226 liveuser 8632
 
3 liveuser 8633
					}//if end
8634
 
8635
				//設定 header
8636
				xmlhttp.setRequestHeader('Content-type','application/x-www-form-urlencoded');
8637
 
8638
				//設定要求為ajax 的 header
8639
				xmlhttp.setRequestHeader('X-Requested-With','XMLHttpRequest');
8640
 
226 liveuser 8641
				//如果是 'POST'
3 liveuser 8642
				if(params.method==='POST'){
8643
 
8644
					//如果data不為空物件
8645
					if(params.data.toString()!=='[object Object]'){
8646
 
8647
						//傳送要求
8648
						xmlhttp.send(params.data);
239 liveuser 8649
 
3 liveuser 8650
						}//if end
226 liveuser 8651
 
174 liveuser 8652
					//反之data存在資料
3 liveuser 8653
					else{
8654
						//傳送要求,POST為空
8655
						xmlhttp.send();
226 liveuser 8656
 
3 liveuser 8657
						}//else end
8658
 
8659
					}//if end
8660
 
8661
				//反之是 GET 或 HEAD 或 OPTIONS
8662
				else if(params.method==='GET' || params.method==='HEAD' || params.method==='OPTIONS'){
226 liveuser 8663
 
3 liveuser 8664
					//直接傳送要求
8665
					xmlhttp.send();
226 liveuser 8666
 
174 liveuser 8667
					}//else end
239 liveuser 8668
 
232 liveuser 8669
				//其他不認得的 method
8670
				else{
239 liveuser 8671
 
232 liveuser 8672
					//初始化儲存結果的物件
8673
					var res={};
239 liveuser 8674
 
232 liveuser 8675
					//設置錯誤訊息
8676
					res.error='unknow method:'+params.method;
239 liveuser 8677
 
232 liveuser 8678
					//設置執行異常
8679
					res.status='false';
239 liveuser 8680
 
232 liveuser 8681
					//receive
8682
					resolve(res);
239 liveuser 8683
 
232 liveuser 8684
					}//else end
226 liveuser 8685
 
3 liveuser 8686
				});//Promise end
226 liveuser 8687
 
3 liveuser 8688
			}//function window.qbpwcf.ajaxP end
8689
		";
8690
		#js function
8691
		$conf["javaScript::toScript"]["jsFunciton"][]=
8692
		"
8693
		/*
8694
		說明:
8695
		window.qbpwcf.tail ,物件,提供遞迴執行取得內容並顯示的功能.
8696
		window.qbpwcf.tail.url, 提供連線內容的頁面,預設為當前頁面.
8697
		window.qbpwcf.tail.continue ,true代表繼續執行;false代表暫停.
8698
		window.qbpwcf.tail.rootDiv.id ,儲存回應的div其id,預設為'qbbpwcfTailRootDivID'.
8699
		window.qbpwcf.tail.ajax(line2start) ,啟用該功能的函式,參數line2start為要從第幾行開始讀取,-1代表從最尾端開始.
8700
		*/
226 liveuser 8701
 
3 liveuser 8702
		//initial window.qbpwcf
8703
		if(window.qbpwcf===undefined){
8704
 
8705
			//初始化 window.qbpwcf
8706
			window.qbpwcf={};
8707
 
8708
			}//if end
226 liveuser 8709
 
3 liveuser 8710
		//initial window.qbpwcf.tail
8711
		if(window.qbpwcf.tail===undefined){
8712
 
8713
			//初始化 window.qbpwf.tail
8714
			window.qbpwcf.tail={};
8715
 
8716
			//初始化繼續執行
8717
			window.qbpwcf.tail.continue=true;
8718
 
8719
			}//if end
226 liveuser 8720
 
3 liveuser 8721
		//如果沒有指定要求內容的頁面
8722
		if(window.qbpwcf.tail.url===undefined){
226 liveuser 8723
 
3 liveuser 8724
			//初始化為當前頁面
8725
			window.qbpwcf.tail.url=location.href;
226 liveuser 8726
 
3 liveuser 8727
			}//if end
226 liveuser 8728
 
3 liveuser 8729
		//create root div
8730
		window.qbpwcf.tail.rootDiv = document.createElement('div');
226 liveuser 8731
 
3 liveuser 8732
		//如果位指定div id
8733
		if(window.qbpwcf.tail.rootDiv.id===undefined || window.qbpwcf.tail.rootDiv.id==='')
8734
		{
8735
			//預設為 qbbpwcfTailRootDivID
8736
			window.qbpwcf.tail.rootDiv.id='qbpwcfTailRootDivID';
226 liveuser 8737
 
3 liveuser 8738
		}//if end
226 liveuser 8739
 
3 liveuser 8740
		//設置周期執行的涵式
8741
		window.qbpwcf.tail.ajax = function(line2start){
226 liveuser 8742
 
3 liveuser 8743
			console.log(window.qbpwcf.tail.rootDiv.id);
226 liveuser 8744
 
3 liveuser 8745
			//初始化 root div 的 selector
8746
			var selector='div.'+window.qbpwcf.tail.rootDiv.id;
226 liveuser 8747
 
3 liveuser 8748
			//若 root div 不存在
8749
			if(document.querySelector(selector)===null){
226 liveuser 8750
 
3 liveuser 8751
				//建立之
8752
				document.body.appendChild(window.qbpwcf.tail.rootDiv);
226 liveuser 8753
 
3 liveuser 8754
				}//if end
226 liveuser 8755
 
3 liveuser 8756
			xmlhttp=new XMLHttpRequest();
8757
			//xmlhttp.responseType='json';
8758
			xmlhttp.open('POST',window.qbpwcf.tail.url,true);
8759
			xmlhttp.setRequestHeader('Content-type','application/x-www-form-urlencoded');
8760
			xmlhttp.setRequestHeader('X-Requested-With','XMLHttpRequest');
8761
			xmlhttp.onreadystatechange=function(){
8762
 
8763
				//如果狀態為4且response code為200
8764
				if(xmlhttp.readyState===4 && xmlhttp.status===200){
8765
 
226 liveuser 8766
					//get response
3 liveuser 8767
					res=xmlhttp.response;
226 liveuser 8768
 
3 liveuser 8769
					//try parse res to json
8770
					//參考資料
8771
					//https://stackoverflow.com/questions/4467044/proper-way-to-catch-exception-from-json-parse
8772
					try{
226 liveuser 8773
						json=JSON.parse(res);
3 liveuser 8774
					 	}
8775
					catch(e){
8776
						//console.log(e);
8777
					 	}
226 liveuser 8778
 
8779
					console.log(json);
8780
 
3 liveuser 8781
					//如果json不存在
8782
					if(json===undefined || json===null){
226 liveuser 8783
 
3 liveuser 8784
						//取得文字結果
8785
						res=xmlhttp.responseText
226 liveuser 8786
 
3 liveuser 8787
						//如果輸出有逗號.
8788
						if(res.includes(',')){
226 liveuser 8789
 
3 liveuser 8790
							//用逗號分割回應
8791
							res=res.split(',');
226 liveuser 8792
 
3 liveuser 8793
							//取得回應的陣列長度
8794
							rLength=res.length;
226 liveuser 8795
 
3 liveuser 8796
							}//if end
226 liveuser 8797
 
3 liveuser 8798
						//儲存最新的行內容
8799
						window.qbpwcf.tail.latsLineContent=null;
226 liveuser 8800
 
3 liveuser 8801
						//針對每個回應
8802
						for(i=0;i<rLength-1;i++){
226 liveuser 8803
 
8804
							//解密內容
3 liveuser 8805
							res[i]=JSON.parse(decodeURIComponent(atob(res[i])).replaceAll('+',' '));
226 liveuser 8806
 
3 liveuser 8807
							//取得讀取到的行數.
226 liveuser 8808
							window.qbpwcf.tail.lineNum=res[i].lineNum;
8809
 
3 liveuser 8810
							//針對每行輸出
8811
							for(var j=0;j<res[i].lines;j++){
226 liveuser 8812
 
3 liveuser 8813
								//如果內容跟上一行相同.
8814
								if(window.qbpwcf.tail.latsLineContent===res[i].content[j]){
226 liveuser 8815
 
3 liveuser 8816
									//跳過
8817
									continue;
226 liveuser 8818
 
8819
									}//if end
8820
 
3 liveuser 8821
								//反之
8822
								else{
226 liveuser 8823
 
3 liveuser 8824
									//更新最新一列的內容
8825
									window.qbpwcf.tail.latsLineContent=res[i].content[j];
226 liveuser 8826
 
3 liveuser 8827
									}//else end
226 liveuser 8828
 
3 liveuser 8829
								//set output line
8830
								var div=document.createElement('div');
8831
								var text=document.createTextNode(res[i].content[j]);
8832
								div.appendChild(text);
226 liveuser 8833
 
3 liveuser 8834
								//如果內容為空
8835
								if(res[i].content[j]==='')
8836
								{
8837
									//建立<br>
8838
									var br=document.createElement('br');
226 liveuser 8839
 
3 liveuser 8840
									//遷入<br>
8841
									div.appendChild(br);
8842
								}
226 liveuser 8843
 
3 liveuser 8844
								//show output line
8845
								var rootDiv=document.getElementById(window.qbpwcf.tail.rootDiv.id);
8846
								rootDiv.prepend(div);
226 liveuser 8847
 
3 liveuser 8848
								}//for end
226 liveuser 8849
 
3 liveuser 8850
							}//for end
226 liveuser 8851
 
3 liveuser 8852
						}//if end
226 liveuser 8853
 
3 liveuser 8854
					//反之有pasrer出json
8855
					else{
226 liveuser 8856
 
3 liveuser 8857
						//取得json
8858
						res=json;
226 liveuser 8859
 
3 liveuser 8860
						//取得真實內容
8861
						res=res.content;
226 liveuser 8862
 
3 liveuser 8863
						//取得回應的陣列長度
8864
						rLength=res.length;
226 liveuser 8865
 
3 liveuser 8866
						//針對每筆輸出
8867
						for(var i=0;i<rLength;i++){
226 liveuser 8868
 
3 liveuser 8869
							//針對每行輸出
8870
							for(var j=0;j<rLength;j++){
226 liveuser 8871
 
3 liveuser 8872
								//set output line
8873
								var div=document.createElement('div');
8874
								var text=document.createTextNode(res[j]);
8875
								div.appendChild(text);
226 liveuser 8876
 
3 liveuser 8877
								//如果內容為空
8878
								if(res[j]==='')
8879
								{
8880
									//建立<br>
8881
									var br=document.createElement('br');
226 liveuser 8882
 
3 liveuser 8883
									//遷入<br>
8884
									div.appendChild(br);
8885
								}
226 liveuser 8886
 
3 liveuser 8887
								//show output line
8888
								var rootDiv=document.getElementById(window.qbpwcf.tail.rootDiv.id);
8889
								rootDiv.prepend(div);
226 liveuser 8890
 
3 liveuser 8891
								}//for end
226 liveuser 8892
 
3 liveuser 8893
							}//for end
226 liveuser 8894
 
3 liveuser 8895
						}//else end
226 liveuser 8896
 
3 liveuser 8897
					//if json !=null
8898
					if(json!=null){
226 liveuser 8899
 
3 liveuser 8900
						console.log(json.lineNum);
226 liveuser 8901
 
3 liveuser 8902
						//遞迴
8903
						window.qbpwcf.tail.ajax.call(this,json.lineNum+1);
8904
 
8905
						//清空變數
8906
						json=null;
226 liveuser 8907
 
3 liveuser 8908
						}//if end
226 liveuser 8909
 
3 liveuser 8910
					else{
226 liveuser 8911
 
3 liveuser 8912
						//如果當前行數不等於空
8913
						if(window.qbpwcf.tail.lineNum!==undefined && window.qbpwcf.tail.lineNum!==null){
226 liveuser 8914
 
3 liveuser 8915
							//遞迴
8916
							window.qbpwcf.tail.ajax.call(this,window.qbpwcf.tail.lineNum);
226 liveuser 8917
 
3 liveuser 8918
							}//if end
226 liveuser 8919
 
3 liveuser 8920
						else{
226 liveuser 8921
 
3 liveuser 8922
							//遞迴
8923
							window.qbpwcf.tail.ajax.call(this,-1);
226 liveuser 8924
 
3 liveuser 8925
							}//else end
226 liveuser 8926
 
3 liveuser 8927
						}//else end
8928
 
8929
					}//if end
8930
 
8931
				}//function end
226 liveuser 8932
 
8933
			//如果要繼續
3 liveuser 8934
			if(window.qbpwcf.tail.continue){
8935
 
8936
				//繼續
8937
				xmlhttp.send('line2start='+line2start);
8938
 
8939
				}//if end
226 liveuser 8940
 
3 liveuser 8941
			//反之要暫停
8942
			else{
226 liveuser 8943
 
3 liveuser 8944
				//設置無限等待
8945
				var intervalTail = window.setInterval(function(){
226 liveuser 8946
 
3 liveuser 8947
					//提示已經暫停
8948
					console.log('paused');
226 liveuser 8949
 
3 liveuser 8950
					//如果要繼續了
8951
					if(window.qbpwcf.tail.continue){
226 liveuser 8952
 
3 liveuser 8953
						//清除無限等待
8954
						clearInterval(intervalTail);
226 liveuser 8955
 
3 liveuser 8956
						//繼續
8957
						xmlhttp.send('line2start='+line2start);
226 liveuser 8958
 
3 liveuser 8959
						}//if end
226 liveuser 8960
 
3 liveuser 8961
					},1000);
226 liveuser 8962
 
3 liveuser 8963
				}//else end
8964
 
8965
			}//function end
8966
		";
8967
		#js function
8968
		$conf["javaScript::toScript"]["jsFunciton"][]=
8969
		"
8970
		//initial window.qbpwcf
8971
		if(window.qbpwcf===undefined){
8972
 
8973
			//初始化 window.qbpwcf
8974
			window.qbpwcf={};
8975
 
8976
			}//if end
226 liveuser 8977
 
3 liveuser 8978
		//initial window.qbpwcf.screenShare
8979
		if(window.qbpwcf.screenShare===undefined){
8980
 
8981
			//初始化 window.qbpwcf.screenShare
8982
			window.qbpwcf.screenShare={};
8983
 
8984
			}//if end
226 liveuser 8985
 
3 liveuser 8986
		/*
8987
		函式說明:
8988
		分享螢幕畫面.
8989
		參數說明:
8990
		parmas={};
8991
		params.displayOptions={};
8992
		params.startEle=''; //點擊後開始分享螢幕的元素id
8993
		參考資料:
8994
		https://developer.mozilla.org/en-US/docs/Web/API/Screen_Capture_API/Using_Screen_Capture
8995
		https://developer.mozilla.org/en-US/docs/Web/API/MediaStream_Recording_API
8996
		https://developer.mozilla.org/en-US/docs/Web/API/MediaSource/addSourceBuffer
8997
		https://developer.mozilla.org/en-US/docs/Web/API/Blob
8998
		https://developer.mozilla.org/zh-TW/docs/Web/JavaScript/Reference/Global_Objects/Array/shift
8999
		https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/ArrayBuffer
9000
		https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Int8Array
9001
		https://ithelp.ithome.com.tw/articles/10195525
9002
		https://developer.mozilla.org/zh-TW/docs/Web/API/Blob
9003
		#備註:
9004
		#錄製好的畫面無法在別的畫面播放.
9005
		*/
9006
		window.qbpwcf.screenShare.init=function(params){
226 liveuser 9007
 
3 liveuser 9008
			//初始化參數
9009
			if(params.startEle===undefined){
226 liveuser 9010
 
3 liveuser 9011
				params.startEle='';
226 liveuser 9012
 
3 liveuser 9013
				}//if end
226 liveuser 9014
 
3 liveuser 9015
			//初始化參數
9016
			if(params.displayOptions===undefined){
226 liveuser 9017
 
3 liveuser 9018
				//參數
9019
				params.displayOptions={
9020
  					video: {
9021
    						cursor: 'always',
9022
  						},
9023
  					audio: {
9024
  						echoCancellation: true,
9025
    						noiseSuppression: true,
9026
    						sampleRate: 44100,
9027
						},
9028
					};
226 liveuser 9029
 
3 liveuser 9030
				}// if end
226 liveuser 9031
 
3 liveuser 9032
			//全域化 displayOptions
9033
			window.qbpwcf.screenShare.displayOptions=params.displayOptions;
226 liveuser 9034
 
3 liveuser 9035
			//如果無指定點擊後開始分享畫面的元素
9036
			if(params.startEle==='')
9037
			{
9038
				//移除既有的分享畫面div
9039
				screenShareBtn=document.getElementById('window.qbpwcf.screenShare.startId');
226 liveuser 9040
 
3 liveuser 9041
				//如果有該按鈕
9042
				if(screenShareBtn!==null)
9043
				{
9044
					//移除之
9045
					screenShareBtn.remove();
9046
				}
226 liveuser 9047
 
3 liveuser 9048
				//建立 div 物件
9049
				div=document.createElement('div');
226 liveuser 9050
 
3 liveuser 9051
				//綁定點擊事件
9052
				div.addEventListener('click',function()
9053
				{
9054
					window.qbpwcf.screenShare.startCapture();
9055
				});
226 liveuser 9056
 
3 liveuser 9057
				//設置固位置的 css 樣式
9058
				div.style.position='fixed';
9059
				div.style.bottom='10px';
9060
				div.style.right='10px';
226 liveuser 9061
 
3 liveuser 9062
				//設置背景顏色為藍色
9063
				div.style.backgroundColor='#AAAAFF';
226 liveuser 9064
 
3 liveuser 9065
				//設置滑鼠指標過去為 pointer
9066
				div.style.cursor='pointer';
226 liveuser 9067
 
3 liveuser 9068
				//設置 div 的 id
9069
				div.id='window.qbpwcf.screenShare.startId';
226 liveuser 9070
 
3 liveuser 9071
				//給予提文字
9072
				div.innerText='按我開始分享畫面';
226 liveuser 9073
 
3 liveuser 9074
				//取得預設的開始錄影參數;
226 liveuser 9075
				params.startEle=div;
9076
 
3 liveuser 9077
				//放置 div
226 liveuser 9078
				document.body.appendChild(div);
9079
 
3 liveuser 9080
			}//if end
226 liveuser 9081
 
3 liveuser 9082
			//反之
9083
			else
9084
			{
9085
				//設置點擊就開始分享畫面的事件
9086
				params.startEle.addEventListener('click',function()
9087
				{
9088
					window.qbpwcf.screenShare.startCapture();
9089
				});
226 liveuser 9090
 
3 liveuser 9091
			}//else end
226 liveuser 9092
 
3 liveuser 9093
			//建立 video div 物件
9094
			window.qbpwcf.screenShare.videoElem=document.createElement('video');
9095
			window.qbpwcf.screenShare.videoElem.autoplay=true;
9096
			window.qbpwcf.screenShare.videoElem.style.width='100vw';
9097
			window.qbpwcf.screenShare.videoElem.style.height='100vh';
9098
			window.qbpwcf.screenShare.videoElem.style.border='solid 1px silver';
9099
			window.qbpwcf.screenShare.videoElem.id='video';
226 liveuser 9100
 
3 liveuser 9101
			//放置 video div
9102
			document.body.appendChild(window.qbpwcf.screenShare.videoElem);
226 liveuser 9103
 
3 liveuser 9104
			}//function window.qbpwcf.screenShare.init end
226 liveuser 9105
 
3 liveuser 9106
		//開始截取畫面
9107
		window.qbpwcf.screenShare.startCapture = async function(){
226 liveuser 9108
 
3 liveuser 9109
			//try start
9110
			try{
9111
				//顯示畫面
9112
				window.qbpwcf.screenShare.videoElem.srcObject = await navigator.mediaDevices.getDisplayMedia(window.qbpwcf.screenShare.displayOptions);
9113
				window.qbpwcf.screenShare.dumpOptionsInfo();
226 liveuser 9114
 
3 liveuser 9115
				//設定錄製畫面的設定
9116
				var options = { mimeType: 'video/webm; codecs=vp8' };
9117
				window.qbpwcf.screenShare.mediaRecorder = new MediaRecorder(window.qbpwcf.screenShare.videoElem.srcObject, options);
226 liveuser 9118
 
3 liveuser 9119
				//初始化儲存錄影的片段
9120
				window.qbpwcf.screenShare.recordedChunks=[];
226 liveuser 9121
 
3 liveuser 9122
				//當有資料可以錄製時
9123
				window.qbpwcf.screenShare.mediaRecorder.ondataavailable=window.qbpwcf.screenShare.handleDataAvailable;
226 liveuser 9124
 
3 liveuser 9125
				//開始錄製
9126
				window.qbpwcf.screenShare.mediaRecorder.start();
226 liveuser 9127
 
3 liveuser 9128
				//設置每1秒就要求一次錄取的資料
9129
				window.qbpwcf.screenShare.interval = setInterval(function(){
226 liveuser 9130
 
3 liveuser 9131
					//debug
9132
					if(window.debug){
226 liveuser 9133
 
3 liveuser 9134
						console.log(window.qbpwcf.screenShare.mediaRecorder);
226 liveuser 9135
 
3 liveuser 9136
						}//if end
226 liveuser 9137
 
3 liveuser 9138
					//如果停止錄影了
9139
					if(window.qbpwcf.screenShare.mediaRecorder.state==='inactive'){
226 liveuser 9140
 
3 liveuser 9141
						//結束循環要求錄取的資料
9142
						clearInterval(window.qbpwcf.screenShare.interval);
226 liveuser 9143
 
3 liveuser 9144
						}//if end
226 liveuser 9145
 
3 liveuser 9146
					//手動要求目前錄製
9147
					window.qbpwcf.screenShare.mediaRecorder.requestData();
226 liveuser 9148
 
3 liveuser 9149
					//如果要繼續了
9150
					if(window.qbpwcf.screenShare.continue){
226 liveuser 9151
 
3 liveuser 9152
						//清除無限等待
9153
						clearInterval(window.qbpwcf.screenShare.interval);
226 liveuser 9154
 
3 liveuser 9155
						}//if end
226 liveuser 9156
 
3 liveuser 9157
					},1000);
226 liveuser 9158
 
3 liveuser 9159
				} //try end
226 liveuser 9160
 
3 liveuser 9161
			//catch error
9162
			catch(err){
226 liveuser 9163
 
3 liveuser 9164
				//debug
9165
				console.error(err);
226 liveuser 9166
 
3 liveuser 9167
	 			}//catch end
226 liveuser 9168
 
3 liveuser 9169
			}//function end
226 liveuser 9170
 
3 liveuser 9171
		//結束截取畫面跟音訊
9172
		window.qbpwcf.screenShare.stopCapture = function(){
226 liveuser 9173
 
3 liveuser 9174
			let tracks = window.qbpwcf.screenShare.videoElem.srcObject.getTracks();
9175
 
9176
			tracks.forEach(track => track.stop());
226 liveuser 9177
 
3 liveuser 9178
			videoElem.srcObject = null;
226 liveuser 9179
 
3 liveuser 9180
			}//funciton end
226 liveuser 9181
 
3 liveuser 9182
		//輸出當前錄影的各項資訊
9183
		window.qbpwcf.screenShare.dumpOptionsInfo = function(){
226 liveuser 9184
 
3 liveuser 9185
			//debug
9186
			if(window.debug){
226 liveuser 9187
 
3 liveuser 9188
				//debug
9189
				console.log(window.qbpwcf.screenShare.videoElem.srcObject);
226 liveuser 9190
 
3 liveuser 9191
				}//if end
226 liveuser 9192
 
3 liveuser 9193
			const videoTrack = window.qbpwcf.screenShare.videoElem.srcObject.getVideoTracks()[0];
9194
 
9195
			//debug
9196
			if(window.debug){
9197
 
9198
 				console.log('Track settings:');
9199
  				console.log(JSON.stringify(videoTrack.getSettings(), null, 2));
9200
  				console.log('Track constraints:');
9201
  				console.log(JSON.stringify(videoTrack.getConstraints(), null, 2));
226 liveuser 9202
 
3 liveuser 9203
				}//if end
226 liveuser 9204
 
3 liveuser 9205
			}//function end
226 liveuser 9206
 
3 liveuser 9207
		//ondataavailable event 要執行的函式
9208
		window.qbpwcf.screenShare.handleDataAvailable = function(e){
226 liveuser 9209
 
3 liveuser 9210
			//debug
9211
			if(window.debug){
226 liveuser 9212
 
3 liveuser 9213
				console.log('data-available');
226 liveuser 9214
 
3 liveuser 9215
				}//if end
226 liveuser 9216
 
3 liveuser 9217
			//如果有資料
9218
			if (e.data.size > 0){
226 liveuser 9219
 
3 liveuser 9220
				//記錄資料
9221
				window.qbpwcf.screenShare.recordedChunks.push(e.data);
226 liveuser 9222
 
3 liveuser 9223
				//debug
9224
				if(window.debug){
226 liveuser 9225
 
3 liveuser 9226
					console.log(window.qbpwcf.screenShare.recordedChunks);
226 liveuser 9227
 
3 liveuser 9228
					}//if end
226 liveuser 9229
 
3 liveuser 9230
				//取得最舊的資料
9231
				blob=window.qbpwcf.screenShare.recordedChunks.shift();
226 liveuser 9232
 
3 liveuser 9233
				//debug
226 liveuser 9234
				if(window.debug){
9235
 
3 liveuser 9236
					//blob.type='video/webm; codecs=vp8'
226 liveuser 9237
					console.log(blob);
9238
 
3 liveuser 9239
					}//if end
226 liveuser 9240
 
3 liveuser 9241
				//建立 reader 物件
9242
				reader = new FileReader();
226 liveuser 9243
 
3 liveuser 9244
				//如果開啟完畢
9245
				reader.addEventListener('loadend',function(e){
226 liveuser 9246
 
3 liveuser 9247
					//debug
9248
					if(window.debug){
226 liveuser 9249
 
3 liveuser 9250
						console.log(e);
226 liveuser 9251
 
3 liveuser 9252
						}//if end
226 liveuser 9253
 
3 liveuser 9254
					//取得 arrayBUffer
9255
					buf=e.originalTarget.result;
226 liveuser 9256
 
3 liveuser 9257
					//debug
9258
					if(window.debug){
226 liveuser 9259
 
3 liveuser 9260
						console.log(buf);
226 liveuser 9261
 
3 liveuser 9262
						}//if end
226 liveuser 9263
 
3 liveuser 9264
					//用8位數2進位來表示
9265
					intArray = new Int8Array(buf);
226 liveuser 9266
 
3 liveuser 9267
					//儲存成json字串
9268
					json = JSON.stringify(intArray);
226 liveuser 9269
 
3 liveuser 9270
					//初始化要傳遞的變數物件內容
9271
					toDb={};
9272
					toDb.dbAddr='localhost';
9273
					toDb.dbName='qbpwcf';
9274
					toDb.dbUser='root';
9275
					toDb.dbPass='dolbyhometheater';
9276
					toDb.dtName='int8array';
9277
					toDb.cols=['json'];
9278
					toDb.vals=[json];
226 liveuser 9279
 
3 liveuser 9280
					//加密要傳輸的變數
9281
					toDb=btoa(encodeURIComponent(JSON.stringify(toDb)));
226 liveuser 9282
 
3 liveuser 9283
					//儲存到資料庫
9284
					params={};
9285
					params.method='POST';
9286
					params.url='/qbpwcf/db/toDb.php';
9287
					params.resType='json';
9288
					//params.preAc='function name to call before send request';
9289
					//params.aftAc='function name to call after send request';
9290
					params.data='params='+toDb;
9291
					window.qbpwcf.ajax(params);
226 liveuser 9292
 
3 liveuser 9293
					});//funciton  end
226 liveuser 9294
 
3 liveuser 9295
				//讀取 blob 成 arrayBuffer
9296
				reader.readAsArrayBuffer(blob);
226 liveuser 9297
 
3 liveuser 9298
				}//if end
226 liveuser 9299
 
3 liveuser 9300
			}//function end
226 liveuser 9301
 
9302
		//用戶觀賞分享的畫面
3 liveuser 9303
		window.qbpwcf.screenShare.client=function(){
226 liveuser 9304
 
3 liveuser 9305
			//建立 videoR div 物件
9306
			window.qbpwcf.screenShare.videoR=document.createElement('video');
9307
			window.qbpwcf.screenShare.videoR.autoplay=true;
9308
			window.qbpwcf.screenShare.videoR.style.width='100vw';
9309
			window.qbpwcf.screenShare.videoR.style.height='100vh';
9310
			window.qbpwcf.screenShare.videoR.style.border='solid 1px silver';
9311
			window.qbpwcf.screenShare.videoR.id='videoR';
226 liveuser 9312
 
3 liveuser 9313
			//放置 videoR div
9314
			document.body.appendChild(window.qbpwcf.screenShare.videoR);
226 liveuser 9315
 
3 liveuser 9316
			//建立 media source 物件
226 liveuser 9317
			window.qbpwcf.screenShare.mediaSourceForR = new MediaSource();
9318
 
9319
			//設置 video tag 的內容來源
3 liveuser 9320
			//window.qbpwcf.screenShare.videoR.src=URL.createObjectURL(window.qbpwcf.screenShare.mediaSourceForR); //old method
9321
			window.qbpwcf.screenShare.videoR.srcObject=window.qbpwcf.screenShare.mediaSourceForR; //new method
226 liveuser 9322
 
3 liveuser 9323
			//初始化用戶取得的最新視訊片段id
9324
			window.qbpwcf.screenShare.clientDataId=0;
226 liveuser 9325
 
3 liveuser 9326
			//建立當打開媒體來源時
9327
			window.qbpwcf.screenShare.mediaSourceForR.addEventListener('sourceopen',window.qbpwcf.screenShare.clientRecursive);
226 liveuser 9328
 
3 liveuser 9329
			}//functino end
226 liveuser 9330
 
3 liveuser 9331
		//用戶觀賞分享的畫面用的遞回函式
9332
		window.qbpwcf.screenShare.clientRecursive=function(event){
226 liveuser 9333
 
3 liveuser 9334
			//debug
9335
			if(window.debug){
226 liveuser 9336
 
3 liveuser 9337
				console.log(event);
226 liveuser 9338
 
3 liveuser 9339
				}//if end
226 liveuser 9340
 
3 liveuser 9341
			//如果尚無資料
9342
			if(window.qbpwcf.screenShare.clientDataId===0){
226 liveuser 9343
 
9344
				//設置輸出的編碼
3 liveuser 9345
				window.qbpwcf.screenShare.sourceBuffer = window.qbpwcf.screenShare.mediaSourceForR.addSourceBuffer('video/webm; codecs=vp8');
226 liveuser 9346
 
3 liveuser 9347
				}//if end
226 liveuser 9348
 
3 liveuser 9349
			//初始化要傳遞的變數物件內容
9350
			toDb={};
9351
			toDb.dbAddr='localhost';
9352
			toDb.dbName='qbpwcf';
9353
			toDb.dbUser='root';
9354
			toDb.dbPass='dolbyhometheater';
9355
			toDb.dtName='int8array';
9356
			toDb.cols=['id','json'];
9357
			toDb.orderItem='id';
9358
			toDb.ascORdesc='desc';
9359
			toDb.numLimit='1';
9360
			//toDb.WhereColumnName=['id'];
9361
			//toDb.WhereColumnOperator=['>'];
9362
			//toDb.WhereColumnValue=[window.qbpwcf.screenShare.clientDataId+''];
226 liveuser 9363
 
3 liveuser 9364
			//debug
9365
			if(window.debug){
226 liveuser 9366
 
3 liveuser 9367
				console.log(toDb);
226 liveuser 9368
 
9369
				}//if end
9370
 
3 liveuser 9371
			//加密要傳輸的變數
9372
			toDb=btoa(encodeURIComponent(JSON.stringify(toDb)));
226 liveuser 9373
 
3 liveuser 9374
			//從Server取得資料
9375
			params={};
9376
			params.method='POST';
9377
			params.url='/qbpwcf/db/dbOut.php';
9378
			params.resType='json';
9379
			params.preAc=function(res){
226 liveuser 9380
 
3 liveuser 9381
				//debug
9382
				if(window.debug){
226 liveuser 9383
 
3 liveuser 9384
					console.log('loading');
226 liveuser 9385
 
3 liveuser 9386
					}//if end
9387
				};
9388
			params.aftAc=function(res){
226 liveuser 9389
 
3 liveuser 9390
				//debug
9391
				if(window.debug){
226 liveuser 9392
 
3 liveuser 9393
					console.log(res);
226 liveuser 9394
 
3 liveuser 9395
					}//if end
226 liveuser 9396
 
3 liveuser 9397
				//如果尚無資料
9398
				if(res.dataContent===null){
226 liveuser 9399
 
3 liveuser 9400
					//debug
9401
					if(window.debug){
226 liveuser 9402
 
3 liveuser 9403
						//提示讀取到結尾了
9404
						console.log('read EOL');
226 liveuser 9405
 
3 liveuser 9406
						}//if end
226 liveuser 9407
 
3 liveuser 9408
					//遞迴
9409
					window.qbpwcf.screenShare.clientRecursive();
226 liveuser 9410
 
3 liveuser 9411
					//結束執行
9412
					return true;
226 liveuser 9413
 
3 liveuser 9414
					}//if end
226 liveuser 9415
 
3 liveuser 9416
				//取得id
9417
				id=res.dataContent.id[0];
226 liveuser 9418
 
3 liveuser 9419
				//如果id有變
9420
				if(window.qbpwcf.screenShare.clientDataId!==id){
226 liveuser 9421
 
3 liveuser 9422
					//取得新id
9423
					window.qbpwcf.screenShare.clientDataId=id;
226 liveuser 9424
 
3 liveuser 9425
					//讀取片段資料
9426
					json=res.dataContent.json[0];
226 liveuser 9427
 
3 liveuser 9428
					//debug
9429
					if(window.debug){
226 liveuser 9430
 
3 liveuser 9431
						console.log(json);
226 liveuser 9432
 
3 liveuser 9433
						}//if end
226 liveuser 9434
 
9435
					//parse json
3 liveuser 9436
					json=JSON.parse(json);
226 liveuser 9437
 
3 liveuser 9438
					//debug
9439
					if(window.debug){
226 liveuser 9440
 
3 liveuser 9441
						console.log(json);
226 liveuser 9442
 
3 liveuser 9443
						}//if end
226 liveuser 9444
 
3 liveuser 9445
					//用int8Array的方式儲存
9446
					intArray=new Int8Array(Object.values(json));
226 liveuser 9447
 
3 liveuser 9448
					//debug
9449
					if(window.debug){
226 liveuser 9450
 
3 liveuser 9451
						console.log(intArray);
226 liveuser 9452
 
3 liveuser 9453
						}//if end
226 liveuser 9454
 
9455
 
3 liveuser 9456
					//debug
9457
					if(window.debug){
226 liveuser 9458
 
3 liveuser 9459
						console.log(intArray.buffer);
226 liveuser 9460
 
3 liveuser 9461
						}//if end
226 liveuser 9462
 
3 liveuser 9463
					//轉換成blob
9464
					blob=new Blob(intArray,{type:'video/webm'});
226 liveuser 9465
 
3 liveuser 9466
					//debug
9467
					if(window.debug){
226 liveuser 9468
 
3 liveuser 9469
						console.log(blob);
226 liveuser 9470
 
3 liveuser 9471
						}//if end
226 liveuser 9472
 
3 liveuser 9473
					//建立 reader 物件
9474
					readerR = new FileReader();
226 liveuser 9475
 
3 liveuser 9476
					//如果開啟完畢
9477
					readerR.addEventListener('loadend',function(e){
226 liveuser 9478
 
3 liveuser 9479
						//debug
9480
						if(window.debug){
226 liveuser 9481
 
3 liveuser 9482
							console.log(e);
226 liveuser 9483
 
3 liveuser 9484
							}//if end
226 liveuser 9485
 
3 liveuser 9486
						//取得 arrayBUffer
9487
						buf=e.originalTarget.result;
226 liveuser 9488
 
3 liveuser 9489
						//debug
9490
						if(window.debug){
226 liveuser 9491
 
3 liveuser 9492
							console.log(buf);
226 liveuser 9493
 
9494
							}//if end
9495
 
3 liveuser 9496
						//debug
9497
						if(window.debug){
226 liveuser 9498
 
9499
							console.log(window.qbpwcf.screenShare.sourceBuffer);
9500
 
3 liveuser 9501
							}//if end
226 liveuser 9502
 
3 liveuser 9503
						//append buffer
226 liveuser 9504
						window.qbpwcf.screenShare.sourceBuffer.appendBuffer(buf);
9505
 
3 liveuser 9506
						// Wait for the sourcebuffer to be ready to load all other chunks
9507
						window.qbpwcf.screenShare.sourceBuffer.addEventListener('updateend',window.qbpwcf.screenShare.clientRecursive);
226 liveuser 9508
 
3 liveuser 9509
						//debug
9510
						if(window.debug){
226 liveuser 9511
 
9512
							console.log(window.qbpwcf.screenShare.sourceBuffer);
9513
 
9514
							}//if end
9515
 
9516
						});//addEventListener end
9517
 
3 liveuser 9518
					//讀取 blob 成 arrayBuffer
9519
					readerR.readAsArrayBuffer(blob);
226 liveuser 9520
 
3 liveuser 9521
					//遞迴
226 liveuser 9522
					window.qbpwcf.screenShare.clientRecursive();
9523
 
3 liveuser 9524
					}//if end
226 liveuser 9525
 
3 liveuser 9526
				//反之
9527
				else{
226 liveuser 9528
 
3 liveuser 9529
					//遞迴
226 liveuser 9530
					window.qbpwcf.screenShare.clientRecursive();
9531
 
3 liveuser 9532
					}//else end
226 liveuser 9533
 
3 liveuser 9534
				}//function end
226 liveuser 9535
 
3 liveuser 9536
			params.data='params='+toDb;
9537
			window.qbpwcf.ajax(params);
226 liveuser 9538
 
3 liveuser 9539
			}//function end
9540
		";
226 liveuser 9541
 
3 liveuser 9542
		/*
9543
		desc:
9544
		等待既有圖片讀取完畢後,再讀取更清楚的圖片,取代之.
9545
		參考資料:
9546
		https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener
9547
		*/
9548
		$conf["javaScript::toScript"]["jsFunciton"][]=
9549
		"
9550
		//img thumbnails 效果
9551
		window.qbpwcf.imgThumbnails=function(thumbnails,oriImgUrl){
226 liveuser 9552
 
3 liveuser 9553
			//如果變數 thumbnails 跟 oriImg 其中一個不是 object
9554
			if( typeof(thumbnails)!=='object' || typeof(oriImgUrl)!=='string' ){
226 liveuser 9555
 
3 liveuser 9556
				//提示錯誤訊息
9557
				console.error('thumbnails not a object');
226 liveuser 9558
 
3 liveuser 9559
				//提示錯誤訊息
9560
				console.error('oriImgUrl not a string');
226 liveuser 9561
 
3 liveuser 9562
				//結束執行
9563
				return false;
226 liveuser 9564
 
3 liveuser 9565
				}//if end
9566
 
9567
			//event只跑一次的設定參數
9568
			var Optional={};
9569
			Optional.once=true;
9570
 
9571
			//事件,當圖片檔案讀取完畢後執行
9572
			thumbnails.addEventListener('load',function(e){
226 liveuser 9573
 
3 liveuser 9574
				/*
9575
				設置 window.qbpwcf.ajax 函數
9576
				說明:
9577
				傳送ajax,指定傳送前要做什麼事情,傳送後要做什麼事情.
9578
				參數:
9579
				params={};
9580
				params.method='POST' or 'GET';
9581
				params.headers={name:value};
9582
				params.url='url to request';
9583
				params.resType='json';
9584
				params.preAc='function name to call before send request';
9585
				params.aftAc='function name to call after send request';
9586
				params.data='data to contain','key1=encodeURIComponent(val1)&key2=encodeURIComponent(val2)';if no data please use '';
9587
				*/
9588
				params={};
9589
				params.method='GET';
9590
				params.url=oriImgUrl;
9591
				params.resType='blob';
9592
				//帶入 img obj
226 liveuser 9593
				params.imgObj=e.target;
3 liveuser 9594
				params.aftAc=function(res){
226 liveuser 9595
 
3 liveuser 9596
					//new reader obj
9597
					var reader = new FileReader();
226 liveuser 9598
 
3 liveuser 9599
					//reader evevnt
9600
					reader.addEventListener('loadend', function(e){
226 liveuser 9601
 
3 liveuser 9602
						//置換圖片位置為 base64 data url
9603
						reader.imgObj.src=e.target.result;
9604
					});
226 liveuser 9605
 
3 liveuser 9606
					//帶入 img obj
9607
					reader.imgObj=params.imgObj;
226 liveuser 9608
 
3 liveuser 9609
					//讀取圖片為 data url
9610
					reader.readAsDataURL(res);
9611
 
9612
					};
9613
				window.qbpwcf.ajax(params);
9614
 
9615
				},Optional);//functino end
226 liveuser 9616
 
3 liveuser 9617
			}//function end
9618
		";
226 liveuser 9619
 
3 liveuser 9620
		/*
9621
		desc:
9622
		低解析度的指定圖片讀取完畢後,再讀取更清楚的圖片,取代之.
9623
		參考資料:
9624
		https://developer.mozilla.org/en-US/docs/Learn/JavaScript/Asynchronous
9625
		*/
9626
		$conf["javaScript::toScript"]["jsFunciton"][]=
9627
		"
9628
		//img thumbnails 效果,用 async 實作
9629
		window.qbpwcf.imgThumbAsync=async function(element,thumbUrl,oriImgUrl){
226 liveuser 9630
 
3 liveuser 9631
			//如果變數 element 不是 object 或 thumbUrl 跟 oriImg 其中一個不是 string
9632
			if( typeof(element)!=='object' || typeof(thumbUrl)!=='string' || typeof(oriImgUrl)!=='string' ){
226 liveuser 9633
 
3 liveuser 9634
				//提示錯誤訊息
9635
				console.error('element is not a object');
226 liveuser 9636
 
3 liveuser 9637
				//提示錯誤訊息
9638
				console.error('thumbUrl is not a string');
226 liveuser 9639
 
3 liveuser 9640
				//提示錯誤訊息
9641
				console.error('oriImgUrl is not a string');
226 liveuser 9642
 
3 liveuser 9643
				//結束執行
9644
				return false;
226 liveuser 9645
 
3 liveuser 9646
				}//if end
226 liveuser 9647
 
3 liveuser 9648
			//載入低解析度的圖片,將Promise儲存到res裡面
9649
			var res = await fetch(thumbUrl);
226 liveuser 9650
 
3 liveuser 9651
			//如果沒有讀取成功
9652
			if(await res.status!==200){
226 liveuser 9653
 
3 liveuser 9654
				//回傳失敗
9655
				return false;
226 liveuser 9656
 
3 liveuser 9657
				}//if end
226 liveuser 9658
 
3 liveuser 9659
			//顯示低解析度的圖片
9660
			element.src=URL.createObjectURL(await res.blob());
226 liveuser 9661
 
3 liveuser 9662
			//載入原始圖片,將Promise儲存到res裡面
9663
			var res = await fetch(oriImgUrl);
226 liveuser 9664
 
3 liveuser 9665
			//如果沒有讀取成功
9666
			if(await res.status!==200){
226 liveuser 9667
 
3 liveuser 9668
				//回傳失敗
9669
				return false;
226 liveuser 9670
 
3 liveuser 9671
				}//if end
226 liveuser 9672
 
3 liveuser 9673
			//顯示原始的圖片
9674
			element.src=URL.createObjectURL(await res.blob());
226 liveuser 9675
 
3 liveuser 9676
			//回傳正確
9677
			return true;
226 liveuser 9678
 
3 liveuser 9679
			}//function end
9680
		";
226 liveuser 9681
 
3 liveuser 9682
		/*
9683
		desc:
9684
		低解析度的多個指定圖片讀取完畢後,再讀取更清楚的圖片,取代之,且同步執行.
9685
		參考資料:
9686
		https://developer.mozilla.org/en-US/docs/Learn/JavaScript/Asynchronous/Async_await
9687
		*/
9688
		$conf["javaScript::toScript"]["jsFunciton"][]=
9689
		"
9690
		//多張img thumbnails 效果,用 async 實作
9691
		window.qbpwcf.multiImgThumbAsync=async function(element,thumbUrl,oriImgUrl){
226 liveuser 9692
 
3 liveuser 9693
			//儲存要同步執行的工作
9694
			var tasks=[];
226 liveuser 9695
 
3 liveuser 9696
			//針對每個陣列元素做事情,不需要中斷.
9697
			element.forEach(function(value,key)
9698
			{
9699
				//不等待結果趕緊執行下一個
9700
				tasks.push(window.qbpwcf.imgThumbAsync(value,thumbUrl[key],oriImgUrl[key]));
9701
			});
226 liveuser 9702
 
3 liveuser 9703
			//等待每個工作執行結束
9704
			await Promise.all(tasks);
226 liveuser 9705
 
3 liveuser 9706
			//回傳正確
226 liveuser 9707
			return true;
9708
 
3 liveuser 9709
			}//function end
9710
		";
226 liveuser 9711
 
3 liveuser 9712
		$conf["javaScript::toScript"]["jsFunciton"][]=
9713
		"
9714
		/*
9715
		說明:
9716
		偷偷摸摸地傳送表單,並觸發事件
9717
		參數:
9718
		params={};參數為一物件
9719
		params.formEle=[];為每個表單元素.
9720
		params.target='';為表單要傳送到的目的地.
9721
		params.successFunc='';為表單回覆為成功時要做的事情,回應為一物件,有一屬性為'status',其數值為'true'.
9722
		params.failedFunc='';為表單回覆為失敗時要做的事情,回應為一物件,有一屬性為'status',其數值為'false'.
9723
		*/
9724
		window.qbpwcf.slientSubmit=function(params){
226 liveuser 9725
 
3 liveuser 9726
			//取得表單元素的key
9727
			var formKeys=Object.keys(params.formEle);
226 liveuser 9728
 
3 liveuser 9729
			//取得表單key的數量
9730
			var formLength=formKeys.length;
226 liveuser 9731
 
3 liveuser 9732
			//針對每個 key
9733
			for(var i=0;i<formLength;i++){
226 liveuser 9734
 
3 liveuser 9735
				//該表單,綁定失去焦點的事件,看其來沒有效果
9736
				params.formEle[i].addEventListener('focusout',function(e){
226 liveuser 9737
 
3 liveuser 9738
					//如果輸入內容為空
9739
					if(e.target.value===''){
226 liveuser 9740
 
3 liveuser 9741
						//聚焦選單
9742
						e.target.focus();
226 liveuser 9743
 
3 liveuser 9744
						}//if end
226 liveuser 9745
 
3 liveuser 9746
					});//event blur end
226 liveuser 9747
 
3 liveuser 9748
				//該表單,綁定內容變化的事件
9749
				params.formEle[i].addEventListener('change',function(e){
226 liveuser 9750
 
3 liveuser 9751
					//針對每個表單
9752
					for(var j=0;j<formLength;j++){
226 liveuser 9753
 
3 liveuser 9754
						//如果有表單未填寫
9755
						if(params.formEle[j].value===''){
226 liveuser 9756
 
9757
							//結束迴圈
3 liveuser 9758
							break;
226 liveuser 9759
 
3 liveuser 9760
							}//if end
226 liveuser 9761
 
3 liveuser 9762
						//到這邊代表表單都有填寫
9763
						if(j===formLength-1){
226 liveuser 9764
 
9765
							//驗證表單 - start
9766
 
3 liveuser 9767
							//初始化表單變數
9768
							var post='';
226 liveuser 9769
 
3 liveuser 9770
							//針對每個表單
9771
							for(var k=0;k<formLength;k++){
226 liveuser 9772
 
3 liveuser 9773
								//記錄表單名稱
9774
								var formName=params.formEle[k].name;
226 liveuser 9775
 
3 liveuser 9776
								//記錄表單數值
9777
								var formValue=params.formEle[k].value;
226 liveuser 9778
 
3 liveuser 9779
								//當是第一個表單時
9780
								if(k==0){
226 liveuser 9781
 
3 liveuser 9782
									//串接變數
9783
									post=post+formName+'='+encodeURIComponent(formValue);
226 liveuser 9784
 
3 liveuser 9785
									}//if end
226 liveuser 9786
 
3 liveuser 9787
								//中間的表單
9788
								else{
226 liveuser 9789
 
3 liveuser 9790
									//串接變數
9791
									post=post+'&'+formName+'='+encodeURIComponent(formValue);
226 liveuser 9792
 
3 liveuser 9793
									}//else end
226 liveuser 9794
 
3 liveuser 9795
								}//for end
226 liveuser 9796
 
3 liveuser 9797
							/*
9798
							設置 window.qbpwcf.ajax 函數
9799
							說明:
9800
							傳送ajax,指定傳送前要做什麼事情,傳送後要做什麼事情.
9801
							參數:
9802
							params={};
9803
							params.method='POST' or 'GET';
9804
							params.headers={name:value};
9805
							params.url='url to request';
9806
							params.resType='json';
9807
							params.preAc='function name to call before send request';
9808
							params.aftAc='function name to call after send request';
9809
							params.data='data to contain','key1=encodeURIComponent(val1)&key2=encodeURIComponent(val2)';if no data please use '';
9810
							*/
9811
							var ajParams={};
9812
							ajParams.method='POST';
9813
							ajParams.url=params.target;
9814
							ajParams.resType='json';
9815
							ajParams.data=post;
9816
							ajParams.aftAc=function(res){
226 liveuser 9817
 
3 liveuser 9818
								//驗證正確
9819
								if(res.status==='true'){
226 liveuser 9820
 
3 liveuser 9821
									//運行驗證成功的函式
9822
									params.successFunc(res);
226 liveuser 9823
 
3 liveuser 9824
									}//if end
226 liveuser 9825
 
3 liveuser 9826
								//反之驗證失敗
9827
								else if(params.failedFunc!==undefined){
226 liveuser 9828
 
3 liveuser 9829
									//運行驗證失敗的函式
9830
									params.failedFunc(res);
226 liveuser 9831
 
3 liveuser 9832
									}//if end
226 liveuser 9833
 
3 liveuser 9834
								};
226 liveuser 9835
 
3 liveuser 9836
							window.qbpwcf.ajax(ajParams);
226 liveuser 9837
 
9838
 
3 liveuser 9839
							//驗證表單 - end
226 liveuser 9840
 
3 liveuser 9841
							}//if end
226 liveuser 9842
 
3 liveuser 9843
						}//for end
226 liveuser 9844
 
3 liveuser 9845
					//結束程式
9846
					return false;
226 liveuser 9847
 
3 liveuser 9848
					});//event blur end
226 liveuser 9849
 
3 liveuser 9850
				}//for end
226 liveuser 9851
 
3 liveuser 9852
			}//function end
9853
		";
226 liveuser 9854
 
3 liveuser 9855
		#js function
9856
		$conf["javaScript::toScript"]["jsFunciton"][]=
9857
		"
9858
		/*
9859
		說明:
9860
		偵測目標是否可以連線後要做的事情.
9861
		參數:
9862
		params,物件.
9863
		params.url,服務網址.
9864
		params.timeout,偵測的毫秒數上限.
9865
		params.callback,偵測完服務後要執行的函式,參數為偵測的結果可以連線為true,不可連線為false.
9866
		*/
9867
		window.qbpwcf.connectable={};
9868
		window.qbpwcf.connectable.func=function(params){
226 liveuser 9869
 
3 liveuser 9870
			//如果 url 未定義
9871
			if(params===undefined){
226 liveuser 9872
 
3 liveuser 9873
				//回傳 false
9874
				return false;
226 liveuser 9875
 
3 liveuser 9876
				}//if end
226 liveuser 9877
 
3 liveuser 9878
			//如果 url 未定義
9879
			if(params.url===undefined){
226 liveuser 9880
 
3 liveuser 9881
				//初始化為 https://www.google.com
9882
				this.url='https://www.google.com';
226 liveuser 9883
 
3 liveuser 9884
				}//if end
226 liveuser 9885
 
3 liveuser 9886
			//反之
9887
			else{
9888
				//設置 url
9889
				this.url=params.url;
226 liveuser 9890
 
3 liveuser 9891
				}//else end
226 liveuser 9892
 
3 liveuser 9893
			//如果 timeout 未定義
9894
			if(params.timeout===undefined){
226 liveuser 9895
 
3 liveuser 9896
				//初始化為1秒鐘
9897
				this.timeout=1000;
226 liveuser 9898
 
3 liveuser 9899
				}//if end
226 liveuser 9900
 
3 liveuser 9901
			//反之
9902
			else{
226 liveuser 9903
 
3 liveuser 9904
				//設置 timeout
9905
				this.timeout=params.timeout;
226 liveuser 9906
 
3 liveuser 9907
				}//else end
226 liveuser 9908
 
3 liveuser 9909
			//如果 callback 未定義
9910
			if(params.callback===undefined){
226 liveuser 9911
 
3 liveuser 9912
				//初始化 callback
9913
				this.callback=function(res){
226 liveuser 9914
 
3 liveuser 9915
					console.log(res);
226 liveuser 9916
 
3 liveuser 9917
					}//function end
226 liveuser 9918
 
3 liveuser 9919
				}//if end
226 liveuser 9920
 
3 liveuser 9921
			//反之
9922
			else{
226 liveuser 9923
 
3 liveuser 9924
				//設置 callback
9925
				this.callback=params.callback;
226 liveuser 9926
 
3 liveuser 9927
				}//else end
226 liveuser 9928
 
3 liveuser 9929
			//預設尚未偵測完成 params.url 的服務狀況
9930
			this.detectServiceFin=false;
226 liveuser 9931
 
3 liveuser 9932
			//預設 params.url 的服務狀況為正常
9933
			this.serviceBlock=false;
226 liveuser 9934
 
3 liveuser 9935
			//儲存timeout物件
9936
			this.checkServiceBlockTimeout={};
226 liveuser 9937
 
3 liveuser 9938
			/*
9939
			說明:
9940
			傳送ajax,指定傳送前要做什麼事情,傳送後要做什麼事情.
9941
			參數:
9942
			params={};
9943
			params.method='POST' or 'GET' or 'HEAD' or 'OPTIONS';
9944
			params.headers={name:value};
9945
			params.url='url to request';
9946
			params.resType='json';
9947
			params.preAc='function name to call before send request';
9948
			params.aftAc='function name to call after send request';
9949
			params.data='data to contain','key1=encodeURIComponent(val1)&key2=encodeURIComponent(val2)';if no data please use {};
9950
			*/
9951
			var params={};
9952
			params.timeout=this.timeout;
9953
			params.detectServiceFin=this.detectServiceFin;
9954
			params.serviceBlock=this.serviceBlock;
9955
			params.checkServiceBlockTimeout=this.checkServiceBlockTimeout;
9956
			params.callback=this.callback;
9957
			params.method='GET';
9958
			params.data={};
9959
			params.url=this.url;
9960
			params.preAc=function(){
226 liveuser 9961
 
3 liveuser 9962
				//取得 xmlhttp物件
9963
				var xmlhttp=this;
226 liveuser 9964
 
3 liveuser 9965
				//設置過了 params.timeout 秒中後要做的事情.
9966
				params.checkServiceBlockTimeout=setTimeout(function(){
226 liveuser 9967
 
3 liveuser 9968
					//中斷連線
9969
					xmlhttp.abort();
226 liveuser 9970
 
3 liveuser 9971
					//提示目標被封鎖了
9972
					console.log(params.url+' is blocked');
226 liveuser 9973
 
3 liveuser 9974
					//設置服務不正常,被阻擋了
9975
					params.serviceBlock=true;
226 liveuser 9976
 
3 liveuser 9977
					//設置偵測google連線完畢
9978
					params.detectServiceFin=true;
226 liveuser 9979
 
3 liveuser 9980
					},params.timeout,xmlhttp);
226 liveuser 9981
 
3 liveuser 9982
				}
9983
			params.aftAc=function(res){
226 liveuser 9984
 
3 liveuser 9985
				//debug
9986
				console.log('res='+res);
226 liveuser 9987
 
3 liveuser 9988
				//清除 timeout 的 flag
9989
				clearTimeout(params.checkServiceBlockTimeout);
226 liveuser 9990
 
3 liveuser 9991
				//設置偵測google連線完畢
9992
				params.detectServiceFin=true;
226 liveuser 9993
 
3 liveuser 9994
				}
9995
			window.qbpwcf.ajax(params);
226 liveuser 9996
 
3 liveuser 9997
			//設置無限等待
9998
			var intervalTail = window.setInterval(function(){
226 liveuser 9999
 
3 liveuser 10000
				//如果已經偵測好google的連線狀況
10001
				if(params.detectServiceFin){
226 liveuser 10002
 
3 liveuser 10003
					//清除無限等待
10004
					clearInterval(intervalTail);
226 liveuser 10005
 
3 liveuser 10006
					console.log(params.callback);
226 liveuser 10007
 
3 liveuser 10008
					//如果存在要callback的函式
10009
					if(params.callback!==undefined){
226 liveuser 10010
 
3 liveuser 10011
						//debug
10012
						console.log('beafore callback');
226 liveuser 10013
 
3 liveuser 10014
						//callback
10015
						params.callback.call(this,params.serviceBlock);
226 liveuser 10016
 
3 liveuser 10017
						}//if end
226 liveuser 10018
 
3 liveuser 10019
					}//if end
226 liveuser 10020
 
3 liveuser 10021
				},100);
226 liveuser 10022
 
3 liveuser 10023
			}//function window.qbpwcf.connectable end
10024
		";
226 liveuser 10025
 
3 liveuser 10026
		#js function
10027
		$conf["javaScript::toScript"]["jsFunciton"][]=
10028
		"
10029
		/*
10030
		說明:
10031
		設置網頁要套用的字形.
10032
		參數:
207 liveuser 10033
		window.qbpwcf.fonts.bufferArray,預設的字形檔案binary.
10034
		await window.qbpwcf.fonts.load(),將指定的字形套用在body.
3 liveuser 10035
		參考資料:
10036
		https://developer.mozilla.org/en-US/docs/Web/API/FontFace
10037
		https://developer.mozilla.org/en-US/docs/Web/API/FontFace/FontFace
10038
		https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face => 直接用 CSS 下載字形
10039
		https://fontlibrary.org/ => 免費字體下載
10040
		https://developer.mozilla.org/en-US/docs/Web/API/CSSStyleSheet => CSS 樣式 in Javascript
10041
		https://developer.mozilla.org/en-US/docs/Web/API/Document/styleSheets => 取得 CSS 樣式集合
10042
		https://developer.mozilla.org/en-US/docs/Web/API/StyleSheet
10043
		https://developer.mozilla.org/en-US/docs/Web/API/CSSStyleSheet
10044
		https://developer.mozilla.org/en-US/docs/Web/API/CSSStyleSheet/insertRule => 新增 css 樣式
207 liveuser 10045
		https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/ArrayBuffer => ArrayBuffer
10046
		https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Uint8Array/fromBase64 => bytes array from base64 encode string
10047
		#備註:
10048
		#server必須要有該字形.
3 liveuser 10049
		*/
10050
		window.qbpwcf.fonts={};
226 liveuser 10051
 
207 liveuser 10052
		//default font binary
10053
		window.qbpwcf.fonts.bufferArray=new ArrayBuffer();
226 liveuser 10054
 
3 liveuser 10055
		//load font function
207 liveuser 10056
		window.qbpwcf.fonts.load=async function(){
226 liveuser 10057
 
3 liveuser 10058
			//建立font物件
207 liveuser 10059
			var font = new FontFace('qbpwcfFont', window.qbpwcf.fonts.bufferArray);
226 liveuser 10060
 
3 liveuser 10061
			//告訴瀏覽器載入字形,並等待其執行完再往下執行
10062
			//因為 FontFace 類別的 load 方法回傳為 Promise ,因此要等待其回傳結果所以要用 await 關鍵字.
10063
			await font.load();
226 liveuser 10064
 
3 liveuser 10065
			//新增字形到網頁文件
10066
			document.fonts.add(font);
226 liveuser 10067
 
3 liveuser 10068
			//新增 qbpwcfFont 類別的網頁字形
10069
			document.styleSheets[0].insertRule("."'.qbpwcfFont {font-family:qbpwcfFont;}'".");
226 liveuser 10070
 
3 liveuser 10071
			//避免重複新增class,先移除之
10072
			document.body.classList.remove('qbpwcfFont');
226 liveuser 10073
 
3 liveuser 10074
			//套用字形
10075
			document.body.classList.add('qbpwcfFont');
226 liveuser 10076
 
207 liveuser 10077
			}//function end
226 liveuser 10078
 
3 liveuser 10079
		//list aviable fonts
207 liveuser 10080
		window.qbpwcf.fonts.list=function(){
226 liveuser 10081
 
3 liveuser 10082
			//開發中
10083
			console.log('list fonts');
226 liveuser 10084
 
207 liveuser 10085
			}//function end
3 liveuser 10086
 
10087
		";
226 liveuser 10088
 
3 liveuser 10089
		#js function
10090
		$conf["javaScript::toScript"]["jsFunciton"][]=
10091
		"
10092
		//記錄點擊當下的用戶資訊
10093
		window.qbpwcf.recordClientInfo=function(){
226 liveuser 10094
 
3 liveuser 10095
			console.log('建構中');
226 liveuser 10096
 
3 liveuser 10097
			}//function end
10098
		";
226 liveuser 10099
 
3 liveuser 10100
		#js function
10101
		$conf["javaScript::toScript"]["jsFunciton"][]=
10102
		"
10103
		/*
10104
		說明:
10105
		解析cookie資料
10106
		*/
10107
		window.qbpwcf.cookie={};
226 liveuser 10108
 
3 liveuser 10109
		//記錄原始cookie
10110
		window.qbpwcf.cookie.ori=document.cookie;
226 liveuser 10111
 
3 liveuser 10112
		//如果有 cookie 存在
10113
		if(window.qbpwcf.cookie.ori!=''){
226 liveuser 10114
 
3 liveuser 10115
			//記錄cookie的數量
10116
			window.qbpwcf.cookie.count=document.cookie.split(';').length;
226 liveuser 10117
 
3 liveuser 10118
			//初始化用名稱來記錄cookie的內容
10119
			window.qbpwcf.cookie.byName={};
226 liveuser 10120
 
3 liveuser 10121
			//有幾個cookie就執行幾次
10122
			for(var i=0;i<window.qbpwcf.cookie.count;i++){
226 liveuser 10123
 
3 liveuser 10124
				//取得cookie
10125
				var cookieStr=document.cookie.split(';')[i];
226 liveuser 10126
 
3 liveuser 10127
				//取得cookie名稱
10128
				var cookieName=cookieStr.split('=')[0];
226 liveuser 10129
 
3 liveuser 10130
				//取得cookie內容
10131
				var cookieValue=cookieStr.split('=')[1];
226 liveuser 10132
 
3 liveuser 10133
				//記錄coockie
10134
				eval('window.qbpwcf.cookie.byName[\''+cookieName+'\']=cookieValue');
226 liveuser 10135
 
3 liveuser 10136
				//如果有經過編碼
10137
				if(cookieValue!==decodeURIComponent(cookieValue)){
226 liveuser 10138
 
3 liveuser 10139
					/*
10140
					設置 window.qbpwcf.ajax 函數
10141
					說明:
10142
					傳送ajax,指定傳送前要做什麼事情,傳送後要做什麼事情.
10143
					參數:
10144
					params={};
10145
					params.method='POST' or 'GET' or 'HEAD' or 'OPTIONS';
10146
					params.headers={name:value};
10147
					params.url='url to request';
10148
					params.resType='json';
10149
					params.preAc='function name to call before send request';
10150
					params.aftAc='function name to call after send request,default params is data to send';
10151
					params.data='data to contain','key1=encodeURIComponent(val1)&key2=encodeURIComponent(val2)';if no data please use {};
10152
					*/
10153
					params={};
10154
					params.method='POST';
10155
					params.url='/qbpwcf/unserialize/';
226 liveuser 10156
 
3 liveuser 10157
					//帶入 cookieName
226 liveuser 10158
					params.cookieName=cookieName;
10159
 
3 liveuser 10160
					params.aftAc=function(res){
10161
 
226 liveuser 10162
						//如果有json回應
3 liveuser 10163
						if(res!==null){
10164
 
10165
							//取得cookie解析後的結果
10166
							eval('window.qbpwcf.cookie.byName.'+params.cookieName+'=res');
226 liveuser 10167
 
3 liveuser 10168
							}//if end
226 liveuser 10169
 
3 liveuser 10170
						};
226 liveuser 10171
 
3 liveuser 10172
					params.data='data='+cookieValue;
10173
					window.qbpwcf.ajax.call(this,params);
226 liveuser 10174
 
3 liveuser 10175
					}//if end
10176
 
10177
				}//for end
226 liveuser 10178
 
3 liveuser 10179
			}//if end
226 liveuser 10180
 
3 liveuser 10181
		";
226 liveuser 10182
 
3 liveuser 10183
		#js function
10184
		$conf["javaScript::toScript"]["jsFunciton"][]=
10185
		"
10186
		/*
10187
		說明:
10188
		dialog,類似modal的方法.
10189
		*/
10190
		window.qbpwcf.dialog={};
226 liveuser 10191
 
3 liveuser 10192
		/*
10193
		用dialog確認要做的事情
10194
		*/
10195
		//初始化儲存 confirm dialog 物件
10196
		window.qbpwcf.dialog.confirm={};
226 liveuser 10197
 
3 liveuser 10198
		//初始化相關屬性
10199
		window.qbpwcf.dialog.confirm.clear=function(){
226 liveuser 10200
 
3 liveuser 10201
			//初始化儲存 confirm dialog 的實體
10202
			window.qbpwcf.dialog.confirm.instance=null;
226 liveuser 10203
 
3 liveuser 10204
			//初始化儲存 confirm dialog 結束後取得的內容
10205
			window.qbpwcf.dialog.confirm.result={};
226 liveuser 10206
 
3 liveuser 10207
			//初始化儲存 confirm dialog 詢問的內容文字
10208
			window.qbpwcf.dialog.confirm.text='Are you sure?';
226 liveuser 10209
 
3 liveuser 10210
			//初始化儲存 confirm dialog 取消按鈕的顯示文字
10211
			window.qbpwcf.dialog.confirm.cancelBtnText='Cancel';
226 liveuser 10212
 
3 liveuser 10213
			//初始化儲存 confirm dialog 確定按鈕的顯示文字
10214
			window.qbpwcf.dialog.confirm.okBtnText='Confirm';
226 liveuser 10215
 
3 liveuser 10216
			//初始化 confirm dialog 的內容
10217
			window.qbpwcf.dialog.confirm.content='';
226 liveuser 10218
 
3 liveuser 10219
			//初始化 confirm dialog 的 dom 內容
10220
			window.qbpwcf.dialog.confirm.customDom={};
226 liveuser 10221
 
3 liveuser 10222
			}//function end
10223
 
10224
		//立刻初始化相關屬性
10225
		window.qbpwcf.dialog.confirm.clear();
226 liveuser 10226
 
3 liveuser 10227
		//初始化設置好 confirm dialog 後要觸發的函式
10228
		window.qbpwcf.dialog.confirm.prepareCallback=function(){
226 liveuser 10229
 
3 liveuser 10230
			//取得 cancel 的按鈕
10231
			var cancel_btn=document.querySelector('button#dialog_cancel_btn');
226 liveuser 10232
 
3 liveuser 10233
			//按鈕的事件
10234
			cancel_btn.addEventListener('click',function(){
226 liveuser 10235
 
3 liveuser 10236
				//設置結果為 'false'
10237
				window.qbpwcf.dialog.confirm.result='false';
226 liveuser 10238
 
3 liveuser 10239
				//關閉dialog
10240
				window.qbpwcf.dialog.confirm.instance.close();
226 liveuser 10241
 
3 liveuser 10242
				});
226 liveuser 10243
 
3 liveuser 10244
			//取得 confirm 的按鈕
10245
			var confirm_btn=document.querySelector('button#dialog_confirm_btn');
226 liveuser 10246
 
3 liveuser 10247
			//按鈕的事件
10248
			confirm_btn.addEventListener('click',function(){
226 liveuser 10249
 
3 liveuser 10250
				//設置結果為 'true'
10251
				window.qbpwcf.dialog.confirm.result='true';
226 liveuser 10252
 
3 liveuser 10253
				//關閉dialog
10254
				window.qbpwcf.dialog.confirm.instance.close();
226 liveuser 10255
 
3 liveuser 10256
				});
226 liveuser 10257
 
3 liveuser 10258
			}//function end
226 liveuser 10259
 
3 liveuser 10260
		/*
10261
		初始化關閉 confirm dialog 後要觸發的函式
10262
		params為取得的內容結果.
10263
		*/
10264
		window.qbpwcf.dialog.confirm.closeCallback=function(params){
226 liveuser 10265
 
3 liveuser 10266
			//debug
10267
			console.log(params);
226 liveuser 10268
 
3 liveuser 10269
			}//fucntion end
226 liveuser 10270
 
3 liveuser 10271
		//顯示 confirm dialog
10272
		window.qbpwcf.dialog.confirm.func=function(){
226 liveuser 10273
 
3 liveuser 10274
			//回傳 Promise
10275
			return new Promise(function(resolve, reject){
226 liveuser 10276
 
3 liveuser 10277
				//建立dialog物件
10278
				var dialog=document.createElement('dialog');
226 liveuser 10279
 
3 liveuser 10280
				//取得參考
10281
				window.qbpwcf.dialog.confirm.instance=dialog;
226 liveuser 10282
 
3 liveuser 10283
				//dialog的確認內容
10284
				var dialogConfirmText=document.createTextNode(window.qbpwcf.dialog.confirm.text);
226 liveuser 10285
 
3 liveuser 10286
				//建立放置按鈕的div
10287
				var divDialogButton=document.createElement('div');
226 liveuser 10288
 
3 liveuser 10289
				//建立放置取消按鈕的span
10290
				var spanCancelButton=document.createElement('span');
226 liveuser 10291
 
3 liveuser 10292
				//設置取消按鈕靠左對齊
10293
				spanCancelButton.style.float='left';
226 liveuser 10294
 
3 liveuser 10295
				//建立dialog cancel按鈕
10296
				var buttonDialogCancel=document.createElement('button');
226 liveuser 10297
 
3 liveuser 10298
				//設置dialog cancel按鈕的id
10299
				buttonDialogCancel.id='dialog_cancel_btn';
226 liveuser 10300
 
3 liveuser 10301
				//設置dialog cancel按鈕的文字內容
10302
				buttonDialogCancel.innerText=window.qbpwcf.dialog.confirm.cancelBtnText;
226 liveuser 10303
 
3 liveuser 10304
				//將取消按鈕放置到span
10305
				spanCancelButton.appendChild(buttonDialogCancel);
226 liveuser 10306
 
3 liveuser 10307
				//放置取消按鈕span到div
10308
				divDialogButton.append(spanCancelButton);
226 liveuser 10309
 
3 liveuser 10310
				//建立放置確認按鈕的span
10311
				var spanConfirmButton=document.createElement('span');
226 liveuser 10312
 
3 liveuser 10313
				//設置確認按鈕靠右對齊
10314
				spanConfirmButton.style.float='right';
226 liveuser 10315
 
3 liveuser 10316
				//建立dialog confirm按鈕
10317
				var buttonDialogConfirm=document.createElement('button');
226 liveuser 10318
 
3 liveuser 10319
				//設置dialog confirm按鈕的id
10320
				buttonDialogConfirm.id='dialog_confirm_btn';
226 liveuser 10321
 
3 liveuser 10322
				//設置dialog confirm按鈕的文字內容
10323
				buttonDialogConfirm.innerText=window.qbpwcf.dialog.confirm.okBtnText;
226 liveuser 10324
 
3 liveuser 10325
				//將確認鈕放置到span
10326
				spanConfirmButton.appendChild(buttonDialogConfirm);
226 liveuser 10327
 
3 liveuser 10328
				//放置確認按鈕span到div
10329
				divDialogButton.append(spanConfirmButton);
226 liveuser 10330
 
3 liveuser 10331
				//建立要作為dialog內容的div
10332
				var divDialogConent=document.createElement('div');
226 liveuser 10333
 
3 liveuser 10334
				//建立dialog確認內容的div
10335
				var divDialogConfrimText=document.createElement('div');
226 liveuser 10336
 
3 liveuser 10337
				//設置dialog確認內容的文字要置中
10338
				divDialogConfrimText.style.textAlign='center';
226 liveuser 10339
 
3 liveuser 10340
				//設置dialog確認內容的文字
10341
				divDialogConfrimText.appendChild(dialogConfirmText);
226 liveuser 10342
 
3 liveuser 10343
				//放置dialog的確認內容
10344
				divDialogConent.appendChild(divDialogConfrimText);
226 liveuser 10345
 
3 liveuser 10346
				//放置dialog的按鈕
10347
				divDialogConent.appendChild(divDialogButton);
226 liveuser 10348
 
3 liveuser 10349
				//如果有指定 dom 內容
10350
				if(window.qbpwcf.dialog.confirm.customDom.outerHTML!=undefined){
226 liveuser 10351
 
3 liveuser 10352
					//建立 div
10353
					var div=document.createElement('div');
226 liveuser 10354
 
3 liveuser 10355
					//將dom放置到div裡面
10356
					div.appendChild(window.qbpwcf.dialog.confirm.customDom);
226 liveuser 10357
 
3 liveuser 10358
					//設置 div dom 內容在前
10359
					divDialogConent.prepend(div);
226 liveuser 10360
 
3 liveuser 10361
					}//if end
226 liveuser 10362
 
3 liveuser 10363
				//更新 confirm dialog 的內容
10364
				window.qbpwcf.dialog.confirm.content=divDialogConent;
226 liveuser 10365
 
3 liveuser 10366
				//設置dialog的內容
10367
				dialog.appendChild(window.qbpwcf.dialog.confirm.content);
226 liveuser 10368
 
3 liveuser 10369
				//設置id
10370
				dialog.id='qbpwcf_dialog';
226 liveuser 10371
 
3 liveuser 10372
				//放置dialog
10373
				document.body.appendChild(dialog);
226 liveuser 10374
 
3 liveuser 10375
				//呼叫 window.qbpwcf.dialog.confirm.prepareCallback
10376
				window.qbpwcf.dialog.confirm.prepareCallback.call(this);
226 liveuser 10377
 
3 liveuser 10378
				//取得dialog
10379
				var qbpwcf_dialog=document.querySelector('dialog#qbpwcf_dialog');
226 liveuser 10380
 
3 liveuser 10381
				//顯示modal
10382
				qbpwcf_dialog.showModal();
226 liveuser 10383
 
3 liveuser 10384
				//當dialog關閉時觸發
10385
				qbpwcf_dialog.addEventListener('close',function(event){
226 liveuser 10386
 
3 liveuser 10387
					//取得dialog回傳的結果
10388
					var result=window.qbpwcf.dialog.confirm.result;
226 liveuser 10389
 
3 liveuser 10390
					//將回傳結果交給函式 window.qbpwcf.dialog.confirm.callback處理
10391
					window.qbpwcf.dialog.confirm.closeCallback.call(this,result);
226 liveuser 10392
 
3 liveuser 10393
					//回傳結果給Promise
10394
					resolve(result);
226 liveuser 10395
 
3 liveuser 10396
					//移除dialog元素
10397
					qbpwcf_dialog.remove();
226 liveuser 10398
 
3 liveuser 10399
					});
226 liveuser 10400
 
3 liveuser 10401
				});
226 liveuser 10402
 
3 liveuser 10403
			}//function end
226 liveuser 10404
 
3 liveuser 10405
		/*
10406
		用dialog取得密碼.
10407
		*/
10408
		//初始化儲存 getPassword dialog 的物件
10409
		window.qbpwcf.dialog.getPassword={};
226 liveuser 10410
 
3 liveuser 10411
		//初始化儲存 getPassword dialog 的實體
10412
		window.qbpwcf.dialog.getPassword.instance=null;
226 liveuser 10413
 
3 liveuser 10414
		//初始化儲存 getPassword dialog 結束後取得的內容
10415
		window.qbpwcf.dialog.getPassword.result={};
226 liveuser 10416
 
3 liveuser 10417
		//初始化儲存 getPassword dialog 確認輸入的按鈕顯示文字
10418
		window.qbpwcf.dialog.getPassword.text='Next';
226 liveuser 10419
 
3 liveuser 10420
		//初始化getPassword dialog的內容
10421
		window.qbpwcf.dialog.getPassword.content='';
226 liveuser 10422
 
3 liveuser 10423
		//初始化設置好getPassword dialog內容要觸發的函式
10424
		window.qbpwcf.dialog.getPassword.prepareCallback=function(){
226 liveuser 10425
 
3 liveuser 10426
			//取得輸入的密碼
10427
			var password=document.querySelector('input#dialog_pass');
226 liveuser 10428
 
3 liveuser 10429
			//如果輸入內容改變
10430
			password.addEventListener('change',function(){
226 liveuser 10431
 
3 liveuser 10432
				//儲存輸入的密碼
10433
				window.qbpwcf.dialog.getPassword.result=password.value;
226 liveuser 10434
 
3 liveuser 10435
				});
226 liveuser 10436
 
3 liveuser 10437
			//取得關閉的按鈕
10438
			var closeBtn=document.querySelector('button#dialog_btn');
226 liveuser 10439
 
3 liveuser 10440
			//關閉按鈕的事件
10441
			closeBtn.addEventListener('click',function(){
226 liveuser 10442
 
3 liveuser 10443
				//關閉dialog
10444
				window.qbpwcf.dialog.getPassword.instance.close();
226 liveuser 10445
 
3 liveuser 10446
				});
226 liveuser 10447
 
3 liveuser 10448
			}//function end
226 liveuser 10449
 
3 liveuser 10450
		/*
10451
		初始化關閉getPassword dialog後要觸發的函式
10452
		params為取得的內容結果.
10453
		*/
10454
		window.qbpwcf.dialog.getPassword.closeCallback=function(params){
226 liveuser 10455
 
3 liveuser 10456
			//debug
10457
			console.log(params);
226 liveuser 10458
 
3 liveuser 10459
			}//fucntion end
226 liveuser 10460
 
3 liveuser 10461
		//顯示 getPassword dialog
10462
		window.qbpwcf.dialog.getPassword.func=function(){
226 liveuser 10463
 
3 liveuser 10464
			//建立dialog物件
10465
			var dialog=document.createElement('dialog');
226 liveuser 10466
 
3 liveuser 10467
			//取得參考
10468
			window.qbpwcf.dialog.getPassword.instance=dialog;
226 liveuser 10469
 
3 liveuser 10470
			//更新 dialog 的內容
10471
			window.qbpwcf.dialog.getPassword.content='<input type=\'password\' value=\'\' autocomplete=\'off\' id=\'dialog_pass\'><button id=\'dialog_btn\'>'+window.qbpwcf.dialog.getPassword.text+'</button>';
226 liveuser 10472
 
3 liveuser 10473
			//設置dialog的內容
10474
			dialog.innerHTML=window.qbpwcf.dialog.getPassword.content;
226 liveuser 10475
 
3 liveuser 10476
			//設置id
10477
			dialog.id='qbpwcf_dialog';
226 liveuser 10478
 
3 liveuser 10479
			//放置dialog
10480
			document.body.appendChild(dialog);
226 liveuser 10481
 
3 liveuser 10482
			//呼叫 window.qbpwcf.dialog.getPassword.prepareCallback
10483
			window.qbpwcf.dialog.getPassword.prepareCallback.call(this);
226 liveuser 10484
 
3 liveuser 10485
			//取得dialog
10486
			var qbpwcf_dialog=document.querySelector('dialog#qbpwcf_dialog');
226 liveuser 10487
 
3 liveuser 10488
			//顯示modal
10489
			qbpwcf_dialog.showModal();
226 liveuser 10490
 
3 liveuser 10491
			//當dialog關閉時觸發
10492
			qbpwcf_dialog.addEventListener('close',function(event){
226 liveuser 10493
 
3 liveuser 10494
				//取得輸入的密碼
10495
				var password=document.querySelector('input#dialog_pass');
226 liveuser 10496
 
3 liveuser 10497
				//儲存輸入的密碼
10498
				window.qbpwcf.dialog.getPassword.result=password.value;
226 liveuser 10499
 
3 liveuser 10500
				//取得dialog回傳的結果
10501
				var result=window.qbpwcf.dialog.getPassword.result;
226 liveuser 10502
 
3 liveuser 10503
				//將回傳結果交給函式 window.qbpwcf.dialog.getPassword.callback處理
10504
				window.qbpwcf.dialog.getPassword.closeCallback.call(this,result);
226 liveuser 10505
 
3 liveuser 10506
				//移除dialog元素
10507
				qbpwcf_dialog.remove();
226 liveuser 10508
 
3 liveuser 10509
				});
226 liveuser 10510
 
3 liveuser 10511
			}//function end
10512
		";
226 liveuser 10513
 
3 liveuser 10514
		#js function
10515
		$conf["javaScript::toScript"]["jsFunciton"][]=
10516
		"
10517
		/*
10518
		說明:
10519
		sleep
10520
		*/
226 liveuser 10521
 
3 liveuser 10522
		//初始化
10523
		window.qbpwcf.sleep={};
226 liveuser 10524
 
3 liveuser 10525
		//執行的定義
10526
		//參數sec代表要sleep多久,單位為秒.
10527
		window.qbpwcf.sleep.func=function(sec){
226 liveuser 10528
 
3 liveuser 10529
			//回傳 Promise
10530
			return new Promise(resolve => {
226 liveuser 10531
 
3 liveuser 10532
				//sec秒後才會結束
10533
				setTimeout(() => {
226 liveuser 10534
 
3 liveuser 10535
					resolve(sec);
226 liveuser 10536
 
3 liveuser 10537
					}, sec*1000);
226 liveuser 10538
 
3 liveuser 10539
				});
226 liveuser 10540
 
3 liveuser 10541
			}//window.qbpwcf.sleep.func end
10542
		";
226 liveuser 10543
 
3 liveuser 10544
		#js function
10545
		$conf["javaScript::toScript"]["jsFunciton"][]=
10546
		"
10547
		/*
10548
		說明:
10549
		slide,輪播任何東西.
10550
		*/
226 liveuser 10551
 
3 liveuser 10552
		//初始化
10553
		window.qbpwcf.slide={};
226 liveuser 10554
 
3 liveuser 10555
		//初始化要播放的內容 html、css、javaScript 字串.
10556
		//https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Errors/Unterminated_string_literal
10557
		window.qbpwcf.slide.eles=[];
226 liveuser 10558
 
3 liveuser 10559
		//初始化放置投影片的div區域
10560
		window.qbpwcf.slide.displayDivByQuerySelector='div#slide';
226 liveuser 10561
 
3 liveuser 10562
		//初始化投影片的滯留時間,預設為3秒,時間到就換下一個投影片.
10563
		window.qbpwcf.slide.showTime=3;
226 liveuser 10564
 
3 liveuser 10565
		//說明:
10566
		//將 html、css、javaScript 轉換為 dom
10567
		//參數:
10568
		//htmlStr 內容必須有此結構 html > body > div > anyTag(content to show)
10569
		window.qbpwcf.slide.toDom=function(htmlStr){
226 liveuser 10570
 
3 liveuser 10571
			//回傳 Promise
10572
			return new Promise(resolve => {
226 liveuser 10573
 
3 liveuser 10574
				//debug
10575
				//console.log(htmlStr);
226 liveuser 10576
 
3 liveuser 10577
				//initial DOMParser
10578
				var domParser = new DOMParser();
226 liveuser 10579
 
3 liveuser 10580
				//確保內容格式正確,若為影片,則播放結束後才會結束.
226 liveuser 10581
 
3 liveuser 10582
				//script start
10583
				htmlStr=htmlStr+'\<script\>';
226 liveuser 10584
 
3 liveuser 10585
				//綁定 load 事件
10586
				htmlStr=htmlStr+'window.addEventListener(\'load\',function(event){';
226 liveuser 10587
 
3 liveuser 10588
				//debug
10589
				//htmlStr=htmlStr+'console.log(document.querySelector(\'div\'));';
226 liveuser 10590
 
3 liveuser 10591
				//取得第一個div
10592
				htmlStr=htmlStr+'var containerDiv=document.querySelector(\'div\');';
226 liveuser 10593
 
3 liveuser 10594
				//debug
10595
				//htmlStr=htmlStr+'console.log(event);';
10596
				//htmlStr=htmlStr+'console.log(containerDiv);';
226 liveuser 10597
 
3 liveuser 10598
				//如果不存在,則提示錯誤
10599
				htmlStr=htmlStr+'if(containerDiv===null){console.error(\'containerDiv div not exixt\');}';
226 liveuser 10600
 
3 liveuser 10601
				//設置container div 的 id 為 window_qbpwcf_slide
10602
				htmlStr=htmlStr+'containerDiv.id=\'window_qbpwcf_slide\';';
226 liveuser 10603
 
10604
				//設置container div 為背景
3 liveuser 10605
				htmlStr=htmlStr+'containerDiv.style.zIndex=-1;';
226 liveuser 10606
 
3 liveuser 10607
				//設置container div 為透明
10608
				htmlStr=htmlStr+'containerDiv.style.opacity=0;';
226 liveuser 10609
 
3 liveuser 10610
				//設置container div 為相對位置
10611
				htmlStr=htmlStr+'containerDiv.style.position=\'absolute\';';
226 liveuser 10612
 
3 liveuser 10613
				//設置最小寬度跟父元素一樣
10614
				htmlStr=htmlStr+'containerDiv.style.minWidth=\'inherit\';';
226 liveuser 10615
 
3 liveuser 10616
				//設置最大寬度跟父元素一樣
10617
				htmlStr=htmlStr+'containerDiv.style.maxWidth=\'inherit\';';
226 liveuser 10618
 
3 liveuser 10619
				//設置最小高度跟父元素一樣
10620
				htmlStr=htmlStr+'containerDiv.style.minHeight=\'inherit\';';
226 liveuser 10621
 
3 liveuser 10622
				//設置最大高度跟父元素一樣
10623
				htmlStr=htmlStr+'containerDiv.style.maxHeight=\'inherit\';';
226 liveuser 10624
 
3 liveuser 10625
				//如果有里層元素 - start
10626
				htmlStr=htmlStr+'if(containerDiv.children.length!==0){';
226 liveuser 10627
 
3 liveuser 10628
				//設置最小寬度跟父元素一樣
10629
				htmlStr=htmlStr+'containerDiv.children[0].style.minWidth=\'inherit\';';
226 liveuser 10630
 
3 liveuser 10631
				//設置最大寬度跟父元素一樣
10632
				htmlStr=htmlStr+'containerDiv.children[0].style.maxWidth=\'inherit\';';
226 liveuser 10633
 
3 liveuser 10634
				//設置最小高度跟父元素一樣
10635
				htmlStr=htmlStr+'containerDiv.children[0].style.minHeight=\'inherit\';';
226 liveuser 10636
 
3 liveuser 10637
				//設置最大高度跟父元素一樣
10638
				htmlStr=htmlStr+'containerDiv.children[0].style.maxHeight=\'inherit\';';
226 liveuser 10639
 
3 liveuser 10640
				//取得要呈現的內容
10641
				htmlStr=htmlStr+'var contentToShow=containerDiv.children[0];';
226 liveuser 10642
 
3 liveuser 10643
				//如果有里層元素 - end
10644
				htmlStr=htmlStr+'}';
226 liveuser 10645
 
3 liveuser 10646
				//反之裡層不為element,可能為textNode - start
10647
				htmlStr=htmlStr+'else{';
226 liveuser 10648
 
3 liveuser 10649
				//取得要呈現的內容
10650
				htmlStr=htmlStr+'var contentToShow=containerDiv.childNodes[0];';
226 liveuser 10651
 
3 liveuser 10652
				//設置內容左右置中
10653
				htmlStr=htmlStr+'containerDiv.style.textAlign=\'center\';';
226 liveuser 10654
 
3 liveuser 10655
				//設置內容高度為 100vh
10656
				htmlStr=htmlStr+'containerDiv.style.lineHeight=\'100vh\';';
226 liveuser 10657
 
3 liveuser 10658
				//反之裡層不為element,可能為textNode - end
10659
				htmlStr=htmlStr+'}';
226 liveuser 10660
 
3 liveuser 10661
				//若內容是不為video,設置可立即換頁.
10662
				htmlStr=htmlStr+'if(contentToShow.tagName!==\'VIDEO\'){containerDiv.dataset.canChangeNow=true;}';
226 liveuser 10663
 
3 liveuser 10664
				//反之內容為video
10665
				htmlStr=htmlStr+'else{';
226 liveuser 10666
 
3 liveuser 10667
				//設置不可立即換頁
10668
				htmlStr=htmlStr+'containerDiv.dataset.canChangeNow=false;';
226 liveuser 10669
 
3 liveuser 10670
				//設置影片靜音
10671
				htmlStr=htmlStr+'contentToShow.muted=true;';
226 liveuser 10672
 
3 liveuser 10673
				//禁止影片自動播放
10674
				htmlStr=htmlStr+'contentToShow.autoplay=false;';
226 liveuser 10675
 
3 liveuser 10676
				//新增影片播放完之後的事件
10677
				htmlStr=htmlStr+'contentToShow.addEventListener(\'ended\',function(){';
226 liveuser 10678
 
3 liveuser 10679
				//設置可立即換頁
10680
				htmlStr=htmlStr+'containerDiv.dataset.canChangeNow=true;';
226 liveuser 10681
 
3 liveuser 10682
				//ended 事件結束
10683
				htmlStr=htmlStr+'});';
226 liveuser 10684
 
3 liveuser 10685
				//else end
10686
				htmlStr=htmlStr+'}';
226 liveuser 10687
 
3 liveuser 10688
				//若內容是img,設置按照比例自動縮放
10689
				//https://code-boxx.com/keep-image-aspect-ratio/
10690
				htmlStr=htmlStr+'if(contentToShow.tagName===\'IMG\'){contentToShow.style.objectFit=\'scale-down\';}';
226 liveuser 10691
 
3 liveuser 10692
				//load 事件結束
226 liveuser 10693
				htmlStr=htmlStr+'});';
10694
 
3 liveuser 10695
				//script end
10696
				htmlStr=htmlStr+'\</script\>';
226 liveuser 10697
 
3 liveuser 10698
				//html to dom
10699
				var dom=domParser.parseFromString(htmlStr,'text/html');
226 liveuser 10700
 
3 liveuser 10701
				//回傳轉成 dom 的 html
10702
				resolve(dom.documentElement);
226 liveuser 10703
 
3 liveuser 10704
				});
226 liveuser 10705
 
3 liveuser 10706
			}//window.qbpwcf.slide.toDom end
226 liveuser 10707
 
3 liveuser 10708
		//將多個 html、css、javaScript 轉換為 dom
10709
		window.qbpwcf.slide.toDoms=function(htmlStrArray){
226 liveuser 10710
 
3 liveuser 10711
			//回傳 Promise
10712
			return new Promise(resolve => {
226 liveuser 10713
 
3 liveuser 10714
				//初始化要回傳的內容
10715
				var doms=[];
226 liveuser 10716
 
3 liveuser 10717
				//初始化用來存放排序後的 doms
10718
				var tempDoms=[];
226 liveuser 10719
 
3 liveuser 10720
				//針對每個要輪播的內容
10721
				htmlStrArray.forEach(async function(value,key){
226 liveuser 10722
 
3 liveuser 10723
					//將 html to dom
10724
					var dom=await window.qbpwcf.slide.toDom.call(this,value);
226 liveuser 10725
 
3 liveuser 10726
					//記錄排序順序
10727
					dom.order=key;
226 liveuser 10728
 
3 liveuser 10729
					//保存到 doms 陣列裡面
10730
					doms.push(dom);
226 liveuser 10731
 
3 liveuser 10732
					//如果每個都解析成 dom 了
10733
					if(doms.length===htmlStrArray.length){
226 liveuser 10734
 
3 liveuser 10735
						//初始化要尋找的索引
10736
						var indexToFind=0;
226 liveuser 10737
 
3 liveuser 10738
						//初始化最後的索引
10739
						var maxlidex=htmlStrArray.length-1;
226 liveuser 10740
 
3 liveuser 10741
						//按照 order 重新排序
10742
						for(var i=0;i<=maxlidex;i++){
226 liveuser 10743
 
3 liveuser 10744
							//如果是要找的索引
10745
							if(doms[i].order===indexToFind){
226 liveuser 10746
 
3 liveuser 10747
								//放置dom
10748
								tempDoms.push(doms[i]);
226 liveuser 10749
 
3 liveuser 10750
								//要尋找的索引+1
10751
								indexToFind++;
226 liveuser 10752
 
3 liveuser 10753
								//重新搜尋
10754
								i=-1;
226 liveuser 10755
 
3 liveuser 10756
								//繼續迴圈
10757
								continue;
226 liveuser 10758
 
3 liveuser 10759
								}//if end
226 liveuser 10760
 
3 liveuser 10761
							}//for end
226 liveuser 10762
 
3 liveuser 10763
						//回傳轉成 dom 的 array
10764
						resolve(tempDoms);
226 liveuser 10765
 
3 liveuser 10766
						}//if end
226 liveuser 10767
 
3 liveuser 10768
					});//forEach end
226 liveuser 10769
 
3 liveuser 10770
				});//回傳 Promise end
226 liveuser 10771
 
3 liveuser 10772
			}//window.qbpwcf.slide.toDoms end
226 liveuser 10773
 
10774
		//將 dom 給 ifrmae 執行完後,回傳其 document
3 liveuser 10775
		window.qbpwcf.slide.loadDom=function(dom){
226 liveuser 10776
 
3 liveuser 10777
			//回傳 Promise
10778
			return new Promise(resolve => {
226 liveuser 10779
 
3 liveuser 10780
				//建立 iframe
10781
				var iframe=document.createElement('iframe');
226 liveuser 10782
 
3 liveuser 10783
				//隱藏 iframe
10784
				iframe.style.display='none';
226 liveuser 10785
 
3 liveuser 10786
				//放置 iframe
174 liveuser 10787
				document.body.appendChild(iframe);
226 liveuser 10788
 
3 liveuser 10789
				//取得 iframe 的 document
10790
				var documentInIframe=iframe.contentDocument;
226 liveuser 10791
 
3 liveuser 10792
				//讓 iframe 開始接收內容
10793
				documentInIframe.open();
226 liveuser 10794
 
3 liveuser 10795
				//綁定 iframe load 事件
10796
				iframe.addEventListener('load',function(){
226 liveuser 10797
 
3 liveuser 10798
					//回傳 iframe document
10799
					resolve(documentInIframe.documentElement);
226 liveuser 10800
 
3 liveuser 10801
					});
226 liveuser 10802
 
10803
				//讓 iframe 接收指定內容
3 liveuser 10804
				documentInIframe.write(dom.outerHTML);
226 liveuser 10805
 
3 liveuser 10806
				//讓 iframe 結束接收內容
10807
				documentInIframe.close();
226 liveuser 10808
 
3 liveuser 10809
				});//回傳 Promise end
226 liveuser 10810
 
3 liveuser 10811
			}//window.qbpwcf.slide.loadDom end
226 liveuser 10812
 
10813
		//將多個 dom 給 ifrmae 執行完後,回傳其 document 集合
3 liveuser 10814
		window.qbpwcf.slide.loadDoms=function(doms){
226 liveuser 10815
 
3 liveuser 10816
			//回傳 Promise
10817
			return new Promise(resolve => {
226 liveuser 10818
 
3 liveuser 10819
				//初始化儲存 iframe document
10820
				var iframeDocs=[];
226 liveuser 10821
 
3 liveuser 10822
				//初始化儲存排序過後的 iframe document
10823
				var tempIframeDocs=[];
226 liveuser 10824
 
3 liveuser 10825
				//針對每個dom
10826
				doms.forEach(async function(value,key){
226 liveuser 10827
 
3 liveuser 10828
					//取得 iframe document
10829
					var iframeDoc=await window.qbpwcf.slide.loadDom.call(this,value);
226 liveuser 10830
 
3 liveuser 10831
					//記錄排序順序
10832
					iframeDoc.order=key;
226 liveuser 10833
 
3 liveuser 10834
					//儲存
174 liveuser 10835
					iframeDocs.push(iframeDoc);
226 liveuser 10836
 
3 liveuser 10837
					//如果每個都解析成 dom 了
10838
					if(iframeDocs.length===doms.length){
226 liveuser 10839
 
3 liveuser 10840
						//初始化要尋找的索引
10841
						var indexToFind=0;
226 liveuser 10842
 
3 liveuser 10843
						//初始化最後的索引
10844
						var maxlidex=doms.length-1;
226 liveuser 10845
 
3 liveuser 10846
						//按照 order 重新排序
10847
						for(var i=0;i<=maxlidex;i++){
226 liveuser 10848
 
3 liveuser 10849
							//如果是要找的索引
10850
							if(iframeDocs[i].order===indexToFind){
226 liveuser 10851
 
3 liveuser 10852
								//放置iframeDoc
10853
								tempIframeDocs.push(iframeDocs[i]);
226 liveuser 10854
 
3 liveuser 10855
								//要尋找的索引+1
10856
								indexToFind++;
226 liveuser 10857
 
3 liveuser 10858
								//重新搜尋
10859
								i=-1;
226 liveuser 10860
 
3 liveuser 10861
								//繼續迴圈
10862
								continue;
226 liveuser 10863
 
3 liveuser 10864
								}//if end
226 liveuser 10865
 
3 liveuser 10866
							}//for end
226 liveuser 10867
 
3 liveuser 10868
						//回傳各個 iframe document
10869
						resolve(tempIframeDocs);
226 liveuser 10870
 
3 liveuser 10871
						}//if end
226 liveuser 10872
 
3 liveuser 10873
					});//forEach end
226 liveuser 10874
 
3 liveuser 10875
				});//回傳 Promise end
226 liveuser 10876
 
3 liveuser 10877
			}//window.qbpwcf.slide.loadDoms end
226 liveuser 10878
 
3 liveuser 10879
		//執行的定義
10880
		window.qbpwcf.slide.func=async function(){
226 liveuser 10881
 
3 liveuser 10882
			//取得要輪播的元素
10883
			var eles=window.qbpwcf.slide.eles;
226 liveuser 10884
 
3 liveuser 10885
			//如果沒有要輪播的內容
10886
			if(eles.length===0){
226 liveuser 10887
 
3 liveuser 10888
				//提示錯誤訊息
10889
				console.error('Array(window.qbpwcf.slide.eles) should not be empty');
226 liveuser 10890
 
3 liveuser 10891
				//結束執行
10892
				return false;
226 liveuser 10893
 
3 liveuser 10894
				}//if end
226 liveuser 10895
 
3 liveuser 10896
			//取得放置輪播的div QuerySelectorString
10897
			var displayDivByQuerySelector=window.qbpwcf.slide.displayDivByQuerySelector;
226 liveuser 10898
 
3 liveuser 10899
			//取得放置輪播的div
10900
			var displayDiv=document.querySelector(displayDivByQuerySelector);
226 liveuser 10901
 
3 liveuser 10902
			//如果沒有找到放置輪播內容的div
10903
			if(displayDiv===null){
226 liveuser 10904
 
3 liveuser 10905
				//提示錯誤訊息
10906
				console.error('result of querySelector by '+displayDivByQuerySelector+' is null');
226 liveuser 10907
 
3 liveuser 10908
				//結束執行
10909
				return false;
226 liveuser 10910
 
3 liveuser 10911
				}//if end
226 liveuser 10912
 
3 liveuser 10913
			//取得每個slide的最小播放時間
10914
			var showTime=window.qbpwcf.slide.showTime;
226 liveuser 10915
 
3 liveuser 10916
			//將輪播內容轉換為doms
10917
			var doms = await window.qbpwcf.slide.toDoms.call(this,eles);
226 liveuser 10918
 
3 liveuser 10919
			//debug
10920
			//console.log(doms);
226 liveuser 10921
 
3 liveuser 10922
			//取得每個 iframe 的 document
10923
			var iframeDocs = await window.qbpwcf.slide.loadDoms.call(this,doms);
226 liveuser 10924
 
3 liveuser 10925
			//debug
10926
			//console.log(iframeDocs);
226 liveuser 10927
 
3 liveuser 10928
			//放置讀取好的投影片
10929
			for(var i=0;i<iframeDocs.length;i++){
226 liveuser 10930
 
3 liveuser 10931
				//取得容器 div
10932
				var containerDiv=iframeDocs[i].querySelector('div');
226 liveuser 10933
 
3 liveuser 10934
				//放置要播放的內容
10935
				displayDiv.appendChild(containerDiv);
226 liveuser 10936
 
3 liveuser 10937
				}//for end
226 liveuser 10938
 
3 liveuser 10939
			//初始化索引為0
10940
			i=0;
226 liveuser 10941
 
3 liveuser 10942
			//無窮迴圈
10943
			while(true){
226 liveuser 10944
 
3 liveuser 10945
				//如果目標不存在
10946
				if(iframeDocs[i]===undefined){
226 liveuser 10947
 
3 liveuser 10948
					//重新計數
10949
					i=0;
226 liveuser 10950
 
3 liveuser 10951
					//下一輪
10952
					continue;
226 liveuser 10953
 
3 liveuser 10954
					}//if end
226 liveuser 10955
 
3 liveuser 10956
				//取得所有投影片
10957
				var slides=displayDiv.querySelectorAll('div#window_qbpwcf_slide');
226 liveuser 10958
 
3 liveuser 10959
				//針對每個投影片
10960
				for(var j=0;j<slides.length;j++){
226 liveuser 10961
 
3 liveuser 10962
					//設置放在背景
10963
					slides[j].style.zIndex=-1;
226 liveuser 10964
 
3 liveuser 10965
					//設置為透明
10966
					slides[j].style.opacity=0;
226 liveuser 10967
 
3 liveuser 10968
					//設置為absolute,不占用空間
10969
					slides[j].style.position='absolute';
226 liveuser 10970
 
3 liveuser 10971
					}//for end
226 liveuser 10972
 
3 liveuser 10973
				//取得當前播放的內容
10974
				var prePlayContent=displayDiv.querySelectorAll('div#window_qbpwcf_slide')[i];
226 liveuser 10975
 
3 liveuser 10976
				//當前要播放的內容移到前景
10977
				prePlayContent.style.zIndex='unset';
226 liveuser 10978
 
3 liveuser 10979
				//顯示當前要播放的內容
10980
				prePlayContent.style.opacity='unset';
226 liveuser 10981
 
3 liveuser 10982
				//設置為unset,要占用空間
10983
				prePlayContent.style.position='unset';
226 liveuser 10984
 
3 liveuser 10985
				//如果有子元素
10986
				if(prePlayContent.children.length>0){
226 liveuser 10987
 
3 liveuser 10988
					//如果是影片
10989
					if(prePlayContent.children[0].tagName==='VIDEO'){
226 liveuser 10990
 
3 liveuser 10991
						//播放之
10992
						prePlayContent.children[0].play();
226 liveuser 10993
 
3 liveuser 10994
						}//if end
226 liveuser 10995
 
3 liveuser 10996
					}//if end
226 liveuser 10997
 
3 liveuser 10998
				//播放 showTime 秒
10999
				await window.qbpwcf.sleep.func(showTime);
226 liveuser 11000
 
3 liveuser 11001
				//如果尚不行置換slide
11002
				while(prePlayContent.dataset.canChangeNow==='false'){
226 liveuser 11003
 
3 liveuser 11004
					//多播放 1 秒
11005
					await window.qbpwcf.sleep.func(1);
226 liveuser 11006
 
3 liveuser 11007
					}//while end
226 liveuser 11008
 
3 liveuser 11009
				//如果有子元素
11010
				if(prePlayContent.children.length>0){
226 liveuser 11011
 
3 liveuser 11012
					//如果是影片
11013
					if(prePlayContent.children[0].tagName==='VIDEO'){
226 liveuser 11014
 
3 liveuser 11015
						//設置下次要等待影片播放完才能換頁
11016
						prePlayContent.dataset.canChangeNow=false;
226 liveuser 11017
 
3 liveuser 11018
						}//if end
226 liveuser 11019
 
3 liveuser 11020
					}//if end
226 liveuser 11021
 
3 liveuser 11022
				//執行到這邊代表可以置換slide了
226 liveuser 11023
 
3 liveuser 11024
				//計數增加
11025
				i++;
226 liveuser 11026
 
3 liveuser 11027
				}//while end
226 liveuser 11028
 
3 liveuser 11029
			}//window.qbpwcf.slide.func end
226 liveuser 11030
 
3 liveuser 11031
		";
226 liveuser 11032
 
3 liveuser 11033
		#js function
11034
		$conf["javaScript::toScript"]["jsFunciton"][]=
11035
		"
11036
		/*
11037
		說明:
11038
		取得用戶端的檔案.
11039
		回傳結果:
11040
		result.data,取得檔案的 base64 data
226 liveuser 11041
		result.mime,取得檔案的 mime
3 liveuser 11042
		result.base64,取得檔案的純 base64 部分
11043
		參考資料:
11044
		https://developer.mozilla.org/en-US/docs/Web/API/File
11045
		https://developer.mozilla.org/en-US/docs/Web/API/FileList
11046
		https://developer.mozilla.org/en-US/docs/Web/HTML/Attributes/accept
11047
		https://developer.mozilla.org/en-US/docs/Web/API/URL/createObjectURL_static
11048
		https://developer.mozilla.org/en-US/docs/Web/API/FileReader/readAsDataURL
11049
		*/
226 liveuser 11050
 
3 liveuser 11051
		//初始化
11052
		window.qbpwcf.clientFile={};
226 liveuser 11053
 
3 liveuser 11054
		//取得用戶端檔案的參數設定
11055
		window.qbpwcf.clientFile.params={};
226 liveuser 11056
 
3 liveuser 11057
		//初始化multiple參數為false
11058
		window.qbpwcf.clientFile.params.multiple=false;
226 liveuser 11059
 
3 liveuser 11060
		//初始化accept參數為''
11061
		window.qbpwcf.clientFile.params.accept='';
226 liveuser 11062
 
3 liveuser 11063
		//設置只接受video
11064
		window.qbpwcf.clientFile.acceptVideoOnly=function(){
226 liveuser 11065
 
3 liveuser 11066
			//設置accept為'video/*'
11067
			window.qbpwcf.clientFile.params.accept='video/*';
226 liveuser 11068
 
3 liveuser 11069
			}//function end
226 liveuser 11070
 
3 liveuser 11071
		//設置只接受audio
11072
		window.qbpwcf.clientFile.acceptAudioOnly=function(){
226 liveuser 11073
 
3 liveuser 11074
			//設置accept為'audio/*'
11075
			window.qbpwcf.clientFile.params.accept='audio/*';
226 liveuser 11076
 
3 liveuser 11077
			}//function end
226 liveuser 11078
 
3 liveuser 11079
		//設置只接受image
11080
		window.qbpwcf.clientFile.acceptImageOnly=function(){
226 liveuser 11081
 
3 liveuser 11082
			//設置accept為'image/*'
11083
			window.qbpwcf.clientFile.params.accept='image/*';
226 liveuser 11084
 
3 liveuser 11085
			}//function end
226 liveuser 11086
 
3 liveuser 11087
		//累加允許的檔案類型
11088
		window.qbpwcf.clientFile.acceptAppend=function(type){
226 liveuser 11089
 
3 liveuser 11090
			//如果已經有內容
11091
			if(window.qbpwcf.clientFile.params.accept!=''){
226 liveuser 11092
 
3 liveuser 11093
				//增加允許的類型
11094
				window.qbpwcf.clientFile.params.accept=window.qbpwcf.clientFile.params.accept+','+type;
226 liveuser 11095
 
3 liveuser 11096
				}//if end
226 liveuser 11097
 
3 liveuser 11098
			//反之尚無設定
11099
			else{
226 liveuser 11100
 
3 liveuser 11101
				//設置允許的類型
11102
				window.qbpwcf.clientFile.params.accept=type;
226 liveuser 11103
 
3 liveuser 11104
				}//else end
226 liveuser 11105
 
3 liveuser 11106
			}//function end
226 liveuser 11107
 
3 liveuser 11108
		//觸發選擇檔案的視窗後,若沒有選擇到的檔案,會強制使用者再度選擇,預設為'false'不啟用;反之為'true'要啟用.
11109
		window.qbpwcf.clientFile.forceSelectFileAfterTrigger='false';
226 liveuser 11110
 
3 liveuser 11111
		//取得用戶端的檔案,使用時前面請加上 await 才能取得回應.
11112
		window.qbpwcf.clientFile.init=async function(){
226 liveuser 11113
 
3 liveuser 11114
			//建立 input
11115
			var input=document.createElement('input');
226 liveuser 11116
 
3 liveuser 11117
			//設置 type 為檔案
11118
			input.type='file';
226 liveuser 11119
 
3 liveuser 11120
			//設置multiple參數
11121
			input.multiple=window.qbpwcf.clientFile.params.multiple;
226 liveuser 11122
 
3 liveuser 11123
			//設置multiple參數
11124
			input.accept=window.qbpwcf.clientFile.params.accept;
226 liveuser 11125
 
3 liveuser 11126
			//初始化要回傳的結果物件
11127
			input.result={};
226 liveuser 11128
 
3 liveuser 11129
			//預設使用者尚未取消選取檔案
11130
			input.canceled='false';
226 liveuser 11131
 
3 liveuser 11132
			//當選擇的檔案有異動
11133
			input.onchange=function(){
226 liveuser 11134
 
3 liveuser 11135
				//轉換與取得ObjectURL
11136
				input.result.url=URL.createObjectURL(input.files[0]);
11137
 
11138
				//初始化 FileReader
11139
				var reader = new FileReader();
226 liveuser 11140
 
3 liveuser 11141
				//讀取檔案
11142
				reader.readAsDataURL(input.files[0]);
226 liveuser 11143
 
3 liveuser 11144
				//當檔案讀取完畢後
11145
				reader.onload=function(){
226 liveuser 11146
 
3 liveuser 11147
					//取得檔案的 base64 data
11148
					input.result.data = reader.result;
226 liveuser 11149
 
3 liveuser 11150
					//取得檔案的 mime
11151
					input.result.mime = input.result.data.split(':')[1].split(';')[0];
226 liveuser 11152
 
3 liveuser 11153
					//取得檔案的純 base64 部分
11154
					input.result.base64 = input.result.data.split(',')[1];
226 liveuser 11155
 
3 liveuser 11156
					}//function end
226 liveuser 11157
 
3 liveuser 11158
				};//function end
226 liveuser 11159
 
3 liveuser 11160
			//綁定使用按下取消的事件
11161
			//參考資料:
11162
			//https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/cancel_event
11163
			input.addEventListener('cancel',function(event){
11164
 
11165
				//debug
11166
				//console.log(event,Object.keys(input.result).length);return false;
11167
 
11168
				//如果沒有結果
11169
				if(Object.keys(input.result).length===0){
226 liveuser 11170
 
3 liveuser 11171
					//設置被按下cancel了
11172
					input.canceled='true';
226 liveuser 11173
 
3 liveuser 11174
					}//if end
226 liveuser 11175
 
3 liveuser 11176
				});
226 liveuser 11177
 
3 liveuser 11178
			//觸發使用者選擇檔案
11179
			input.click();
226 liveuser 11180
 
3 liveuser 11181
			//無窮迴圈
11182
			while(true){
226 liveuser 11183
 
3 liveuser 11184
				//如果使用者取消了
11185
				if(input.canceled==='true'){
226 liveuser 11186
 
3 liveuser 11187
					//回傳結果
11188
					return input.result;
226 liveuser 11189
 
3 liveuser 11190
					}//if end
226 liveuser 11191
 
3 liveuser 11192
				//休息一秒
11193
				await window.qbpwcf.sleep.func(1);
226 liveuser 11194
 
3 liveuser 11195
				//debug
11196
				console.log('wait file selected');
226 liveuser 11197
 
3 liveuser 11198
				//如果有結果
11199
				if(input.result!={}){
226 liveuser 11200
 
3 liveuser 11201
					//如果
11202
					if(
226 liveuser 11203
 
3 liveuser 11204
						//url存在
226 liveuser 11205
						input.result.url!=undefined
11206
 
11207
						&&
11208
 
3 liveuser 11209
						//data存在
226 liveuser 11210
						input.result.data!=undefined
11211
 
3 liveuser 11212
						&&
226 liveuser 11213
 
3 liveuser 11214
						//mime存在
11215
						input.result.mime!=undefined
226 liveuser 11216
 
3 liveuser 11217
						&&
226 liveuser 11218
 
3 liveuser 11219
						//base64存在
11220
						input.result.base64!=undefined
226 liveuser 11221
 
3 liveuser 11222
						){
226 liveuser 11223
 
3 liveuser 11224
						//執行到這代表資料都有了
226 liveuser 11225
 
3 liveuser 11226
						//結束迴圈
11227
						break;
226 liveuser 11228
 
3 liveuser 11229
						}//if end
226 liveuser 11230
 
3 liveuser 11231
					}//if end
226 liveuser 11232
 
3 liveuser 11233
				}//while end
226 liveuser 11234
 
3 liveuser 11235
			//回傳結果
11236
			return input.result;
226 liveuser 11237
 
3 liveuser 11238
			};
226 liveuser 11239
 
3 liveuser 11240
		";
226 liveuser 11241
 
3 liveuser 11242
		#js function
11243
		$conf["javaScript::toScript"]["jsFunciton"][]=
11244
		"
11245
		/*
11246
		說明:
11247
		text_editor,編輯文字.
11248
		*/
226 liveuser 11249
 
3 liveuser 11250
		//初始化
11251
		window.qbpwcf.text_editor={};
226 liveuser 11252
 
3 liveuser 11253
		//用於取得顯示輸入內容的區塊
11254
		window.qbpwcf.text_editor.selector='';
226 liveuser 11255
 
3 liveuser 11256
		//執行
11257
		window.qbpwcf.text_editor.init=function(){
226 liveuser 11258
 
3 liveuser 11259
			//取得用來顯示輸入內容的 selector
11260
			var displayTag=document.querySelector(window.qbpwcf.text_editor.selector);
226 liveuser 11261
 
3 liveuser 11262
			//取得一開始的內容,用一個div代表一行.
11263
			var lines=displayTag.children;
226 liveuser 11264
 
3 liveuser 11265
			//關注用來顯示輸入內容的元素後
11266
			displayTag.addEventListener('focus',function(event){
226 liveuser 11267
 
3 liveuser 11268
				//取得觸發的元素
11269
				var eTarget=event.target;
226 liveuser 11270
 
3 liveuser 11271
				//debug
11272
				console.log(eTarget);
226 liveuser 11273
 
3 liveuser 11274
				//建立暫存的textInput
11275
				var tempInput=document.createElement('input');
226 liveuser 11276
 
3 liveuser 11277
				//設置為單行輸入
11278
				tempInput.type='text';
226 liveuser 11279
 
3 liveuser 11280
				//break point
11281
				return;
226 liveuser 11282
 
3 liveuser 11283
				//初始化內容
11284
				tempInput.value=contentOfTag;
226 liveuser 11285
 
3 liveuser 11286
				//關注之
11287
				tempInput.focus();
226 liveuser 11288
 
3 liveuser 11289
				//若內容有改變
11290
				tempInput.addEventListener('change',function(event){
226 liveuser 11291
 
3 liveuser 11292
					//更新用來顯示輸入的內容
11293
					displayTag.innerText=this.value;
226 liveuser 11294
 
3 liveuser 11295
					});
226 liveuser 11296
 
3 liveuser 11297
				});
226 liveuser 11298
 
3 liveuser 11299
			}
11300
		";
226 liveuser 11301
 
3 liveuser 11302
		#js function
11303
		$conf["javaScript::toScript"]["jsFunciton"][]=
11304
		"
226 liveuser 11305
 
3 liveuser 11306
		/*
11307
		說明:
11308
		openWindow,由javaScript開啟可管控的視窗,甚至存取其內容.
226 liveuser 11309
 
3 liveuser 11310
		範例:
226 liveuser 11311
 
3 liveuser 11312
		//第一段
11313
		var script=document.createElement('script');
11314
		script.src='https://latest.qbpwcf.org/qbpwcf/javaScript/qbpwcf.php';
11315
		document.head.appendChild(script);
226 liveuser 11316
 
3 liveuser 11317
		//第二段
11318
		window.qbpwcf.openWindow.params.url=window.location.href;
11319
		window.qbpwcf.openWindow.saveSourceAtTheEnd='true';
11320
		await window.qbpwcf.openWindow.func();
226 liveuser 11321
 
3 liveuser 11322
		參考資料:
11323
		https://developer.mozilla.org/en-US/docs/Web/API/FileReader/readAsDataURL
226 liveuser 11324
		https://developer.mozilla.org/en-US/docs/Web/API/File/File
3 liveuser 11325
		*/
226 liveuser 11326
 
3 liveuser 11327
		//初始化物件
11328
		window.qbpwcf.openWindow={};
226 liveuser 11329
 
3 liveuser 11330
		//初始化參數
11331
		window.qbpwcf.openWindow.init=function(){
226 liveuser 11332
 
3 liveuser 11333
			//初始化參數物件
11334
			window.qbpwcf.openWindow.params={};
226 liveuser 11335
 
3 liveuser 11336
			//初始化目標網址
11337
			window.qbpwcf.openWindow.params.url='https://sourceforge.net/projects/qbpwc/';
226 liveuser 11338
 
3 liveuser 11339
			//初始化要將window.open()儲存到哪個全域變數裡面.
11340
			window.qbpwcf.openWindow.params.varName='qbpwcf_openWindow_instance';
226 liveuser 11341
 
3 liveuser 11342
			//初始化給予 window.open() 的第三個參數.
11343
			window.qbpwcf.openWindow.params.windowFeatures='';
226 liveuser 11344
 
3 liveuser 11345
			//初始化window.open()後,其回應的html source
11346
			window.qbpwcf.openWindow.resSource='';
226 liveuser 11347
 
3 liveuser 11348
			//初始化window.open()後,要執行什麼操作,參數Window為其opened的Window的.
11349
			window.qbpwcf.openWindow.actionAfterOpen=function(Window){
226 liveuser 11350
 
3 liveuser 11351
				//預設的提示訊息
11352
				console.log('do something after window.oepn()');
226 liveuser 11353
 
3 liveuser 11354
				}//actionAfterOpen end
226 liveuser 11355
 
3 liveuser 11356
			//預設window.open()後經過處理後結果不要下載下來
11357
			window.qbpwcf.openWindow.saveSourceAtTheEnd='false';
226 liveuser 11358
 
3 liveuser 11359
			}//funciton end
226 liveuser 11360
 
3 liveuser 11361
		//初始化參數
11362
		window.qbpwcf.openWindow.init();
226 liveuser 11363
 
3 liveuser 11364
		//window.open
11365
		window.qbpwcf.openWindow.func=async function(){
226 liveuser 11366
 
3 liveuser 11367
			//window.open()並儲存回傳的結果
11368
			window[window.qbpwcf.openWindow.params.varName]=await window.open(window.qbpwcf.openWindow.params.url,'_blank',window.qbpwcf.openWindow.params.windowFeatures);
226 liveuser 11369
 
3 liveuser 11370
			//如果執行失敗
11371
			if(!(window[window.qbpwcf.openWindow.params.varName])){
11372
 
11373
				//提示錯誤訊息
11374
				console.error('The window wasn\'t allowed to open. This is likely caused by built-in popup blockers.');
11375
 
11376
				//結束執行
11377
				return;
11378
 
11379
				}//if end
226 liveuser 11380
 
3 liveuser 11381
			//加入load事件
11382
			window[window.qbpwcf.openWindow.params.varName].addEventListener('load',function(event){
226 liveuser 11383
 
3 liveuser 11384
				//debug
11385
				//console.log(this);
226 liveuser 11386
 
3 liveuser 11387
				//呼叫開啟後要做度事情
11388
				window.qbpwcf.openWindow.actionAfterOpen(this);
226 liveuser 11389
 
3 liveuser 11390
				//取得html原始碼
11391
				window.qbpwcf.openWindow.resSource='<html>'+window[window.qbpwcf.openWindow.params.varName].document.head.outerHTML+window[window.qbpwcf.openWindow.params.varName].document.body.outerHTML+'</html>';
226 liveuser 11392
 
3 liveuser 11393
				//如果要下載內容
11394
				if(window.qbpwcf.openWindow.saveSourceAtTheEnd=='true'){
226 liveuser 11395
 
3 liveuser 11396
					//建立檔案File
11397
					var filed2download=new File([window.qbpwcf.openWindow.resSource],'filed2download');
226 liveuser 11398
 
3 liveuser 11399
					//建立用來讀取檔案的FileReader
11400
					var fileReader=new FileReader();
226 liveuser 11401
 
3 liveuser 11402
					//檔案讀取完畢後
11403
					fileReader.addEventListener('load',function(event){
226 liveuser 11404
 
3 liveuser 11405
						//取得dataUrl
11406
						dataUrl=fileReader.result;
226 liveuser 11407
 
3 liveuser 11408
						//建立 a
11409
						var a=document.createElement('a');
226 liveuser 11410
 
3 liveuser 11411
						//設置連結為dataUrl
11412
						a.href=dataUrl;
11413
 
11414
						//點擊開始下載
11415
						a.click();
11416
 
11417
						});
226 liveuser 11418
 
3 liveuser 11419
					//讀取檔案為 dataUrl]
11420
					fileReader.readAsDataURL(filed2download);
226 liveuser 11421
 
3 liveuser 11422
					}//if end
226 liveuser 11423
 
3 liveuser 11424
				});
226 liveuser 11425
 
3 liveuser 11426
			}//function end
226 liveuser 11427
 
3 liveuser 11428
		";
226 liveuser 11429
 
3 liveuser 11430
		#js function
11431
		$conf["javaScript::toScript"]["jsFunciton"][]=
11432
		"
226 liveuser 11433
 
3 liveuser 11434
		/*
11435
		說明:
11436
		儲存當前頁面的原始碼
226 liveuser 11437
 
3 liveuser 11438
		範例:
11439
		window.qbpwcf.saveSource();
11440
		*/
226 liveuser 11441
 
3 liveuser 11442
		//儲存當前頁面原始碼
11443
		window.qbpwcf.saveSource=async function(){
226 liveuser 11444
 
3 liveuser 11445
			//取得原始碼
11446
			var sourceStr='<html>'+document.head.outerHTML+document.body.outerHTML+'</html>';
226 liveuser 11447
 
3 liveuser 11448
			//建立File,檔案名稱隨機產生.
11449
			var file2download=new File([sourceStr],'file2download');
226 liveuser 11450
 
3 liveuser 11451
			//建立用來讀取檔案的FileReader
11452
			var fileReader=new FileReader();
226 liveuser 11453
 
3 liveuser 11454
			//檔案讀取完畢後
11455
			fileReader.addEventListener('load',function(event){
226 liveuser 11456
 
3 liveuser 11457
				//取得dataUrl
11458
				dataUrl=fileReader.result;
226 liveuser 11459
 
3 liveuser 11460
				//建立 a
11461
				var a=document.createElement('a');
226 liveuser 11462
 
3 liveuser 11463
				//設置連結為dataUrl
11464
				a.href=dataUrl;
11465
 
11466
				//點擊開始下載
11467
				a.click();
11468
 
11469
				});
226 liveuser 11470
 
3 liveuser 11471
			//讀取檔案為 dataUrl
11472
			fileReader.readAsDataURL(file2download);
226 liveuser 11473
 
3 liveuser 11474
			}//function end
226 liveuser 11475
 
3 liveuser 11476
		";
226 liveuser 11477
 
3 liveuser 11478
		#js function
11479
		$conf["javaScript::toScript"]["jsFunciton"][]=
11480
		"
226 liveuser 11481
 
3 liveuser 11482
		/*
11483
		說明:
11484
		將要執行的任務交由 web socket 處理.
226 liveuser 11485
 
3 liveuser 11486
		範例:
226 liveuser 11487
 
3 liveuser 11488
		//初始化參數
11489
		var params={};
226 liveuser 11490
 
3 liveuser 11491
		//設定websocket位置
30 liveuser 11492
		params.url='wss://'+location.hostname+':443/wss';
226 liveuser 11493
 
3 liveuser 11494
		//要傳輸的資料
11495
		params.data={};
226 liveuser 11496
 
3 liveuser 11497
		//用來識別是所需要資料的id
11498
		params.data.id=crypto.randomUUID();
226 liveuser 11499
 
3 liveuser 11500
		//取得對應的回應
11501
		var response=await window.qbpwcf.ws.init(params);
226 liveuser 11502
 
3 liveuser 11503
		*/
226 liveuser 11504
 
3 liveuser 11505
		//該方法的物件
11506
		window.qbpwcf.ws={};
226 liveuser 11507
 
3 liveuser 11508
		//連線到web socket,並傳輸資料,會回傳promise.亦即要在 async function 中使用,且使用 await 來取得結果.
59 liveuser 11509
		//params,參數物件.
11510
		//params.url,web socket的url,加密的連線為wss://url,預設為當前頁面的 domain name/wss
11511
		//params.callback,函式,參數為收到的訊息,收到訊息後要怎麼處理.
11512
		//params.data,要傳輸的資料物件.
323 liveuser 11513
		//params.data.id,用於識別回應的id資訊,預設為自動產生(crypto.randomUUID()).
3 liveuser 11514
		window.qbpwcf.ws.init=async function(params){
226 liveuser 11515
 
3 liveuser 11516
			//回傳 Promise
323 liveuser 11517
			return new Promise(async function(resolve, reject){
226 liveuser 11518
 
323 liveuser 11519
				//初始化可以使用的websocket連線
11520
				var conn=null;
11521
 
11522
				//初始化要回傳的結果
11523
				var result=null;
11524
 
3 liveuser 11525
				//若無參數
11526
				if(Object.keys(params).length==0){
226 liveuser 11527
 
3 liveuser 11528
					//初始化參數
11529
					params={};
226 liveuser 11530
 
3 liveuser 11531
					//設定websocket位置
11532
					params.url='wss://'+location.hostname+':443/';
226 liveuser 11533
 
3 liveuser 11534
					//要傳輸的資料
11535
					params.data={};
226 liveuser 11536
 
3 liveuser 11537
					//用來識別是所需要資料的id
11538
					params.data.id=crypto.randomUUID();
226 liveuser 11539
 
3 liveuser 11540
					//收到資料後要做的事情
11541
					params.callback=function(msg){
226 liveuser 11542
 
3 liveuser 11543
						//debug
11544
						console.log('run callback');
226 liveuser 11545
 
3 liveuser 11546
						}//function end
226 liveuser 11547
 
3 liveuser 11548
					}//if end
226 liveuser 11549
 
59 liveuser 11550
				//如果沒有 url 參數
11551
				if(params.url==undefined){
226 liveuser 11552
 
59 liveuser 11553
					//回傳結果, await 可以有結果.
325 liveuser 11554
					reject('missing param url');
226 liveuser 11555
 
59 liveuser 11556
					}//if end
226 liveuser 11557
 
66 liveuser 11558
				//如果無 params.data 參數
11559
				if(params.data==undefined){
226 liveuser 11560
 
59 liveuser 11561
					//回傳結果, await 可以有結果.
325 liveuser 11562
					reject('missing param data');
226 liveuser 11563
 
59 liveuser 11564
					}//if end
323 liveuser 11565
 
11566
				//如果無 params.id 參數
11567
				if(params.data.id==undefined){
226 liveuser 11568
 
323 liveuser 11569
					//用來識別是所需要資料的id
11570
					params.data.id=crypto.randomUUID();
11571
 
11572
					}//if end
11573
 
3 liveuser 11574
				//如果沒有儲存所有wss連線的變數存在
11575
				if(this.qbpwcf.ws.wss==undefined){
226 liveuser 11576
 
3 liveuser 11577
					//初始化為空物件
11578
					this.qbpwcf.ws.wss={};
226 liveuser 11579
 
3 liveuser 11580
					}//if end
226 liveuser 11581
 
3 liveuser 11582
				//設置 既有的 web socket 實體清單 參考
11583
				var wsList={
226 liveuser 11584
 
3 liveuser 11585
					//取得本函式的參數參考
11586
					'params':params,
226 liveuser 11587
 
3 liveuser 11588
					//取得既有的 web socket 實體清單
11589
					'list':Object.keys(window.qbpwcf.ws.wss),
226 liveuser 11590
 
3 liveuser 11591
					}//wsList end
226 liveuser 11592
 
3 liveuser 11593
				//針對每個實體清單
11594
				for(key in wsList.list){
323 liveuser 11595
 
11596
					//debug
11597
					console.log('key('+wsList.list[key]+') in wsList');
226 liveuser 11598
 
3 liveuser 11599
					//如果有同樣目標的連線
323 liveuser 11600
					if(wsList.list[key]==params.url){
226 liveuser 11601
 
323 liveuser 11602
						//提示找到同連線目標的 web socket 連線
11603
						console.log('same web socket target('+params.url+') found.');
11604
 
3 liveuser 11605
						//使用既有的連線
323 liveuser 11606
						conn=window.qbpwcf.ws.wss[params.url];
11607
 
325 liveuser 11608
						//清空要回傳的結果
11609
						conn.result=null;
11610
 
11611
						//清空要回傳的狀態
11612
						conn.status=null;
11613
 
323 liveuser 11614
						//提示找到同連線目標的 web socket 連線
11615
						console.log('reuse current connection('+params.url+')');
226 liveuser 11616
 
3 liveuser 11617
						//如果有要傳遞資料
11618
						if(params.data!={}){
226 liveuser 11619
 
3 liveuser 11620
							//傳遞資料
323 liveuser 11621
							conn.send(JSON.stringify(params.data));
11622
 
3 liveuser 11623
							}//if end
226 liveuser 11624
 
3 liveuser 11625
						//結束for
11626
						break;
226 liveuser 11627
 
3 liveuser 11628
						}//if end
226 liveuser 11629
 
3 liveuser 11630
					}//for end
226 liveuser 11631
 
3 liveuser 11632
				//如果尚無可用的ws連線
11633
				if(conn==undefined){
226 liveuser 11634
 
3 liveuser 11635
					//設定webSocket的連線目標
11636
					var conn = new WebSocket(params.url);
325 liveuser 11637
 
3 liveuser 11638
					//設置上層參考
11639
					conn.mother=this.qbpwcf.ws;
11640
 
11641
					//設置本函式參數的參考
11642
					conn.params=params;
11643
 
11644
					//儲存可以使用的連線
11645
					window.qbpwcf.ws.wss[params.url]=conn;
325 liveuser 11646
 
3 liveuser 11647
					//當有收到訊息時
59 liveuser 11648
					conn.onmessage = async function(e){
226 liveuser 11649
 
3 liveuser 11650
						//debug
11651
						console.log(e);
226 liveuser 11652
 
3 liveuser 11653
						//解析成json
66 liveuser 11654
						var revJson=JSON.parse(e.data);
226 liveuser 11655
 
323 liveuser 11656
						//如果是當前用戶需要的回應
11657
						if(revJson.id==params.data.id){
11658
 
11659
							//取得結果
325 liveuser 11660
							conn.result=revJson;
323 liveuser 11661
 
11662
							//如果有 callback
11663
							if(this.params.callback!=undefined){
226 liveuser 11664
 
323 liveuser 11665
								//callback,收到資料後要做的事情,參數為收到的訊息.
11666
								this.params.callback(e.data);
226 liveuser 11667
 
3 liveuser 11668
								}//if end
325 liveuser 11669
 
11670
							//設置執行正常
11671
							conn.status=true;
11672
 
3 liveuser 11673
							}//if end
226 liveuser 11674
 
3 liveuser 11675
						}//function end
226 liveuser 11676
 
3 liveuser 11677
					//當連線斷開後
11678
					conn.onclose = async function(e){
226 liveuser 11679
 
3 liveuser 11680
						//debug
11681
						console.log('onclose');
226 liveuser 11682
 
325 liveuser 11683
						//設置錯誤訊息
11684
						conn.result=e;
226 liveuser 11685
 
325 liveuser 11686
						//設置執行失敗
11687
						conn.status=false;
226 liveuser 11688
 
3 liveuser 11689
						}//function end
226 liveuser 11690
 
3 liveuser 11691
					//當遇到錯誤時
59 liveuser 11692
					conn.onerror = async function(e){
226 liveuser 11693
 
3 liveuser 11694
						//初始化要回傳的結果
325 liveuser 11695
						conn.result={};
226 liveuser 11696
 
3 liveuser 11697
						//設置錯誤訊息
325 liveuser 11698
						conn.result=e;
226 liveuser 11699
 
3 liveuser 11700
						//設置執行失敗
325 liveuser 11701
						conn.status=false;
226 liveuser 11702
 
3 liveuser 11703
						}//function end
226 liveuser 11704
 
3 liveuser 11705
					//建立與當連線成功後
226 liveuser 11706
					conn.onopen = async function(e){
11707
 
59 liveuser 11708
						//如果無要傳遞資料
11709
						if(params.data==undefined){
226 liveuser 11710
 
59 liveuser 11711
							//結束
11712
							return;
226 liveuser 11713
 
59 liveuser 11714
							}//if end
226 liveuser 11715
 
3 liveuser 11716
						//如果有要傳遞資料
11717
						if(params.data!={}){
226 liveuser 11718
 
3 liveuser 11719
							//debug
11720
							console.log(params.data);
226 liveuser 11721
 
3 liveuser 11722
							//將訊息顯現在console
11723
							console.log('send:'+JSON.stringify(params.data));
226 liveuser 11724
 
3 liveuser 11725
							//傳遞資料
11726
							conn.send(JSON.stringify(params.data));
226 liveuser 11727
 
3 liveuser 11728
							}//if end
226 liveuser 11729
 
3 liveuser 11730
						}//function end
325 liveuser 11731
 
3 liveuser 11732
					}//if end
325 liveuser 11733
 
11734
				//如果沒有 status
11735
				while(conn.status==null){
226 liveuser 11736
 
325 liveuser 11737
					//debug
11738
					console.log(conn);
11739
 
323 liveuser 11740
					//等待1秒
11741
					await window.qbpwcf.sleep.func(1);
325 liveuser 11742
 
11743
					}//while end
11744
 
11745
				//如果執行正常
11746
				if(conn.status==true){
323 liveuser 11747
 
325 liveuser 11748
					//resolve
11749
					resolve(conn.result);
11750
 
323 liveuser 11751
					}//if end
325 liveuser 11752
 
11753
				//反之
11754
				else{
11755
 
11756
					//reject
11757
					reject(conn.result);
11758
 
11759
					}//else end
11760
 
3 liveuser 11761
				});//Promise end
226 liveuser 11762
 
3 liveuser 11763
			}//function end
226 liveuser 11764
 
3 liveuser 11765
		";
226 liveuser 11766
 
401 liveuser 11767
		#js function
11768
		$conf["javaScript::toScript"]["jsFunciton"][]=
11769
		"
11770
 
11771
		/*
11772
		說明:
11773
		偵測 html input type=\"text\" 的 dom,當內容過長無法於 input 區塊完整顯現,必須滾動才能看到前後內容時,提供滾動協助的按鈕.
11774
 
11775
		範例:
11776
 
11777
		//初始化參數
11778
		var params={};
11779
 
11780
		//顯示往右滾動的icon dom,不指定就不要指定該參數.
11781
		//params.iconScrollToRight='';
11782
 
11783
		//顯示往左滾動的icon  dom,不指定就不要指定該參數.
11784
		//params.iconScrollToLeft='';
11785
 
11786
		//初始化、 設置參數
11787
		var inputTextScrollHelper=window.qbpwcf.inputTextScrollHelper.init(params);
11788
 
11789
		//執行
11790
		inputTextScrollHelper.run(event);
11791
		*/
11792
 
11793
		//該方法的物件
11794
		window.qbpwcf.inputTextScrollHelper={};
11795
 
11796
		//初始化、設定
11797
		window.qbpwcf.inputTextScrollHelper.init=function(params){
11798
 
11799
			//預設的往右滾動的div
11800
			var toRightIcon=document.createElement('div');
11801
 
11802
			//預設向右滾動的圖示會出現,且可以抓到顯示有內容的寬度.
11803
			toRightIcon.style.display='inline-block';
11804
 
11805
			//跟上個元素同位置
11806
			toRightIcon.style.position='relative';
11807
 
11808
			//設置方文字
11809
			toRightIcon.innerText='>>>';
11810
 
11811
			//設置cursor為pointer
11812
			toRightIcon.style.cursor='pointer';
11813
 
11814
			//預設的往作左滾動div
11815
			var toLeftIcon=document.createElement('div');
11816
 
11817
			//一開始不顯示
11818
			toLeftIcon.style.display='inline-block';
11819
 
11820
			//跟上個元素同位置
11821
			toLeftIcon.style.position='relative';
11822
 
11823
			//設置文字
11824
			toLeftIcon.innerText='<<<';
11825
 
11826
			//設置cursor為pointer
11827
			toLeftIcon.style.cursor='pointer';
11828
 
11829
			//如果有設置 iconScrollToRight
11830
			if(params.iconScrollToRight!=undefined){
11831
 
11832
				//設置指定的圖示
11833
				toRightIcon=params.iconScrollToRight;
11834
 
11835
				//預設向右滾動的圖示會出現,且可以抓到顯示有內容的寬度.
11836
				toRightIcon.style.display='inline-block';
11837
 
11838
				//跟上個元素同位置
11839
				toRightIcon.style.position='relative';
11840
 
11841
				//設置方文字
11842
				toRightIcon.innerText='>>>';
11843
 
11844
				//設置cursor為pointer
11845
				toRightIcon.style.cursor='pointer';
11846
 
11847
				}//if end
11848
 
11849
			//如果有設置 iconScrollToLeft
11850
			if(params.iconScrollToLeft!=undefined){
11851
 
11852
				//設置指定的圖示
11853
				toLeftIcon=params.iconScrollToLeft;
11854
 
11855
				//預設向左滾動的圖示會出現,且可以抓到顯示有內容的寬度.
11856
				toLeftIcon.style.display='inline-block';
11857
 
11858
				//跟上個元素同位置
11859
				toLeftIcon.style.position='relative';
11860
 
11861
				//設置文字
11862
				toLeftIcon.innerText='<<<';
11863
 
11864
				//設置cursor為pointer
11865
				toLeftIcon.style.cursor='pointer';
11866
 
11867
				}//if end
11868
 
11869
			//設置要回傳的結果
11870
			var result={
11871
 
11872
				//放置向右滾動的icon
11873
				'toRightIcon':toRightIcon,
11874
 
11875
				//放置向左滾動的icon
11876
				'toLeftIcon':toLeftIcon,
11877
 
11878
				//放置運行該功能的function
11879
				'run':function(event){
11880
 
11881
					//取得 input dom
11882
					var ele=event.target;
11883
 
11884
					//如果不是 input dom
11885
					if(ele.tagName!='INPUT'){
11886
 
11887
						//不做事
11888
						return false;
11889
 
11890
						}//if end
11891
 
11892
					//如果 type 不是 text
11893
					else if(ele.type!='text'){
11894
 
11895
						//不做事
11896
						return false;
11897
 
11898
						}//if end
11899
 
11900
					//如果是 mobile client
11901
					if(navigator.userAgent.includes('Mobile')){
11902
 
11903
						//不做事
11904
						return false;
11905
 
11906
						}//if end
11907
 
11908
					//取得最大的滾動寬度
11909
					var maxScrollPx=ele.scrollLeftMax;
11910
 
11911
					//如果沒有內容無法呈現
11912
					if( maxScrollPx == ele.clientWidth ){
11913
 
11914
						//不做事
11915
						return false;
11916
 
11917
						}//if end
11918
 
11919
					//如果沒有需要滾軸
11920
					if(ele.scrollLeftMax==0){
11921
 
11922
						//不做事
11923
						return false;
11924
 
11925
						}//if end
11926
 
11927
					//取得目前滾軸的位置
11928
					var scrollX=ele.scrollLeft;
11929
 
11930
					//取得一次要滾動多少px
11931
					var scrollPxPerTime=ele.clientWidth;
11932
 
11933
					//顯示向左滾動的 icon
11934
					ele.parentElement.append(result.toLeftIcon);
11935
 
11936
					//取得向左滾動的圖示其 bottom 樣式的數值
11937
					var toLeftIcon_bottomPosition=parseInt(window.getComputedStyle(ele.parentElement.children[1]).height)+parseInt(window.getComputedStyle(ele).height)/2-parseInt(window.getComputedStyle(ele.parentElement.children[1]).height)/2;
11938
 
11939
					//如果為負數
11940
					if(toLeftIcon_bottomPosition<0){
11941
 
11942
						//轉正數
11943
						toLeftIcon_bottomPosition=toLeftIcon_bottomPosition-toLeftIcon_bottomPosition*2;
11944
 
11945
						}//if end
11946
 
11947
					//位置在可視區域的最左端,且上下置中
11948
					ele.parentElement.children[1].style.bottom=toLeftIcon_bottomPosition+'px';
11949
 
11950
					//不能占用空間
11951
					ele.parentElement.children[1].style.height='0px';
11952
 
11953
					//先隱藏該按鈕
11954
					ele.parentElement.children[1].style.display='none';
11955
 
11956
					//當點擊向左滾動的icon
11957
					result.toLeftIcon.addEventListener('click',function(e){
11958
 
11959
						//取得 input dom
11960
						var inputEle=e.target.previousElementSibling;
11961
 
11962
						//滾動到新位置
11963
						inputEle.scroll(scrollX-scrollPxPerTime,0);
11964
 
11965
						//更新目前滾軸的位置
11966
						scrollX=inputEle.scrollLeft;
11967
 
11968
						//如果已經在最左邊
11969
						if(scrollX==0){
11970
 
11971
							//隱藏該按鈕
11972
							inputEle.parentElement.children[1].style.display='none';
11973
 
11974
							}//if end
11975
 
11976
						//如果還可以往右邊滾動
11977
						if(scrollX<maxScrollPx){
11978
 
11979
							//顯示向右滾動的按鈕
11980
							inputEle.parentElement.children[2].style.display='inline-block';
11981
 
11982
							}//if end
11983
 
11984
						});
11985
 
11986
					//顯示向右滾動的 icon
11987
					ele.parentElement.append(result.toRightIcon);
11988
 
11989
					//取得向右滾動的圖示其 left 樣式的數值
11990
					var toRightIcon_leftPosition=parseInt(window.getComputedStyle(ele).width)-parseInt(window.getComputedStyle(ele.parentElement.children[2]).width);
11991
 
11992
					//取得向右滾動的圖示其 bottom 樣式的數值
11993
					var toRightIcon_bottomPosition=parseInt(window.getComputedStyle(ele.parentElement.children[2]).height)+parseInt(window.getComputedStyle(ele).height)/2-parseInt(window.getComputedStyle(ele.parentElement.children[2]).height)/2;
11994
 
11995
					//如果為負數
11996
					if(toRightIcon_bottomPosition<0){
11997
 
11998
						//轉正數
11999
						toRightIcon_bottomPosition=toRightIcon_bottomPosition-toRightIcon_bottomPosition*2;
12000
 
12001
						}//if end
12002
 
12003
					//位置在可視區域的最右端
12004
					ele.parentElement.children[2].style.left=toRightIcon_leftPosition+'px';
12005
 
12006
					//且上下置中
12007
					ele.parentElement.children[2].style.bottom=toRightIcon_bottomPosition+'px';
12008
 
12009
					//且不能占用空間
12010
					ele.parentElement.children[2].style.height='0px';
12011
 
12012
					//當點擊了向右滾動的 icon
12013
					result.toRightIcon.addEventListener('click',function(e){
12014
 
12015
						//取得 input dom
12016
						var inputEle=e.target.previousElementSibling.previousElementSibling;
12017
 
12018
						//取得剩下多少可以滾動
12019
						var leftScrollPx=maxScrollPx-scrollX;
12020
 
12021
						//滾動到新位置
12022
						inputEle.scroll(scrollX+scrollPxPerTime,0);
12023
 
12024
						//更新目前滾軸的位置
12025
						scrollX=inputEle.scrollLeft;
12026
 
12027
						//如果已經在最右邊
12028
						if(scrollX>=maxScrollPx){
12029
 
12030
							//隱藏該按鈕
12031
							inputEle.parentElement.children[2].style.display='none';
12032
 
12033
							}//if end
12034
 
12035
						//如果不是在最左邊
12036
						if(scrollX!=0){
12037
 
12038
							//顯示向左滾動的按鈕
12039
							inputEle.parentElement.children[1].style.display='inline-block';
12040
 
12041
							}//if end
12042
 
12043
						});
12044
 
12045
					}//function end
12046
				};
12047
 
12048
			//回傳結果
12049
			return result;
12050
 
12051
			};//function end
12052
		";
12053
 
3 liveuser 12054
		#$conf["noScriptTag"],字串,是否不要輸出<script></script>,預設為"false",代表要輸出;反之為"true",代表不要輸出.
12055
		$conf["javaScript::toScript"]["noScriptTag"]=$conf["noScriptTag"];
226 liveuser 12056
 
3 liveuser 12057
		#參考資料:
12058
		#http://stackoverflow.com/questions/9899372/pure-javascript-equivalent-to-jquerys-ready-how-to-call-a-function-when-the
12059
		$toScript=javaScript::toScript($conf["javaScript::toScript"]);
12060
		unset($conf["javaScript::toScript"]);
12061
 
12062
		#如果建立script失敗
12063
		if($toScript["status"]==="false"){
12064
 
12065
			#設置執行失敗
12066
			$result["status"]="false";
12067
 
12068
			#設置錯誤訊息
12069
			$result["error"]=$toScript;
12070
 
12071
			#回傳結果
12072
			return $result;
12073
 
12074
			}#if end
12075
 
12076
		#取得建立好的js語法
12077
		$result["content"]=$toScript["content"];
12078
 
12079
		#設置執行正常
12080
		$result["status"]="true";
12081
 
12082
		#回傳結果
12083
		return $result;
12084
 
12085
		}#function qbpwcfJavaScript end
12086
 
12087
	/*
12088
	#函式說明:
12089
	#分段續載檔案
12090
	#回傳結果:
12091
	#$result["status"],執行正常與否,"true"代表正常,"false"代表不正常.
12092
	#$result["error"],錯誤訊息.
12093
	#$result["function"],當前執行的函式名稱.
12094
	#$result["content"],js語法.
12095
	#必填參數:
12096
	#$conf["url"],字串,下載檔案的url.
12097
	$conf["url"]="";
12098
	#可省略參數:
12099
	#$conf["scriptTag"],字串,是否要用<script>標籤包起來,預設為"true"代表要;"false"代表不要.
12100
	#$conf["scriptTag"]="true";
12101
	#$conf["partSize"],字串,一次要下載多少bytes,預設為"1024",亦即1kb.
12102
	#$conf["partSize"]="1024";
12103
	#$conf["retryIn"],字串,如果下載失敗或不完整,要幾秒後再度嘗試,預設為3.
12104
	#$conf["retryIn"]="3";
12105
	#參考資料:
12106
	#無.
12107
	#備註:
12108
	#尚不支援,關閉瀏覽器後再續載.
12109
	#server 端需要搭配 fileAccess::partDownload 方可運行
12110
	*/
12111
	public static function conDownload(&$conf=array()){
12112
 
12113
		#初始化要回傳的結果
12114
		$result=array();
12115
 
12116
		#取得當前執行的函數名稱
12117
		$result["function"]=__FUNCTION__;
12118
 
12119
		#如果沒有參數
12120
		if(func_num_args()==0){
12121
 
12122
			#設置執行失敗
12123
			$result["status"]="false";
12124
 
12125
			#設置執行錯誤訊息
12126
			$result["error"]="函數".$result["function"]."需要參數";
12127
 
12128
			#回傳結果
12129
			return $result;
12130
 
12131
		}#if end
12132
 
12133
		#取得參數
12134
		$result["argu"]=$conf;
12135
 
12136
		#如果 $conf 不為陣列
12137
		if(gettype($conf)!=="array"){
12138
 
12139
			#設置執行失敗
12140
			$result["status"]="false";
12141
 
12142
			#設置執行錯誤訊息
12143
			$result["error"][]="\$conf變數須為陣列形態";
12144
 
12145
			#如果傳入的參數為 null
12146
			if($conf===null){
12147
 
12148
				#設置執行錯誤訊息
12149
				$result["error"][]="\$conf變數不得為null,請檢查函數「".$result["function"]."」的參數設置有無正確!";
12150
 
12151
				}#if end
12152
 
12153
			#回傳結果
12154
			return $result;
12155
 
12156
			}#if end
12157
 
12158
		#檢查參數
12159
		#函式說明:
12160
		#檢查必填與可省略的參數,可省略參數可指定預設要給與什麼數值內容。
12161
		#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
12162
		#$reuslt["error"],執行不正常結束的錯訊息陣列.
12163
		#$result["function"],當前執行的函式名稱.
12164
		#$result["argu"],設置給予的參數.
12165
		#$result["passed"],識別要檢查的全體變數是否存在以及型態是否正確的變數,"true"代表檢查全部通過;"false"代表檢查不通過
12166
		#$result[$shouldBeCheckedVarName]["varExist"],所檢查的變數是否存在,"false"代表不存在;"true"代表存在
12167
		#$result[$shouldBeCheckedVarName]["varType"],所檢查的變數型態是否正確,"false"代表錯誤;"true"代表正確
12168
		#$result[$shouldBeCheckedVarName]["error"],每個參數設定的錯誤訊息
12169
		#$result["shouldNotBeEmpty"],不應該為空字串或控陣列的變數.
12170
		#$result["argu"],字串陣列,目前輸入的參數名稱陣列.
12171
		#$result["legalVarName"],字串陣列,合法可用的參數名稱陣列.
12172
		#$result["notNeedVar"],字串陣列,多餘的參數名稱.
12173
		#必填寫的參數:
12174
		#$conf["varInput"],陣列變數,要檢查的陣列變數,請在要檢查的參數前面加上&,這樣變動的結果才能被套用。
12175
		$conf["variableCheck::checkArguments"]["varInput"]=&$conf;
12176
		#$conf["referenceVarKey"],字串,$conf參數後面的key值,用於移除不要的參考陣列.
12177
		$conf["variableCheck::checkArguments"]["referenceVarKey"]="variableCheck::checkArguments";
12178
		#可以省略的參數:
12179
		#$conf["mustBeFilledVariableName"],爲必填參數的變數名稱陣列,形態爲陣列變數,元素數量需要跟"mustBeFilledVariableType"參數的元素數量一致,例如: $conf["mustBeFilledVariableName"] = array("id","account","password");
12180
		$conf["variableCheck::checkArguments"]["mustBeFilledVariableName"]=array("url");
12181
		#$conf["mustBeFilledVariableType"],爲必填參數的變數陣列應該爲何種變數形態,形態爲陣列,元素數量需要跟"mustBeFilledVariableName"參數的元素數量一致,例如: $conf["mustBeFilledVariableType"] = array("string",integer,"double","resource","object"); , null代表不指定變數形態.
12182
		$conf["variableCheck::checkArguments"]["mustBeFilledVariableType"]=array("string");
12183
		#$conf["canBeEmptyString"],字串,必填變數內容如果是空字串就不能算是有設置的話,請設為"false",預設爲"true",可以為空字串.
12184
		$conf["variableCheck::checkArguments"]["canBeEmptyString"]="false";
12185
		#$conf["canNotBeEmpty"],字串陣列,哪些必填參數的內容不得為空字串或空陣列,僅當$conf["canBeEmptyString"]為"true"時會生效.
12186
		#$conf["canNotBeEmpty"]=array();
12187
		#$conf["canBeEmpty"],字串陣列,哪些必填參數的內容可為空字串或空陣列,僅當$conf["canBeEmptyString"]為"false"時會生效.
12188
		#$conf["canBeEmpty"]=array();
12189
		#$conf["skipableVariableCanNotBeEmpty"],字串陣列,哪些可省略參數不可以為空字串或空陣列.
12190
		$conf["variableCheck::checkArguments"]["skipableVariableCanNotBeEmpty"]=array("scriptTag","partSize","retryIn");
12191
		#$conf["skipableVariableName"],陣列字串,爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableName"] = array("id","account","password");
12192
		$conf["variableCheck::checkArguments"]["skipableVariableName"]=array("scriptTag","partSize","retryIn");
12193
		#$conf["skipableVariableType"],陣列字串,爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableType"] = array("string",integer,"double");
12194
		$conf["variableCheck::checkArguments"]["skipableVariableType"]=array("string","string","string");
12195
		#$conf["skipableVarDefaultValue"],字串陣列,每個不存在的可省略變數要初始化為什麼,null與代表不指定,若預設值是參數之一,請將$conf["mustBeFilledVar"]改成"\$conf["\mustBeFilledVar\"]".
12196
		$conf["variableCheck::checkArguments"]["skipableVarDefaultValue"]=array("true","1024","3","60");
12197
		#$conf["disallowAllSkipableVarIsEmpty"],字串,是否允許每個可省略參數都為空字串,預設為"true"允許,反之為"false".
12198
		#$conf["disallowAllSkipableVarIsEmpty"]="";
12199
		#$conf["disallowAllSkipableVarIsEmptyArray"],字串,是否允許每個可省略參數都為空陣列,預設為"true"允許,反之為"false".
12200
		#$conf["disallowAllSkipableVarIsEmptyArray"]="";
12201
		#$conf["arrayCountEqualCheck"],字串陣列,為檢查哪些陣列參數的元素數量要一樣,$conf["arrayCountEqualCheck"][$i]=array()為第$i組key為哪些的變數其元素數量要相等.
12202
		#$conf["arrayCountEqualCheck"][]=array();
12203
		#參考資料來源:
12204
		#array_keys=>http://php.net/manual/en/function.array-keys.php
12205
		$checkArguments=variableCheck::checkArguments($conf["variableCheck::checkArguments"]);
12206
		unset($conf["variableCheck::checkArguments"]);
12207
 
12208
		#如果檢查參數失敗
12209
		if($checkArguments["status"]==="false"){
12210
 
12211
			#設置執行失敗
12212
			$result["status"]="false";
12213
 
12214
			#設置執行錯誤
12215
			$result["error"]=$checkArguments;
12216
 
12217
			#回傳結果
12218
			return $result;
12219
 
12220
			}#if end
12221
 
12222
		#如果檢查參數不通過
12223
		if($checkArguments["passed"]==="false"){
12224
 
12225
			#設置執行失敗
12226
			$result["status"]="false";
12227
 
12228
			#設置執行錯誤
12229
			$result["error"]=$checkArguments;
12230
 
12231
			#回傳結果
12232
			return $result;
12233
 
12234
			}#if end
12235
 
12236
		#續載的js
12237
		$result["content"]=
12238
		"
12239
			var myConDownloadAgent=new conDownloadAgent();
12240
			myConDownloadAgent.fileUrl='".$conf["url"]."';
12241
			myConDownloadAgent.partSize='".$conf["partSize"]."';
12242
			myConDownloadAgent.retryIn=".$conf["retryIn"].";
12243
			myConDownloadAgent.getPart();
12244
		";
12245
 
12246
		#如果要用<script>標籤包起來
12247
		if($conf["scriptTag"]==="true"){
12248
 
12249
			#函式說明:
12250
			#將要執行的script語法透過該函式執行(會在程式外層用<script></script>包起來).
12251
			#回傳結果:
12252
			#$result["status"],執行是否正常,"true"為正常,"false"為不正常.
12253
			#$result["error"],錯誤訊息陣列
12254
			#$result["function"],當前執行的函數名稱
12255
			#$result["content"],要執行的javaScript語法
12256
			#必填參數:
12257
			#$conf["script"],字串,要執行的javaScript語法.
12258
			$conf["javaScript::toScript"]["script"]=$result["content"];
12259
			#可省略參數:
12260
			#$conf["onReady"],字串,是否要在網頁完全載入後再執行,"false"為不等載入完就先執行,預設為"true"要等載入完再執行.
12261
			#$conf["javaScript::toScript"]["onReady"]=$conf["onReady"];
12262
			#$conf["globalJs"],字串陣列,為要放入<script>標籤的js全域變數.
12263
			#$conf["globalJs"]=array();
12264
			#$conf["jsFunciton"],字串陣列,為要放入<script>標籤的js函數.
12265
			#$conf["jsFunciton"]=array();
12266
			#參考資料:
12267
			#http://stackoverflow.com/questions/9899372/pure-javascript-equivalent-to-jquerys-ready-how-to-call-a-function-when-the
12268
			$toScript=javaScript::toScript($conf["javaScript::toScript"]);
12269
			unset($conf["javaScript::toScript"]);
12270
 
12271
			#如果轉成script失敗
12272
			if($toScript["status"]==="false"){
12273
 
12274
				#設置執行不正常
12275
				$result["status"]="false";
12276
 
12277
				#設置執行錯誤訊息
12278
				$result["error"]=$toScript;
12279
 
12280
				#回傳結果
12281
				return $result;
12282
 
12283
				}#if end
12284
 
12285
			#取得js語法
12286
			$result["content"]=$toScript["content"];
12287
 
12288
			}#if end
12289
 
12290
		#設置執行正常
12291
		$result["status"]="true";
12292
 
12293
		#回傳結果
12294
		return $result;
12295
 
12296
		}#function conDownload end
226 liveuser 12297
 
3 liveuser 12298
	/*
12299
	#函式說明:
12300
	#建立rwd的置頂menu,橫向span選單遇到寬度不足會變成div選單,其中第一個元素爲Logo.
12301
	#回傳結果:
12302
	#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
12303
	#$result["error"],錯誤訊息.
12304
	#$result["function"],當前執行的函數名稱.
12305
	#$result["content"],語法.
12306
	#必填參數:
12307
	#$conf["firstEleId"],字串,選單的擡頭元素id.
12308
	$conf["firstEleId"]="";
12309
	#$conf["otherEleClass"],字串,除擡頭選單外項目的共同類別名稱.
12310
	$conf["otherEleClass"]="";
226 liveuser 12311
	#可省略參數:
3 liveuser 12312
	#$conf["bgColor"],字串,選單的背景顏色,預設爲"#FFFFFF".
12313
	#$conf["bgColor"]="";
12314
	#參考資料:
12315
	#無.
12316
	#備註:
12317
	#bgColor尚未實作
12318
	#固定在頂端或底端的功能未實作
12319
	*/
12320
	public static function rwdMenu($conf){
226 liveuser 12321
 
3 liveuser 12322
		return css::rwdMenu($conf);
226 liveuser 12323
 
3 liveuser 12324
		}#function rwdMenu end
226 liveuser 12325
 
3 liveuser 12326
	/*
12327
	#函式說明:
12328
	#建立廣告幻燈片,實際上為div的背景會隨着時間變化.
12329
	#回傳結果:
12330
	#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
12331
	#$result["error"],錯誤訊息.
12332
	#$result["function"],當前執行的函數名稱.
12333
	#$result["content"],語法.
12334
	#必填參數:
12335
	#$conf["divId"],字串,廣告區域的div id.
12336
	$conf["divId"]="";
12337
	#$conf["divClass"],字串,廣告區域用於套用動畫效果的div class名稱.
12338
	$conf["divClass"]="";
12339
	#$conf["adImg"],字串陣列,廣告圖片的網站陣列.
12340
	$conf["adImg"]=array();
226 liveuser 12341
	#可省略參數:
3 liveuser 12342
	#無.
12343
	#參考資料:
12344
	#無.
12345
	#備註:
12346
	#bgColor尚未實作
12347
	#固定在頂端或底端的功能未實作
12348
	*/
12349
	public static function adImg($conf){
226 liveuser 12350
 
3 liveuser 12351
		#初始化要回傳的結果
12352
		$result=array();
12353
 
12354
		#取得當前執行的函數名稱
12355
		$result["function"]=__FUNCTION__;
12356
 
12357
		#如果沒有參數
12358
		if(func_num_args()==0){
12359
 
12360
			#設置執行失敗
12361
			$result["status"]="false";
12362
 
12363
			#設置執行錯誤訊息
12364
			$result["error"]="函數".$result["function"]."需要參數";
12365
 
12366
			#回傳結果
12367
			return $result;
12368
 
12369
			}#if end
12370
 
12371
		#取得參數
12372
		$result["argu"]=$conf;
12373
 
12374
		#如果 $conf 不為陣列
12375
		if(gettype($conf)!=="array"){
12376
 
12377
			#設置執行失敗
12378
			$result["status"]="false";
12379
 
12380
			#設置執行錯誤訊息
12381
			$result["error"][]="\$conf變數須為陣列形態";
12382
 
12383
			#如果傳入的參數為 null
12384
			if($conf===null){
12385
 
12386
				#設置執行錯誤訊息
12387
				$result["error"][]="\$conf變數不得為null,請檢查函數「".$result["function"]."」的參數設置有無正確!";
12388
 
12389
				}#if end
12390
 
12391
			#回傳結果
12392
			return $result;
12393
 
12394
			}#if end
12395
 
12396
		#檢查參數
12397
		#函式說明:
12398
		#檢查必填與可省略的參數,可省略參數可指定預設要給與什麼數值內容。
12399
		#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
12400
		#$reuslt["error"],執行不正常結束的錯訊息陣列.
12401
		#$result["function"],當前執行的函式名稱.
12402
		#$result["passed"],識別要檢查的全體變數是否存在以及型態是否正確的變數,"true"代表檢查全部通過;"false"代表檢查不通過
12403
		#$result[$shouldBeCheckedVarName]["varExist"],所檢查的變數是否存在,"false"代表不存在;"true"代表存在
12404
		#$result[$shouldBeCheckedVarName]["varType"],所檢查的變數型態是否正確,"false"代表錯誤;"true"代表正確
12405
		#$result[$shouldBeCheckedVarName]["error"],每個參數設定的錯誤訊息
12406
		#$result["shouldNotBeEmpty"],不應該為空字串或控陣列的變數.
12407
		#$result["argu"],字串陣列,目前輸入的參數名稱陣列.
12408
		#$result["legalVarName"],字串陣列,合法可用的參數名稱陣列.
12409
		#$result["notNeedVar"],字串陣列,多餘的參數名稱.
12410
		#必填參數:
12411
		#$conf["varInput"],陣列變數,要檢查的陣列變數,請在要檢查的參數前面加上&,這樣變動的結果才能被套用。
12412
		$conf["variableCheck::checkArguments"]["varInput"]=&$conf;
12413
		#$conf["mustBeFilledVariableName"],爲必填參數的變數名稱陣列,形態爲陣列變數,元素數量需要跟"mustBeFilledVariableType"參數的元素數量一致,例如: $conf["mustBeFilledVariableName"] = array("id","account","password");
12414
		$conf["variableCheck::checkArguments"]["mustBeFilledVariableName"]=array("divId","divClass","adImg");
12415
		#$conf["mustBeFilledVariableType"],爲必填參數的變數陣列應該爲何種變數形態,形態爲陣列,元素數量需要跟"mustBeFilledVariableName"參數的元素數量一致,例如: $conf["mustBeFilledVariableType"] = array("string",integer,"double","resource","object"); , null代表不指定變數形態.
12416
		$conf["variableCheck::checkArguments"]["mustBeFilledVariableType"]=array("string","string","array");
12417
		#$conf["referenceVarKey"],字串,$conf參數後面的key值,用於移除不要的參考陣列.
12418
		$conf["variableCheck::checkArguments"]["referenceVarKey"]="variableCheck::checkArguments";
12419
		#可以省略的參數:
12420
		#$conf["canBeEmptyString"],字串,必填變數內容如果是空字串就不能算是有設置的話,請設為"false",預設爲"true",可以為空字串.
12421
		$conf["variableCheck::checkArguments"]["canBeEmptyString"]="false";
12422
		#$conf["skipableVariableCanNotBeEmpty"],字串陣列,哪些可省略參數不可以為空字串或集合.
12423
		#$conf["variableCheck::checkArguments"]["skipableVariableCanNotBeEmpty"]=array("bgColor");
12424
		#$conf["skipableVariableName"],陣列字串,爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableName"] = array("id","account","password");
12425
		#$conf["variableCheck::checkArguments"]["skipableVariableName"]=array("bgColor");
12426
		#$conf["skipableVariableType"],陣列字串,爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableType"] = array("string",integer,"double");
12427
		#$conf["variableCheck::checkArguments"]["skipableVariableType"]=array("string");
12428
		#$conf["skipableVarDefaultValue"],字串陣列,每個不存在的可省略變數要初始化為什麼,null與代表不指定,若預設值是參數之一,請將$conf["mustBeFilledVar"]改成"\$conf["\mustBeFilledVar\"]".
12429
		#$conf["variableCheck::checkArguments"]["skipableVarDefaultValue"]=array("#FFFFFF");
12430
		#$conf["arrayCountEqualCheck"],字串陣列,為檢查哪些陣列參數的元素數量要一樣,$conf["arrayCountEqualCheck"][$i]=array()為第$i組key為哪些的變數其元素數量要相等.
12431
		#$conf["variableCheck::checkArguments"]["arrayCountEqualCheck"][]=array("headOrTail","target","styleAttr","styleVal","content");
12432
		#參考資料來源:
12433
		#array_keys=>http://php.net/manual/en/function.array-keys.php
12434
		$checkArguments=variableCheck::checkArguments($conf["variableCheck::checkArguments"]);
12435
		unset($conf["variableCheck::checkArguments"]);
12436
 
12437
		#如果檢查參數失敗
12438
		if($checkArguments["status"]==="false"){
12439
 
12440
			#設置執行不正常
12441
			$result["status"]="false";
12442
 
12443
			#設置執行錯誤
12444
			$result["error"]=$checkArguments;
12445
 
12446
			#回傳結果
12447
			return $result;
12448
 
12449
			}#if end
12450
 
12451
		#如果檢查參數不通過
12452
		if($checkArguments["passed"]==="false"){
12453
 
12454
			#設置執行不正常
12455
			$result["status"]="false";
12456
 
12457
			#設置執行錯誤
12458
			$result["error"]=$checkArguments;
12459
 
12460
			#回傳結果
12461
			return $result;
12462
 
12463
			}#if end
226 liveuser 12464
 
3 liveuser 12465
		#初始化要回傳的語法
12466
		$result["content"]="";
226 liveuser 12467
 
3 liveuser 12468
		#ad bar
12469
		#函式說明:
12470
		#<div>區塊,裡面可以指定css的class樣式,可以指定提示文字.
12471
		#$result["status"],字串,執行否正常,"true"代表正常,"false"代表不正常.
12472
		#$result["functin"],字串,當前函數的名稱.
12473
		#$result["error"],陣列,錯訊訊息.
12474
		#$result["content"],字串,含有<div>標籤的內容.
12475
		#必填參數:
12476
		#$conf["contentArray"],字串陣列,要放入的內容陣列.
12477
		$conf["css::divSection"]["contentArray"]=array("");
12478
		#可省略參數
12479
		#$conf["id"],字串,div區塊的id.
12480
		$conf["css::divSection"]["id"]=$conf["divId"];
12481
		#$conf["styleAttr"],字串陣列,給div區段要套用的style樣式屬性.
12482
		$conf["css::divSection"]["styleAttr"]=array("width","height","background-size");
12483
		#$conf["styleVal"],字串陣列,給div區段要套用的style樣式數值.
12484
		$conf["css::divSection"]["styleVal"]=array("100vw","100vh","cover");
12485
		#$conf["class"],字串,div區段要套用的css樣式.
12486
		$conf["css::divSection"]["class"]=$conf["divClass"];
12487
		#$conf["title"],陣列,滑鼠移到上面時要顯示的內容,每個元素代表一列內容.
12488
		#$conf["title"]=array();
12489
		#$conf["oneScreenSize"],字串,div區塊是否要占一個螢幕的大小,預設為"false"不設定,"true"為設定成一個螢幕的大小.
12490
		#$conf["oneScreenSize"]="false";
12491
		#$conf["textAlignCenter"],字串,div區塊是否要置中,預設為$conf["oneScreenSize"]的值,"false"為不置中,"true"代表要置中.
12492
		$conf["css::divSection"]["textAlignCenter"]="true";
12493
		#$conf["data"],字串陣列,每個要設置的屬性data內容,例如array("option1"=>"A","option2"=>"B"),預設不使用.
12494
		#$conf["data"]=array();
12495
		$divSection=css::divSection($conf["css::divSection"]);
12496
		unset($conf["css::divSection"]);
12497
 
12498
		#如果建立div區塊失敗
12499
		if($divSection["status"]==="false"){
226 liveuser 12500
 
3 liveuser 12501
			#設置執行失敗
12502
			$result["status"]="false";
226 liveuser 12503
 
3 liveuser 12504
			#設置錯誤訊息
12505
			$result["error"]=$divSection;
226 liveuser 12506
 
3 liveuser 12507
			#回傳結果
12508
			return $result;
226 liveuser 12509
 
3 liveuser 12510
			}#if end
12511
 
12512
		#儲存內容
12513
		$result["content"]=$result["content"].$divSection["content"];
226 liveuser 12514
 
3 liveuser 12515
		#儲存廣告圖片的計數
12516
		$adImgCount=count($conf["adImg"]);
226 liveuser 12517
 
3 liveuser 12518
		#函式說明:
12519
		#製作針對 css class 的動畫,請套用在div上,才會有效果
12520
		#回傳結果:
12521
		#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
12522
		#$result["content"],css動畫設定的語法
12523
		#$result["function"],當前執行的函數
12524
		#$result["error"],涵式錯誤訊息陣列
12525
		#$result["warning"],警告訊息陣列
12526
		#必填參數:
12527
		#$conf["name"],字串,css動畫的名稱.
12528
		$conf["css::animation"]["name"]=$conf["divClass"];
12529
		#$conf["durationTime"],字串,整個動畫需要幾秒完成,例如"5s".
12530
		$durationTime=$adImgCount*5;
12531
		$durationTime=$durationTime."s";
12532
		$conf["css::animation"]["durationTime"]=$durationTime;
12533
		#$conf["iteration"],字串,整個動畫要重複幾次,"infinite"代表不斷地重複,"0"代表不重複執行.
12534
		$conf["css::animation"]["iteration"]="infinite";
12535
		#$conf["direction"],字串,動畫要怎麼樣重複,"alternate"代表來回執行,"normal"代表正常執行.
12536
		$conf["css::animation"]["direction"]="alternate";
12537
		#$conf["delay"],字串,動畫要延遲幾秒開始,例如"0s".
12538
		$conf["css::animation"]["delay"]="0s";
12539
		#$conf["speedMode"],字串,動畫執行過程的速度要用什麼模式來執行,"linear"代表等速,"ease"代表起始跟結尾是靜止的,中間是最快的.
12540
		$conf["css::animation"]["speedMode"]="linear";
12541
		#可省略參數:
226 liveuser 12542
 
3 liveuser 12543
		#每個廣告圖片的依存時間百分比.
12544
		$perImgPercentage=(int)(100/$adImgCount/2);
226 liveuser 12545
 
3 liveuser 12546
		#$conf["keyFrameStartPoint"],字串陣列,各個動畫單位開始的時間百分比,"0%"與"from"代表一開始,"100%"與"to"代表時間結束.
12547
		#$conf["css::animation"]["keyFrameStartPoint"]=array("0%","10%","30%","70%","90%","100%");
226 liveuser 12548
 
3 liveuser 12549
		#針對每個廣告圖片
12550
		for($i=1;$i<=$adImgCount*2;$i=$i+2){
226 liveuser 12551
 
3 liveuser 12552
			#如果是第一個
12553
			if($i===1){
226 liveuser 12554
 
3 liveuser 12555
				#起始點
226 liveuser 12556
				$conf["css::animation"]["keyFrameStartPoint"][]="0%";
3 liveuser 12557
				$conf["css::animation"]["keyFrameStartPoint"][]=$perImgPercentage*$i."%";
226 liveuser 12558
 
3 liveuser 12559
				}#if end
226 liveuser 12560
 
3 liveuser 12561
			#反之如果是最後一個
12562
			else if($i===$adImgCount*2-1){
226 liveuser 12563
 
3 liveuser 12564
				#最後一點
12565
				$conf["css::animation"]["keyFrameStartPoint"][]=$perImgPercentage*($i)."%";
12566
				$conf["css::animation"]["keyFrameStartPoint"][]="100%";
226 liveuser 12567
 
3 liveuser 12568
				}#if end
226 liveuser 12569
 
3 liveuser 12570
			#其他狀況
12571
			else{
12572
				#擺兩個點,在區間內呈現
12573
				$conf["css::animation"]["keyFrameStartPoint"][]=$perImgPercentage*($i-1)."%";
226 liveuser 12574
 
3 liveuser 12575
				#$i多加1
12576
				$conf["css::animation"]["keyFrameStartPoint"][]=$perImgPercentage*($i+1)."%";
226 liveuser 12577
 
3 liveuser 12578
				}#else end
226 liveuser 12579
 
3 liveuser 12580
			}#for end
226 liveuser 12581
 
3 liveuser 12582
		#debug
12583
		#var_dump($conf["css::animation"]["keyFrameStartPoint"]);
226 liveuser 12584
 
3 liveuser 12585
		#$conf["keyFrameCssMoveAttribute"],二維字串陣列,各個動畫影格子的與動畫相關的css屬性.
12586
		#$conf["keyFrameCssMoveAttribute"][]=array();
12587
		#$conf["keyFrameCssMoveValue"],二維字串陣列,各個動畫影格子的與動畫相關的css屬性.
12588
		#$conf["keyFrameCssMoveValue"][]=array();
226 liveuser 12589
 
3 liveuser 12590
		#$conf["keyFrameCssAttribute"],二維字串陣列,各個動畫影格子的一般非動畫的css屬性.
226 liveuser 12591
 
3 liveuser 12592
		#跑 $adImgCount*2 的次數
12593
		for($i=0;$i<$adImgCount*2;$i++){
226 liveuser 12594
 
3 liveuser 12595
			$conf["css::animation"]["keyFrameCssAttribute"][]=array("background-image");
226 liveuser 12596
 
3 liveuser 12597
			}#for end
226 liveuser 12598
 
3 liveuser 12599
		#$conf["keyFrameCssValue"],二維字串陣列,各個動畫格子的css屬性數值.
226 liveuser 12600
 
3 liveuser 12601
		#跑 $adImgCount 的次數
12602
		for($i=0;$i<$adImgCount;$i++){
226 liveuser 12603
 
3 liveuser 12604
			#兩個點的圖片要一致
12605
			$conf["css::animation"]["keyFrameCssValue"][]=array("url('".$conf["adImg"][$i]."')");
12606
			$conf["css::animation"]["keyFrameCssValue"][]=array("url('".$conf["adImg"][$i]."')");
226 liveuser 12607
 
3 liveuser 12608
			}#for end
226 liveuser 12609
 
3 liveuser 12610
		#參考資料:
12611
		#css動畫,http://blogger.gtwang.org/2013/12/using-css3-animation.html
12612
		#w3c的animation-keyframes,http://www.w3schools.com/cssref/css3_pr_animation-keyframes.asp
12613
		$animation=css::animation($conf["css::animation"]);
12614
		unset($conf["css::animation"]);
226 liveuser 12615
 
3 liveuser 12616
		#如果建立動畫失敗
12617
		if($animation["status"]==="false"){
226 liveuser 12618
 
3 liveuser 12619
			#設置執行失敗
12620
			$result["status"]="false";
226 liveuser 12621
 
3 liveuser 12622
			#設置錯誤訊息
12623
			$result["error"]=$animation;
226 liveuser 12624
 
3 liveuser 12625
			#回傳結果
12626
			return $result;
226 liveuser 12627
 
3 liveuser 12628
			}#if end
12629
 
12630
		#儲存內容
12631
		$result["content"]=$result["content"].$animation["content"];
226 liveuser 12632
 
3 liveuser 12633
		#函式說明:
12634
		#將要執行的script語法透過該函式執行(會在程式外層用<script></script>包起來).
12635
		#回傳結果:
12636
		#$result["status"],執行是否正常,"true"為正常,"false"為不正常.
12637
		#$result["error"],錯誤訊息陣列
12638
		#$result["function"],當前執行的函數名稱
12639
		#$result["content"],要執行的javaScript語法
12640
		#必填參數:
12641
		#$conf["script"],字串,要執行的javaScript語法.
12642
		$conf["javaScript::toScript"]["script"]=
12643
		"
12644
		//debug
12645
		console.log('loaded');
226 liveuser 12646
 
3 liveuser 12647
		//get scroll div
12648
		var scrollDiv=document.getElementById('".$conf["divId"]."');
226 liveuser 12649
 
3 liveuser 12650
		//set click one to 0
226 liveuser 12651
		scrollDiv.dataset.clickOnce=0;
12652
 
3 liveuser 12653
		//scrolliv click event
12654
		scrollDiv.addEventListener('click',function(e){
226 liveuser 12655
 
3 liveuser 12656
			//set scroll div id
12657
			var scrollDivId='".$conf["divId"]."';
226 liveuser 12658
 
3 liveuser 12659
			//get scroll div
12660
			var scrollDiv=document.getElementById(scrollDivId);
226 liveuser 12661
 
3 liveuser 12662
			//如果已經點擊過一次了
12663
			if(scrollDiv.dataset.clickOnce==='1'){
12664
 
12665
				//結束事件
12666
				return true;
226 liveuser 12667
 
12668
				}//if end
12669
 
3 liveuser 12670
			//觸發者非div
12671
			if(e.target.id!==scrollDivId){
226 liveuser 12672
 
3 liveuser 12673
				//debug
12674
				console.log(e.target.id+'!=='+scrollDivId);
226 liveuser 12675
 
3 liveuser 12676
				//debug
12677
				console.log(e.target);
226 liveuser 12678
 
3 liveuser 12679
				//end function
12680
				return false;
226 liveuser 12681
 
3 liveuser 12682
				}//if end
226 liveuser 12683
 
3 liveuser 12684
			//debug
12685
			console.log(e.target);
226 liveuser 12686
 
3 liveuser 12687
			//get target computed style
12688
			var tcs=window.getComputedStyle(e.target,null);
226 liveuser 12689
 
3 liveuser 12690
			//debug
12691
			console.log(tcs);
226 liveuser 12692
 
3 liveuser 12693
			//get style background image url
12694
			var tcsBg=tcs.backgroundImage;
226 liveuser 12695
 
3 liveuser 12696
			//debug
12697
			console.log(tcsBg);
226 liveuser 12698
 
3 liveuser 12699
			//split by '/'
12700
			var splitedStr=tcsBg.split('/');
226 liveuser 12701
 
12702
			//debug
3 liveuser 12703
			for(i=0;i<splitedStr.length;i++){
226 liveuser 12704
 
3 liveuser 12705
				//show each section str
12706
				console.log(splitedStr[i]);
226 liveuser 12707
 
3 liveuser 12708
				}//for end
226 liveuser 12709
 
3 liveuser 12710
			//get clicked image file name
226 liveuser 12711
			var clickedImgName=splitedStr[splitedStr.length-1].split('\")')[0];
12712
 
3 liveuser 12713
			//debug
12714
			console.log(clickedImgName);
226 liveuser 12715
 
3 liveuser 12716
			//split by '\"'
12717
			var splitedStr=tcsBg.split('\"');
226 liveuser 12718
 
3 liveuser 12719
			//get clickedImgUrl
226 liveuser 12720
			var clickedImgUrl=splitedStr[1];
12721
 
3 liveuser 12722
			//debug
226 liveuser 12723
			console.log(clickedImgUrl);
12724
 
3 liveuser 12725
			//delete applied class
12726
			scrollDiv.classList={};
226 liveuser 12727
 
3 liveuser 12728
			//set clicked image
12729
			scrollDiv.style.backgroundImage='url('+clickedImgUrl+')';
226 liveuser 12730
 
3 liveuser 12731
			//設置點擊過一次了
12732
			scrollDiv.dataset.clickOnce='1';
12733
 
12734
			//scrolliv click event
12735
			scrollDiv.addEventListener('click',function(e){
226 liveuser 12736
 
3 liveuser 12737
				//set scroll div id
12738
				var scrollDivId='".$conf["divId"]."';
226 liveuser 12739
 
3 liveuser 12740
				//get scroll div
12741
				var scrollDiv=document.getElementById(scrollDivId);
226 liveuser 12742
 
3 liveuser 12743
				//如果已經點擊過一次了
12744
				if(scrollDiv.dataset.clickOnce!=='1'){
12745
 
12746
					//結束執行
12747
					return true;
226 liveuser 12748
 
3 liveuser 12749
					}//if end
226 liveuser 12750
 
3 liveuser 12751
				//debug
12752
				console.log('should change to next pic');
226 liveuser 12753
 
3 liveuser 12754
				//debug
12755
				console.log(e.target);
226 liveuser 12756
 
3 liveuser 12757
				//get target computed style
12758
				var tcs=window.getComputedStyle(e.target,null);
226 liveuser 12759
 
3 liveuser 12760
				//debug
12761
				console.log(tcs);
226 liveuser 12762
 
3 liveuser 12763
				//get style background image url
12764
				var tcsBg=tcs.backgroundImage;
226 liveuser 12765
 
3 liveuser 12766
				//debug
12767
				console.log(tcsBg);
226 liveuser 12768
 
3 liveuser 12769
				//split by '/'
12770
				var splitedStr=tcsBg.split('/');
226 liveuser 12771
 
12772
				//debug
3 liveuser 12773
				for(i=0;i<splitedStr.length;i++){
226 liveuser 12774
 
3 liveuser 12775
					//show each section str
12776
					console.log(splitedStr[i]);
226 liveuser 12777
 
3 liveuser 12778
					}//for end
226 liveuser 12779
 
3 liveuser 12780
				//get clicked image file name
226 liveuser 12781
				var clickedImgName=splitedStr[splitedStr.length-1].split('\")')[0];
12782
 
3 liveuser 12783
				//debug
12784
				console.log(clickedImgName);
226 liveuser 12785
 
3 liveuser 12786
				//split by '\"'
12787
				var splitedStr=tcsBg.split('\"');
226 liveuser 12788
 
3 liveuser 12789
				//get clickedImgUrl
226 liveuser 12790
				var clickedImgUrl=splitedStr[1];
12791
 
3 liveuser 12792
				//debug
226 liveuser 12793
				console.log(clickedImgUrl);
12794
 
3 liveuser 12795
				//set img array
12796
				var imgArray=".json_encode($conf["adImg"]).";
226 liveuser 12797
 
3 liveuser 12798
				//無窮迴圈
12799
				for(i=0;i<".$adImgCount.";i++){
226 liveuser 12800
 
3 liveuser 12801
					//如果找到點擊的圖片
12802
					if(clickedImgUrl.includes(imgArray[i])){
226 liveuser 12803
 
3 liveuser 12804
						//debug
12805
						console.log(i+'<".$adImgCount."');
226 liveuser 12806
 
3 liveuser 12807
						//如果是最後一張圖片
12808
						if(i===".$adImgCount."-1){
226 liveuser 12809
 
3 liveuser 12810
							//設置為第一張圖片
12811
							i=0;
226 liveuser 12812
 
3 liveuser 12813
							}
226 liveuser 12814
 
3 liveuser 12815
						//反之+1
12816
						else{
226 liveuser 12817
 
3 liveuser 12818
							i++;
226 liveuser 12819
 
3 liveuser 12820
							}//else end
226 liveuser 12821
 
3 liveuser 12822
						//debug
12823
						console.log('set img to '+imgArray[i]);
226 liveuser 12824
 
3 liveuser 12825
						//set clicked image
12826
						scrollDiv.style.backgroundImage='url('+imgArray[i]+')';
226 liveuser 12827
 
3 liveuser 12828
						//debug
12829
						console.log('end for');
226 liveuser 12830
 
3 liveuser 12831
						//end for
12832
						break;
226 liveuser 12833
 
3 liveuser 12834
						}//if end
226 liveuser 12835
 
3 liveuser 12836
					}//for end
226 liveuser 12837
 
3 liveuser 12838
				});//scrollDiv addEventListener end
226 liveuser 12839
 
3 liveuser 12840
			});//scrollDiv click event end
12841
		";
12842
		#可省略參數:
12843
		#$conf["onReady"],字串,是否要在網頁完全載入後再執行,"false"為不等載入完就先執行,預設為"true"要等載入完再執行.
12844
		#$conf["onReady"]="true";
12845
		#$conf["globalJs"],字串陣列,為要放入<script>標籤的js全域變數.
12846
		#$conf["globalJs"]=array();
12847
		#$conf["jsFunciton"],字串陣列,為要放入<script>標籤的js函數.
12848
		#$conf["jsFunciton"]=array();
12849
		#參考資料:
12850
		#http://stackoverflow.com/questions/9899372/pure-javascript-equivalent-to-jquerys-ready-how-to-call-a-function-when-the
12851
		$toScript=javaScript::toScript($conf["javaScript::toScript"]);
12852
		unset($conf["javaScript::toScript"]);
226 liveuser 12853
 
3 liveuser 12854
		#如果建立 script 語法失敗
12855
		if($toScript["status"]==="false"){
226 liveuser 12856
 
3 liveuser 12857
			#設置執行失敗
12858
			$result["status"]="false";
226 liveuser 12859
 
3 liveuser 12860
			#設置錯誤訊息
12861
			$result["error"]=$toScript;
226 liveuser 12862
 
3 liveuser 12863
			#回傳結果
12864
			return $result;
226 liveuser 12865
 
3 liveuser 12866
			}#if end
226 liveuser 12867
 
3 liveuser 12868
		#儲存內容
12869
		$result["content"]=$result["content"].$toScript["content"];
226 liveuser 12870
 
3 liveuser 12871
		#設置執行正常
12872
		$result["status"]="true";
226 liveuser 12873
 
3 liveuser 12874
		#回傳結果
226 liveuser 12875
		return $result;
12876
 
3 liveuser 12877
		}//function adImg end
226 liveuser 12878
 
3 liveuser 12879
	/*
12880
	#函式說明:
12881
	#區塊輪播的效果
12882
	#回傳結果:
12883
	#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
12884
	#$result["error"],錯誤訊息.
12885
	#$result["function"],當前執行的函數名稱.
12886
	#$result["content"],語法.
12887
	#必填參數:
12888
	#$conf["place"],字串,輪播區塊要在哪個元素裡面呈現,其區塊特徵為何?(請參閱javascript的querySelector函式).
12889
	$conf["place"]="";
12890
	#$conf["slideDiv"],字串陣列,每個投影片的div區塊特徵(請參閱javascript的querySelector函式).
12891
	$conf["slideDiv"]=array("");
226 liveuser 12892
	#可省略參數:
3 liveuser 12893
	#$conf["sec"],字串,過幾秒就要置換成下一張投影片,預設為"5",代表每5秒就換一張投影片.
12894
	#$conf["sec"]="5";
12895
	#參考資料:
12896
	#無.
12897
	#備註:
12898
	#無.
12899
	*/
12900
	public static function slideDiv(&$conf){
12901
 
12902
		#初始化要回傳的結果
12903
		$result=array();
12904
 
12905
		#取得當前執行的函數名稱
12906
		$result["function"]=__FUNCTION__;
12907
 
12908
		#如果沒有參數
12909
		if(func_num_args()==0){
12910
 
12911
			#設置執行失敗
12912
			$result["status"]="false";
12913
 
12914
			#設置執行錯誤訊息
12915
			$result["error"]="函數".$result["function"]."需要參數";
12916
 
12917
			#回傳結果
12918
			return $result;
12919
 
12920
			}#if end
12921
 
12922
		#取得參數
12923
		$result["argu"]=$conf;
12924
 
12925
		#如果 $conf 不為陣列
12926
		if(gettype($conf)!=="array"){
12927
 
12928
			#設置執行失敗
12929
			$result["status"]="false";
12930
 
12931
			#設置執行錯誤訊息
12932
			$result["error"][]="\$conf變數須為陣列形態";
12933
 
12934
			#如果傳入的參數為 null
12935
			if($conf===null){
12936
 
12937
				#設置執行錯誤訊息
12938
				$result["error"][]="\$conf變數不得為null,請檢查函數「".$result["function"]."」的參數設置有無正確!";
12939
 
12940
				}#if end
12941
 
12942
			#回傳結果
12943
			return $result;
12944
 
12945
			}#if end
12946
 
12947
		#檢查參數
12948
		#函式說明:
12949
		#檢查必填與可省略的參數,可省略參數可指定預設要給與什麼數值內容。
12950
		#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
12951
		#$reuslt["error"],執行不正常結束的錯訊息陣列.
12952
		#$result["function"],當前執行的函式名稱.
12953
		#$result["passed"],識別要檢查的全體變數是否存在以及型態是否正確的變數,"true"代表檢查全部通過;"false"代表檢查不通過
12954
		#$result[$shouldBeCheckedVarName]["varExist"],所檢查的變數是否存在,"false"代表不存在;"true"代表存在
12955
		#$result[$shouldBeCheckedVarName]["varType"],所檢查的變數型態是否正確,"false"代表錯誤;"true"代表正確
12956
		#$result[$shouldBeCheckedVarName]["error"],每個參數設定的錯誤訊息
12957
		#$result["shouldNotBeEmpty"],不應該為空字串或控陣列的變數.
12958
		#$result["argu"],字串陣列,目前輸入的參數名稱陣列.
12959
		#$result["legalVarName"],字串陣列,合法可用的參數名稱陣列.
12960
		#$result["notNeedVar"],字串陣列,多餘的參數名稱.
12961
		#必填參數:
12962
		#$conf["varInput"],陣列變數,要檢查的陣列變數,請在要檢查的參數前面加上&,這樣變動的結果才能被套用。
12963
		$conf["variableCheck::checkArguments"]["varInput"]=&$conf;
12964
		#$conf["mustBeFilledVariableName"],爲必填參數的變數名稱陣列,形態爲陣列變數,元素數量需要跟"mustBeFilledVariableType"參數的元素數量一致,例如: $conf["mustBeFilledVariableName"] = array("id","account","password");
12965
		$conf["variableCheck::checkArguments"]["mustBeFilledVariableName"]=array("place","slideDiv");
12966
		#$conf["mustBeFilledVariableType"],爲必填參數的變數陣列應該爲何種變數形態,形態爲陣列,元素數量需要跟"mustBeFilledVariableName"參數的元素數量一致,例如: $conf["mustBeFilledVariableType"] = array("string",integer,"double","resource","object"); , null代表不指定變數形態.
12967
		$conf["variableCheck::checkArguments"]["mustBeFilledVariableType"]=array("string","array");
12968
		#$conf["referenceVarKey"],字串,$conf參數後面的key值,用於移除不要的參考陣列.
12969
		$conf["variableCheck::checkArguments"]["referenceVarKey"]="variableCheck::checkArguments";
12970
		#可以省略的參數:
12971
		#$conf["canBeEmptyString"],字串,必填變數內容如果是空字串就不能算是有設置的話,請設為"false",預設爲"true",可以為空字串.
12972
		$conf["variableCheck::checkArguments"]["canBeEmptyString"]="false";
12973
		#$conf["skipableVariableCanNotBeEmpty"],字串陣列,哪些可省略參數不可以為空字串或集合.
12974
		$conf["variableCheck::checkArguments"]["skipableVariableCanNotBeEmpty"]=array("sec");
12975
		#$conf["skipableVariableName"],陣列字串,爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableName"] = array("id","account","password");
12976
		$conf["variableCheck::checkArguments"]["skipableVariableName"]=array("sec");
12977
		#$conf["skipableVariableType"],陣列字串,爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableType"] = array("string",integer,"double");
12978
		$conf["variableCheck::checkArguments"]["skipableVariableType"]=array("string");
12979
		#$conf["skipableVarDefaultValue"],字串陣列,每個不存在的可省略變數要初始化為什麼,null與代表不指定,若預設值是參數之一,請將$conf["mustBeFilledVar"]改成"\$conf["\mustBeFilledVar\"]".
12980
		$conf["variableCheck::checkArguments"]["skipableVarDefaultValue"]=array("5");
12981
		#$conf["arrayCountEqualCheck"],字串陣列,為檢查哪些陣列參數的元素數量要一樣,$conf["arrayCountEqualCheck"][$i]=array()為第$i組key為哪些的變數其元素數量要相等.
12982
		#$conf["variableCheck::checkArguments"]["arrayCountEqualCheck"][]=array("headOrTail","target","styleAttr","styleVal","content");
12983
		#參考資料來源:
12984
		#array_keys=>http://php.net/manual/en/function.array-keys.php
12985
		$checkArguments=variableCheck::checkArguments($conf["variableCheck::checkArguments"]);
12986
		unset($conf["variableCheck::checkArguments"]);
12987
 
12988
		#如果檢查參數失敗
12989
		if($checkArguments["status"]==="false"){
12990
 
12991
			#設置執行不正常
12992
			$result["status"]="false";
12993
 
12994
			#設置執行錯誤
12995
			$result["error"]=$checkArguments;
12996
 
12997
			#回傳結果
12998
			return $result;
12999
 
13000
			}#if end
13001
 
13002
		#如果檢查參數不通過
13003
		if($checkArguments["passed"]==="false"){
13004
 
13005
			#設置執行不正常
13006
			$result["status"]="false";
13007
 
13008
			#設置執行錯誤
13009
			$result["error"]=$checkArguments;
13010
 
13011
			#回傳結果
13012
			return $result;
13013
 
13014
			}#if end
226 liveuser 13015
 
3 liveuser 13016
		#初始化要回傳的語法
13017
		$result["content"]="";
226 liveuser 13018
 
3 liveuser 13019
		#函式說明:
13020
		#將要執行的script語法透過該函式執行(會在程式外層用<script></script>包起來).
13021
		#回傳結果:
13022
		#$result["status"],執行是否正常,"true"為正常,"false"為不正常.
13023
		#$result["error"],錯誤訊息陣列
13024
		#$result["function"],當前執行的函數名稱
13025
		#$result["content"],要執行的javaScript語法
13026
		#必填參數:
13027
		#$conf["script"],字串,要執行的javaScript語法.
13028
		$conf["javaScript::toScript"]["script"]=
13029
		"
13030
		//取得內部要放置投影片內容的區塊
13031
		var displayArea=document.querySelector('".$conf["place"]."');
226 liveuser 13032
 
3 liveuser 13033
		//get left value
13034
		var leftP=displayArea.offsetLeft+'px';
226 liveuser 13035
 
3 liveuser 13036
		//get top value
13037
		var topP=displayArea.offsetTop+'px';
226 liveuser 13038
 
3 liveuser 13039
		//get width value
226 liveuser 13040
		var widthP=displayArea.clientWidth;
13041
 
3 liveuser 13042
		//get height value
226 liveuser 13043
		var heightP=displayArea.clientHeight;
13044
 
3 liveuser 13045
		//不顯示原始內容
13046
		displayArea.style.opacity=0;
13047
		displayArea.style.zIndex=-1;
226 liveuser 13048
 
3 liveuser 13049
		//取得投影片的數量
13050
		var slideCount=".count($conf["slideDiv"])."
226 liveuser 13051
 
3 liveuser 13052
		//宣告儲存投影片陣列的變數
13053
		var slide=[];
226 liveuser 13054
 
3 liveuser 13055
		";
226 liveuser 13056
 
3 liveuser 13057
		#針對每個投影片
13058
		foreach($conf["slideDiv"] as $index=>$slide)
13059
		{
13060
			#串接js內容
13061
			$conf["javaScript::toScript"]["script"]=$conf["javaScript::toScript"]["script"].
13062
			"
13063
			//取得投影片的區塊元素
13064
			var content=document.querySelector('".$slide."');
226 liveuser 13065
 
3 liveuser 13066
			//強制設定其位置為看不到的地方
13067
			content.style.position='absolute';
13068
			content.style.left='-100vw';
13069
			content.style.top='-100vh';
226 liveuser 13070
 
3 liveuser 13071
			//設置投影片的資訊
13072
			var info={};
226 liveuser 13073
 
3 liveuser 13074
			//設置投影片的left資訊
13075
			info.left=getComputedStyle(content).left;
226 liveuser 13076
 
3 liveuser 13077
			//設置投影片的top資訊
13078
			info.top=getComputedStyle(content).top;
226 liveuser 13079
 
3 liveuser 13080
			//初始化儲存單一投影片的結構
13081
			var slideObject={};
226 liveuser 13082
 
3 liveuser 13083
			//設置投影片的內容
13084
			slideObject.content=content;
226 liveuser 13085
 
3 liveuser 13086
			//設置投影片的資訊
13087
			slideObject.info=info;
226 liveuser 13088
 
3 liveuser 13089
			//儲存投影片到陣列
13090
			slide.push(slideObject);
226 liveuser 13091
 
3 liveuser 13092
			";
13093
		}
226 liveuser 13094
 
3 liveuser 13095
		#串接js的內容.
13096
		$conf["javaScript::toScript"]["script"]=$conf["javaScript::toScript"]["script"].
13097
		"
226 liveuser 13098
 
3 liveuser 13099
		//debug
13100
		//console.log(slide);
226 liveuser 13101
 
3 liveuser 13102
		//設置投影片置換的等待秒數
13103
		var sec=".$conf["sec"].";
226 liveuser 13104
 
3 liveuser 13105
		//設置等待時間的函式
13106
		var timeout=function(sec)
13107
		{
226 liveuser 13108
			return new Promise(resolve =>
3 liveuser 13109
			{
226 liveuser 13110
				setTimeout(() =>
3 liveuser 13111
				{
13112
					resolve(sec);
13113
				}, sec*1000);
13114
			});
13115
		}
226 liveuser 13116
 
3 liveuser 13117
		//建立與執行隨着畫面大小改變而更新播放區域資訊的函式
13118
		var updateDisplayInfo=window.addEventListener('resize',function()
13119
		{
13120
			//更新投影區域資訊
13121
			leftP=displayArea.offsetLeft+'px';
13122
			topP=displayArea.offsetTop+'px';
226 liveuser 13123
			widthP=displayArea.clientWidth+'px';
13124
			heightP=displayArea.clientHeight+'px';
13125
 
3 liveuser 13126
			//初始化要更新的投影片索引為-1
13127
			var showedSlideIndex=-1;
226 liveuser 13128
 
3 liveuser 13129
			//針對每個投影片
13130
			for(var i=0;i<slideCount;i++)
13131
			{
13132
				//如果是正在顯示的投影片
13133
				if(slide[i].content.dataset.show==='true')
13134
				{
13135
					//取得當前播放的投影片索引
13136
					showedSlideIndex=i;
13137
				}
13138
			}
226 liveuser 13139
 
3 liveuser 13140
			//如果有抓取到正在播放的投影片索引
13141
			if(showedSlideIndex!==-1)
13142
			{
226 liveuser 13143
 
3 liveuser 13144
				//更新正在投影的投影片
13145
				slide[showedSlideIndex].content.style.top=topP;
13146
				slide[showedSlideIndex].content.style.left=leftP;
13147
				slide[showedSlideIndex].content.style.width=widthP;
13148
				slide[showedSlideIndex].content.style.height=heightP;
13149
			}
13150
		});
226 liveuser 13151
 
3 liveuser 13152
		//宣告置換投影片的函式
13153
		var changeSlide=async function(page)
13154
		{
13155
			//debug
13156
			//console.log('start chaneg slide');
226 liveuser 13157
 
3 liveuser 13158
			//如果要顯示的投影片編號超出範圍
13159
			if(page > slideCount - 1)
13160
			{
13161
				//代表是要顯示第一張投影片
13162
				page=0;
13163
			}
226 liveuser 13164
 
3 liveuser 13165
			//取得要隱藏的投影片編號
13166
			var lastSlideNo=page-1;
226 liveuser 13167
 
3 liveuser 13168
			//如果要隱藏的投影片編號是負的
13169
			if(lastSlideNo < 0)
13170
			{
13171
				//代表要隱藏的投影片編號最後一張
13172
				lastSlideNo = slideCount - 1;
13173
			}
226 liveuser 13174
 
3 liveuser 13175
			//隱藏上一張投影片
13176
			slide[lastSlideNo].content.style.top=slide[lastSlideNo].info.top;
13177
			slide[lastSlideNo].content.style.left=slide[lastSlideNo].info.left;
13178
			slide[lastSlideNo].content.dataset.show='false';
226 liveuser 13179
 
3 liveuser 13180
			//顯示下一張投影片
13181
			slide[page].content.style.top=topP;
13182
			slide[page].content.style.left=leftP;
13183
			slide[page].content.style.width=widthP;
13184
			slide[page].content.style.height=heightP;
13185
			slide[page].content.dataset.show='true';
226 liveuser 13186
 
3 liveuser 13187
			//等待時間
13188
			await timeout.call(this,sec);
226 liveuser 13189
 
3 liveuser 13190
			//呼叫自己
13191
			changeSlide.call(this,page+1);
13192
		}
226 liveuser 13193
 
3 liveuser 13194
		//每過了 sec 秒後就置換投影片
13195
		changeSlide.call(this,0);
226 liveuser 13196
 
3 liveuser 13197
		";
226 liveuser 13198
 
3 liveuser 13199
		#可省略參數:
13200
		#$conf["onReady"],字串,是否要在網頁完全載入後再執行,"false"為不等載入完就先執行,預設為"true"要等載入完再執行.
13201
		#$conf["onReady"]="true";
13202
		#$conf["globalJs"],字串陣列,為要放入<script>標籤的js全域變數.
13203
		#$conf["globalJs"]=array();
13204
		#$conf["jsFunciton"],字串陣列,為要放入<script>標籤的js函數.
13205
		#$conf["jsFunciton"]=array();
13206
		#參考資料:
13207
		#http://stackoverflow.com/questions/9899372/pure-javascript-equivalent-to-jquerys-ready-how-to-call-a-function-when-the
13208
		#備註:
13209
		#無.
13210
		$toScript=javaScript::toScript($conf["javaScript::toScript"]);
13211
		unset($conf["javaScript::toScript"]);
226 liveuser 13212
 
3 liveuser 13213
		#如果建立 script 語法失敗
13214
		if($toScript["status"]==="false"){
226 liveuser 13215
 
3 liveuser 13216
			#設置執行失敗
13217
			$result["status"]="false";
226 liveuser 13218
 
3 liveuser 13219
			#設置錯誤訊息
13220
			$result["error"]=$toScript;
226 liveuser 13221
 
3 liveuser 13222
			#回傳結果
13223
			return $result;
226 liveuser 13224
 
3 liveuser 13225
			}#if end
226 liveuser 13226
 
3 liveuser 13227
		#儲存內容
13228
		$result["content"]=$result["content"].$toScript["content"];
226 liveuser 13229
 
3 liveuser 13230
		#設置執行正常
13231
		$result["status"]="true";
226 liveuser 13232
 
3 liveuser 13233
		#回傳結果
226 liveuser 13234
		return $result;
13235
 
3 liveuser 13236
	}#function slideDiv end
226 liveuser 13237
 
3 liveuser 13238
	/*
13239
	#函式說明:
13240
	#簡易版區塊輪播的效果,要輪播的內容為$conf["place"]特徵區塊的children元素.
13241
	#回傳結果:
13242
	#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
13243
	#$result["error"],錯誤訊息.
13244
	#$result["function"],當前執行的函數名稱.
13245
	#$result["content"],語法.
13246
	#必填參數:
13247
	#$conf["place"],字串,輪播區塊要在哪個元素裡面呈現,其區塊特徵為何?(請參閱javascript的querySelector函式).
13248
	$conf["place"]="";
226 liveuser 13249
	#可省略參數:
3 liveuser 13250
	#$conf["sec"],字串,過幾秒就要置換成下一張投影片,預設為"5",代表每5秒就換一張投影片.
13251
	#$conf["sec"]="5";
13252
	#參考資料:
13253
	#無.
13254
	#備註:
13255
	#無.
13256
	*/
13257
	public static function slideDivSimple(&$conf){
13258
 
13259
		#初始化要回傳的結果
13260
		$result=array();
13261
 
13262
		#取得當前執行的函數名稱
13263
		$result["function"]=__FUNCTION__;
13264
 
13265
		#如果沒有參數
13266
		if(func_num_args()==0){
13267
 
13268
			#設置執行失敗
13269
			$result["status"]="false";
13270
 
13271
			#設置執行錯誤訊息
13272
			$result["error"]="函數".$result["function"]."需要參數";
13273
 
13274
			#回傳結果
13275
			return $result;
13276
 
13277
			}#if end
13278
 
13279
		#取得參數
13280
		$result["argu"]=$conf;
13281
 
13282
		#如果 $conf 不為陣列
13283
		if(gettype($conf)!=="array"){
13284
 
13285
			#設置執行失敗
13286
			$result["status"]="false";
13287
 
13288
			#設置執行錯誤訊息
13289
			$result["error"][]="\$conf變數須為陣列形態";
13290
 
13291
			#如果傳入的參數為 null
13292
			if($conf===null){
13293
 
13294
				#設置執行錯誤訊息
13295
				$result["error"][]="\$conf變數不得為null,請檢查函數「".$result["function"]."」的參數設置有無正確!";
13296
 
13297
				}#if end
13298
 
13299
			#回傳結果
13300
			return $result;
13301
 
13302
			}#if end
13303
 
13304
		#檢查參數
13305
		#函式說明:
13306
		#檢查必填與可省略的參數,可省略參數可指定預設要給與什麼數值內容。
13307
		#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
13308
		#$reuslt["error"],執行不正常結束的錯訊息陣列.
13309
		#$result["function"],當前執行的函式名稱.
13310
		#$result["passed"],識別要檢查的全體變數是否存在以及型態是否正確的變數,"true"代表檢查全部通過;"false"代表檢查不通過
13311
		#$result[$shouldBeCheckedVarName]["varExist"],所檢查的變數是否存在,"false"代表不存在;"true"代表存在
13312
		#$result[$shouldBeCheckedVarName]["varType"],所檢查的變數型態是否正確,"false"代表錯誤;"true"代表正確
13313
		#$result[$shouldBeCheckedVarName]["error"],每個參數設定的錯誤訊息
13314
		#$result["shouldNotBeEmpty"],不應該為空字串或控陣列的變數.
13315
		#$result["argu"],字串陣列,目前輸入的參數名稱陣列.
13316
		#$result["legalVarName"],字串陣列,合法可用的參數名稱陣列.
13317
		#$result["notNeedVar"],字串陣列,多餘的參數名稱.
13318
		#必填參數:
13319
		#$conf["varInput"],陣列變數,要檢查的陣列變數,請在要檢查的參數前面加上&,這樣變動的結果才能被套用。
13320
		$conf["variableCheck::checkArguments"]["varInput"]=&$conf;
13321
		#$conf["mustBeFilledVariableName"],爲必填參數的變數名稱陣列,形態爲陣列變數,元素數量需要跟"mustBeFilledVariableType"參數的元素數量一致,例如: $conf["mustBeFilledVariableName"] = array("id","account","password");
13322
		$conf["variableCheck::checkArguments"]["mustBeFilledVariableName"]=array("place");
13323
		#$conf["mustBeFilledVariableType"],爲必填參數的變數陣列應該爲何種變數形態,形態爲陣列,元素數量需要跟"mustBeFilledVariableName"參數的元素數量一致,例如: $conf["mustBeFilledVariableType"] = array("string",integer,"double","resource","object"); , null代表不指定變數形態.
13324
		$conf["variableCheck::checkArguments"]["mustBeFilledVariableType"]=array("string");
13325
		#$conf["referenceVarKey"],字串,$conf參數後面的key值,用於移除不要的參考陣列.
13326
		$conf["variableCheck::checkArguments"]["referenceVarKey"]="variableCheck::checkArguments";
13327
		#可以省略的參數:
13328
		#$conf["canBeEmptyString"],字串,必填變數內容如果是空字串就不能算是有設置的話,請設為"false",預設爲"true",可以為空字串.
13329
		$conf["variableCheck::checkArguments"]["canBeEmptyString"]="false";
13330
		#$conf["skipableVariableCanNotBeEmpty"],字串陣列,哪些可省略參數不可以為空字串或集合.
13331
		$conf["variableCheck::checkArguments"]["skipableVariableCanNotBeEmpty"]=array("sec");
13332
		#$conf["skipableVariableName"],陣列字串,爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableName"] = array("id","account","password");
13333
		$conf["variableCheck::checkArguments"]["skipableVariableName"]=array("sec");
13334
		#$conf["skipableVariableType"],陣列字串,爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableType"] = array("string",integer,"double");
13335
		$conf["variableCheck::checkArguments"]["skipableVariableType"]=array("string");
13336
		#$conf["skipableVarDefaultValue"],字串陣列,每個不存在的可省略變數要初始化為什麼,null與代表不指定,若預設值是參數之一,請將$conf["mustBeFilledVar"]改成"\$conf["\mustBeFilledVar\"]".
13337
		$conf["variableCheck::checkArguments"]["skipableVarDefaultValue"]=array("5");
13338
		#$conf["arrayCountEqualCheck"],字串陣列,為檢查哪些陣列參數的元素數量要一樣,$conf["arrayCountEqualCheck"][$i]=array()為第$i組key為哪些的變數其元素數量要相等.
13339
		#$conf["variableCheck::checkArguments"]["arrayCountEqualCheck"][]=array("headOrTail","target","styleAttr","styleVal","content");
13340
		#參考資料來源:
13341
		#array_keys=>http://php.net/manual/en/function.array-keys.php
13342
		$checkArguments=variableCheck::checkArguments($conf["variableCheck::checkArguments"]);
13343
		unset($conf["variableCheck::checkArguments"]);
13344
 
13345
		#如果檢查參數失敗
13346
		if($checkArguments["status"]==="false"){
13347
 
13348
			#設置執行不正常
13349
			$result["status"]="false";
13350
 
13351
			#設置執行錯誤
13352
			$result["error"]=$checkArguments;
13353
 
13354
			#回傳結果
13355
			return $result;
13356
 
13357
			}#if end
13358
 
13359
		#如果檢查參數不通過
13360
		if($checkArguments["passed"]==="false"){
13361
 
13362
			#設置執行不正常
13363
			$result["status"]="false";
13364
 
13365
			#設置執行錯誤
13366
			$result["error"]=$checkArguments;
13367
 
13368
			#回傳結果
13369
			return $result;
13370
 
13371
			}#if end
226 liveuser 13372
 
3 liveuser 13373
		#初始化要回傳的語法
13374
		$result["content"]="";
226 liveuser 13375
 
3 liveuser 13376
		#函式說明:
13377
		#將要執行的script語法透過該函式執行(會在程式外層用<script></script>包起來).
13378
		#回傳結果:
13379
		#$result["status"],執行是否正常,"true"為正常,"false"為不正常.
13380
		#$result["error"],錯誤訊息陣列
13381
		#$result["function"],當前執行的函數名稱
13382
		#$result["content"],要執行的javaScript語法
13383
		#必填參數:
13384
		#$conf["script"],字串,要執行的javaScript語法.
13385
		$conf["javaScript::toScript"]["script"]=
13386
		"
13387
		//取得要放置投影片內容的區塊
13388
		var displayArea=document.querySelector('".$conf["place"]."');
226 liveuser 13389
 
3 liveuser 13390
		//如果無投影片的內容存在
13391
		if(displayArea.children.length<1){
226 liveuser 13392
 
3 liveuser 13393
			//提示錯誤
13394
			console.error('無投影片內容');
226 liveuser 13395
 
3 liveuser 13396
			//結束執行
13397
			return;
226 liveuser 13398
 
3 liveuser 13399
			}//if end
226 liveuser 13400
 
3 liveuser 13401
		//設置投影片的數量
13402
		var slideCount=displayArea.children.length;
226 liveuser 13403
 
3 liveuser 13404
		//設置投影片置換的等待秒數
13405
		var sec=".$conf["sec"].";
226 liveuser 13406
 
3 liveuser 13407
		//設置等待時間的函式
13408
		var timeout=function(sec)
13409
		{
226 liveuser 13410
			return new Promise(resolve =>
3 liveuser 13411
			{
226 liveuser 13412
				setTimeout(() =>
3 liveuser 13413
				{
13414
					resolve(sec);
13415
				}, sec*1000);
13416
			});
13417
		}
226 liveuser 13418
 
3 liveuser 13419
		//宣告置換投影片的函式
13420
		var changeSlide=async function(page)
13421
		{
13422
			//隱藏所有投影片
13423
			for(var i=0;i<slideCount;i++)
13424
			{
13425
				//隱藏投影片
13426
				displayArea.children[i].style.display='none';
226 liveuser 13427
 
3 liveuser 13428
			}//for end
226 liveuser 13429
 
3 liveuser 13430
			//如果page超過上限
13431
			if(page===slideCount)
13432
			{
13433
				//設置為第1個投影片
13434
				page=0;
13435
			}
226 liveuser 13436
 
3 liveuser 13437
			//顯示投影片
13438
			displayArea.children[page].style.display='inline-block';
226 liveuser 13439
 
3 liveuser 13440
			//等待時間
13441
			await timeout.call(this,sec);
226 liveuser 13442
 
3 liveuser 13443
			//呼叫自己
13444
			changeSlide.call(this,page+1);
13445
		}
226 liveuser 13446
 
3 liveuser 13447
		//每過了 sec 秒後就置換投影片
13448
		changeSlide.call(this,0);
226 liveuser 13449
 
3 liveuser 13450
		";
13451
		#可省略參數:
13452
		#$conf["onReady"],字串,是否要在網頁完全載入後再執行,"false"為不等載入完就先執行,預設為"true"要等載入完再執行.
13453
		#$conf["onReady"]="true";
13454
		#$conf["globalJs"],字串陣列,為要放入<script>標籤的js全域變數.
13455
		#$conf["globalJs"]=array();
13456
		#$conf["jsFunciton"],字串陣列,為要放入<script>標籤的js函數.
13457
		#$conf["jsFunciton"]=array();
13458
		#參考資料:
13459
		#http://stackoverflow.com/questions/9899372/pure-javascript-equivalent-to-jquerys-ready-how-to-call-a-function-when-the
13460
		#備註:
13461
		#無.
13462
		$toScript=javaScript::toScript($conf["javaScript::toScript"]);
13463
		unset($conf["javaScript::toScript"]);
226 liveuser 13464
 
3 liveuser 13465
		#如果建立 script 語法失敗
13466
		if($toScript["status"]==="false"){
226 liveuser 13467
 
3 liveuser 13468
			#設置執行失敗
13469
			$result["status"]="false";
226 liveuser 13470
 
3 liveuser 13471
			#設置錯誤訊息
13472
			$result["error"]=$toScript;
226 liveuser 13473
 
3 liveuser 13474
			#回傳結果
13475
			return $result;
226 liveuser 13476
 
3 liveuser 13477
			}#if end
226 liveuser 13478
 
3 liveuser 13479
		#儲存內容
13480
		$result["content"]=$result["content"].$toScript["content"];
226 liveuser 13481
 
3 liveuser 13482
		#設置執行正常
13483
		$result["status"]="true";
226 liveuser 13484
 
3 liveuser 13485
		#回傳結果
226 liveuser 13486
		return $result;
3 liveuser 13487
	}
226 liveuser 13488
 
3 liveuser 13489
	/*
13490
	#函式說明:
13491
	#建立點擊後會移到最頂端的 span icon,位於頂端時則會隱藏.
13492
	#回傳結果:
13493
	#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
13494
	#$result["error"],錯誤訊息.
13495
	#$result["function"],當前執行的函數名稱.
13496
	#$result["content"],語法.
13497
	#必填參數:
13498
	#$conf["id"],字串,廣告區域的span id.
13499
	$conf["id"]="";
226 liveuser 13500
	#可省略參數:
3 liveuser 13501
	#$conf["img"],字串,gotop的icon位置與名稱,預設爲base64加密svg圖檔.
13502
	#$conf["img"]="";
13503
	#$conf["mimeType"],字串,圖檔的mime type,預設爲image/*.
13504
	#$conf["mimeType"]="image/*";
13505
	#$conf["fileArgu"],字串, __FILE__ 的內容,若有設置img參數,則也要設置該參數.
13506
	#$conf["fileArgu"]=__FILE__;
13507
	#$conf["bottom"],字串,icon距離底部的位置.
13508
	$conf["bottom"]="";
13509
	#$conf["right"],字串,icon距離右部的位置.
13510
	$conf["right"]="";
13511
	#參考資料:
13512
	#無.
13513
	#備註:
13514
	#bgColor尚未實作
13515
	#固定在頂端或底端的功能未實作
13516
	*/
13517
	public static function goTopIcon(&$conf){
226 liveuser 13518
 
3 liveuser 13519
		#初始化要回傳的結果
13520
		$result=array();
13521
 
13522
		#取得當前執行的函數名稱
13523
		$result["function"]=__FUNCTION__;
13524
 
13525
		#如果沒有參數
13526
		if(func_num_args()==0){
13527
 
13528
			#設置執行失敗
13529
			$result["status"]="false";
13530
 
13531
			#設置執行錯誤訊息
13532
			$result["error"]="函數".$result["function"]."需要參數";
13533
 
13534
			#回傳結果
13535
			return $result;
13536
 
13537
			}#if end
13538
 
13539
		#取得參數
13540
		$result["argu"]=$conf;
13541
 
13542
		#如果 $conf 不為陣列
13543
		if(gettype($conf)!=="array"){
13544
 
13545
			#設置執行失敗
13546
			$result["status"]="false";
13547
 
13548
			#設置執行錯誤訊息
13549
			$result["error"][]="\$conf變數須為陣列形態";
13550
 
13551
			#如果傳入的參數為 null
13552
			if($conf===null){
13553
 
13554
				#設置執行錯誤訊息
13555
				$result["error"][]="\$conf變數不得為null,請檢查函數「".$result["function"]."」的參數設置有無正確!";
13556
 
13557
				}#if end
13558
 
13559
			#回傳結果
13560
			return $result;
13561
 
13562
			}#if end
13563
 
13564
		#初始化內容
13565
		$result["content"]="";
13566
 
13567
		#檢查參數
13568
		#函式說明:
13569
		#檢查必填與可省略的參數,可省略參數可指定預設要給與什麼數值內容。
13570
		#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
13571
		#$reuslt["error"],執行不正常結束的錯訊息陣列.
13572
		#$result["function"],當前執行的函式名稱.
13573
		#$result["passed"],識別要檢查的全體變數是否存在以及型態是否正確的變數,"true"代表檢查全部通過;"false"代表檢查不通過
13574
		#$result[$shouldBeCheckedVarName]["varExist"],所檢查的變數是否存在,"false"代表不存在;"true"代表存在
13575
		#$result[$shouldBeCheckedVarName]["varType"],所檢查的變數型態是否正確,"false"代表錯誤;"true"代表正確
13576
		#$result[$shouldBeCheckedVarName]["error"],每個參數設定的錯誤訊息
13577
		#$result["shouldNotBeEmpty"],不應該為空字串或控陣列的變數.
13578
		#$result["argu"],字串陣列,目前輸入的參數名稱陣列.
13579
		#$result["legalVarName"],字串陣列,合法可用的參數名稱陣列.
13580
		#$result["notNeedVar"],字串陣列,多餘的參數名稱.
13581
		#必填參數:
13582
		#$conf["varInput"],陣列變數,要檢查的陣列變數,請在要檢查的參數前面加上&,這樣變動的結果才能被套用。
13583
		$conf["variableCheck::checkArguments"]["varInput"]=&$conf;
13584
		#$conf["mustBeFilledVariableName"],爲必填參數的變數名稱陣列,形態爲陣列變數,元素數量需要跟"mustBeFilledVariableType"參數的元素數量一致,例如: $conf["mustBeFilledVariableName"] = array("id","account","password");
13585
		$conf["variableCheck::checkArguments"]["mustBeFilledVariableName"]=array("id");
13586
		#$conf["mustBeFilledVariableType"],爲必填參數的變數陣列應該爲何種變數形態,形態爲陣列,元素數量需要跟"mustBeFilledVariableName"參數的元素數量一致,例如: $conf["mustBeFilledVariableType"] = array("string",integer,"double","resource","object"); , null代表不指定變數形態.
13587
		$conf["variableCheck::checkArguments"]["mustBeFilledVariableType"]=array("string");
13588
		#$conf["referenceVarKey"],字串,$conf參數後面的key值,用於移除不要的參考陣列.
13589
		$conf["variableCheck::checkArguments"]["referenceVarKey"]="variableCheck::checkArguments";
13590
		#可以省略的參數:
13591
		#$conf["canBeEmptyString"],字串,必填變數內容如果是空字串就不能算是有設置的話,請設為"false",預設爲"true",可以為空字串.
13592
		$conf["variableCheck::checkArguments"]["canBeEmptyString"]="false";
13593
		#$conf["canNotBeEmpty"],字串陣列,哪些必填參數的內容不得為空字串或空陣列,僅當$conf["canBeEmptyString"]為"true"時會生效.
13594
		#$conf["canNotBeEmpty"]=array();
13595
		#$conf["canBeEmpty"],字串陣列,哪些必填參數的內容可為空字串或空陣列,僅當$conf["canBeEmptyString"]為"false"時會生效.
13596
		#$conf["canBeEmpty"]=array();
13597
		#$conf["skipableVariableCanNotBeEmpty"],字串陣列,哪些可省略參數不可以為空字串或空陣列.
13598
		$conf["variableCheck::checkArguments"]["skipableVariableCanNotBeEmpty"]=array("img","bottom","right","fileArgu","mimeType");
13599
		#$conf["skipableVariableName"],陣列字串,爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableName"] = array("id","account","password");
13600
		$conf["variableCheck::checkArguments"]["skipableVariableName"]=array("img","bottom","right","fileArgu","mimeType");
13601
		#$conf["skipableVariableType"],陣列字串,爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableType"] = array("string",integer,"double");
13602
		$conf["variableCheck::checkArguments"]["skipableVariableType"]=array("string","string","string","string","string");
13603
		#$conf["skipableVarDefaultValue"],字串陣列,每個不存在的可省略變數要初始化為什麼,null與代表不指定,若預設值是參數之一,請將$conf["mustBeFilledVar"]改成"\$conf["\mustBeFilledVar\"]".
13604
		$conf["variableCheck::checkArguments"]["skipableVarDefaultValue"]=array(null,"30px","30px",null,null);
13605
		#$conf["arrayCountEqualCheck"],字串陣列,為檢查哪些陣列參數的元素數量要一樣,$conf["arrayCountEqualCheck"][$i]=array()為第$i組key為哪些的變數其元素數量要相等.
13606
		#$conf["arrayCountEqualCheck"][]=array();
13607
		#參考資料來源:
13608
		#array_keys=>http://php.net/manual/en/function.array-keys.php
13609
		$checkArguments=variableCheck::checkArguments($conf["variableCheck::checkArguments"]);
13610
		unset($conf["variableCheck::checkArguments"]);
13611
 
13612
		#如果檢查參數失敗
13613
		if($checkArguments["status"]==="false"){
13614
 
13615
			#設置執行失敗
13616
			$result["status"]="false";
13617
 
13618
			#設置執行錯誤訊息
13619
			$result["error"]=$checkArguments;
13620
 
13621
			#回傳結果
13622
			return $result;
13623
 
13624
			}#if end
13625
 
13626
		#如果參數檢查不通過
13627
		if($checkArguments["passed"]==="false"){
13628
 
13629
			#設置執行失敗
13630
			$result["status"]="false";
13631
 
13632
			#設置執行錯誤訊息
13633
			$result["error"]=$checkArguments;
13634
 
13635
			#回傳結果
13636
			return $result;
13637
 
13638
			}#if end
226 liveuser 13639
 
3 liveuser 13640
		#如果有設置 $conf["img"] 跟 $conf["fileArgu"]
13641
		if( isset($conf["img"]) && isset($conf["fileArgu"]) ){
226 liveuser 13642
 
3 liveuser 13643
			#移到最上面的icon
13644
			#函式說明:
13645
			#用data:mimeType;base64,imgVar的形式來提供圖片的連結,亦即圖片儲存在變數裡面,本函式包含顯示圖片的語法.
13646
			#回傳結果:
13647
			#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
13648
			#$result["error"],錯誤訊息
13649
			#$result["content"],圖片的連結資訊
226 liveuser 13650
			#$result["function"],當前執行的函數名稱
3 liveuser 13651
			#必填參數:
13652
			#$conf["imgPosition"],要轉存成2元碼的圖片檔案位置與名稱
13653
			$conf["img::data"]["imgPosition"]=$conf["img"];
13654
			#$conf["fileArgu"],字串,php變數__FILE__的內容,亦即該檔案在檔案系統的絕對路徑.
13655
			$conf["img::data"]["fileArgu"]=$conf["fileArgu"];
13656
			#可省略參數:
13657
			#$conf["alt"],若沒有圖片要用什麼文字顯示。
13658
			#$conf["alt"]="";
13659
			#$conf["style"],字串陣列,要使用的style,key為樣式名稱,value為樣式值.
13660
			#$conf["style"]=array();
13661
			#$conf["class"],圖片要套用的css樣式名稱.
13662
			#$conf["class"]="";
226 liveuser 13663
 
3 liveuser 13664
			#如果有設置 $conf["mimeType"]
13665
			if(isset($conf["mimeType"])){
226 liveuser 13666
 
3 liveuser 13667
				#$conf["mimeType"],2元碼的內容是什麼,預設為"image/*".
13668
				$conf["img::data"]["mimeType"]=$conf["mimeType"];
226 liveuser 13669
 
13670
				}#if end
13671
 
3 liveuser 13672
			#$conf["compressType"],2元碼壓縮的方式,預設為"base64".
13673
			#$conf["compressType"]="base64";
13674
			#$conf["delImg"],讀取完圖片檔案後,要移除圖片嗎?"true"代表要移除,"false"代表不要移除,預設為"false".
13675
			#$conf["delImg"]="false";
13676
			#參考資料:
13677
			#將檔案用字串變數儲存起來=>http://php.net/manual/en/function.file-get-contents.php
13678
			#壓縮2元碼=>http://php.net/manual/en/function.base64-encode.php
13679
			$data=img::data($conf["img::data"]);
13680
			unset($conf["img::data"]);
13681
 
13682
			#如果建立 span section 失敗
13683
			if($data["status"]==="false"){
226 liveuser 13684
 
3 liveuser 13685
				#設置執行失敗
13686
				$result["status"]="false";
13687
 
13688
				#設置執行錯誤訊息
13689
				$result["error"]=$data;
13690
 
13691
				#回傳結果
13692
				return $result;
226 liveuser 13693
 
3 liveuser 13694
				}#if end
226 liveuser 13695
 
13696
			}#if end
13697
 
3 liveuser 13698
		#反之設置爲
13699
		else{
226 liveuser 13700
 
3 liveuser 13701
			#預設的 go top svg base64 encode
13702
			$data["content"]="<img src=\"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhLS0gQ3JlYXRlZCB3aXRoIElua3NjYXBlIChodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy8pIC0tPgoKPHN2ZwogICB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iCiAgIHhtbG5zOmNjPSJodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9ucyMiCiAgIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyIKICAgeG1sbnM6c3ZnPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogICB4bWxuczpzb2RpcG9kaT0iaHR0cDovL3NvZGlwb2RpLnNvdXJjZWZvcmdlLm5ldC9EVEQvc29kaXBvZGktMC5kdGQiCiAgIHhtbG5zOmlua3NjYXBlPSJodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy9uYW1lc3BhY2VzL2lua3NjYXBlIgogICB3aWR0aD0iOTAiCiAgIGhlaWdodD0iOTAiCiAgIHZpZXdCb3g9IjAgMCA4OS45OTk5OSA4OS45OTk5OTkiCiAgIGlkPSJzdmcyIgogICB2ZXJzaW9uPSIxLjEiCiAgIGlua3NjYXBlOnZlcnNpb249IjAuOTEgcjEzNzI1IgogICBzb2RpcG9kaTpkb2NuYW1lPSJ0b3Auc3ZnIgogICBpbmtzY2FwZTpleHBvcnQtZmlsZW5hbWU9Ii9ob21lL2xpdmV1c2VyL3B1YmxpY19odG1sL3NhbXBsZVBhZ2UvZmFjdG9yeS9pbWcvdG9wLnN2Zy5wbmciCiAgIGlua3NjYXBlOmV4cG9ydC14ZHBpPSI5MCIKICAgaW5rc2NhcGU6ZXhwb3J0LXlkcGk9IjkwIj4KICA8ZGVmcwogICAgIGlkPSJkZWZzNCIgLz4KICA8c29kaXBvZGk6bmFtZWR2aWV3CiAgICAgaWQ9ImJhc2UiCiAgICAgcGFnZWNvbG9yPSIjZmZmZmZmIgogICAgIGJvcmRlcmNvbG9yPSIjNjY2NjY2IgogICAgIGJvcmRlcm9wYWNpdHk9IjEuMCIKICAgICBpbmtzY2FwZTpwYWdlb3BhY2l0eT0iMC4wIgogICAgIGlua3NjYXBlOnBhZ2VzaGFkb3c9IjIiCiAgICAgaW5rc2NhcGU6em9vbT0iMS40IgogICAgIGlua3NjYXBlOmN4PSI0NS4xMDA5NjYiCiAgICAgaW5rc2NhcGU6Y3k9IjEzMS45NjQ5MiIKICAgICBpbmtzY2FwZTpkb2N1bWVudC11bml0cz0ibW0iCiAgICAgaW5rc2NhcGU6Y3VycmVudC1sYXllcj0iZzMzNTkiCiAgICAgc2hvd2dyaWQ9InRydWUiCiAgICAgc2hvd2d1aWRlcz0iZmFsc2UiCiAgICAgaW5rc2NhcGU6d2luZG93LXdpZHRoPSIxOTIwIgogICAgIGlua3NjYXBlOndpbmRvdy1oZWlnaHQ9IjEwMjMiCiAgICAgaW5rc2NhcGU6d2luZG93LXg9IjAiCiAgICAgaW5rc2NhcGU6d2luZG93LXk9IjMxIgogICAgIGlua3NjYXBlOndpbmRvdy1tYXhpbWl6ZWQ9IjEiCiAgICAgaW5rc2NhcGU6c2hvd3BhZ2VzaGFkb3c9ImZhbHNlIgogICAgIHNob3dib3JkZXI9InRydWUiCiAgICAgdW5pdHM9InB4Ij4KICAgIDxpbmtzY2FwZTpncmlkCiAgICAgICB0eXBlPSJ4eWdyaWQiCiAgICAgICBpZD0iZ3JpZDMzNjQiIC8+CiAgPC9zb2RpcG9kaTpuYW1lZHZpZXc+CiAgPG1ldGFkYXRhCiAgICAgaWQ9Im1ldGFkYXRhNyI+CiAgICA8cmRmOlJERj4KICAgICAgPGNjOldvcmsKICAgICAgICAgcmRmOmFib3V0PSIiPgogICAgICAgIDxkYzpmb3JtYXQ+aW1hZ2Uvc3ZnK3htbDwvZGM6Zm9ybWF0PgogICAgICAgIDxkYzp0eXBlCiAgICAgICAgICAgcmRmOnJlc291cmNlPSJodHRwOi8vcHVybC5vcmcvZGMvZGNtaXR5cGUvU3RpbGxJbWFnZSIgLz4KICAgICAgICA8ZGM6dGl0bGUgLz4KICAgICAgPC9jYzpXb3JrPgogICAgPC9yZGY6UkRGPgogIDwvbWV0YWRhdGE+CiAgPGcKICAgICBpbmtzY2FwZTpsYWJlbD0iTGF5ZXIgMSIKICAgICBpbmtzY2FwZTpncm91cG1vZGU9ImxheWVyIgogICAgIGlkPSJsYXllcjEiCiAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCwtOTYyLjM2MjIyKSI+CiAgICA8ZwogICAgICAgaWQ9ImczMzU5IgogICAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMC45OTkzNzg1OCwwLDAsMS4wNDIxOTk3LC0zMTIuODc2ODUsNzkwLjE2OTMxKSI+CiAgICAgIDxnCiAgICAgICAgIGlkPSJnMzMzOCIKICAgICAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMC45OTE2NDk1LDAsMCwxLjAyNDkzNTQsMi42MzA5MTk2LC01LjU1NTczMDYpIj4KICAgICAgICA8cmVjdAogICAgICAgICAgIHN0eWxlPSJmaWxsOiNmZmZmZmY7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjIuNjY5MTU5NjUiCiAgICAgICAgICAgaWQ9InJlY3QzMzQ1IgogICAgICAgICAgIHdpZHRoPSI4OC4zMzA4NDEiCiAgICAgICAgICAgaGVpZ2h0PSI4MS41NTk4NDUiCiAgICAgICAgICAgeD0iMzEzLjY5MTI1IgogICAgICAgICAgIHk9IjE2OC4yODE3NyIKICAgICAgICAgICByeT0iNDEuNjY1NDA1IgogICAgICAgICAgIHJ4PSI0NC4xNjU0MjEiIC8+CiAgICAgICAgPHRleHQKICAgICAgICAgICB4bWw6c3BhY2U9InByZXNlcnZlIgogICAgICAgICAgIHN0eWxlPSJmb250LXN0eWxlOm5vcm1hbDtmb250LXdlaWdodDpub3JtYWw7Zm9udC1zaXplOjQwcHg7bGluZS1oZWlnaHQ6MTI1JTtmb250LWZhbWlseTpzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOjBweDt3b3JkLXNwYWNpbmc6MHB4O2ZpbGw6IzAwMDAwMDtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MXB4O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1vcGFjaXR5OjEiCiAgICAgICAgICAgeD0iMzI1LjcxNDI5IgogICAgICAgICAgIHk9IjIyMi4zNjIyIgogICAgICAgICAgIGlkPSJ0ZXh0MzM0NyIKICAgICAgICAgICBzb2RpcG9kaTpsaW5lc3BhY2luZz0iMTI1JSI+PHRzcGFuCiAgICAgICAgICAgICBzb2RpcG9kaTpyb2xlPSJsaW5lIgogICAgICAgICAgICAgaWQ9InRzcGFuMzM0OSIKICAgICAgICAgICAgIHg9IjMyNS43MTQyOSIKICAgICAgICAgICAgIHk9IjIyMi4zNjIyIj5Ub3A8L3RzcGFuPjwvdGV4dD4KICAgICAgPC9nPgogICAgPC9nPgogIDwvZz4KPC9zdmc+Cg==\">";
226 liveuser 13703
 
3 liveuser 13704
			}#else end
13705
 
13706
		#移到最上面的icon div
13707
		#函式說明:
13708
		#<span>區塊,裡面可以指定css的class樣式,可以指定提示文字,若要使用移動的css樣式,請改用divSection函數.
13709
		#$result["status"],字串,執行否正常,"true"代表正常,"false"代表不正常.
13710
		#$result["functin"],字串,當前函數的名稱.
13711
		#$result["error"],陣列,錯訊訊息.
13712
		#$result["content"],字串,含有<span>標籤的內容.
13713
		#必填參數:
13714
		#$conf["contentArray"],字串陣列,要放入的內容陣列.
13715
		$conf["css::spanSection"]["contentArray"]=array($data["content"]);
13716
		#可省略參數
13717
		#$conf["id"],字串,span元素的id.
13718
		$conf["css::spanSection"]["id"]=$conf["id"];
13719
		#$conf["styleAttr"],字串陣列,給div區段要套用的style樣式屬性.
13720
		$conf["css::spanSection"]["styleAttr"]=array("position","bottom","right","display");
13721
		#$conf["styleVal"],字串陣列,給div區段要套用的style樣式數值.
13722
		$conf["css::spanSection"]["styleVal"]=array("fixed",$conf["bottom"],$conf["right"],"none");
13723
		#$conf["class"],字串,span區段要套用的css樣式.
13724
		#$conf["class"]="";
13725
		#$conf["title"],陣列,滑鼠移到上面時要顯示的內容,每個元素代表一列內容
13726
		#$conf["title"]=array();
13727
		#$conf["data"],字串陣列,每個data屬性名稱為數值內容,例如array("a"=>"A","b"=>"B")
13728
		#$conf["data"]=array();
13729
		$spanSection=css::spanSection($conf["css::spanSection"]);
13730
		unset($conf["css::spanSection"]);
13731
 
13732
		#如果建立 span section 失敗
13733
		if($spanSection["status"]==="false"){
226 liveuser 13734
 
3 liveuser 13735
			#設置執行失敗
13736
			$result["status"]="false";
13737
 
13738
			#設置執行錯誤訊息
13739
			$result["error"]=$spanSection;
13740
 
13741
			#回傳結果
13742
			return $result;
226 liveuser 13743
 
3 liveuser 13744
			}#if end
13745
 
13746
		#儲存 top span
13747
		$result["content"]=$result["content"].$spanSection["content"];
226 liveuser 13748
 
3 liveuser 13749
		#函式說明:
13750
		#將要執行的script語法透過該函式執行(會在程式外層用<script></script>包起來).
13751
		#回傳結果:
13752
		#$result["status"],執行是否正常,"true"為正常,"false"為不正常.
13753
		#$result["error"],錯誤訊息陣列
13754
		#$result["function"],當前執行的函數名稱
13755
		#$result["content"],要執行的javaScript語法
13756
		#必填參數:
13757
		#$conf["script"],字串,要執行的javaScript語法.
13758
		$conf["javaScript::toScript"]["script"]="
13759
		//get topspan
13760
		var topSpan=document.getElementById('".$conf["id"]."');
226 liveuser 13761
 
3 liveuser 13762
		//scrolliv click event
226 liveuser 13763
		topSpan.addEventListener('click',function(e){
13764
 
3 liveuser 13765
			//滑到頂端
226 liveuser 13766
			document.scrollingElement.scrollTop=0;
13767
 
3 liveuser 13768
			});//topSpan addEventListener end
226 liveuser 13769
 
3 liveuser 13770
		//當滾軸滾動時觸發
13771
		window.addEventListener('scroll', function(e){
226 liveuser 13772
 
3 liveuser 13773
			//get last scroll y
13774
			var last_known_scroll_position = window.scrollY;
226 liveuser 13775
 
3 liveuser 13776
			//get topspan
13777
			var topSpan=document.getElementById('".$conf["id"]."');
226 liveuser 13778
 
3 liveuser 13779
			//如果是在網頁頂端
13780
			if(last_known_scroll_position===0){
226 liveuser 13781
 
3 liveuser 13782
				//隱藏往頂端的圖示
13783
				topSpan.style.display='none';
226 liveuser 13784
 
3 liveuser 13785
				}//if end
226 liveuser 13786
 
3 liveuser 13787
			//反之
13788
			else{
226 liveuser 13789
 
3 liveuser 13790
				//get topspan to show
13791
				topSpan.style.display='inline';
226 liveuser 13792
 
3 liveuser 13793
				}//else end
226 liveuser 13794
 
3 liveuser 13795
			});//window scroll event end
13796
		";
13797
		#可省略參數:
13798
		#$conf["onReady"],字串,是否要在網頁完全載入後再執行,"false"為不等載入完就先執行,預設為"true"要等載入完再執行.
13799
		#$conf["onReady"]="true";
13800
		#$conf["globalJs"],字串陣列,為要放入<script>標籤的js全域變數.
13801
		#$conf["globalJs"]=array();
13802
		#$conf["jsFunciton"],字串陣列,為要放入<script>標籤的js函數.
13803
		#$conf["jsFunciton"]=array();
13804
		#參考資料:
13805
		#http://stackoverflow.com/questions/9899372/pure-javascript-equivalent-to-jquerys-ready-how-to-call-a-function-when-the
13806
		$toScript=javaScript::toScript($conf["javaScript::toScript"]);
13807
		unset($conf["javaScript::toScript"]);
226 liveuser 13808
 
3 liveuser 13809
		#如果建立js失敗
13810
		if($toScript["status"]==="false"){
226 liveuser 13811
 
3 liveuser 13812
			#設置執行失敗
13813
			$result["status"]="false";
13814
 
13815
			#設置執行錯誤訊息
13816
			$result["error"]=$toScript;
13817
 
13818
			#回傳結果
13819
			return $result;
226 liveuser 13820
 
3 liveuser 13821
			}#if end
226 liveuser 13822
 
3 liveuser 13823
		#儲存 top span
13824
		$result["content"]=$result["content"].$toScript["content"];
226 liveuser 13825
 
3 liveuser 13826
		#設置執行正常
13827
		$result["status"]="true";
226 liveuser 13828
 
3 liveuser 13829
		#回傳結果
13830
		return $result;
13831
 
226 liveuser 13832
		}#funcion goTopIcon end
13833
 
3 liveuser 13834
	/*
13835
	#函式說明:
13836
	#透過ajax遞迴取得檔案的內容,類似tail指令的效果.
13837
	#回傳結果:
13838
	#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
13839
	#$result["error"],錯誤訊息.
13840
	#$result["function"],當前執行的函數名稱.
13841
	#$result["argu"],使用的參數.
13842
	#$result["content"],語法.
13843
	#必填參數:
13844
	#$conf["url"],字串,提供tail ajax的網址.
13845
	$conf["url"]="";
226 liveuser 13846
	#可省略參數:
3 liveuser 13847
	#$conf["rootDivId"],字串,root div的id,預設為"tailRootDiv".
13848
	#$conf["rootDivId"]="tailRootDiv";
13849
	#參考資料:
13850
	#無.
13851
	#備註:
13852
	#請跟fileAccess類別的tail函式搭配使用.
13853
	*/
13854
	public static function tail(&$conf){
13855
 
13856
		#初始化要回傳的結果
13857
		$result=array();
13858
 
13859
		#取得當前執行的函數名稱
13860
		$result["function"]=__FUNCTION__;
13861
 
13862
		#如果沒有參數
13863
		if(func_num_args()==0){
13864
 
13865
			#設置執行失敗
13866
			$result["status"]="false";
13867
 
13868
			#設置執行錯誤訊息
13869
			$result["error"]="函數".$result["function"]."需要參數";
13870
 
13871
			#回傳結果
13872
			return $result;
13873
 
13874
			}#if end
13875
 
13876
		#取得參數
13877
		$result["argu"]=$conf;
13878
 
13879
		#如果 $conf 不為陣列
13880
		if(gettype($conf)!=="array"){
13881
 
13882
			#設置執行失敗
13883
			$result["status"]="false";
13884
 
13885
			#設置執行錯誤訊息
13886
			$result["error"][]="\$conf變數須為陣列形態";
13887
 
13888
			#如果傳入的參數為 null
13889
			if($conf===null){
13890
 
13891
				#設置執行錯誤訊息
13892
				$result["error"][]="\$conf變數不得為null,請檢查函數「".$result["function"]."」的參數設置有無正確!";
13893
 
13894
				}#if end
13895
 
13896
			#回傳結果
13897
			return $result;
13898
 
13899
			}#if end
13900
 
13901
		#初始化內容
226 liveuser 13902
		$result["content"]="";
3 liveuser 13903
 
13904
		#檢查參數
13905
		#函式說明:
13906
		#檢查必填與可省略的參數,可省略參數可指定預設要給與什麼數值內容。
13907
		#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
13908
		#$reuslt["error"],執行不正常結束的錯訊息陣列.
13909
		#$result["function"],當前執行的函式名稱.
13910
		#$result["passed"],識別要檢查的全體變數是否存在以及型態是否正確的變數,"true"代表檢查全部通過;"false"代表檢查不通過
13911
		#$result[$shouldBeCheckedVarName]["varExist"],所檢查的變數是否存在,"false"代表不存在;"true"代表存在
13912
		#$result[$shouldBeCheckedVarName]["varType"],所檢查的變數型態是否正確,"false"代表錯誤;"true"代表正確
13913
		#$result[$shouldBeCheckedVarName]["error"],每個參數設定的錯誤訊息
13914
		#$result["shouldNotBeEmpty"],不應該為空字串或控陣列的變數.
13915
		#$result["argu"],字串陣列,目前輸入的參數名稱陣列.
13916
		#$result["legalVarName"],字串陣列,合法可用的參數名稱陣列.
13917
		#$result["notNeedVar"],字串陣列,多餘的參數名稱.
13918
		#必填參數:
13919
		#$conf["varInput"],陣列變數,要檢查的陣列變數,請在要檢查的參數前面加上&,這樣變動的結果才能被套用。
13920
		$conf["variableCheck::checkArguments"]["varInput"]=&$conf;
13921
		#$conf["mustBeFilledVariableName"],爲必填參數的變數名稱陣列,形態爲陣列變數,元素數量需要跟"mustBeFilledVariableType"參數的元素數量一致,例如: $conf["mustBeFilledVariableName"] = array("id","account","password");
13922
		$conf["variableCheck::checkArguments"]["mustBeFilledVariableName"]=array("url");
13923
		#$conf["mustBeFilledVariableType"],爲必填參數的變數陣列應該爲何種變數形態,形態爲陣列,元素數量需要跟"mustBeFilledVariableName"參數的元素數量一致,例如: $conf["mustBeFilledVariableType"] = array("string",integer,"double","resource","object"); , null代表不指定變數形態.
13924
		$conf["variableCheck::checkArguments"]["mustBeFilledVariableType"]=array("string");
13925
		#$conf["referenceVarKey"],字串,$conf參數後面的key值,用於移除不要的參考陣列.
13926
		$conf["variableCheck::checkArguments"]["referenceVarKey"]="variableCheck::checkArguments";
13927
		#可以省略的參數:
13928
		#$conf["canBeEmptyString"],字串,必填變數內容如果是空字串就不能算是有設置的話,請設為"false",預設爲"true",可以為空字串.
13929
		$conf["variableCheck::checkArguments"]["canBeEmptyString"]="false";
13930
		#$conf["canNotBeEmpty"],字串陣列,哪些必填參數的內容不得為空字串或空陣列,僅當$conf["canBeEmptyString"]為"true"時會生效.
13931
		#$conf["canNotBeEmpty"]=array();
13932
		#$conf["canBeEmpty"],字串陣列,哪些必填參數的內容可為空字串或空陣列,僅當$conf["canBeEmptyString"]為"false"時會生效.
13933
		#$conf["canBeEmpty"]=array();
13934
		#$conf["skipableVariableCanNotBeEmpty"],字串陣列,哪些可省略參數不可以為空字串或空陣列.
13935
		$conf["variableCheck::checkArguments"]["skipableVariableCanNotBeEmpty"]=array("rootDivId");
13936
		#$conf["skipableVariableName"],陣列字串,爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableName"] = array("id","account","password");
13937
		$conf["variableCheck::checkArguments"]["skipableVariableName"]=array("rootDivId");
13938
		#$conf["skipableVariableType"],陣列字串,爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableType"] = array("string",integer,"double");
13939
		$conf["variableCheck::checkArguments"]["skipableVariableType"]=array("string");
13940
		#$conf["skipableVarDefaultValue"],字串陣列,每個不存在的可省略變數要初始化為什麼,null與代表不指定,若預設值是參數之一,請將$conf["mustBeFilledVar"]改成"\$conf["\mustBeFilledVar\"]".
13941
		$conf["variableCheck::checkArguments"]["skipableVarDefaultValue"]=array("tailRootDiv");
13942
		#$conf["arrayCountEqualCheck"],字串陣列,為檢查哪些陣列參數的元素數量要一樣,$conf["arrayCountEqualCheck"][$i]=array()為第$i組key為哪些的變數其元素數量要相等.
13943
		#$conf["arrayCountEqualCheck"][]=array();
13944
		#參考資料來源:
13945
		#array_keys=>http://php.net/manual/en/function.array-keys.php
13946
		$checkArguments=variableCheck::checkArguments($conf["variableCheck::checkArguments"]);
13947
		unset($conf["variableCheck::checkArguments"]);
13948
 
13949
		#如果檢查參數失敗
13950
		if($checkArguments["status"]==="false"){
13951
 
13952
			#設置執行失敗
13953
			$result["status"]="false";
13954
 
13955
			#設置執行錯誤訊息
13956
			$result["error"]=$checkArguments;
13957
 
13958
			#回傳結果
13959
			return $result;
13960
 
13961
			}#if end
13962
 
13963
		#如果參數檢查不通過
13964
		if($checkArguments["passed"]==="false"){
13965
 
13966
			#設置執行失敗
13967
			$result["status"]="false";
13968
 
13969
			#設置執行錯誤訊息
13970
			$result["error"]=$checkArguments;
13971
 
13972
			#回傳結果
13973
			return $result;
13974
 
13975
			}#if end
13976
 
13977
		#函式說明:
13978
		#將要執行的script語法透過該函式執行(會在程式外層用<script></script>包起來).
13979
		#回傳結果:
13980
		#$result["status"],執行是否正常,"true"為正常,"false"為不正常.
13981
		#$result["error"],錯誤訊息陣列
13982
		#$result["function"],當前執行的函數名稱
13983
		#$result["content"],要執行的javaScript語法
13984
		#必填參數:
13985
		#$conf["script"],字串,要執行的javaScript語法.
13986
		$conf["javaScript::toScript"]["script"]="
226 liveuser 13987
 
3 liveuser 13988
		//initial window.tail
13989
		if(window.tail===undefined){
13990
 
13991
			//初始化 window.tail
13992
			window.tail={};
13993
 
13994
			//初始化繼續執行
13995
			window.tail.continue=true;
13996
 
13997
			}//if end
226 liveuser 13998
 
3 liveuser 13999
		//create root div
226 liveuser 14000
		window.tail.rootDiv = document.createElement('div');
3 liveuser 14001
		window.tail.rootDiv.id = '".$conf["rootDivId"]."';
14002
		document.body.appendChild(window.tail.rootDiv);
14003
 
14004
		//set tail url
14005
		window.tailUrl='".$conf["url"]."';
226 liveuser 14006
 
3 liveuser 14007
		//設置周期執行的涵式
14008
		window.tail.ajax = function(line2start){
226 liveuser 14009
 
3 liveuser 14010
			xmlhttp=new XMLHttpRequest();
14011
			xmlhttp.responseType='json';
14012
			xmlhttp.timeout=60000;
14013
			xmlhttp.open('POST',window.tailUrl,true);
14014
			xmlhttp.setRequestHeader('Content-type','application/x-www-form-urlencoded');
14015
			xmlhttp.setRequestHeader('X-Requested-With','XMLHttpRequest');
14016
			xmlhttp.onreadystatechange=function(){
14017
 
14018
				//如果狀態為4且response code為200
14019
				if(xmlhttp.readyState===4 && xmlhttp.status===200){
14020
 
226 liveuser 14021
					//get response
3 liveuser 14022
					res=xmlhttp.response;
226 liveuser 14023
 
3 liveuser 14024
					//debug
14025
					console.log(res);
226 liveuser 14026
 
3 liveuser 14027
					//針對每個輸出的行
14028
					for(var i=0;i<xmlhttp.response.lines;i++){
226 liveuser 14029
 
3 liveuser 14030
						//set output line
14031
						var div=document.createElement('div');
14032
						var text=document.createTextNode(xmlhttp.response.content[i]);
14033
						div.appendChild(text);
226 liveuser 14034
 
3 liveuser 14035
						//debug
226 liveuser 14036
						console.log(div);
14037
 
3 liveuser 14038
						//如果內容為空
14039
						if(xmlhttp.response.content[i]==='')
14040
						{
14041
							//建立<br>
14042
							var br=document.createElement('br');
226 liveuser 14043
 
3 liveuser 14044
							//遷入<br>
14045
							div.appendChild(br);
14046
						}
226 liveuser 14047
 
3 liveuser 14048
						//show output line
14049
						var rootDiv=document.getElementById(window.tail.rootDiv.id);
14050
						rootDiv.prepend(div);
14051
 
226 liveuser 14052
						}//for end
14053
 
3 liveuser 14054
					//遞迴
14055
					window.tail.ajax.call(this,(res.lineNum)+1);
14056
 
14057
					}//if end
14058
 
14059
				}//function end
226 liveuser 14060
 
14061
			//如果要繼續
3 liveuser 14062
			if(window.tail.continue){
14063
 
14064
				//繼續
14065
				xmlhttp.send('line2start='+line2start);
14066
 
14067
				}//if end
226 liveuser 14068
 
3 liveuser 14069
			//反之要暫停
14070
			else{
226 liveuser 14071
 
3 liveuser 14072
				//設置無限等待
14073
				var intervalTail = window.setInterval(function(){
226 liveuser 14074
 
3 liveuser 14075
					//提示已經暫停
14076
					console.log('paused');
226 liveuser 14077
 
3 liveuser 14078
					//如果要繼續了
14079
					if(window.tail.continue){
226 liveuser 14080
 
3 liveuser 14081
						//清除無限等待
14082
						clearInterval(intervalTail);
226 liveuser 14083
 
3 liveuser 14084
						//繼續
14085
						xmlhttp.send('line2start='+line2start);
226 liveuser 14086
 
3 liveuser 14087
						}//if end
226 liveuser 14088
 
3 liveuser 14089
					},1000);
226 liveuser 14090
 
3 liveuser 14091
				}//else end
14092
 
14093
			}//function end
14094
 
14095
		//call tail ajax
14096
		window.tail.ajax.call(this,-1);
14097
		";
14098
		#可省略參數:
14099
		#$conf["onReady"],字串,是否要在網頁完全載入後再執行,"false"為不等載入完就先執行,預設為"true"要等載入完再執行.
14100
		#$conf["onReady"]="true";
14101
		#$conf["globalJs"],字串陣列,為要放入<script>標籤的js全域變數.
14102
		#$conf["globalJs"]=array();
14103
		#$conf["jsFunciton"],字串陣列,為要放入<script>標籤的js函數.
14104
		#$conf["jsFunciton"]=array();
14105
		#參考資料:
14106
		#http://stackoverflow.com/questions/9899372/pure-javascript-equivalent-to-jquerys-ready-how-to-call-a-function-when-the
14107
		$toScript=javaScript::toScript($conf["javaScript::toScript"]);
14108
		unset($conf["javaScript::toScript"]);
226 liveuser 14109
 
3 liveuser 14110
		#如果建立js失敗
14111
		if($toScript["status"]==="false"){
226 liveuser 14112
 
3 liveuser 14113
			#設置執行失敗
14114
			$result["status"]="false";
14115
 
14116
			#設置執行錯誤訊息
14117
			$result["error"]=$toScript;
14118
 
14119
			#回傳結果
14120
			return $result;
226 liveuser 14121
 
3 liveuser 14122
			}#if end
226 liveuser 14123
 
3 liveuser 14124
		#儲存 top span
14125
		$result["content"]=$result["content"].$toScript["content"];
226 liveuser 14126
 
3 liveuser 14127
		#設置執行正常
14128
		$result["status"]="true";
226 liveuser 14129
 
3 liveuser 14130
		#回傳結果
14131
		return $result;
14132
 
14133
		}#function tail end
14134
 
14135
	/*
14136
	#函式說明:
14137
	#透過ajax產生亂數驗證碼,驗證亂數驗證碼與傳送表單
14138
	#回傳結果:
14139
	#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
14140
	#$result["error"],錯誤訊息.
14141
	#$result["argu"],使用的參數.
14142
	#$result["function"],當前執行的函數名稱.
14143
	#$result["content"],json.
14144
	#必填參數:
14145
	#$conf["url"],字串,提供random code的網址.
14146
	$conf["url"]="";
14147
	#$conf["callBackUrls"],字串陣列,用來處理表單資訊的網址們,會傳送 obj 物件的 post 內容到第一個 callback url,之後都會將 json 回應傳送給下一個 callback url. 如果進行第2個含以上的 callback urls 時有回應含有 formObj 元素的 json 則會改傳送之.每次傳送給 callback url 的表單變數均為 $conf["sendedName"].
14148
	$conf["callBackUrls"]=array();
226 liveuser 14149
	#可省略參數:
3 liveuser 14150
	#$conf["resDivId"],字串,輸入驗證碼的表單id,預設為"randomCode".
14151
	#$conf["resDivId"]="randomCode";
14152
	#$conf["names"],字串陣列,需要傳送的表單變數.
14153
	#$conf["names"]=array();
14154
	#$conf["sendedName"],字串,傳送的post變數名稱,預設的爲"formData".
14155
	#$conf["sendedName"]="";
14156
	#備註:
14157
	#請跟 authenticate 類別的 verifyCodeAndFormData 函式搭配.
14158
	#每次呼叫 callBackUrl 應該要驗證其所 post 的驗證碼是否正確,其對應的 post 變數為元素 id 為 $conf["resDivId"] 的 name 屬性數值;對應的session變數名稱則為 "authenticate.verifyCodeAndFormData.".元素 id 為 $conf["resDivId"] 的 name 屬性數值.例如 $_SESSION["authenticate.verifyCodeAndFormData.randomCode"]===$post->randomCode .
14159
	#從 $conf["callBackUrls"] 取得的 json 回應,若有 msg 屬性,且 status 屬性爲 'true', 則會顯示提示訊息.
14160
	#從 $conf["callBackUrls"] 取得的 json 回應,若有 error 屬性,且 status 屬性爲 'false', 則會顯示錯誤訊息.
14161
	#從 $conf["callBackUrls"] 中的最後一個 callback url 取得的 json 回應,若有 href 屬性,則會轉址.
14162
	#從 $conf["callBackUrls"] 中的最後一個 callback url 取得的 json 回應,若有 refresh 屬性,且爲 'true' 則會重新整理頁面.
14163
	#參考資料:
14164
	#無.
14165
	#備註:
14166
	#提示訊息的呈現改用 text area;
14167
	#驗證失敗原因呈現改用 text area;
14168
	*/
14169
	public static function randomCode(&$conf){
226 liveuser 14170
 
3 liveuser 14171
		#初始化要回傳的結果
14172
		$result=array();
14173
 
14174
		#取得當前執行的函數名稱
14175
		$result["function"]=__FUNCTION__;
14176
 
14177
		#如果沒有參數
14178
		if(func_num_args()==0){
14179
 
14180
			#設置執行失敗
14181
			$result["status"]="false";
14182
 
14183
			#設置執行錯誤訊息
14184
			$result["error"]="函數".$result["function"]."需要參數";
14185
 
14186
			#回傳結果
14187
			return $result;
14188
 
14189
			}#if end
14190
 
14191
		#取得參數
14192
		$result["argu"]=$conf;
14193
 
14194
		#如果 $conf 不為陣列
14195
		if(gettype($conf)!=="array"){
14196
 
14197
			#設置執行失敗
14198
			$result["status"]="false";
14199
 
14200
			#設置執行錯誤訊息
14201
			$result["error"][]="\$conf變數須為陣列形態";
14202
 
14203
			#如果傳入的參數為 null
14204
			if($conf===null){
14205
 
14206
				#設置執行錯誤訊息
14207
				$result["error"][]="\$conf變數不得為null,請檢查函數「".$result["function"]."」的參數設置有無正確!";
14208
 
14209
				}#if end
14210
 
14211
			#回傳結果
14212
			return $result;
14213
 
14214
			}#if end
14215
 
14216
		#初始化內容
226 liveuser 14217
		$result["content"]="";
3 liveuser 14218
 
14219
		#檢查參數
14220
		#函式說明:
14221
		#檢查必填與可省略的參數,可省略參數可指定預設要給與什麼數值內容。
14222
		#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
14223
		#$reuslt["error"],執行不正常結束的錯訊息陣列.
14224
		#$result["function"],當前執行的函式名稱.
14225
		#$result["passed"],識別要檢查的全體變數是否存在以及型態是否正確的變數,"true"代表檢查全部通過;"false"代表檢查不通過
14226
		#$result[$shouldBeCheckedVarName]["varExist"],所檢查的變數是否存在,"false"代表不存在;"true"代表存在
14227
		#$result[$shouldBeCheckedVarName]["varType"],所檢查的變數型態是否正確,"false"代表錯誤;"true"代表正確
14228
		#$result[$shouldBeCheckedVarName]["error"],每個參數設定的錯誤訊息
14229
		#$result["shouldNotBeEmpty"],不應該為空字串或控陣列的變數.
14230
		#$result["argu"],字串陣列,目前輸入的參數名稱陣列.
14231
		#$result["legalVarName"],字串陣列,合法可用的參數名稱陣列.
14232
		#$result["notNeedVar"],字串陣列,多餘的參數名稱.
14233
		#必填參數:
14234
		#$conf["varInput"],陣列變數,要檢查的陣列變數,請在要檢查的參數前面加上&,這樣變動的結果才能被套用。
14235
		$conf["variableCheck::checkArguments"]["varInput"]=&$conf;
14236
		#$conf["mustBeFilledVariableName"],爲必填參數的變數名稱陣列,形態爲陣列變數,元素數量需要跟"mustBeFilledVariableType"參數的元素數量一致,例如: $conf["mustBeFilledVariableName"] = array("id","account","password");
14237
		$conf["variableCheck::checkArguments"]["mustBeFilledVariableName"]=array("url","callBackUrls");
14238
		#$conf["mustBeFilledVariableType"],爲必填參數的變數陣列應該爲何種變數形態,形態爲陣列,元素數量需要跟"mustBeFilledVariableName"參數的元素數量一致,例如: $conf["mustBeFilledVariableType"] = array("string",integer,"double","resource","object"); , null代表不指定變數形態.
14239
		$conf["variableCheck::checkArguments"]["mustBeFilledVariableType"]=array("string","array");
14240
		#$conf["referenceVarKey"],字串,$conf參數後面的key值,用於移除不要的參考陣列.
14241
		$conf["variableCheck::checkArguments"]["referenceVarKey"]="variableCheck::checkArguments";
14242
		#可以省略的參數:
14243
		#$conf["canBeEmptyString"],字串,必填變數內容如果是空字串就不能算是有設置的話,請設為"false",預設爲"true",可以為空字串.
14244
		$conf["variableCheck::checkArguments"]["canBeEmptyString"]="false";
14245
		#$conf["canNotBeEmpty"],字串陣列,哪些必填參數的內容不得為空字串或空陣列,僅當$conf["canBeEmptyString"]為"true"時會生效.
14246
		#$conf["canNotBeEmpty"]=array();
14247
		#$conf["canBeEmpty"],字串陣列,哪些必填參數的內容可為空字串或空陣列,僅當$conf["canBeEmptyString"]為"false"時會生效.
14248
		#$conf["canBeEmpty"]=array();
14249
		#$conf["skipableVariableCanNotBeEmpty"],字串陣列,哪些可省略參數不可以為空字串或空陣列.
14250
		$conf["variableCheck::checkArguments"]["skipableVariableCanNotBeEmpty"]=array("resDivId","names","sendedName");
14251
		#$conf["skipableVariableName"],陣列字串,爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableName"] = array("id","account","password");
14252
		$conf["variableCheck::checkArguments"]["skipableVariableName"]=array("resDivId","names","sendedName");
14253
		#$conf["skipableVariableType"],陣列字串,爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableType"] = array("string",integer,"double");
14254
		$conf["variableCheck::checkArguments"]["skipableVariableType"]=array("string","array","string");
14255
		#$conf["skipableVarDefaultValue"],字串陣列,每個不存在的可省略變數要初始化為什麼,null與代表不指定,若預設值是參數之一,請將$conf["mustBeFilledVar"]改成"\$conf["\mustBeFilledVar\"]".
14256
		$conf["variableCheck::checkArguments"]["skipableVarDefaultValue"]=array("randomCode",null,"formData");
14257
		#$conf["arrayCountEqualCheck"],字串陣列,為檢查哪些陣列參數的元素數量要一樣,$conf["arrayCountEqualCheck"][$i]=array()為第$i組key為哪些的變數其元素數量要相等.
14258
		#$conf["arrayCountEqualCheck"][]=array();
14259
		#參考資料來源:
14260
		#array_keys=>http://php.net/manual/en/function.array-keys.php
14261
		$checkArguments=variableCheck::checkArguments($conf["variableCheck::checkArguments"]);
14262
		unset($conf["variableCheck::checkArguments"]);
14263
 
14264
		#如果檢查參數失敗
14265
		if($checkArguments["status"]==="false"){
14266
 
14267
			#設置執行失敗
14268
			$result["status"]="false";
14269
 
14270
			#設置執行錯誤訊息
14271
			$result["error"]=$checkArguments;
14272
 
14273
			#回傳結果
14274
			return $result;
14275
 
14276
			}#if end
14277
 
14278
		#如果參數檢查不通過
14279
		if($checkArguments["passed"]==="false"){
14280
 
14281
			#設置執行失敗
14282
			$result["status"]="false";
14283
 
14284
			#設置執行錯誤訊息
14285
			$result["error"]=$checkArguments;
14286
 
14287
			#回傳結果
14288
			return $result;
14289
 
14290
			}#if end
226 liveuser 14291
 
3 liveuser 14292
		#如果未設置 $conf["names"]
14293
		if(!isset($conf["names"])){
14294
 
14295
			#設置爲空
14296
			$conf["names"]=array();
14297
 
14298
			}#if end
14299
 
14300
		#函式說明:
14301
		#將要執行的script語法透過該函式執行(會在程式外層用<script></script>包起來).
14302
		#回傳結果:
14303
		#$result["status"],執行是否正常,"true"為正常,"false"為不正常.
14304
		#$result["error"],錯誤訊息陣列
14305
		#$result["function"],當前執行的函數名稱
14306
		#$result["content"],要執行的javaScript語法
14307
		#必填參數:
14308
		#$conf["script"],字串,要執行的javaScript語法.
14309
		$conf["javaScript::toScript"]["script"]="
226 liveuser 14310
 
3 liveuser 14311
		//initial window.qbpwcf
14312
		if(window.qbpwcf===undefined){
14313
 
14314
			window.qbpwcf={};
14315
 
14316
			}//if end
226 liveuser 14317
 
3 liveuser 14318
		//initial window.randomCode
14319
		if(window.qbpwcf.randomCode===undefined){
14320
 
14321
			window.qbpwcf.randomCode={};
14322
 
14323
			}//if end
14324
 
14325
		//set random code generate url
14326
		window.qbpwcf.randomCode.randomCodeUrl='".$conf["url"]."';
226 liveuser 14327
 
3 liveuser 14328
		//set 表單ID 陣列
14329
		window.qbpwcf.randomCode.formDataIDs=".json_encode($conf["names"])."
226 liveuser 14330
 
3 liveuser 14331
		//設置傳送表單的涵式
14332
		window.qbpwcf.randomCodeAjax = function(formObj){
226 liveuser 14333
 
3 liveuser 14334
			xmlhttp=new XMLHttpRequest();
14335
			xmlhttp.responseType='json';
14336
			xmlhttp.timeout=60000;
14337
			xmlhttp.open('POST',window.qbpwcf.randomCode.randomCodeUrl,true);
14338
			xmlhttp.setRequestHeader('Content-type','application/x-www-form-urlencoded');
14339
			xmlhttp.setRequestHeader('X-Requested-With','XMLHttpRequest');
14340
			xmlhttp.onreadystatechange=function(){
14341
 
14342
				//如果狀態為4且response code為200
14343
				if(xmlhttp.readyState===4 && xmlhttp.status===200){
14344
 
226 liveuser 14345
					//get response
3 liveuser 14346
					res=xmlhttp.response;
226 liveuser 14347
 
3 liveuser 14348
					//debug
14349
					console.log(res);
226 liveuser 14350
 
3 liveuser 14351
					//debug
14352
					console.log(res.status);
226 liveuser 14353
 
3 liveuser 14354
					//if error occur
14355
					if(res.status==='false'){
226 liveuser 14356
 
3 liveuser 14357
						//debug
14358
						console.log(res.error);
226 liveuser 14359
 
3 liveuser 14360
						//if no data
14361
						if(res.error==='no data'){
226 liveuser 14362
 
3 liveuser 14363
							//get random code base64 encoded string
14364
							var randomCodeSrc=res.content.randomCodeSrc;
226 liveuser 14365
 
3 liveuser 14366
							//debug
226 liveuser 14367
							console.log(randomCodeSrc);
14368
 
3 liveuser 14369
							//get random code length
14370
							window.qbpwcf.randomCode.codeLength=res.content.randomCodeLength;
226 liveuser 14371
 
3 liveuser 14372
							//debug
14373
							console.log(window.qbpwcf.randomCode.codeLength);
14374
 
14375
							//get code input element
14376
							var codeInput=document.getElementById('".$conf["resDivId"]."');
226 liveuser 14377
 
3 liveuser 14378
							//create img element
14379
							var img=document.createElement('img');
226 liveuser 14380
 
3 liveuser 14381
							//put src code
14382
							img.src=randomCodeSrc;
226 liveuser 14383
 
3 liveuser 14384
							//create random code img id
14385
							var imgId='".$conf["resDivId"]."'+'Img';
226 liveuser 14386
 
3 liveuser 14387
							//若存在舊的驗證碼
14388
							if(document.getElementById(imgId)!==null){
226 liveuser 14389
 
3 liveuser 14390
								//移除舊的驗證碼
14391
								document.getElementById(imgId).remove();
226 liveuser 14392
 
3 liveuser 14393
								}//if end
226 liveuser 14394
 
3 liveuser 14395
							//set img id
14396
							img.id=imgId;
226 liveuser 14397
 
3 liveuser 14398
							//設置寬度
14399
							img.width='200';
14400
 
14401
							//debug
14402
							console.log(img);
226 liveuser 14403
 
3 liveuser 14404
							//place random code img
14405
							codeInput.parentElement.prepend(img);
226 liveuser 14406
 
3 liveuser 14407
							}//if end
14408
 
14409
						//反之有其他錯誤
14410
						else{
226 liveuser 14411
 
3 liveuser 14412
							//debug
14413
							console.log(res.error);
14414
 
14415
							//alert
14416
							alert(res.error);
226 liveuser 14417
 
3 liveuser 14418
							}//else end
226 liveuser 14419
 
3 liveuser 14420
						}//if end
226 liveuser 14421
 
3 liveuser 14422
					//如果驗證失敗
14423
					if(res.passed==='false'){
14424
 
14425
						//debug
14426
						console.log(res.error);
14427
 
14428
						//alert
14429
						alert(res.error);
14430
 
14431
						}//if end
226 liveuser 14432
 
3 liveuser 14433
					//反之通過驗證
14434
					else if(res.passed==='true'){
14435
 
14436
						//debug
14437
						console.log(res.msg);
14438
 
14439
						//alert
14440
						//alert(res.msg);
226 liveuser 14441
 
3 liveuser 14442
						//set callback urls
14443
						window.qbpwcf.randomCode.callBackUrls=".json_encode($conf["callBackUrls"]).";
226 liveuser 14444
 
3 liveuser 14445
						//nested call callback urls
14446
						window.qbpwcf.randomCode.callBackFunc.call(this,formObj,window.qbpwcf.randomCode.callBackUrls);
14447
 
14448
						}//else end
226 liveuser 14449
 
3 liveuser 14450
					}//if end
14451
 
14452
				}//function end
226 liveuser 14453
 
14454
			//加密傳送資料
3 liveuser 14455
			xmlhttp.send('".$conf["sendedName"]."='+btoa(encodeURIComponent(JSON.stringify(formObj))));
226 liveuser 14456
 
3 liveuser 14457
			}//end window.qbpwcf.randomCodeAjax
14458
 
14459
		//initial call random code ajax
14460
		window.qbpwcf.randomCodeAjax({});
226 liveuser 14461
 
3 liveuser 14462
		//設置遞迴傳送表單的涵式
226 liveuser 14463
		window.qbpwcf.randomCode.callBackFunc = function(formObj,urls){
14464
 
3 liveuser 14465
			xmlhttp=new XMLHttpRequest();
14466
			xmlhttp.responseType='json';
14467
			xmlhttp.timeout=60000;
14468
			xmlhttp.open('POST',urls[0],true);
14469
			xmlhttp.setRequestHeader('Content-type','application/x-www-form-urlencoded');
14470
			xmlhttp.setRequestHeader('X-Requested-With','XMLHttpRequest');
14471
			xmlhttp.onreadystatechange=function(){
14472
 
14473
				//如果狀態為4且response code為200
14474
				if(xmlhttp.readyState===4 && xmlhttp.status===200){
14475
 
226 liveuser 14476
					//get response
3 liveuser 14477
					res=xmlhttp.response;
226 liveuser 14478
 
3 liveuser 14479
					//如果沒有定義 res.status
14480
					if(res===null){
14481
 
14482
						//debug
14483
						console.log('callback to '+urls[0]+' fails!');
226 liveuser 14484
 
3 liveuser 14485
						//show error
14486
						alert('callback to '+urls[0]+' fails!');
226 liveuser 14487
 
3 liveuser 14488
						//return & end process.
14489
						return false;
14490
 
14491
 
14492
						}//if end
14493
 
14494
					//debug
14495
					console.log(res);
226 liveuser 14496
 
3 liveuser 14497
					//如果沒有定義 res.status
14498
					if(res.status===undefined){
14499
 
14500
						//debug
14501
						console.log('callback to '+urls[0]+' fails!');
226 liveuser 14502
 
3 liveuser 14503
						//show error
14504
						alert('callback to '+urls[0]+' fails!');
226 liveuser 14505
 
3 liveuser 14506
						//return & end process.
14507
						return false;
14508
 
14509
						}//if end
14510
 
14511
					//debug
14512
					console.log(res.status);
226 liveuser 14513
 
3 liveuser 14514
					//如果執行不正常
14515
					if(res.status!=='true'){
226 liveuser 14516
 
3 liveuser 14517
						//debug
14518
						console.log('callback to '+urls[0]+' fails!');
226 liveuser 14519
 
3 liveuser 14520
						//show error
14521
						alert(res.error);
226 liveuser 14522
 
3 liveuser 14523
						//return & end process.
14524
						return false;
226 liveuser 14525
 
3 liveuser 14526
						}//if end
226 liveuser 14527
 
3 liveuser 14528
					//執行正常
14529
 
14530
					//如果有訊息
14531
					if(res.msg!==undefined){
14532
 
14533
						//顯示訊息
14534
						alert(res.msg);
14535
 
14536
						}//if end
226 liveuser 14537
 
3 liveuser 14538
					//新的表單變數存在
14539
					if(res.formObj!==undefined){
226 liveuser 14540
 
14541
						//取代要傳送的表單變數
3 liveuser 14542
						res=res.formObj;
226 liveuser 14543
 
14544
						}//else end
14545
 
3 liveuser 14546
					//移除第一個已經callback的url
14547
					urls.splice(0, 1);
226 liveuser 14548
 
3 liveuser 14549
					//如果還有 callback urls
14550
					if(urls.length>0){
226 liveuser 14551
 
3 liveuser 14552
						//debug
226 liveuser 14553
						console.log('callback to:'+urls[0]);
14554
 
3 liveuser 14555
						//nested call callback urls
14556
						window.qbpwcf.randomCode.callBackFunc.call(this,res,urls);
226 liveuser 14557
 
3 liveuser 14558
						}//if end
226 liveuser 14559
 
3 liveuser 14560
					//反之
14561
					else{
14562
 
14563
						//如果有 href 設定
14564
						if(res.href!==undefined){
226 liveuser 14565
 
3 liveuser 14566
							//到指定頁面
14567
							window.location.href=res.href;
14568
 
14569
							//結束執行
14570
							return true;
14571
 
14572
							}//if end
14573
 
14574
						//如果有 refresh 設定
14575
						if(res.refresh!==undefined){
14576
 
14577
							//如果要 refresh
14578
							if(res.refresh==='true'){
14579
 
14580
								//重新整理頁面
14581
								window.location.href=document.baseURI;
226 liveuser 14582
 
3 liveuser 14583
								//結束執行
14584
								return true;
14585
 
14586
								}//if end
226 liveuser 14587
 
3 liveuser 14588
							}//if end
14589
 
14590
						}//else end
226 liveuser 14591
 
3 liveuser 14592
					}//if end
14593
 
14594
				}//function end
226 liveuser 14595
 
14596
			//加密傳送資料
3 liveuser 14597
			xmlhttp.send('".$conf["sendedName"]."='+btoa(encodeURIComponent(JSON.stringify(formObj))));
226 liveuser 14598
 
3 liveuser 14599
			}//function end
226 liveuser 14600
 
3 liveuser 14601
		//get code input element
14602
		var codeInput=document.getElementById('".$conf["resDivId"]."');
226 liveuser 14603
 
3 liveuser 14604
		//如果存在輸入驗證碼的表單
14605
		if(codeInput!==null){
14606
 
14607
			//當輸入的驗證碼長度變化時、有按鍵放開時.
14608
			codeInput.addEventListener('keyup',function(e){
226 liveuser 14609
 
3 liveuser 14610
				//debug
14611
				console.log('keyup event occur');
14612
 
14613
				//debug
14614
				console.log('放開的Key爲'+e.key);
14615
 
14616
				//expected 'Enter' Key
14617
				if( e.key!=='Enter' )
14618
				{
14619
					//debug
14620
					console.log('ignore '+e.key);
14621
 
14622
					return false;
14623
 
14624
				}//if end
14625
 
14626
				//如果長度不一致
14627
				if(codeInput.value.length!==window.qbpwcf.randomCode.codeLength){
226 liveuser 14628
 
3 liveuser 14629
					//結束執行
14630
					return false;
226 liveuser 14631
 
3 liveuser 14632
					}//if end
226 liveuser 14633
 
3 liveuser 14634
				//長度一致
226 liveuser 14635
 
3 liveuser 14636
				//初始化 form Obj
14637
				formObj={};
226 liveuser 14638
 
3 liveuser 14639
				//依照每個表單
14640
				for(var i=0;i<window.qbpwcf.randomCode.formDataIDs.length;i++){
226 liveuser 14641
 
3 liveuser 14642
					//構成表單變數名稱
226 liveuser 14643
					var formName=window.qbpwcf.randomCode.formDataIDs[i];
3 liveuser 14644
 
14645
					//debug
14646
					console.log(formName);
14647
 
14648
					//取得表單內容
14649
					formObj.formName=document.getElementById(window.qbpwcf.randomCode.formDataIDs[i]).value;
226 liveuser 14650
 
3 liveuser 14651
					}//for end
226 liveuser 14652
 
3 liveuser 14653
				//加入驗證碼表單內容
14654
				formObj.".$conf["resDivId"]."=document.getElementById('".$conf["resDivId"]."').value;
226 liveuser 14655
 
3 liveuser 14656
				//傳送表單
14657
				window.qbpwcf.randomCodeAjax.call(this,formObj);
226 liveuser 14658
 
3 liveuser 14659
				});//function end
14660
 
14661
			}//if end
14662
		";
14663
		#可省略參數:
14664
		#$conf["onReady"],字串,是否要在網頁完全載入後再執行,"false"為不等載入完就先執行,預設為"true"要等載入完再執行.
14665
		#$conf["onReady"]="true";
14666
		#$conf["globalJs"],字串陣列,為要放入<script>標籤的js全域變數.
14667
		#$conf["globalJs"]=array();
14668
		#$conf["jsFunciton"],字串陣列,為要放入<script>標籤的js函數.
14669
		#$conf["jsFunciton"]=array();
14670
		#參考資料:
14671
		#http://stackoverflow.com/questions/9899372/pure-javascript-equivalent-to-jquerys-ready-how-to-call-a-function-when-the
14672
		$toScript=javaScript::toScript($conf["javaScript::toScript"]);
14673
		unset($conf["javaScript::toScript"]);
226 liveuser 14674
 
3 liveuser 14675
		#如果建立js失敗
14676
		if($toScript["status"]==="false"){
226 liveuser 14677
 
3 liveuser 14678
			#設置執行失敗
14679
			$result["status"]="false";
14680
 
14681
			#設置執行錯誤訊息
14682
			$result["error"]=$toScript;
14683
 
14684
			#回傳結果
14685
			return $result;
226 liveuser 14686
 
3 liveuser 14687
			}#if end
226 liveuser 14688
 
3 liveuser 14689
		#儲存 js 語法
14690
		$result["content"]=$result["content"].$toScript["content"];
226 liveuser 14691
 
3 liveuser 14692
		#設置執行正常
14693
		$result["status"]="true";
226 liveuser 14694
 
3 liveuser 14695
		#回傳結果
226 liveuser 14696
		return $result;
14697
 
3 liveuser 14698
		}#function randomCode end
14699
 
14700
	/*
14701
	#函式說明:
14702
	#$conf["countdownSec"]n秒後轉址
14703
	#回傳結果:
14704
	#$result["status"],執行正常與否,"true"代表正常,"false"代表不正常.
14705
	#$result["error"],錯誤訊息.
14706
	#$result["function"],當前執行的函式名稱.
14707
	#$result["content"],js語法.
14708
	#必填參數:
14709
	#$conf["url"],字串,要導頁到哪邊.
14710
	$conf["url"]="";
14711
	#可省略參數:
14712
	#$conf["countdownSec"],字串,幾秒後要導頁,預設不指定.
14713
	#$conf["countdownSec"]="";
14714
	#參考資料:
14715
	#無.
14716
	#備註:
14717
	#無.
14718
	*/
14719
	public static function redirectUrl(&$conf){
14720
 
14721
		#初始化要回傳的結果
14722
		$result=array();
14723
 
14724
		#取得當前執行的函數名稱
14725
		$result["function"]=__FUNCTION__;
14726
 
14727
		#如果沒有參數
14728
		if(func_num_args()==0){
14729
 
14730
			#設置執行失敗
14731
			$result["status"]="false";
14732
 
14733
			#設置執行錯誤訊息
14734
			$result["error"]="函數".$result["function"]."需要參數";
14735
 
14736
			#回傳結果
14737
			return $result;
14738
 
14739
			}#if end
14740
 
14741
		#取得參數
14742
		$result["argu"]=$conf;
14743
 
14744
		#如果 $conf 不為陣列
14745
		if(gettype($conf)!=="array"){
14746
 
14747
			#設置執行失敗
14748
			$result["status"]="false";
14749
 
14750
			#設置執行錯誤訊息
14751
			$result["error"][]="\$conf變數須為陣列形態";
14752
 
14753
			#如果傳入的參數為 null
14754
			if($conf===null){
14755
 
14756
				#設置執行錯誤訊息
14757
				$result["error"][]="\$conf變數不得為null,請檢查函數「".$result["function"]."」的參數設置有無正確!";
14758
 
14759
				}#if end
14760
 
14761
			#回傳結果
14762
			return $result;
14763
 
14764
			}#if end
14765
 
14766
		#初始化內容
226 liveuser 14767
		$result["content"]="";
3 liveuser 14768
 
14769
		#檢查參數
14770
		#函式說明:
14771
		#檢查必填與可省略的參數,可省略參數可指定預設要給與什麼數值內容。
14772
		#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
14773
		#$reuslt["error"],執行不正常結束的錯訊息陣列.
14774
		#$result["function"],當前執行的函式名稱.
14775
		#$result["passed"],識別要檢查的全體變數是否存在以及型態是否正確的變數,"true"代表檢查全部通過;"false"代表檢查不通過
14776
		#$result[$shouldBeCheckedVarName]["varExist"],所檢查的變數是否存在,"false"代表不存在;"true"代表存在
14777
		#$result[$shouldBeCheckedVarName]["varType"],所檢查的變數型態是否正確,"false"代表錯誤;"true"代表正確
14778
		#$result[$shouldBeCheckedVarName]["error"],每個參數設定的錯誤訊息
14779
		#$result["shouldNotBeEmpty"],不應該為空字串或控陣列的變數.
14780
		#$result["argu"],字串陣列,目前輸入的參數名稱陣列.
14781
		#$result["legalVarName"],字串陣列,合法可用的參數名稱陣列.
14782
		#$result["notNeedVar"],字串陣列,多餘的參數名稱.
14783
		#必填參數:
14784
		#$conf["varInput"],陣列變數,要檢查的陣列變數,請在要檢查的參數前面加上&,這樣變動的結果才能被套用。
14785
		$conf["variableCheck::checkArguments"]["varInput"]=&$conf;
14786
		#$conf["mustBeFilledVariableName"],爲必填參數的變數名稱陣列,形態爲陣列變數,元素數量需要跟"mustBeFilledVariableType"參數的元素數量一致,例如: $conf["mustBeFilledVariableName"] = array("id","account","password");
14787
		$conf["variableCheck::checkArguments"]["mustBeFilledVariableName"]=array("url");
14788
		#$conf["mustBeFilledVariableType"],爲必填參數的變數陣列應該爲何種變數形態,形態爲陣列,元素數量需要跟"mustBeFilledVariableName"參數的元素數量一致,例如: $conf["mustBeFilledVariableType"] = array("string",integer,"double","resource","object"); , null代表不指定變數形態.
14789
		$conf["variableCheck::checkArguments"]["mustBeFilledVariableType"]=array("string");
14790
		#$conf["referenceVarKey"],字串,$conf參數後面的key值,用於移除不要的參考陣列.
14791
		$conf["variableCheck::checkArguments"]["referenceVarKey"]="variableCheck::checkArguments";
14792
		#可以省略的參數:
14793
		#$conf["canBeEmptyString"],字串,必填變數內容如果是空字串就不能算是有設置的話,請設為"false",預設爲"true",可以為空字串.
14794
		$conf["variableCheck::checkArguments"]["canBeEmptyString"]="false";
14795
		#$conf["canNotBeEmpty"],字串陣列,哪些必填參數的內容不得為空字串或空陣列,僅當$conf["canBeEmptyString"]為"true"時會生效.
14796
		#$conf["canNotBeEmpty"]=array();
14797
		#$conf["canBeEmpty"],字串陣列,哪些必填參數的內容可為空字串或空陣列,僅當$conf["canBeEmptyString"]為"false"時會生效.
14798
		#$conf["canBeEmpty"]=array();
14799
		#$conf["skipableVariableCanNotBeEmpty"],字串陣列,哪些可省略參數不可以為空字串或空陣列.
14800
		$conf["variableCheck::checkArguments"]["skipableVariableCanNotBeEmpty"]=array("countdownSec");
14801
		#$conf["skipableVariableName"],陣列字串,爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableName"] = array("id","account","password");
14802
		$conf["variableCheck::checkArguments"]["skipableVariableName"]=array("countdownSec");
14803
		#$conf["skipableVariableType"],陣列字串,爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableType"] = array("string",integer,"double");
14804
		$conf["variableCheck::checkArguments"]["skipableVariableType"]=array("string");
14805
		#$conf["skipableVarDefaultValue"],字串陣列,每個不存在的可省略變數要初始化為什麼,null與代表不指定,若預設值是參數之一,請將$conf["mustBeFilledVar"]改成"\$conf["\mustBeFilledVar\"]".
14806
		$conf["variableCheck::checkArguments"]["skipableVarDefaultValue"]=array(null);
14807
		#$conf["arrayCountEqualCheck"],字串陣列,為檢查哪些陣列參數的元素數量要一樣,$conf["arrayCountEqualCheck"][$i]=array()為第$i組key為哪些的變數其元素數量要相等.
14808
		#$conf["arrayCountEqualCheck"][]=array();
14809
		#參考資料來源:
14810
		#array_keys=>http://php.net/manual/en/function.array-keys.php
14811
		$checkArguments=variableCheck::checkArguments($conf["variableCheck::checkArguments"]);
14812
		unset($conf["variableCheck::checkArguments"]);
14813
 
14814
		#如果檢查參數失敗
14815
		if($checkArguments["status"]==="false"){
14816
 
14817
			#設置執行失敗
14818
			$result["status"]="false";
14819
 
14820
			#設置執行錯誤訊息
14821
			$result["error"]=$checkArguments;
14822
 
14823
			#回傳結果
14824
			return $result;
14825
 
14826
			}#if end
14827
 
14828
		#如果參數檢查不通過
14829
		if($checkArguments["passed"]==="false"){
14830
 
14831
			#設置執行失敗
14832
			$result["status"]="false";
14833
 
14834
			#設置執行錯誤訊息
14835
			$result["error"]=$checkArguments;
14836
 
14837
			#回傳結果
14838
			return $result;
14839
 
14840
			}#if end
14841
 
14842
		#初始化不指定要幾秒後導頁
14843
		$countdownSec="";
14844
 
14845
		#如果有設置 countdownSec
14846
		if(isset($conf["countdownSec"])){
14847
 
14848
			#設置要幾秒後才導頁
14849
			$countdownSec="params.countdownSec=".$conf["countdownSec"].";";
14850
 
14851
			}#if end
14852
 
14853
		#函式說明:
14854
		#將要執行的script語法透過該函式執行(會在程式外層用<script></script>包起來).
14855
		#回傳結果:
14856
		#$result["status"],執行是否正常,"true"為正常,"false"為不正常.
14857
		#$result["error"],錯誤訊息陣列
14858
		#$result["function"],當前執行的函數名稱
14859
		#$result["content"],要執行的javaScript語法
14860
		#必填參數:
14861
		#$conf["script"],字串,要執行的javaScript語法.
14862
		$conf["javaScript::toScript"]["script"]=
14863
		"
14864
		params={};
14865
		params.url='".$conf["url"]."';
14866
		".$countdownSec."
174 liveuser 14867
		window.qbpwcf.redirectURL.call(this,params);
3 liveuser 14868
		";
14869
		#可省略參數:
14870
		#$conf["onReady"],字串,是否要在網頁完全載入後再執行,"false"為不等載入完就先執行,預設為"true"要等載入完再執行.
14871
		#$conf["onReady"]="true";
14872
		#$conf["globalJs"],字串陣列,為要放入<script>標籤的js全域變數.
14873
		#$conf["globalJs"]=array();
14874
		#$conf["jsFunciton"],字串陣列,為要放入<script>標籤的js函數.
14875
		#$conf["jsFunciton"]=array();
14876
		#參考資料:
14877
		#http://stackoverflow.com/questions/9899372/pure-javascript-equivalent-to-jquerys-ready-how-to-call-a-function-when-the
14878
		$toScript=javaScript::toScript($conf["javaScript::toScript"]);
14879
		unset($conf["javaScript::toScript"]);
14880
 
14881
		#如果執行失敗
14882
		if($toScript["status"]==="false"){
14883
 
14884
			#設置執行失敗
14885
			$result["status"]="false";
14886
 
14887
			#設置執行錯誤訊息
14888
			$result["error"]=$toScript;
14889
 
14890
			#回傳結果
14891
			return $result;
14892
 
14893
			}#if end
226 liveuser 14894
 
3 liveuser 14895
		#取得js語法
14896
		$result["content"]=$toScript["content"];
14897
 
14898
		#設置執行正常
14899
		$result["status"]="true";
14900
 
14901
		#回傳結果
14902
		return $result;
14903
 
14904
		}#function redirectUrl end
14905
 
14906
	/*
14907
	#函式說明:
14908
	#傳遞識別數字進而取得連續的資料
14909
	#回傳結果:
14910
	#$result["status"],執行正常與否,"true"代表正常,"false"代表不正常.
14911
	#$result["error"],錯誤訊息.
14912
	#$result["function"],當前執行的函式名稱.
14913
	#$result["content"],js語法.
14914
	#必填參數:
14915
	#$conf["params"],參數陣列,要傳遞的識別參數.
14916
	$conf["params"]=array();
14917
	#$conf["url"],字串,要從哪個頁面要求連續的資料.
14918
	$conf["url"]="";
14919
	#可省略參數:
14920
	#$conf["method"],字串,資料傳輸的方式,有POST跟GET
14921
	#$conf["method"]="";
14922
	#$conf["responseDivId"],字串,放置取得資料div的id.
14923
	#$conf["responseDivId"]="";
14924
	#參考資料:
14925
	#無.
14926
	#備註:
14927
	#無.
14928
	*/
14929
	public static function tailAny(&$conf){
226 liveuser 14930
 
3 liveuser 14931
		#初始化要回傳的結果
14932
		$result=array();
14933
 
14934
		#取得當前執行的函數名稱
14935
		$result["function"]=__FUNCTION__;
14936
 
14937
		#如果沒有參數
14938
		if(func_num_args()==0){
14939
 
14940
			#設置執行失敗
14941
			$result["status"]="false";
14942
 
14943
			#設置執行錯誤訊息
14944
			$result["error"]="函數".$result["function"]."需要參數";
14945
 
14946
			#回傳結果
14947
			return $result;
14948
 
14949
			}#if end
14950
 
14951
		#取得參數
14952
		$result["argu"]=$conf;
14953
 
14954
		#如果 $conf 不為陣列
14955
		if(gettype($conf)!=="array"){
14956
 
14957
			#設置執行失敗
14958
			$result["status"]="false";
14959
 
14960
			#設置執行錯誤訊息
14961
			$result["error"][]="\$conf變數須為陣列形態";
14962
 
14963
			#如果傳入的參數為 null
14964
			if($conf===null){
14965
 
14966
				#設置執行錯誤訊息
14967
				$result["error"][]="\$conf變數不得為null,請檢查函數「".$result["function"]."」的參數設置有無正確!";
14968
 
14969
				}#if end
14970
 
14971
			#回傳結果
14972
			return $result;
14973
 
14974
			}#if end
14975
 
14976
		#初始化內容
226 liveuser 14977
		$result["content"]="";
3 liveuser 14978
 
14979
		#檢查參數
14980
		#函式說明:
14981
		#檢查必填與可省略的參數,可省略參數可指定預設要給與什麼數值內容。
14982
		#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
14983
		#$reuslt["error"],執行不正常結束的錯訊息陣列.
14984
		#$result["function"],當前執行的函式名稱.
14985
		#$result["passed"],識別要檢查的全體變數是否存在以及型態是否正確的變數,"true"代表檢查全部通過;"false"代表檢查不通過
14986
		#$result[$shouldBeCheckedVarName]["varExist"],所檢查的變數是否存在,"false"代表不存在;"true"代表存在
14987
		#$result[$shouldBeCheckedVarName]["varType"],所檢查的變數型態是否正確,"false"代表錯誤;"true"代表正確
14988
		#$result[$shouldBeCheckedVarName]["error"],每個參數設定的錯誤訊息
14989
		#$result["shouldNotBeEmpty"],不應該為空字串或控陣列的變數.
14990
		#$result["argu"],字串陣列,目前輸入的參數名稱陣列.
14991
		#$result["legalVarName"],字串陣列,合法可用的參數名稱陣列.
14992
		#$result["notNeedVar"],字串陣列,多餘的參數名稱.
14993
		#必填參數:
14994
		#$conf["varInput"],陣列變數,要檢查的陣列變數,請在要檢查的參數前面加上&,這樣變動的結果才能被套用。
14995
		$conf["variableCheck::checkArguments"]["varInput"]=&$conf;
14996
		#$conf["mustBeFilledVariableName"],爲必填參數的變數名稱陣列,形態爲陣列變數,元素數量需要跟"mustBeFilledVariableType"參數的元素數量一致,例如: $conf["mustBeFilledVariableName"] = array("id","account","password");
14997
		$conf["variableCheck::checkArguments"]["mustBeFilledVariableName"]=array("params","url");
14998
		#$conf["mustBeFilledVariableType"],爲必填參數的變數陣列應該爲何種變數形態,形態爲陣列,元素數量需要跟"mustBeFilledVariableName"參數的元素數量一致,例如: $conf["mustBeFilledVariableType"] = array("string",integer,"double","resource","object"); , null代表不指定變數形態.
14999
		$conf["variableCheck::checkArguments"]["mustBeFilledVariableType"]=array("array","string");
15000
		#$conf["referenceVarKey"],字串,$conf參數後面的key值,用於移除不要的參考陣列.
15001
		$conf["variableCheck::checkArguments"]["referenceVarKey"]="variableCheck::checkArguments";
15002
		#可以省略的參數:
15003
		#$conf["canBeEmptyString"],字串,必填變數內容如果是空字串就不能算是有設置的話,請設為"false",預設爲"true",可以為空字串.
15004
		$conf["variableCheck::checkArguments"]["canBeEmptyString"]="false";
15005
		#$conf["canNotBeEmpty"],字串陣列,哪些必填參數的內容不得為空字串或空陣列,僅當$conf["canBeEmptyString"]為"true"時會生效.
15006
		#$conf["canNotBeEmpty"]=array();
15007
		#$conf["canBeEmpty"],字串陣列,哪些必填參數的內容可為空字串或空陣列,僅當$conf["canBeEmptyString"]為"false"時會生效.
15008
		#$conf["canBeEmpty"]=array();
15009
		#$conf["skipableVariableCanNotBeEmpty"],字串陣列,哪些可省略參數不可以為空字串或空陣列.
15010
		$conf["variableCheck::checkArguments"]["skipableVariableCanNotBeEmpty"]=array("method","responseDivId");
15011
		#$conf["skipableVariableName"],陣列字串,爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableName"] = array("id","account","password");
15012
		$conf["variableCheck::checkArguments"]["skipableVariableName"]=array("method","responseDivId");
15013
		#$conf["skipableVariableType"],陣列字串,爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableType"] = array("string",integer,"double");
15014
		$conf["variableCheck::checkArguments"]["skipableVariableType"]=array("string","string");
15015
		#$conf["skipableVarDefaultValue"],字串陣列,每個不存在的可省略變數要初始化為什麼,null與代表不指定,若預設值是參數之一,請將$conf["mustBeFilledVar"]改成"\$conf["\mustBeFilledVar\"]".
15016
		$conf["variableCheck::checkArguments"]["skipableVarDefaultValue"]=array("POST","rootDiv");
15017
		#$conf["arrayCountEqualCheck"],字串陣列,為檢查哪些陣列參數的元素數量要一樣,$conf["arrayCountEqualCheck"][$i]=array()為第$i組key為哪些的變數其元素數量要相等.
15018
		#$conf["arrayCountEqualCheck"][]=array();
15019
		#參考資料來源:
15020
		#array_keys=>http://php.net/manual/en/function.array-keys.php
15021
		$checkArguments=variableCheck::checkArguments($conf["variableCheck::checkArguments"]);
15022
		unset($conf["variableCheck::checkArguments"]);
15023
 
15024
		#如果檢查參數失敗
15025
		if($checkArguments["status"]==="false"){
15026
 
15027
			#設置執行失敗
15028
			$result["status"]="false";
15029
 
15030
			#設置執行錯誤訊息
15031
			$result["error"]=$checkArguments;
15032
 
15033
			#回傳結果
15034
			return $result;
15035
 
15036
			}#if end
15037
 
15038
		#如果參數檢查不通過
15039
		if($checkArguments["passed"]==="false"){
15040
 
15041
			#設置執行失敗
15042
			$result["status"]="false";
15043
 
15044
			#設置執行錯誤訊息
15045
			$result["error"]=$checkArguments;
15046
 
15047
			#回傳結果
15048
			return $result;
15049
 
15050
			}#if end
15051
 
15052
		#函式說明:
15053
		#將要執行的script語法透過該函式執行(會在程式外層用<script></script>包起來).
15054
		#回傳結果:
15055
		#$result["status"],執行是否正常,"true"為正常,"false"為不正常.
15056
		#$result["error"],錯誤訊息陣列
15057
		#$result["function"],當前執行的函數名稱
15058
		#$result["content"],要執行的javaScript語法
15059
		#必填參數:
15060
		#$conf["script"],字串,要執行的javaScript語法.
15061
		$conf["javaScript::toScript"]["script"]=
15062
		"
15063
		params=".json_encode($conf["params"])."
15064
		var tailAny=new window.qbpwcf.tailAny.func(params,'".$conf["url"]."','".$conf["method"]."','".$conf["responseDivId"]."');
15065
		";
15066
		#可省略參數:
15067
		#$conf["onReady"],字串,是否要在網頁完全載入後再執行,"false"為不等載入完就先執行,預設為"true"要等載入完再執行.
15068
		#$conf["onReady"]="true";
15069
		#$conf["globalJs"],字串陣列,為要放入<script>標籤的js全域變數.
15070
		#$conf["globalJs"]=array();
15071
		#$conf["jsFunciton"],字串陣列,為要放入<script>標籤的js函數.
15072
		#$conf["jsFunciton"]=array();
15073
		#參考資料:
15074
		#http://stackoverflow.com/questions/9899372/pure-javascript-equivalent-to-jquerys-ready-how-to-call-a-function-when-the
15075
		$toScript=javaScript::toScript($conf["javaScript::toScript"]);
15076
		unset($conf["javaScript::toScript"]);
15077
 
15078
		#如果執行失敗
15079
		if($toScript["status"]==="false"){
15080
 
15081
			#設置執行失敗
15082
			$result["status"]="false";
15083
 
15084
			#設置執行錯誤訊息
15085
			$result["error"]=$toScript;
15086
 
15087
			#回傳結果
15088
			return $result;
15089
 
15090
			}#if end
226 liveuser 15091
 
3 liveuser 15092
		#取得js語法
15093
		$result["content"]=$toScript["content"];
15094
 
15095
		#設置執行正常
15096
		$result["status"]="true";
15097
 
15098
		#回傳結果
15099
		return $result;
15100
 
15101
		}#funtion tailAny end
15102
 
15103
	/*
15104
	#函式說明:
15105
	#設置點擊元素後會傳遞data屬性為名稱與其數值為表單數值給特定url,進而取得連續的資料
15106
	#回傳結果:
15107
	#$result["status"],執行正常與否,"true"代表正常,"false"代表不正常.
15108
	#$result["error"],錯誤訊息.
15109
	#$result["function"],當前執行的函式名稱.
15110
	#$result["content"],js語法.
15111
	#必填參數:
15112
	#$conf["elementJS"],字串,要用什麼js語法抓取要綁定事件的元素
15113
	$conf["elementJS"]=""
15114
	#$conf["url"],字串,要將表單資訊傳遞的哪個url.
15115
	$conf["url"]="";
15116
	#可省略參數:
15117
	#$conf["method"],字串,資料傳輸的方式,有POST跟GET,預設為"POST".
15118
	#$conf["method"]="";
15119
	#$conf["resDiv"],字串,放置回應的div之id,預設為"rootDiv".
15120
	#$conf["resDiv"]="";
15121
	#參考資料:
15122
	#無.
15123
	#備註:
15124
	#無.
174 liveuser 15125
	*/
3 liveuser 15126
	public static function postDataAttr(&$conf){
15127
 
15128
		#初始化要回傳的結果
15129
		$result=array();
15130
 
15131
		#取得當前執行的函數名稱
15132
		$result["function"]=__FUNCTION__;
15133
 
15134
		#如果沒有參數
15135
		if(func_num_args()==0){
15136
 
15137
			#設置執行失敗
15138
			$result["status"]="false";
15139
 
15140
			#設置執行錯誤訊息
15141
			$result["error"]="函數".$result["function"]."需要參數";
15142
 
15143
			#回傳結果
15144
			return $result;
15145
 
15146
			}#if end
15147
 
15148
		#取得參數
15149
		$result["argu"]=$conf;
15150
 
15151
		#如果 $conf 不為陣列
15152
		if(gettype($conf)!=="array"){
15153
 
15154
			#設置執行失敗
15155
			$result["status"]="false";
15156
 
15157
			#設置執行錯誤訊息
15158
			$result["error"][]="\$conf變數須為陣列形態";
15159
 
15160
			#如果傳入的參數為 null
15161
			if($conf===null){
15162
 
15163
				#設置執行錯誤訊息
15164
				$result["error"][]="\$conf變數不得為null,請檢查函數「".$result["function"]."」的參數設置有無正確!";
15165
 
15166
				}#if end
15167
 
15168
			#回傳結果
15169
			return $result;
15170
 
15171
			}#if end
15172
 
15173
		#初始化內容
226 liveuser 15174
		$result["content"]="";
3 liveuser 15175
 
15176
		#檢查參數
15177
		#函式說明:
15178
		#檢查必填與可省略的參數,可省略參數可指定預設要給與什麼數值內容。
15179
		#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
15180
		#$reuslt["error"],執行不正常結束的錯訊息陣列.
15181
		#$result["function"],當前執行的函式名稱.
15182
		#$result["passed"],識別要檢查的全體變數是否存在以及型態是否正確的變數,"true"代表檢查全部通過;"false"代表檢查不通過
15183
		#$result[$shouldBeCheckedVarName]["varExist"],所檢查的變數是否存在,"false"代表不存在;"true"代表存在
15184
		#$result[$shouldBeCheckedVarName]["varType"],所檢查的變數型態是否正確,"false"代表錯誤;"true"代表正確
15185
		#$result[$shouldBeCheckedVarName]["error"],每個參數設定的錯誤訊息
15186
		#$result["shouldNotBeEmpty"],不應該為空字串或控陣列的變數.
15187
		#$result["argu"],字串陣列,目前輸入的參數名稱陣列.
15188
		#$result["legalVarName"],字串陣列,合法可用的參數名稱陣列.
15189
		#$result["notNeedVar"],字串陣列,多餘的參數名稱.
15190
		#必填參數:
15191
		#$conf["varInput"],陣列變數,要檢查的陣列變數,請在要檢查的參數前面加上&,這樣變動的結果才能被套用。
15192
		$conf["variableCheck::checkArguments"]["varInput"]=&$conf;
15193
		#$conf["mustBeFilledVariableName"],爲必填參數的變數名稱陣列,形態爲陣列變數,元素數量需要跟"mustBeFilledVariableType"參數的元素數量一致,例如: $conf["mustBeFilledVariableName"] = array("id","account","password");
15194
		$conf["variableCheck::checkArguments"]["mustBeFilledVariableName"]=array("elementJS","url");
15195
		#$conf["mustBeFilledVariableType"],爲必填參數的變數陣列應該爲何種變數形態,形態爲陣列,元素數量需要跟"mustBeFilledVariableName"參數的元素數量一致,例如: $conf["mustBeFilledVariableType"] = array("string",integer,"double","resource","object"); , null代表不指定變數形態.
15196
		$conf["variableCheck::checkArguments"]["mustBeFilledVariableType"]=array("string","string");
15197
		#$conf["referenceVarKey"],字串,$conf參數後面的key值,用於移除不要的參考陣列.
15198
		$conf["variableCheck::checkArguments"]["referenceVarKey"]="variableCheck::checkArguments";
15199
		#可以省略的參數:
15200
		#$conf["canBeEmptyString"],字串,必填變數內容如果是空字串就不能算是有設置的話,請設為"false",預設爲"true",可以為空字串.
15201
		$conf["variableCheck::checkArguments"]["canBeEmptyString"]="false";
15202
		#$conf["canNotBeEmpty"],字串陣列,哪些必填參數的內容不得為空字串或空陣列,僅當$conf["canBeEmptyString"]為"true"時會生效.
15203
		#$conf["canNotBeEmpty"]=array();
15204
		#$conf["canBeEmpty"],字串陣列,哪些必填參數的內容可為空字串或空陣列,僅當$conf["canBeEmptyString"]為"false"時會生效.
15205
		#$conf["canBeEmpty"]=array();
15206
		#$conf["skipableVariableCanNotBeEmpty"],字串陣列,哪些可省略參數不可以為空字串或空陣列.
15207
		$conf["variableCheck::checkArguments"]["skipableVariableCanNotBeEmpty"]=array("method","resDiv");
15208
		#$conf["skipableVariableName"],陣列字串,爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableName"] = array("id","account","password");
15209
		$conf["variableCheck::checkArguments"]["skipableVariableName"]=array("method","resDiv");
15210
		#$conf["skipableVariableType"],陣列字串,爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableType"] = array("string",integer,"double");
15211
		$conf["variableCheck::checkArguments"]["skipableVariableType"]=array("string","string");
15212
		#$conf["skipableVarDefaultValue"],字串陣列,每個不存在的可省略變數要初始化為什麼,null與代表不指定,若預設值是參數之一,請將$conf["mustBeFilledVar"]改成"\$conf["\mustBeFilledVar\"]".
15213
		$conf["variableCheck::checkArguments"]["skipableVarDefaultValue"]=array("POST","rootDiv");
15214
		#$conf["arrayCountEqualCheck"],字串陣列,為檢查哪些陣列參數的元素數量要一樣,$conf["arrayCountEqualCheck"][$i]=array()為第$i組key為哪些的變數其元素數量要相等.
15215
		#$conf["arrayCountEqualCheck"][]=array();
15216
		#參考資料來源:
15217
		#array_keys=>http://php.net/manual/en/function.array-keys.php
15218
		$checkArguments=variableCheck::checkArguments($conf["variableCheck::checkArguments"]);
15219
		unset($conf["variableCheck::checkArguments"]);
15220
 
15221
		#如果檢查參數失敗
15222
		if($checkArguments["status"]==="false"){
15223
 
15224
			#設置執行失敗
15225
			$result["status"]="false";
15226
 
15227
			#設置執行錯誤訊息
15228
			$result["error"]=$checkArguments;
15229
 
15230
			#回傳結果
15231
			return $result;
15232
 
15233
			}#if end
15234
 
15235
		#如果參數檢查不通過
15236
		if($checkArguments["passed"]==="false"){
15237
 
15238
			#設置執行失敗
15239
			$result["status"]="false";
15240
 
15241
			#設置執行錯誤訊息
15242
			$result["error"]=$checkArguments;
15243
 
15244
			#回傳結果
15245
			return $result;
15246
 
15247
			}#if end
15248
 
15249
		#函式說明:
15250
		#將要執行的script語法透過該函式執行(會在程式外層用<script></script>包起來).
15251
		#回傳結果:
15252
		#$result["status"],執行是否正常,"true"為正常,"false"為不正常.
15253
		#$result["error"],錯誤訊息陣列
15254
		#$result["function"],當前執行的函數名稱
15255
		#$result["content"],要執行的javaScript語法
15256
		#必填參數:
15257
		#$conf["script"],字串,要執行的javaScript語法.
15258
		$conf["javaScript::toScript"]["script"]=
15259
		"
15260
		element=".$conf["elementJS"]."
15261
		window.qbpwcf.postDataAttr.func.call(this,element,'".$conf["url"]."','".$conf["method"]."','".$conf["resDiv"]."');
15262
		";
15263
		#可省略參數:
15264
		#$conf["onReady"],字串,是否要在網頁完全載入後再執行,"false"為不等載入完就先執行,預設為"true"要等載入完再執行.
15265
		#$conf["onReady"]="true";
15266
		#$conf["globalJs"],字串陣列,為要放入<script>標籤的js全域變數.
15267
		#$conf["globalJs"]=array();
15268
		#$conf["jsFunciton"],字串陣列,為要放入<script>標籤的js函數.
15269
		#$conf["jsFunciton"]=array();
15270
		#參考資料:
15271
		#http://stackoverflow.com/questions/9899372/pure-javascript-equivalent-to-jquerys-ready-how-to-call-a-function-when-the
15272
		$toScript=javaScript::toScript($conf["javaScript::toScript"]);
15273
		unset($conf["javaScript::toScript"]);
15274
 
15275
		#如果執行失敗
15276
		if($toScript["status"]==="false"){
15277
 
15278
			#設置執行失敗
15279
			$result["status"]="false";
15280
 
15281
			#設置執行錯誤訊息
15282
			$result["error"]=$toScript;
15283
 
15284
			#回傳結果
15285
			return $result;
15286
 
15287
			}#if end
226 liveuser 15288
 
3 liveuser 15289
		#取得js語法
15290
		$result["content"]=$toScript["content"];
15291
 
15292
		#設置執行正常
15293
		$result["status"]="true";
15294
 
15295
		#回傳結果
15296
		return $result;
15297
 
15298
		}#function postDataAttr end
15299
 
15300
	/*
15301
	#函式說明:
15302
	#設置指定元素的數值長度為特定條件時,會傳遞data屬性為名稱與其數值為表單數值給特定url,進而取得連續的資料
15303
	#回傳結果:
15304
	#$result["status"],執行正常與否,"true"代表正常,"false"代表不正常.
15305
	#$result["error"],錯誤訊息.
15306
	#$result["function"],當前執行的函式名稱.
15307
	#$result["content"],js語法.
15308
	#必填參數:
15309
	#$conf["elementJS"],字串,要用什麼js語法抓取要綁定事件的元素
15310
	$conf["elementJS"]=""
15311
	#$conf["length"],字串,數值長度為多少才傳送要求.
15312
	$conf["length"]="";
15313
	#$conf["paramsJS"],字串陣列要使用的js參數物件
15314
	$conf["paramsJS"]="";
15315
	#$conf["url"],字串,要將表單資訊傳遞的哪個url.
15316
	$conf["url"]="";
15317
	#可省略參數:
15318
	#$conf["method"],字串,資料傳輸的方式,有POST跟GET,預設為"POST".
15319
	#$conf["method"]="";
15320
	#$conf["resDiv"],字串,放置回應的div之id,預設為"rootDiv".
15321
	#$conf["resDiv"]="";
15322
	#$conf["outFunc"],字串,重新定義用來將資料放到畫面上的函式,參數有兩個,第一個是得到的json回應,第二個為放置回應的div之id.
15323
	#$conf["outFunc"]="function(res,id){console.log(res,id);}";
15324
	#參考資料:
15325
	#無.
15326
	#備註:
15327
	#無.
15328
	*/
15329
	public static function gatDataDynamic(&$conf){
15330
 
15331
		#初始化要回傳的結果
15332
		$result=array();
15333
 
15334
		#取得當前執行的函數名稱
15335
		$result["function"]=__FUNCTION__;
15336
 
15337
		#如果沒有參數
15338
		if(func_num_args()==0){
15339
 
15340
			#設置執行失敗
15341
			$result["status"]="false";
15342
 
15343
			#設置執行錯誤訊息
15344
			$result["error"]="函數".$result["function"]."需要參數";
15345
 
15346
			#回傳結果
15347
			return $result;
15348
 
15349
			}#if end
15350
 
15351
		#取得參數
15352
		$result["argu"]=$conf;
15353
 
15354
		#如果 $conf 不為陣列
15355
		if(gettype($conf)!=="array"){
15356
 
15357
			#設置執行失敗
15358
			$result["status"]="false";
15359
 
15360
			#設置執行錯誤訊息
15361
			$result["error"][]="\$conf變數須為陣列形態";
15362
 
15363
			#如果傳入的參數為 null
15364
			if($conf===null){
15365
 
15366
				#設置執行錯誤訊息
15367
				$result["error"][]="\$conf變數不得為null,請檢查函數「".$result["function"]."」的參數設置有無正確!";
15368
 
15369
				}#if end
15370
 
15371
			#回傳結果
15372
			return $result;
15373
 
15374
			}#if end
15375
 
15376
		#初始化內容
226 liveuser 15377
		$result["content"]="";
3 liveuser 15378
 
15379
		#檢查參數
15380
		#函式說明:
15381
		#檢查必填與可省略的參數,可省略參數可指定預設要給與什麼數值內容。
15382
		#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
15383
		#$reuslt["error"],執行不正常結束的錯訊息陣列.
15384
		#$result["function"],當前執行的函式名稱.
15385
		#$result["passed"],識別要檢查的全體變數是否存在以及型態是否正確的變數,"true"代表檢查全部通過;"false"代表檢查不通過
15386
		#$result[$shouldBeCheckedVarName]["varExist"],所檢查的變數是否存在,"false"代表不存在;"true"代表存在
15387
		#$result[$shouldBeCheckedVarName]["varType"],所檢查的變數型態是否正確,"false"代表錯誤;"true"代表正確
15388
		#$result[$shouldBeCheckedVarName]["error"],每個參數設定的錯誤訊息
15389
		#$result["shouldNotBeEmpty"],不應該為空字串或控陣列的變數.
15390
		#$result["argu"],字串陣列,目前輸入的參數名稱陣列.
15391
		#$result["legalVarName"],字串陣列,合法可用的參數名稱陣列.
15392
		#$result["notNeedVar"],字串陣列,多餘的參數名稱.
15393
		#必填參數:
15394
		#$conf["varInput"],陣列變數,要檢查的陣列變數,請在要檢查的參數前面加上&,這樣變動的結果才能被套用。
15395
		$conf["variableCheck::checkArguments"]["varInput"]=&$conf;
15396
		#$conf["mustBeFilledVariableName"],爲必填參數的變數名稱陣列,形態爲陣列變數,元素數量需要跟"mustBeFilledVariableType"參數的元素數量一致,例如: $conf["mustBeFilledVariableName"] = array("id","account","password");
15397
		$conf["variableCheck::checkArguments"]["mustBeFilledVariableName"]=array("elementJS","length","paramsJS","url");
15398
		#$conf["mustBeFilledVariableType"],爲必填參數的變數陣列應該爲何種變數形態,形態爲陣列,元素數量需要跟"mustBeFilledVariableName"參數的元素數量一致,例如: $conf["mustBeFilledVariableType"] = array("string",integer,"double","resource","object"); , null代表不指定變數形態.
15399
		$conf["variableCheck::checkArguments"]["mustBeFilledVariableType"]=array("string","string","string","string");
15400
		#$conf["referenceVarKey"],字串,$conf參數後面的key值,用於移除不要的參考陣列.
15401
		$conf["variableCheck::checkArguments"]["referenceVarKey"]="variableCheck::checkArguments";
15402
		#可以省略的參數:
15403
		#$conf["canBeEmptyString"],字串,必填變數內容如果是空字串就不能算是有設置的話,請設為"false",預設爲"true",可以為空字串.
15404
		$conf["variableCheck::checkArguments"]["canBeEmptyString"]="false";
15405
		#$conf["canNotBeEmpty"],字串陣列,哪些必填參數的內容不得為空字串或空陣列,僅當$conf["canBeEmptyString"]為"true"時會生效.
15406
		#$conf["canNotBeEmpty"]=array();
15407
		#$conf["canBeEmpty"],字串陣列,哪些必填參數的內容可為空字串或空陣列,僅當$conf["canBeEmptyString"]為"false"時會生效.
15408
		#$conf["canBeEmpty"]=array();
15409
		#$conf["skipableVariableCanNotBeEmpty"],字串陣列,哪些可省略參數不可以為空字串或空陣列.
15410
		$conf["variableCheck::checkArguments"]["skipableVariableCanNotBeEmpty"]=array("method","resDiv");
15411
		#$conf["skipableVariableName"],陣列字串,爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableName"] = array("id","account","password");
15412
		$conf["variableCheck::checkArguments"]["skipableVariableName"]=array("method","resDiv","outFunc");
15413
		#$conf["skipableVariableType"],陣列字串,爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableType"] = array("string",integer,"double");
15414
		$conf["variableCheck::checkArguments"]["skipableVariableType"]=array("string","string","string");
15415
		#$conf["skipableVarDefaultValue"],字串陣列,每個不存在的可省略變數要初始化為什麼,null與代表不指定,若預設值是參數之一,請將$conf["mustBeFilledVar"]改成"\$conf["\mustBeFilledVar\"]".
15416
		$conf["variableCheck::checkArguments"]["skipableVarDefaultValue"]=array("POST","rootDiv",null);
15417
		#$conf["arrayCountEqualCheck"],字串陣列,為檢查哪些陣列參數的元素數量要一樣,$conf["arrayCountEqualCheck"][$i]=array()為第$i組key為哪些的變數其元素數量要相等.
15418
		#$conf["arrayCountEqualCheck"][]=array();
15419
		#參考資料來源:
15420
		#array_keys=>http://php.net/manual/en/function.array-keys.php
15421
		$checkArguments=variableCheck::checkArguments($conf["variableCheck::checkArguments"]);
15422
		unset($conf["variableCheck::checkArguments"]);
15423
 
15424
		#如果檢查參數失敗
15425
		if($checkArguments["status"]==="false"){
15426
 
15427
			#設置執行失敗
15428
			$result["status"]="false";
15429
 
15430
			#設置執行錯誤訊息
15431
			$result["error"]=$checkArguments;
15432
 
15433
			#回傳結果
15434
			return $result;
15435
 
15436
			}#if end
15437
 
15438
		#如果參數檢查不通過
15439
		if($checkArguments["passed"]==="false"){
15440
 
15441
			#設置執行失敗
15442
			$result["status"]="false";
15443
 
15444
			#設置執行錯誤訊息
15445
			$result["error"]=$checkArguments;
15446
 
15447
			#回傳結果
15448
			return $result;
15449
 
15450
			}#if end
15451
 
15452
		#函式說明:
15453
		#將要執行的script語法透過該函式執行(會在程式外層用<script></script>包起來).
15454
		#回傳結果:
15455
		#$result["status"],執行是否正常,"true"為正常,"false"為不正常.
15456
		#$result["error"],錯誤訊息陣列
15457
		#$result["function"],當前執行的函數名稱
15458
		#$result["content"],要執行的javaScript語法
15459
		#必填參數:
15460
		#$conf["script"],字串,要執行的javaScript語法.
15461
		$conf["javaScript::toScript"]["script"]=
15462
		"
15463
		var element=".$conf["elementJS"]."
15464
		var params=".$conf["paramsJS"];
226 liveuser 15465
 
3 liveuser 15466
		#如果有設置 $conf["outFunc"]
15467
		if(isset($conf["outFunc"]))
15468
		{
15469
			#串接客制化的輸出函式
15470
			$conf["javaScript::toScript"]["script"]=$conf["javaScript::toScript"]["script"]."
15471
			window.qbpwcf.tailAny.outputFunc=".$conf["outFunc"];
226 liveuser 15472
 
15473
		}#if end
15474
 
3 liveuser 15475
		//呼叫涵式
15476
		$conf["javaScript::toScript"]["script"]=$conf["javaScript::toScript"]["script"]."
15477
		window.qbpwcf.gatDataDynamic.func.call(this,element,".$conf["length"].",params,'".$conf["url"]."','".$conf["method"]."','".$conf["resDiv"]."');
15478
		";
15479
		#可省略參數:
15480
		#$conf["onReady"],字串,是否要在網頁完全載入後再執行,"false"為不等載入完就先執行,預設為"true"要等載入完再執行.
15481
		#$conf["onReady"]="true";
15482
		#$conf["globalJs"],字串陣列,為要放入<script>標籤的js全域變數.
15483
		#$conf["globalJs"]=array();
15484
		#$conf["jsFunciton"],字串陣列,為要放入<script>標籤的js函數.
15485
		#$conf["jsFunciton"]=array();
15486
		#參考資料:
15487
		#http://stackoverflow.com/questions/9899372/pure-javascript-equivalent-to-jquerys-ready-how-to-call-a-function-when-the
15488
		$toScript=javaScript::toScript($conf["javaScript::toScript"]);
15489
		unset($conf["javaScript::toScript"]);
15490
 
15491
		#如果執行失敗
15492
		if($toScript["status"]==="false"){
15493
 
15494
			#設置執行失敗
15495
			$result["status"]="false";
15496
 
15497
			#設置執行錯誤訊息
15498
			$result["error"]=$toScript;
15499
 
15500
			#回傳結果
15501
			return $result;
15502
 
15503
			}#if end
226 liveuser 15504
 
3 liveuser 15505
		#取得js語法
15506
		$result["content"]=$toScript["content"];
15507
 
15508
		#設置執行正常
15509
		$result["status"]="true";
15510
 
15511
		#回傳結果
15512
		return $result;
15513
 
15514
		}#function end
15515
 
15516
	/*
15517
	#函式說明:
15518
	#設置點擊元素後會傳遞data屬性為名稱與其數值為表單數值給特定url,進而取得連續的資料
15519
	#回傳結果:
15520
	#$result["status"],執行正常與否,"true"代表正常,"false"代表不正常.
15521
	#$result["error"],錯誤訊息.
15522
	#$result["function"],當前執行的函式名稱.
15523
	#$result["content"],js語法.
15524
	#必填參數:
15525
	#$conf["url"],字串,要將表單資訊傳遞的哪個url.
15526
	$conf["url"]="";
15527
	#$conf["name"],字串,變數名稱.
15528
	$conf["name"]="";
15529
	#$conf["callback"],陣列字串,要呼叫的涵式$conf["callback"]["name"]與參數$conf["callback"]["params"].
15530
	$conf["callback"]=array();
15531
	#可省略參數:
15532
	#無
15533
	#參考資料:
15534
	#無.
15535
	#備註:
15536
	#無.
15537
	*/
15538
	public static function sequenceQuery(&$conf){
226 liveuser 15539
 
3 liveuser 15540
		#初始化要回傳的結果
15541
		$result=array();
15542
 
15543
		#取得當前執行的函數名稱
15544
		$result["function"]=__FUNCTION__;
15545
 
15546
		#如果沒有參數
15547
		if(func_num_args()==0){
15548
 
15549
			#設置執行失敗
15550
			$result["status"]="false";
15551
 
15552
			#設置執行錯誤訊息
15553
			$result["error"]="函數".$result["function"]."需要參數";
15554
 
15555
			#回傳結果
15556
			return $result;
15557
 
15558
			}#if end
15559
 
15560
		#取得參數
15561
		$result["argu"]=$conf;
15562
 
15563
		#如果 $conf 不為陣列
15564
		if(gettype($conf)!=="array"){
15565
 
15566
			#設置執行失敗
15567
			$result["status"]="false";
15568
 
15569
			#設置執行錯誤訊息
15570
			$result["error"][]="\$conf變數須為陣列形態";
15571
 
15572
			#如果傳入的參數為 null
15573
			if($conf===null){
15574
 
15575
				#設置執行錯誤訊息
15576
				$result["error"][]="\$conf變數不得為null,請檢查函數「".$result["function"]."」的參數設置有無正確!";
15577
 
15578
				}#if end
15579
 
15580
			#回傳結果
15581
			return $result;
15582
 
15583
			}#if end
15584
 
15585
		#初始化內容
226 liveuser 15586
		$result["content"]="";
3 liveuser 15587
 
15588
		#檢查參數
15589
		#函式說明:
15590
		#檢查必填與可省略的參數,可省略參數可指定預設要給與什麼數值內容。
15591
		#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
15592
		#$reuslt["error"],執行不正常結束的錯訊息陣列.
15593
		#$result["function"],當前執行的函式名稱.
15594
		#$result["passed"],識別要檢查的全體變數是否存在以及型態是否正確的變數,"true"代表檢查全部通過;"false"代表檢查不通過
15595
		#$result[$shouldBeCheckedVarName]["varExist"],所檢查的變數是否存在,"false"代表不存在;"true"代表存在
15596
		#$result[$shouldBeCheckedVarName]["varType"],所檢查的變數型態是否正確,"false"代表錯誤;"true"代表正確
15597
		#$result[$shouldBeCheckedVarName]["error"],每個參數設定的錯誤訊息
15598
		#$result["shouldNotBeEmpty"],不應該為空字串或控陣列的變數.
15599
		#$result["argu"],字串陣列,目前輸入的參數名稱陣列.
15600
		#$result["legalVarName"],字串陣列,合法可用的參數名稱陣列.
15601
		#$result["notNeedVar"],字串陣列,多餘的參數名稱.
15602
		#必填參數:
15603
		#$conf["varInput"],陣列變數,要檢查的陣列變數,請在要檢查的參數前面加上&,這樣變動的結果才能被套用。
15604
		$conf["variableCheck::checkArguments"]["varInput"]=&$conf;
15605
		#$conf["mustBeFilledVariableName"],爲必填參數的變數名稱陣列,形態爲陣列變數,元素數量需要跟"mustBeFilledVariableType"參數的元素數量一致,例如: $conf["mustBeFilledVariableName"] = array("id","account","password");
15606
		$conf["variableCheck::checkArguments"]["mustBeFilledVariableName"]=array("url","name","callback");
15607
		#$conf["mustBeFilledVariableType"],爲必填參數的變數陣列應該爲何種變數形態,形態爲陣列,元素數量需要跟"mustBeFilledVariableName"參數的元素數量一致,例如: $conf["mustBeFilledVariableType"] = array("string",integer,"double","resource","object"); , null代表不指定變數形態.
15608
		$conf["variableCheck::checkArguments"]["mustBeFilledVariableType"]=array("string","string","array");
15609
		#$conf["referenceVarKey"],字串,$conf參數後面的key值,用於移除不要的參考陣列.
15610
		$conf["variableCheck::checkArguments"]["referenceVarKey"]="variableCheck::checkArguments";
15611
		#可以省略的參數:
15612
		#$conf["canBeEmptyString"],字串,必填變數內容如果是空字串就不能算是有設置的話,請設為"false",預設爲"true",可以為空字串.
15613
		$conf["variableCheck::checkArguments"]["canBeEmptyString"]="false";
15614
		#$conf["canNotBeEmpty"],字串陣列,哪些必填參數的內容不得為空字串或空陣列,僅當$conf["canBeEmptyString"]為"true"時會生效.
15615
		#$conf["canNotBeEmpty"]=array();
15616
		#$conf["canBeEmpty"],字串陣列,哪些必填參數的內容可為空字串或空陣列,僅當$conf["canBeEmptyString"]為"false"時會生效.
15617
		#$conf["canBeEmpty"]=array();
15618
		#$conf["skipableVariableCanNotBeEmpty"],字串陣列,哪些可省略參數不可以為空字串或空陣列.
15619
		#$conf["variableCheck::checkArguments"]["skipableVariableCanNotBeEmpty"]=array("method","resDiv");
15620
		#$conf["skipableVariableName"],陣列字串,爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableName"] = array("id","account","password");
15621
		#$conf["variableCheck::checkArguments"]["skipableVariableName"]=array("method","resDiv");
15622
		#$conf["skipableVariableType"],陣列字串,爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableType"] = array("string",integer,"double");
15623
		#$conf["variableCheck::checkArguments"]["skipableVariableType"]=array("string","string");
15624
		#$conf["skipableVarDefaultValue"],字串陣列,每個不存在的可省略變數要初始化為什麼,null與代表不指定,若預設值是參數之一,請將$conf["mustBeFilledVar"]改成"\$conf["\mustBeFilledVar\"]".
15625
		#$conf["variableCheck::checkArguments"]["skipableVarDefaultValue"]=array("POST","rootDiv");
15626
		#$conf["arrayCountEqualCheck"],字串陣列,為檢查哪些陣列參數的元素數量要一樣,$conf["arrayCountEqualCheck"][$i]=array()為第$i組key為哪些的變數其元素數量要相等.
15627
		#$conf["arrayCountEqualCheck"][]=array();
15628
		#參考資料來源:
15629
		#array_keys=>http://php.net/manual/en/function.array-keys.php
15630
		$checkArguments=variableCheck::checkArguments($conf["variableCheck::checkArguments"]);
15631
		unset($conf["variableCheck::checkArguments"]);
15632
 
15633
		#如果檢查參數失敗
15634
		if($checkArguments["status"]==="false"){
15635
 
15636
			#設置執行失敗
15637
			$result["status"]="false";
15638
 
15639
			#設置執行錯誤訊息
15640
			$result["error"]=$checkArguments;
15641
 
15642
			#回傳結果
15643
			return $result;
15644
 
15645
			}#if end
15646
 
15647
		#如果參數檢查不通過
15648
		if($checkArguments["passed"]==="false"){
15649
 
15650
			#設置執行失敗
15651
			$result["status"]="false";
15652
 
15653
			#設置執行錯誤訊息
15654
			$result["error"]=$checkArguments;
15655
 
15656
			#回傳結果
15657
			return $result;
15658
 
15659
			}#if end
226 liveuser 15660
 
3 liveuser 15661
		#函式說明:
15662
		#將要執行的script語法透過該函式執行(會在程式外層用<script></script>包起來).
15663
		#回傳結果:
15664
		#$result["status"],執行是否正常,"true"為正常,"false"為不正常.
15665
		#$result["error"],錯誤訊息陣列
15666
		#$result["function"],當前執行的函數名稱
15667
		#$result["content"],要執行的javaScript語法
15668
		#必填參數:
15669
		#$conf["script"],字串,要執行的javaScript語法.
15670
		$conf["javaScript::toScript"]["script"]=
15671
		"
15672
		url='".$conf["url"]."';
15673
		name='".$conf["name"]."';
15674
		queue=[];
15675
		callback=".json_encode($conf["callback"]).";
15676
		window.qbpwcf.sequenceQuery.func.call(this,url,name,queue,callback);
15677
		";
15678
		#可省略參數:
15679
		#$conf["onReady"],字串,是否要在網頁完全載入後再執行,"false"為不等載入完就先執行,預設為"true"要等載入完再執行.
15680
		#$conf["onReady"]="true";
15681
		#$conf["globalJs"],字串陣列,為要放入<script>標籤的js全域變數.
15682
		#$conf["globalJs"]=array();
15683
		#$conf["jsFunciton"],字串陣列,為要放入<script>標籤的js函數.
15684
		#$conf["jsFunciton"]=array();
15685
		#參考資料:
15686
		#http://stackoverflow.com/questions/9899372/pure-javascript-equivalent-to-jquerys-ready-how-to-call-a-function-when-the
15687
		$toScript=javaScript::toScript($conf["javaScript::toScript"]);
15688
		unset($conf["javaScript::toScript"]);
15689
 
15690
		#如果執行失敗
15691
		if($toScript["status"]==="false"){
15692
 
15693
			#設置執行失敗
15694
			$result["status"]="false";
15695
 
15696
			#設置執行錯誤訊息
15697
			$result["error"]=$toScript;
15698
 
15699
			#回傳結果
15700
			return $result;
15701
 
15702
			}#if end
226 liveuser 15703
 
3 liveuser 15704
		#取得js語法
15705
		$result["content"]=$toScript["content"];
15706
 
15707
		#設置執行正常
15708
		$result["status"]="true";
15709
 
15710
		#回傳結果
15711
		return $result;
226 liveuser 15712
 
3 liveuser 15713
		}#function sequenceQuery end
15714
 
15715
	/*
15716
	#函數說明
15717
	#讓js變數確實存在.
15718
	#回傳的結果
15719
	#$result["status"],執行正常與否.
15720
	#$result["content"],js語法.
15721
	#$result[argu],使用的參數.
15722
	#必填參數:
15723
	#$conf["name"],js變數的名稱.
226 liveuser 15724
	$conf["name"]="";
3 liveuser 15725
	#可省略參數:
15726
	#無
15727
	#參考資料:
15728
	#無.
15729
	#備註:
15730
	#無.
15731
	*/
15732
	public static function makeVarExist(&$conf=array()){
226 liveuser 15733
 
3 liveuser 15734
		#初始化要回傳的結果
15735
		$result=array();
15736
 
15737
		#取得當前執行的函數名稱
15738
		$result["function"]=__FUNCTION__;
15739
 
15740
		#如果沒有參數
15741
		if(func_num_args()==0){
15742
 
15743
			#設置執行失敗
15744
			$result["status"]="false";
15745
 
15746
			#設置執行錯誤訊息
15747
			$result["error"]="函數".$result["function"]."需要參數";
15748
 
15749
			#回傳結果
15750
			return $result;
15751
 
15752
			}#if end
15753
 
15754
		#取得參數
15755
		$result["argu"]=$conf;
15756
 
15757
		#如果 $conf 不為陣列
15758
		if(gettype($conf)!=="array"){
15759
 
15760
			#設置執行失敗
15761
			$result["status"]="false";
15762
 
15763
			#設置執行錯誤訊息
15764
			$result["error"][]="\$conf變數須為陣列形態";
15765
 
15766
			#如果傳入的參數為 null
15767
			if($conf===null){
15768
 
15769
				#設置執行錯誤訊息
15770
				$result["error"][]="\$conf變數不得為null,請檢查函數「".$result["function"]."」的參數設置有無正確!";
15771
 
15772
				}#if end
15773
 
15774
			#回傳結果
15775
			return $result;
15776
 
15777
			}#if end
15778
 
15779
		#檢查參數
15780
		#函式說明:
15781
		#檢查必填與可省略的參數,可省略參數可指定預設要給與什麼數值內容。
15782
		#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
15783
		#$reuslt["error"],執行不正常結束的錯訊息陣列.
15784
		#$result["function"],當前執行的函式名稱.
15785
		#$result["passed"],識別要檢查的全體變數是否存在以及型態是否正確的變數,"true"代表檢查全部通過;"false"代表檢查不通過
15786
		#$result[$shouldBeCheckedVarName]["varExist"],所檢查的變數是否存在,"false"代表不存在;"true"代表存在
15787
		#$result[$shouldBeCheckedVarName]["varType"],所檢查的變數型態是否正確,"false"代表錯誤;"true"代表正確
15788
		#$result[$shouldBeCheckedVarName]["error"],每個參數設定的錯誤訊息
15789
		#$result["shouldNotBeEmpty"],不應該為空字串或控陣列的變數.
15790
		#$result["argu"],字串陣列,目前輸入的參數名稱陣列.
15791
		#$result["legalVarName"],字串陣列,合法可用的參數名稱陣列.
15792
		#$result["notNeedVar"],字串陣列,多餘的參數名稱.
15793
		#必填參數:
15794
		#$conf["varInput"],陣列變數,要檢查的陣列變數,請在要檢查的參數前面加上&,這樣變動的結果才能被套用。
15795
		$conf["variableCheck::checkArguments"]["varInput"]=&$conf;
15796
		#$conf["mustBeFilledVariableName"],爲必填參數的變數名稱陣列,形態爲陣列變數,元素數量需要跟"mustBeFilledVariableType"參數的元素數量一致,例如: $conf["mustBeFilledVariableName"] = array("id","account","password");
15797
		$conf["variableCheck::checkArguments"]["mustBeFilledVariableName"]=array("name",);
15798
		#$conf["mustBeFilledVariableType"],爲必填參數的變數陣列應該爲何種變數形態,形態爲陣列,元素數量需要跟"mustBeFilledVariableName"參數的元素數量一致,例如: $conf["mustBeFilledVariableType"] = array("string",integer,"double","resource","object"); , null代表不指定變數形態.
15799
		$conf["variableCheck::checkArguments"]["mustBeFilledVariableType"]=array("string");
15800
		#$conf["referenceVarKey"],字串,$conf參數後面的key值,用於移除不要的參考陣列.
15801
		$conf["variableCheck::checkArguments"]["referenceVarKey"]="variableCheck::checkArguments";
15802
		#可以省略的參數:
15803
		#$conf["canBeEmptyString"],字串,必填變數內容如果是空字串就不能算是有設置的話,請設為"false",預設爲"true",可以為空字串.
15804
		$conf["variableCheck::checkArguments"]["canBeEmptyString"]="false";
15805
		#$conf["canNotBeEmpty"],字串陣列,哪些必填參數的內容不得為空字串或空陣列,僅當$conf["canBeEmptyString"]為"true"時會生效.
15806
		#$conf["canNotBeEmpty"]=array();
15807
		#$conf["canBeEmpty"],字串陣列,哪些必填參數的內容可為空字串或空陣列,僅當$conf["canBeEmptyString"]為"false"時會生效.
15808
		#$conf["canBeEmpty"]=array();
15809
		#$conf["skipableVariableCanNotBeEmpty"],字串陣列,哪些可省略參數不可以為空字串或空陣列.
15810
		#$conf["variableCheck::checkArguments"]["skipableVariableCanNotBeEmpty"]=array("method","resDiv");
15811
		#$conf["skipableVariableName"],陣列字串,爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableName"] = array("id","account","password");
15812
		#$conf["variableCheck::checkArguments"]["skipableVariableName"]=array("var","storeInArray","action");
15813
		#$conf["skipableVariableType"],陣列字串,爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableType"] = array("string",integer,"double");
15814
		#$conf["variableCheck::checkArguments"]["skipableVariableType"]=array("string","string","array");
15815
		#$conf["skipableVarDefaultValue"],字串陣列,每個不存在的可省略變數要初始化為什麼,null與代表不指定,若預設值是參數之一,請將$conf["mustBeFilledVar"]改成"\$conf["\mustBeFilledVar\"]".
15816
		#$conf["variableCheck::checkArguments"]["skipableVarDefaultValue"]=array("window.qbpwcf.readTable","true",null);
15817
		#$conf["arrayCountEqualCheck"],字串陣列,為檢查哪些陣列參數的元素數量要一樣,$conf["arrayCountEqualCheck"][$i]=array()為第$i組key為哪些的變數其元素數量要相等.
15818
		#$conf["arrayCountEqualCheck"][]=array();
15819
		#參考資料來源:
15820
		#array_keys=>http://php.net/manual/en/function.array-keys.php
15821
		$checkArguments=variableCheck::checkArguments($conf["variableCheck::checkArguments"]);
15822
		unset($conf["variableCheck::checkArguments"]);
15823
 
15824
		#如果檢查參數失敗
15825
		if($checkArguments["status"]==="false"){
15826
 
15827
			#設置執行失敗
15828
			$result["status"]="false";
15829
 
15830
			#設置執行錯誤訊息
15831
			$result["error"]=$checkArguments;
15832
 
15833
			#回傳結果
15834
			return $result;
15835
 
15836
			}#if end
15837
 
15838
		#如果參數檢查不通過
15839
		if($checkArguments["passed"]==="false"){
15840
 
15841
			#設置執行失敗
15842
			$result["status"]="false";
15843
 
15844
			#設置執行錯誤訊息
15845
			$result["error"]=$checkArguments;
15846
 
15847
			#回傳結果
15848
			return $result;
15849
 
15850
			}#if end
15851
 
15852
		#初始化內容
226 liveuser 15853
		$result["content"]="";
15854
 
3 liveuser 15855
		#用 "." 分割 $conf["var"]
15856
		#函式說明:
15857
		#將固定格式的字串分開,並回傳分開的結果。
15858
		#回傳結果:
15859
		#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
15860
		#$result["error"],錯誤訊息陣列
15861
		#$result["function"],當前執行的函數名稱.
15862
		#$result["argu"],使用的參數.
15863
		#$result["oriStr"],要分割的原始字串內容
15864
		#$result["dataArray"],爲分割好字串的陣列內容,$result["dataArray"][$i]爲第($i+1)段的內容。
15865
		#$result["dataCounts"],爲總共分成幾段
15866
		#$result["found"],是否有在$conf["stringIn"]找到$conf["spiltSymbol"],"true"代表有找到,"false"代表沒有找到.
15867
		#必填參數:
15868
		$conf["stringProcess::spiltString"]["stringIn"]=$conf["name"];#要處理的字串。
15869
		$conf["stringProcess::spiltString"]["spiltSymbol"]=".";#爲以哪個符號作爲分割
15870
		#可省略參數:
15871
		#$conf["allowEmptyStr"],是否允許分割出來空字串,預設為"false"不允許;"true"代表允許.
15872
		$conf["stringProcess::spiltString"]["allowEmptyStr"]="false";
15873
		$spiltString=$spiltString=stringProcess::spiltString($conf["stringProcess::spiltString"]);
15874
		unset($conf["stringProcess::spiltString"]);
226 liveuser 15875
 
3 liveuser 15876
		#如果檢查參數失敗
15877
		if($spiltString["status"]==="false"){
15878
 
15879
			#設置執行失敗
15880
			$result["status"]="false";
15881
 
15882
			#設置執行錯誤訊息
15883
			$result["error"]=$spiltString;
15884
 
15885
			#回傳結果
15886
			return $result;
15887
 
15888
			}#if end
226 liveuser 15889
 
3 liveuser 15890
		#函式說明:
15891
		#將要執行的script語法透過該函式執行(會在程式外層用<script></script>包起來).
15892
		#回傳結果:
15893
		#$result["status"],執行是否正常,"true"為正常,"false"為不正常.
15894
		#$result["error"],錯誤訊息陣列
15895
		#$result["function"],當前執行的函數名稱
15896
		#$result["content"],要執行的javaScript語法
226 liveuser 15897
		#必填參數:
3 liveuser 15898
		#$conf["script"],字串,要執行的javaScript語法.
15899
		$conf["javaScript::toScript"]["script"]="";
226 liveuser 15900
 
3 liveuser 15901
		#初始化 js 變數
15902
		$jsVar="";
226 liveuser 15903
 
3 liveuser 15904
		#針對每個 js 變數的階層
15905
		for($i=0;$i<$spiltString["dataCounts"];$i++){
226 liveuser 15906
 
3 liveuser 15907
			#取得片段 js 變數名稱
15908
			$jsVarPart=$spiltString["dataArray"][$i];
226 liveuser 15909
 
3 liveuser 15910
			#如果不是第一層變數
15911
			if($i!==0){
226 liveuser 15912
 
3 liveuser 15913
				#串接 js 變數名稱
15914
				$jsVar=$jsVar.".".$jsVarPart;
226 liveuser 15915
 
3 liveuser 15916
				}#if end
226 liveuser 15917
 
3 liveuser 15918
			#反之
15919
			else{
226 liveuser 15920
 
3 liveuser 15921
				#串接 js 變數名稱
15922
				$jsVar=$jsVar.$jsVarPart;
226 liveuser 15923
 
3 liveuser 15924
				}#else end
226 liveuser 15925
 
3 liveuser 15926
			#串接 js 語法
15927
			$conf["javaScript::toScript"]["script"]=$conf["javaScript::toScript"]["script"].
15928
			"
15929
				//如果該階段變數不存在
15930
				if(".$jsVar."===undefined){
226 liveuser 15931
 
3 liveuser 15932
					//初始化為空物件
15933
					".$jsVar."={};
226 liveuser 15934
 
3 liveuser 15935
					}//if end
15936
			";
226 liveuser 15937
 
3 liveuser 15938
			}#foreach end
226 liveuser 15939
 
3 liveuser 15940
		#可省略參數:
15941
		#$conf["onReady"],字串,是否要在網頁完全載入後再執行,"false"為不等載入完就先執行,預設為"true"要等載入完再執行.
15942
		#$conf["onReady"]="true";
15943
		#$conf["globalJs"],字串陣列,為要放入<script>標籤的js全域變數.
15944
		#$conf["globalJs"]=array();
15945
		#$conf["jsFunciton"],字串陣列,為要放入<script>標籤的js函數.
15946
		#$conf["jsFunciton"]=array();
15947
		#參考資料:
15948
		#http://stackoverflow.com/questions/9899372/pure-javascript-equivalent-to-jquerys-ready-how-to-call-a-function-when-the
15949
		$toScript=javaScript::toScript($conf["javaScript::toScript"]);
226 liveuser 15950
		unset($conf["javaScript::toScript"]);
15951
 
3 liveuser 15952
		#如果檢查參數失敗
15953
		if($toScript["status"]==="false"){
15954
 
15955
			#設置執行失敗
15956
			$result["status"]="false";
15957
 
15958
			#設置執行錯誤訊息
15959
			$result["error"]=$toScript;
15960
 
15961
			#回傳結果
15962
			return $result;
15963
 
15964
			}#if end
226 liveuser 15965
 
3 liveuser 15966
		#取得 js 語法
226 liveuser 15967
		$result["content"]=$toScript["content"];
15968
 
3 liveuser 15969
		#設置執行正常
15970
		$result["status"]="true";
226 liveuser 15971
 
3 liveuser 15972
		#回傳結果
15973
		return $result;
226 liveuser 15974
 
3 liveuser 15975
		}#fucntion makeVarExist end
15976
 
15977
	/*
15978
	#函數說明
15979
	#讀取由table::div建立的資料表,依照欄位內容做不同的事情.
15980
	#回傳的結果
15981
	#$result["status"],執行正常與否.
15982
	#$result["content"],js語法.
15983
	#$result[argu],使用的參數.
15984
	#必填參數:
15985
	#$conf["table"],取得table的js.
226 liveuser 15986
	$conf["table"]="";
3 liveuser 15987
	#可省略參數:
15988
	#$conf["var"],表格的資訊要儲在哪個js變數,預設為"window.qbpwcf.readTable"
15989
	#$conf["var"]="window.qbpwcf.readTable";
15990
	#$conf["storeInArray"],預設為儲存成陣列"true",反之儲存成單一變數"false".
15991
	#$conf["storeInArray"]="true";
15992
	#$conf["action"],字串陣列,讀到每個欄位要做什麼事情,預設選項為"save":僅儲存;"call,function name":呼叫call js funcion,欄位內容作為參數.
15993
	#$conf["action"]=array();
15994
	#參考資料:
15995
	#無.
15996
	#備註:
15997
	#無.
15998
	*/
15999
	public static function readTable(&$conf=array()){
226 liveuser 16000
 
3 liveuser 16001
		#初始化要回傳的結果
16002
		$result=array();
16003
 
16004
		#取得當前執行的函數名稱
16005
		$result["function"]=__FUNCTION__;
16006
 
16007
		#如果沒有參數
16008
		if(func_num_args()==0){
16009
 
16010
			#設置執行失敗
16011
			$result["status"]="false";
16012
 
16013
			#設置執行錯誤訊息
16014
			$result["error"]="函數".$result["function"]."需要參數";
16015
 
16016
			#回傳結果
16017
			return $result;
16018
 
16019
			}#if end
16020
 
16021
		#取得參數
16022
		$result["argu"]=$conf;
16023
 
16024
		#如果 $conf 不為陣列
16025
		if(gettype($conf)!=="array"){
16026
 
16027
			#設置執行失敗
16028
			$result["status"]="false";
16029
 
16030
			#設置執行錯誤訊息
16031
			$result["error"][]="\$conf變數須為陣列形態";
16032
 
16033
			#如果傳入的參數為 null
16034
			if($conf===null){
16035
 
16036
				#設置執行錯誤訊息
16037
				$result["error"][]="\$conf變數不得為null,請檢查函數「".$result["function"]."」的參數設置有無正確!";
16038
 
16039
				}#if end
16040
 
16041
			#回傳結果
16042
			return $result;
16043
 
16044
			}#if end
16045
 
16046
		#檢查參數
16047
		#函式說明:
16048
		#檢查必填與可省略的參數,可省略參數可指定預設要給與什麼數值內容。
16049
		#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
16050
		#$reuslt["error"],執行不正常結束的錯訊息陣列.
16051
		#$result["function"],當前執行的函式名稱.
16052
		#$result["passed"],識別要檢查的全體變數是否存在以及型態是否正確的變數,"true"代表檢查全部通過;"false"代表檢查不通過
16053
		#$result[$shouldBeCheckedVarName]["varExist"],所檢查的變數是否存在,"false"代表不存在;"true"代表存在
16054
		#$result[$shouldBeCheckedVarName]["varType"],所檢查的變數型態是否正確,"false"代表錯誤;"true"代表正確
16055
		#$result[$shouldBeCheckedVarName]["error"],每個參數設定的錯誤訊息
16056
		#$result["shouldNotBeEmpty"],不應該為空字串或控陣列的變數.
16057
		#$result["argu"],字串陣列,目前輸入的參數名稱陣列.
16058
		#$result["legalVarName"],字串陣列,合法可用的參數名稱陣列.
16059
		#$result["notNeedVar"],字串陣列,多餘的參數名稱.
16060
		#必填參數:
16061
		#$conf["varInput"],陣列變數,要檢查的陣列變數,請在要檢查的參數前面加上&,這樣變動的結果才能被套用。
16062
		$conf["variableCheck::checkArguments"]["varInput"]=&$conf;
16063
		#$conf["mustBeFilledVariableName"],爲必填參數的變數名稱陣列,形態爲陣列變數,元素數量需要跟"mustBeFilledVariableType"參數的元素數量一致,例如: $conf["mustBeFilledVariableName"] = array("id","account","password");
16064
		$conf["variableCheck::checkArguments"]["mustBeFilledVariableName"]=array("table",);
16065
		#$conf["mustBeFilledVariableType"],爲必填參數的變數陣列應該爲何種變數形態,形態爲陣列,元素數量需要跟"mustBeFilledVariableName"參數的元素數量一致,例如: $conf["mustBeFilledVariableType"] = array("string",integer,"double","resource","object"); , null代表不指定變數形態.
16066
		$conf["variableCheck::checkArguments"]["mustBeFilledVariableType"]=array("string");
16067
		#$conf["referenceVarKey"],字串,$conf參數後面的key值,用於移除不要的參考陣列.
16068
		$conf["variableCheck::checkArguments"]["referenceVarKey"]="variableCheck::checkArguments";
16069
		#可以省略的參數:
16070
		#$conf["canBeEmptyString"],字串,必填變數內容如果是空字串就不能算是有設置的話,請設為"false",預設爲"true",可以為空字串.
16071
		$conf["variableCheck::checkArguments"]["canBeEmptyString"]="false";
16072
		#$conf["canNotBeEmpty"],字串陣列,哪些必填參數的內容不得為空字串或空陣列,僅當$conf["canBeEmptyString"]為"true"時會生效.
16073
		#$conf["canNotBeEmpty"]=array();
16074
		#$conf["canBeEmpty"],字串陣列,哪些必填參數的內容可為空字串或空陣列,僅當$conf["canBeEmptyString"]為"false"時會生效.
16075
		#$conf["canBeEmpty"]=array();
16076
		#$conf["skipableVariableCanNotBeEmpty"],字串陣列,哪些可省略參數不可以為空字串或空陣列.
16077
		#$conf["variableCheck::checkArguments"]["skipableVariableCanNotBeEmpty"]=array("method","resDiv");
16078
		#$conf["skipableVariableName"],陣列字串,爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableName"] = array("id","account","password");
16079
		$conf["variableCheck::checkArguments"]["skipableVariableName"]=array("var","storeInArray","action");
16080
		#$conf["skipableVariableType"],陣列字串,爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableType"] = array("string",integer,"double");
16081
		$conf["variableCheck::checkArguments"]["skipableVariableType"]=array("string","string","array");
16082
		#$conf["skipableVarDefaultValue"],字串陣列,每個不存在的可省略變數要初始化為什麼,null與代表不指定,若預設值是參數之一,請將$conf["mustBeFilledVar"]改成"\$conf["\mustBeFilledVar\"]".
16083
		$conf["variableCheck::checkArguments"]["skipableVarDefaultValue"]=array("window.qbpwcf.readTable","true",null);
16084
		#$conf["arrayCountEqualCheck"],字串陣列,為檢查哪些陣列參數的元素數量要一樣,$conf["arrayCountEqualCheck"][$i]=array()為第$i組key為哪些的變數其元素數量要相等.
16085
		#$conf["arrayCountEqualCheck"][]=array();
16086
		#參考資料來源:
16087
		#array_keys=>http://php.net/manual/en/function.array-keys.php
16088
		$checkArguments=variableCheck::checkArguments($conf["variableCheck::checkArguments"]);
16089
		unset($conf["variableCheck::checkArguments"]);
16090
 
16091
		#如果檢查參數失敗
16092
		if($checkArguments["status"]==="false"){
16093
 
16094
			#設置執行失敗
16095
			$result["status"]="false";
16096
 
16097
			#設置執行錯誤訊息
16098
			$result["error"]=$checkArguments;
16099
 
16100
			#回傳結果
16101
			return $result;
16102
 
16103
			}#if end
16104
 
16105
		#如果參數檢查不通過
16106
		if($checkArguments["passed"]==="false"){
16107
 
16108
			#設置執行失敗
16109
			$result["status"]="false";
16110
 
16111
			#設置執行錯誤訊息
16112
			$result["error"]=$checkArguments;
16113
 
16114
			#回傳結果
16115
			return $result;
16116
 
16117
			}#if end
16118
 
16119
		#初始化內容
226 liveuser 16120
		$result["content"]="";
16121
 
3 liveuser 16122
		#函數說明
16123
		#讓js變數確實存在.
16124
		#回傳的結果
16125
		#$result["status"],執行正常與否.
16126
		#$result["content"],js語法.
16127
		#$result[argu],使用的參數.
16128
		#必填參數:
16129
		#$conf["name"],js變數的名稱.
226 liveuser 16130
		$conf["javaScript::makeVarExist"]["name"]=$conf["var"];
3 liveuser 16131
		#可省略參數:
16132
		#無
16133
		$makeVarExist=javaScript::makeVarExist($conf["javaScript::makeVarExist"]);
16134
		unset($conf["javaScript::makeVarExist"]);
16135
 
16136
		#如果執行失敗
16137
		if($makeVarExist["status"]==="false"){
16138
 
16139
			#設置執行失敗
16140
			$result["status"]="false";
16141
 
16142
			#設置執行錯誤訊息
16143
			$result["error"]=$makeVarExist;
16144
 
16145
			#回傳結果
16146
			return $result;
16147
 
16148
			}#if end
226 liveuser 16149
 
3 liveuser 16150
		#串接js語法
226 liveuser 16151
		$result["content"]=$result["content"].$makeVarExist["content"];
16152
 
3 liveuser 16153
		#函式說明:
16154
		#將要執行的script語法透過該函式執行(會在程式外層用<script></script>包起來).
16155
		#回傳結果:
16156
		#$result["status"],執行是否正常,"true"為正常,"false"為不正常.
16157
		#$result["error"],錯誤訊息陣列
16158
		#$result["function"],當前執行的函數名稱
16159
		#$result["content"],要執行的javaScript語法
226 liveuser 16160
		#必填參數:
3 liveuser 16161
		#$conf["script"],字串,要執行的javaScript語法.
16162
		$conf["javaScript::toScript"]["script"]=
16163
		"
16164
		//set debug mode
16165
		window.debug=true;
226 liveuser 16166
 
3 liveuser 16167
		//set params
16168
		params=".json_encode($conf).";
226 liveuser 16169
 
3 liveuser 16170
		//初始化變數存在
226 liveuser 16171
		noExist=true;
16172
 
16173
		//確認變數是否存在
3 liveuser 16174
		eval(noExist=('+params.var+'===undefined));
226 liveuser 16175
 
3 liveuser 16176
		//如果變數不存在
16177
		if(noExist===false){
226 liveuser 16178
 
3 liveuser 16179
			//如果要儲存成陣列
16180
			if(params.storeInArray==='true'){
226 liveuser 16181
 
3 liveuser 16182
				//初始化為空陣列
16183
				eval(params.var+'=[]');
226 liveuser 16184
 
16185
				}//if end
16186
 
3 liveuser 16187
			//反之
16188
			else{
226 liveuser 16189
 
3 liveuser 16190
				//初始化為空陣列
16191
				eval(params.var+'={}');
226 liveuser 16192
 
16193
				}//else end
16194
 
3 liveuser 16195
			}//if end
226 liveuser 16196
 
3 liveuser 16197
		//initial empty table object
226 liveuser 16198
		thisTable={};
16199
 
3 liveuser 16200
		//get latest table
16201
		thisTable.target=".$conf["table"].";
226 liveuser 16202
 
3 liveuser 16203
		//如果有 thead,tbody
16204
		if(thisTable.target.children.length>1){
226 liveuser 16205
 
3 liveuser 16206
			//get thead
16207
			thisTable.thead=thisTable.target.children[0];
226 liveuser 16208
 
3 liveuser 16209
			//get tbody
16210
			thisTable.tbody=thisTable.target.children[1];
226 liveuser 16211
 
3 liveuser 16212
			}//if end
226 liveuser 16213
 
3 liveuser 16214
		//反之只有 tbody
16215
		else{
226 liveuser 16216
 
3 liveuser 16217
			//empty thead
16218
			thisTable.thead={};
226 liveuser 16219
 
3 liveuser 16220
			//get tbody
16221
			thisTable.tbody=thisTable.target.children[1];
226 liveuser 16222
 
3 liveuser 16223
			}//if end
226 liveuser 16224
 
3 liveuser 16225
		//列數
16226
		thisTable.rowsCount=thisTable.tbody.children.length;
226 liveuser 16227
 
3 liveuser 16228
		//欄數
16229
		thisTable.colsCount=thisTable.tbody.children[1].children.length;
226 liveuser 16230
 
3 liveuser 16231
		//如果有標題欄位
16232
		if(thisTable.thead!=={}){
226 liveuser 16233
 
3 liveuser 16234
			//debug
16235
			if(window.debug){
226 liveuser 16236
 
3 liveuser 16237
				//提示有欄位標題
16238
				console.log('There is title.');
226 liveuser 16239
 
3 liveuser 16240
				}//if end
226 liveuser 16241
 
3 liveuser 16242
			//取得每個欄位的標題
16243
			thisTable.title=[];
226 liveuser 16244
 
3 liveuser 16245
			//debug
16246
			if(window.debug){
226 liveuser 16247
 
3 liveuser 16248
				//提示欄位數目
16249
				console.log('thisTable.colsCount='+thisTable.colsCount);
226 liveuser 16250
 
3 liveuser 16251
				}//if end
226 liveuser 16252
 
3 liveuser 16253
			//針對每個
16254
			for(i=0;i<thisTable.colsCount;i++){
226 liveuser 16255
 
3 liveuser 16256
				//debug
16257
				if(window.debug){
226 liveuser 16258
 
3 liveuser 16259
					//提示當前是第幾個欄位(從0開始)
16260
					console.log('i='+i);
226 liveuser 16261
 
3 liveuser 16262
					}//if end
226 liveuser 16263
 
16264
				//如果欄位存在
3 liveuser 16265
				if(thisTable.thead.children[0].children[i]!==undefined){
226 liveuser 16266
 
3 liveuser 16267
					//取得欄位標題
16268
					thisTable.title.push(thisTable.thead.children[0].children[i].innerText);
226 liveuser 16269
 
3 liveuser 16270
					//debug
16271
					if(window.debug){
226 liveuser 16272
 
3 liveuser 16273
						console.log('column title - start');
16274
						console.log(thisTable.thead.children[0].children[i].innerText);
16275
						console.log('column title - end');
226 liveuser 16276
 
3 liveuser 16277
						}//if end
226 liveuser 16278
 
3 liveuser 16279
					}//if end
226 liveuser 16280
 
3 liveuser 16281
				}//for end
226 liveuser 16282
 
3 liveuser 16283
			}//if end
226 liveuser 16284
 
3 liveuser 16285
		//反之
16286
		else{
226 liveuser 16287
 
3 liveuser 16288
			//預設欄位標題為 A,B,C....Z
16289
			console.log('尚未實作');
16290
			exit;
226 liveuser 16291
 
3 liveuser 16292
			}//else end
226 liveuser 16293
 
16294
 
3 liveuser 16295
		//暫存欄位的資料
16296
		rowData=[];
226 liveuser 16297
 
3 liveuser 16298
		//debug
16299
		if(window.debug){
226 liveuser 16300
 
3 liveuser 16301
			//提示資料筆數
16302
			console.log('thisTable.rowsCount='+thisTable.rowsCount);
226 liveuser 16303
 
3 liveuser 16304
			}//if end
226 liveuser 16305
 
3 liveuser 16306
		//針對每筆資料
16307
		for(i=1;i<thisTable.rowsCount;i++){
226 liveuser 16308
 
3 liveuser 16309
			//debug
16310
			if(window.debug){
226 liveuser 16311
 
3 liveuser 16312
				//提示第幾筆資料
16313
				console.log('i='+i);
226 liveuser 16314
 
3 liveuser 16315
				}//if end
226 liveuser 16316
 
3 liveuser 16317
			//取得列
16318
			tr=thisTable.tbody.children[i];
226 liveuser 16319
 
3 liveuser 16320
			//debug
16321
			if(window.debug){
226 liveuser 16322
 
3 liveuser 16323
				//提示第幾筆資料
16324
				console.log('tr - start');
16325
				console.log(tr);
16326
				console.log('tr - end');
226 liveuser 16327
 
3 liveuser 16328
				}//if end
226 liveuser 16329
 
3 liveuser 16330
			//暫存欄位資料
16331
			colData={};
226 liveuser 16332
 
3 liveuser 16333
			//debug
16334
			if(window.debug){
226 liveuser 16335
 
3 liveuser 16336
				//提示欄位數量
16337
				console.log('thisTable.rowsCount='+thisTable.rowsCount);
226 liveuser 16338
 
3 liveuser 16339
				}//if end
226 liveuser 16340
 
3 liveuser 16341
			//針對每個欄位
16342
			for(j=0;j<thisTable.colsCount;j++){
226 liveuser 16343
 
3 liveuser 16344
				//debug
16345
				if(window.debug){
226 liveuser 16346
 
3 liveuser 16347
					//提示欄位編號
16348
					console.log('j='+j);
226 liveuser 16349
 
3 liveuser 16350
					}//if end
226 liveuser 16351
 
3 liveuser 16352
				//取得欄位內容
16353
				td=tr.children[j].innerHTML;
226 liveuser 16354
 
3 liveuser 16355
				//debug
16356
				if(window.debug){
226 liveuser 16357
 
3 liveuser 16358
					//提示欄位內容
16359
					console.log('td='+td);
226 liveuser 16360
 
3 liveuser 16361
					}//if end
226 liveuser 16362
 
3 liveuser 16363
				//debug
16364
				if(window.debug){
226 liveuser 16365
 
3 liveuser 16366
					//提示欄位原始名稱
16367
					console.log('thisTable.title['+j+']='+thisTable.title[j]);
226 liveuser 16368
 
3 liveuser 16369
					}//if end
226 liveuser 16370
 
3 liveuser 16371
				//set temp title,replace ' ' to '_'.
16372
				tempTitle=thisTable.title[j].replace(/ /i, '_');
226 liveuser 16373
 
3 liveuser 16374
				//debug
16375
				if(window.debug){
226 liveuser 16376
 
3 liveuser 16377
					//提示欄位新名稱
16378
					console.log('tempTitle='+tempTitle);
226 liveuser 16379
 
3 liveuser 16380
					}//if end
226 liveuser 16381
 
3 liveuser 16382
				//用欄位標題儲存欄位內容
16383
				eval('colData.'+tempTitle+'=td');
226 liveuser 16384
 
3 liveuser 16385
				//如果有 action 參數
16386
				if(params.action!==undefined){
226 liveuser 16387
 
3 liveuser 16388
					//如果 action 參數對應的欄位存在數值
16389
					if(params.action[j]!==undefined){
16390
 
16391
						//get action
16392
						action=params.action[j];
16393
 
16394
						//debug
16395
						if(window.debug){
226 liveuser 16396
 
3 liveuser 16397
							//提示欄位新名稱
16398
							console.log('action='+action);
226 liveuser 16399
 
3 liveuser 16400
							}//if end
16401
 
16402
						//如果動作不是 'save'
16403
						if(action!=='save'){
226 liveuser 16404
 
3 liveuser 16405
							//debug
16406
							if(window.debug){
226 liveuser 16407
 
3 liveuser 16408
									console.log('not only save, need extra action.');
226 liveuser 16409
 
3 liveuser 16410
								}//if end
226 liveuser 16411
 
3 liveuser 16412
							//用 ',' 分割 action 字串
16413
							splitedStr=action.split(',');
226 liveuser 16414
 
3 liveuser 16415
							//debug
16416
							if(window.debug){
226 liveuser 16417
 
3 liveuser 16418
									console.log('call '+splitedStr[1]+' function with param('+td+')');
226 liveuser 16419
 
3 liveuser 16420
									//call functino with params
16421
									eval(splitedStr[1]+'.call(this,td)');
226 liveuser 16422
 
3 liveuser 16423
								}//if end
226 liveuser 16424
 
3 liveuser 16425
							}//if end
226 liveuser 16426
 
3 liveuser 16427
						}//fie nd
226 liveuser 16428
 
3 liveuser 16429
					}//if end
226 liveuser 16430
 
3 liveuser 16431
				}//if end
226 liveuser 16432
 
3 liveuser 16433
			//儲存該筆資料的欄位資料
16434
			rowData.push(colData);
226 liveuser 16435
 
3 liveuser 16436
			}//for end
226 liveuser 16437
 
3 liveuser 16438
		//儲存每筆資料的欄位資料
16439
		thisTable.rowData=rowData;
226 liveuser 16440
 
3 liveuser 16441
		//如果要儲存成陣列
16442
		if(params.storeInArray==='true'){
226 liveuser 16443
 
3 liveuser 16444
			//put table in array
226 liveuser 16445
			eval(params.var+'.push(thisTable)');
16446
 
16447
			}//if end
16448
 
3 liveuser 16449
		//反之
16450
		else{
226 liveuser 16451
 
16452
			//put table in var
16453
			eval(params.var+'.=thisTable');
16454
 
16455
			}//else end
16456
 
3 liveuser 16457
		";
16458
		#可省略參數:
16459
		#$conf["onReady"],字串,是否要在網頁完全載入後再執行,"false"為不等載入完就先執行,預設為"true"要等載入完再執行.
16460
		#$conf["onReady"]="true";
16461
		#$conf["globalJs"],字串陣列,為要放入<script>標籤的js全域變數.
16462
		#$conf["globalJs"]=array();
16463
		#$conf["jsFunciton"],字串陣列,為要放入<script>標籤的js函數.
16464
		#$conf["jsFunciton"]=array();
16465
		#參考資料:
16466
		#http://stackoverflow.com/questions/9899372/pure-javascript-equivalent-to-jquerys-ready-how-to-call-a-function-when-the
16467
		$toScript=javaScript::toScript($conf["javaScript::toScript"]);
226 liveuser 16468
		unset($conf["javaScript::toScript"]);
16469
 
3 liveuser 16470
		#如果檢查參數失敗
16471
		if($toScript["status"]==="false"){
16472
 
16473
			#設置執行失敗
16474
			$result["status"]="false";
16475
 
16476
			#設置執行錯誤訊息
16477
			$result["error"]=$toScript;
16478
 
16479
			#回傳結果
16480
			return $result;
16481
 
16482
			}#if end
226 liveuser 16483
 
3 liveuser 16484
		#取得 js 語法
226 liveuser 16485
		$result["content"]=$result["content"].$toScript["content"];
16486
 
3 liveuser 16487
		#設置執行正常
16488
		$result["status"]="true";
226 liveuser 16489
 
3 liveuser 16490
		#回傳結果
16491
		return $result;
226 liveuser 16492
 
3 liveuser 16493
		}#funtion readTable end
16494
 
16495
	/*
16496
	#函式說明:
16497
	#提供tab頁簽,點選頁簽後顯示對應的內容.套用的element結構如下:
16498
	#<div>
16499
	#	<!-- data-tab-name 為頁籤要顯示名稱 -->
16500
	#	<div data-tab-name="tab1" style="display:none;">
16501
	#		<!-- 頁籤對應的內容 -->
16502
	#		tab1 content...
16503
	#	</div>
16504
	#	<div data-tab-name="tab2" style="display:none;">
16505
	#		tab2 content...
16506
	#	</div>
16507
	#	<div data-tab-name="tab3" style="display:none;">
226 liveuser 16508
	#		tab3 content...
3 liveuser 16509
	#	</div>
16510
	#</div>
16511
	#回傳結果:
16512
	#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
16513
	#$result["error"],錯誤訊息.
16514
	#$result["function"],當前執行的函數名稱.
16515
	#$result["content"],語法.
16516
	#必填參數:
16517
	#$conf["place"],字串,該功能區塊要在哪個元素裡面呈現,其區塊特徵為何?(請參閱javascript的querySelector函式).
16518
	$conf["place"]="";
226 liveuser 16519
	#可省略參數:
3 liveuser 16520
	#$conf["height"],字串,tab選單+內容的高度,單位為px..
16521
	#$conf["height"]="291";
16522
	#參考資料:
16523
	#無.
16524
	#備註:
16525
	#無.
16526
	*/
16527
	public static function tab(&$conf){
226 liveuser 16528
 
3 liveuser 16529
		#初始化要回傳的結果
16530
		$result=array();
16531
 
16532
		#取得當前執行的函數名稱
16533
		$result["function"]=__FUNCTION__;
16534
 
16535
		#如果沒有參數
16536
		if(func_num_args()==0){
16537
 
16538
			#設置執行失敗
16539
			$result["status"]="false";
16540
 
16541
			#設置執行錯誤訊息
16542
			$result["error"]="函數".$result["function"]."需要參數";
16543
 
16544
			#回傳結果
16545
			return $result;
16546
 
16547
			}#if end
16548
 
16549
		#取得參數
16550
		$result["argu"]=$conf;
16551
 
16552
		#如果 $conf 不為陣列
16553
		if(gettype($conf)!=="array"){
16554
 
16555
			#設置執行失敗
16556
			$result["status"]="false";
16557
 
16558
			#設置執行錯誤訊息
16559
			$result["error"][]="\$conf變數須為陣列形態";
16560
 
16561
			#如果傳入的參數為 null
16562
			if($conf===null){
16563
 
16564
				#設置執行錯誤訊息
16565
				$result["error"][]="\$conf變數不得為null,請檢查函數「".$result["function"]."」的參數設置有無正確!";
16566
 
16567
				}#if end
16568
 
16569
			#回傳結果
16570
			return $result;
16571
 
16572
			}#if end
16573
 
16574
		#檢查參數
16575
		#函式說明:
16576
		#檢查必填與可省略的參數,可省略參數可指定預設要給與什麼數值內容。
16577
		#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
16578
		#$reuslt["error"],執行不正常結束的錯訊息陣列.
16579
		#$result["function"],當前執行的函式名稱.
16580
		#$result["passed"],識別要檢查的全體變數是否存在以及型態是否正確的變數,"true"代表檢查全部通過;"false"代表檢查不通過
16581
		#$result[$shouldBeCheckedVarName]["varExist"],所檢查的變數是否存在,"false"代表不存在;"true"代表存在
16582
		#$result[$shouldBeCheckedVarName]["varType"],所檢查的變數型態是否正確,"false"代表錯誤;"true"代表正確
16583
		#$result[$shouldBeCheckedVarName]["error"],每個參數設定的錯誤訊息
16584
		#$result["shouldNotBeEmpty"],不應該為空字串或控陣列的變數.
16585
		#$result["argu"],字串陣列,目前輸入的參數名稱陣列.
16586
		#$result["legalVarName"],字串陣列,合法可用的參數名稱陣列.
16587
		#$result["notNeedVar"],字串陣列,多餘的參數名稱.
16588
		#必填參數:
16589
		#$conf["varInput"],陣列變數,要檢查的陣列變數,請在要檢查的參數前面加上&,這樣變動的結果才能被套用。
16590
		$conf["variableCheck::checkArguments"]["varInput"]=&$conf;
16591
		#$conf["mustBeFilledVariableName"],爲必填參數的變數名稱陣列,形態爲陣列變數,元素數量需要跟"mustBeFilledVariableType"參數的元素數量一致,例如: $conf["mustBeFilledVariableName"] = array("id","account","password");
16592
		$conf["variableCheck::checkArguments"]["mustBeFilledVariableName"]=array("place");
16593
		#$conf["mustBeFilledVariableType"],爲必填參數的變數陣列應該爲何種變數形態,形態爲陣列,元素數量需要跟"mustBeFilledVariableName"參數的元素數量一致,例如: $conf["mustBeFilledVariableType"] = array("string",integer,"double","resource","object"); , null代表不指定變數形態.
16594
		$conf["variableCheck::checkArguments"]["mustBeFilledVariableType"]=array("string");
16595
		#$conf["referenceVarKey"],字串,$conf參數後面的key值,用於移除不要的參考陣列.
16596
		$conf["variableCheck::checkArguments"]["referenceVarKey"]="variableCheck::checkArguments";
16597
		#可以省略的參數:
16598
		#$conf["canBeEmptyString"],字串,必填變數內容如果是空字串就不能算是有設置的話,請設為"false",預設爲"true",可以為空字串.
16599
		$conf["variableCheck::checkArguments"]["canBeEmptyString"]="false";
16600
		#$conf["skipableVariableCanNotBeEmpty"],字串陣列,哪些可省略參數不可以為空字串或集合.
16601
		#$conf["variableCheck::checkArguments"]["skipableVariableCanNotBeEmpty"]=array("sec");
16602
		#$conf["skipableVariableName"],陣列字串,爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableName"] = array("id","account","password");
16603
		$conf["variableCheck::checkArguments"]["skipableVariableName"]=array("height");
16604
		#$conf["skipableVariableType"],陣列字串,爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableType"] = array("string",integer,"double");
16605
		$conf["variableCheck::checkArguments"]["skipableVariableType"]=array("string");
16606
		#$conf["skipableVarDefaultValue"],字串陣列,每個不存在的可省略變數要初始化為什麼,null與代表不指定,若預設值是參數之一,請將$conf["mustBeFilledVar"]改成"\$conf["\mustBeFilledVar\"]".
16607
		$conf["variableCheck::checkArguments"]["skipableVarDefaultValue"]=array(null);
16608
		#$conf["arrayCountEqualCheck"],字串陣列,為檢查哪些陣列參數的元素數量要一樣,$conf["arrayCountEqualCheck"][$i]=array()為第$i組key為哪些的變數其元素數量要相等.
16609
		#$conf["variableCheck::checkArguments"]["arrayCountEqualCheck"][]=array("tabsDisplayValue","tabsContent");
16610
		#參考資料來源:
16611
		#array_keys=>http://php.net/manual/en/function.array-keys.php
16612
		$checkArguments=variableCheck::checkArguments($conf["variableCheck::checkArguments"]);
16613
		unset($conf["variableCheck::checkArguments"]);
16614
 
16615
		#如果檢查參數失敗
16616
		if($checkArguments["status"]==="false"){
16617
 
16618
			#設置執行不正常
16619
			$result["status"]="false";
16620
 
16621
			#設置執行錯誤
16622
			$result["error"]=$checkArguments;
16623
 
16624
			#回傳結果
16625
			return $result;
16626
 
16627
			}#if end
16628
 
16629
		#如果檢查參數不通過
16630
		if($checkArguments["passed"]==="false"){
16631
 
16632
			#設置執行不正常
16633
			$result["status"]="false";
16634
 
16635
			#設置執行錯誤
16636
			$result["error"]=$checkArguments;
16637
 
16638
			#回傳結果
16639
			return $result;
16640
 
16641
			}#if end
226 liveuser 16642
 
3 liveuser 16643
		#初始化要回傳的語法
16644
		$result["content"]="";
226 liveuser 16645
 
3 liveuser 16646
		#函式說明:
16647
		#將要執行的script語法透過該函式執行(會在程式外層用<script></script>包起來).
16648
		#回傳結果:
16649
		#$result["status"],執行是否正常,"true"為正常,"false"為不正常.
16650
		#$result["error"],錯誤訊息陣列
16651
		#$result["function"],當前執行的函數名稱
16652
		#$result["content"],要執行的javaScript語法
16653
		#必填參數:
16654
		#$conf["script"],字串,要執行的javaScript語法.
16655
		$conf["javaScript::toScript"]["script"]=
16656
		"
16657
		//取得要放置投影片內容的區塊
16658
		var displayArea=document.querySelector('".$conf["place"]."');
226 liveuser 16659
 
3 liveuser 16660
		//儲存頁籤的數量
16661
		var tabsCount=displayArea.children.length;
226 liveuser 16662
 
3 liveuser 16663
		//初始化儲存頁籤的名稱
16664
		var tabsName=[];
226 liveuser 16665
 
3 liveuser 16666
		//針對每個頁簽
16667
		for(var i=0;i<tabsCount;i++){
226 liveuser 16668
 
3 liveuser 16669
			//隱藏頁籤
16670
			displayArea.children[i].style.display='none';
226 liveuser 16671
 
3 liveuser 16672
			//初始化頁籤名稱
16673
			var tabName='tab'+i;
226 liveuser 16674
 
3 liveuser 16675
			//如果有設置頁籤的名稱
16676
			if(displayArea.children[i].dataset.tabName!==undefined){
226 liveuser 16677
 
3 liveuser 16678
				//更新頁籤名稱
16679
				tabName=displayArea.children[i].dataset.tabName
226 liveuser 16680
 
3 liveuser 16681
				}//if end
226 liveuser 16682
 
3 liveuser 16683
			//儲存頁籤名稱
16684
			tabsName.push(tabName);
226 liveuser 16685
 
3 liveuser 16686
			}//for end
226 liveuser 16687
 
3 liveuser 16688
		//建立存放頁籤選單的div
16689
		var tabsDiv=document.createElement('div');
226 liveuser 16690
 
3 liveuser 16691
		//針對每個頁簽
16692
		for(var i=0;i<tabsCount;i++){
226 liveuser 16693
 
3 liveuser 16694
			//建立頁籤的div
16695
			var div=document.createElement('div');
226 liveuser 16696
 
3 liveuser 16697
			//設置儘量不換行
16698
			div.style.display='inline-block';
226 liveuser 16699
 
3 liveuser 16700
			//設置間隔避免無法識別
16701
			div.style.marginLeft='5px';
16702
			div.style.marginRight='5px';
226 liveuser 16703
 
3 liveuser 16704
			//設置index
16705
			div.dataset.index=i+1;
226 liveuser 16706
 
3 liveuser 16707
			//放置頁籤的名稱
16708
			div.appendChild(document.createTextNode(tabsName[i]));
226 liveuser 16709
 
3 liveuser 16710
			//放置頁籤
16711
			tabsDiv.appendChild(div);
226 liveuser 16712
 
3 liveuser 16713
			//新增該頁籤的點擊事件
16714
			div.addEventListener('click',function(event){
226 liveuser 16715
 
3 liveuser 16716
				//針對每個頁簽
16717
				for(var j=1;j<tabsDiv.children.length+1;j++){
226 liveuser 16718
 
3 liveuser 16719
					//隱藏頁籤標題
16720
					displayArea.children[0].children[j-1].style.borderBottom='unset';
226 liveuser 16721
 
3 liveuser 16722
					//隱藏頁籤與礦線
16723
					displayArea.children[j].style.display='none';
226 liveuser 16724
 
3 liveuser 16725
					}//for end
226 liveuser 16726
 
3 liveuser 16727
				";
226 liveuser 16728
 
3 liveuser 16729
				#如果有設置高度
16730
				if(isset($conf["height"]))
16731
				{
16732
					#串接高度的設定
16733
					$conf["javaScript::toScript"]["script"]=$conf["javaScript::toScript"]["script"].
16734
					"
16735
						//設定tab內容區塊的高度
16736
						displayArea.children[this.dataset.index].children[0].style.height=".$conf["height"]."-parseInt(getComputedStyle(displayArea.children[0]).height)+'px';
16737
					";
226 liveuser 16738
 
3 liveuser 16739
				}#if end
226 liveuser 16740
 
3 liveuser 16741
				$conf["javaScript::toScript"]["script"]=$conf["javaScript::toScript"]["script"].
16742
				"
226 liveuser 16743
 
3 liveuser 16744
				//顯示目標頁籤內容
16745
				displayArea.children[this.dataset.index].style.display='inline-block';
226 liveuser 16746
 
3 liveuser 16747
				//提示當前選擇的頁籤
16748
				displayArea.children[0].children[this.dataset.index-1].style.borderBottom='solid blue';
226 liveuser 16749
 
3 liveuser 16750
				});
226 liveuser 16751
 
3 liveuser 16752
			}//for end
226 liveuser 16753
 
3 liveuser 16754
		//放置標籤選單
16755
		displayArea.prepend(tabsDiv);
226 liveuser 16756
 
3 liveuser 16757
		//預設顯示第一個頁簽
16758
		displayArea.children[0].children[0].click();
226 liveuser 16759
 
3 liveuser 16760
		";
16761
		#可省略參數:
16762
		#$conf["onReady"],字串,是否要在網頁完全載入後再執行,"false"為不等載入完就先執行,預設為"true"要等載入完再執行.
16763
		#$conf["onReady"]="true";
16764
		#$conf["globalJs"],字串陣列,為要放入<script>標籤的js全域變數.
16765
		#$conf["globalJs"]=array();
16766
		#$conf["jsFunciton"],字串陣列,為要放入<script>標籤的js函數.
16767
		#$conf["jsFunciton"]=array();
16768
		#參考資料:
16769
		#http://stackoverflow.com/questions/9899372/pure-javascript-equivalent-to-jquerys-ready-how-to-call-a-function-when-the
16770
		#備註:
16771
		#無.
16772
		$toScript=javaScript::toScript($conf["javaScript::toScript"]);
16773
		unset($conf["javaScript::toScript"]);
226 liveuser 16774
 
3 liveuser 16775
		#如果建立 script 語法失敗
16776
		if($toScript["status"]==="false"){
226 liveuser 16777
 
3 liveuser 16778
			#設置執行失敗
16779
			$result["status"]="false";
226 liveuser 16780
 
3 liveuser 16781
			#設置錯誤訊息
16782
			$result["error"]=$toScript;
226 liveuser 16783
 
3 liveuser 16784
			#回傳結果
16785
			return $result;
226 liveuser 16786
 
3 liveuser 16787
			}#if end
226 liveuser 16788
 
3 liveuser 16789
		#儲存內容
16790
		$result["content"]=$result["content"].$toScript["content"];
226 liveuser 16791
 
3 liveuser 16792
		#設置執行正常
16793
		$result["status"]="true";
226 liveuser 16794
 
3 liveuser 16795
		#回傳結果
16796
		return $result;
226 liveuser 16797
 
3 liveuser 16798
		}#function tab end
16799
 
16800
	/*
16801
	#函式說明:
16802
	#區塊輪播的效果,輪播內容支援影片播放結束後再換下一張.
16803
	#回傳結果:
16804
	#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
16805
	#$result["error"],錯誤訊息.
16806
	#$result["function"],當前執行的函數名稱.
16807
	#$result["content"],語法.
16808
	#必填參數:
16809
	#$conf["place"],字串,輪播區塊要在哪個元素裡面呈現,其區塊特徵為何?(請參閱javascript的querySelector函式).
16810
	$conf["place"]="";
16811
	#$conf["slideHtml"],字串陣列,每個投影片的html語法,其生成結構必須為 html > body > div > anyTag(content to show).
16812
	$conf["slideHtml"]=array("");
226 liveuser 16813
	#可省略參數:
3 liveuser 16814
	#$conf["sec"],字串,過幾秒就要置換成下一張投影片,預設為"3",代表每3秒就換一張投影片.
16815
	#$conf["sec"]="3";
16816
	#參考資料:
16817
	#無.
16818
	#備註:
16819
	#無.
16820
	*/
16821
	public static function slideDivPlus(&$conf){
226 liveuser 16822
 
3 liveuser 16823
		#初始化要回傳的結果
16824
		$result=array();
16825
 
16826
		#取得當前執行的函數名稱
16827
		$result["function"]=__FUNCTION__;
16828
 
16829
		#如果沒有參數
16830
		if(func_num_args()==0){
16831
 
16832
			#設置執行失敗
16833
			$result["status"]="false";
16834
 
16835
			#設置執行錯誤訊息
16836
			$result["error"]="函數".$result["function"]."需要參數";
16837
 
16838
			#回傳結果
16839
			return $result;
16840
 
16841
			}#if end
16842
 
16843
		#取得參數
16844
		$result["argu"]=$conf;
16845
 
16846
		#如果 $conf 不為陣列
16847
		if(gettype($conf)!=="array"){
16848
 
16849
			#設置執行失敗
16850
			$result["status"]="false";
16851
 
16852
			#設置執行錯誤訊息
16853
			$result["error"][]="\$conf變數須為陣列形態";
16854
 
16855
			#如果傳入的參數為 null
16856
			if($conf===null){
16857
 
16858
				#設置執行錯誤訊息
16859
				$result["error"][]="\$conf變數不得為null,請檢查函數「".$result["function"]."」的參數設置有無正確!";
16860
 
16861
				}#if end
16862
 
16863
			#回傳結果
16864
			return $result;
16865
 
16866
			}#if end
16867
 
16868
		#檢查參數
16869
		#函式說明:
16870
		#檢查必填與可省略的參數,可省略參數可指定預設要給與什麼數值內容。
16871
		#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
16872
		#$reuslt["error"],執行不正常結束的錯訊息陣列.
16873
		#$result["function"],當前執行的函式名稱.
16874
		#$result["passed"],識別要檢查的全體變數是否存在以及型態是否正確的變數,"true"代表檢查全部通過;"false"代表檢查不通過
16875
		#$result[$shouldBeCheckedVarName]["varExist"],所檢查的變數是否存在,"false"代表不存在;"true"代表存在
16876
		#$result[$shouldBeCheckedVarName]["varType"],所檢查的變數型態是否正確,"false"代表錯誤;"true"代表正確
16877
		#$result[$shouldBeCheckedVarName]["error"],每個參數設定的錯誤訊息
16878
		#$result["shouldNotBeEmpty"],不應該為空字串或控陣列的變數.
16879
		#$result["argu"],字串陣列,目前輸入的參數名稱陣列.
16880
		#$result["legalVarName"],字串陣列,合法可用的參數名稱陣列.
16881
		#$result["notNeedVar"],字串陣列,多餘的參數名稱.
16882
		#必填參數:
16883
		#$conf["varInput"],陣列變數,要檢查的陣列變數,請在要檢查的參數前面加上&,這樣變動的結果才能被套用。
16884
		$conf["variableCheck::checkArguments"]["varInput"]=&$conf;
16885
		#$conf["mustBeFilledVariableName"],爲必填參數的變數名稱陣列,形態爲陣列變數,元素數量需要跟"mustBeFilledVariableType"參數的元素數量一致,例如: $conf["mustBeFilledVariableName"] = array("id","account","password");
16886
		$conf["variableCheck::checkArguments"]["mustBeFilledVariableName"]=array("place","slideHtml");
16887
		#$conf["mustBeFilledVariableType"],爲必填參數的變數陣列應該爲何種變數形態,形態爲陣列,元素數量需要跟"mustBeFilledVariableName"參數的元素數量一致,例如: $conf["mustBeFilledVariableType"] = array("string",integer,"double","resource","object"); , null代表不指定變數形態.
16888
		$conf["variableCheck::checkArguments"]["mustBeFilledVariableType"]=array("string","array");
16889
		#$conf["referenceVarKey"],字串,$conf參數後面的key值,用於移除不要的參考陣列.
16890
		$conf["variableCheck::checkArguments"]["referenceVarKey"]="variableCheck::checkArguments";
16891
		#可以省略的參數:
16892
		#$conf["canBeEmptyString"],字串,必填變數內容如果是空字串就不能算是有設置的話,請設為"false",預設爲"true",可以為空字串.
16893
		$conf["variableCheck::checkArguments"]["canBeEmptyString"]="false";
16894
		#$conf["skipableVariableCanNotBeEmpty"],字串陣列,哪些可省略參數不可以為空字串或集合.
16895
		#$conf["variableCheck::checkArguments"]["skipableVariableCanNotBeEmpty"]=array("sec");
16896
		#$conf["skipableVariableName"],陣列字串,爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableName"] = array("id","account","password");
16897
		$conf["variableCheck::checkArguments"]["skipableVariableName"]=array("sec");
16898
		#$conf["skipableVariableType"],陣列字串,爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableType"] = array("string",integer,"double");
16899
		$conf["variableCheck::checkArguments"]["skipableVariableType"]=array("string");
16900
		#$conf["skipableVarDefaultValue"],字串陣列,每個不存在的可省略變數要初始化為什麼,null與代表不指定,若預設值是參數之一,請將$conf["mustBeFilledVar"]改成"\$conf["\mustBeFilledVar\"]".
16901
		$conf["variableCheck::checkArguments"]["skipableVarDefaultValue"]=array("3");
16902
		#$conf["arrayCountEqualCheck"],字串陣列,為檢查哪些陣列參數的元素數量要一樣,$conf["arrayCountEqualCheck"][$i]=array()為第$i組key為哪些的變數其元素數量要相等.
16903
		#$conf["variableCheck::checkArguments"]["arrayCountEqualCheck"][]=array("tabsDisplayValue","tabsContent");
16904
		#參考資料來源:
16905
		#array_keys=>http://php.net/manual/en/function.array-keys.php
16906
		$checkArguments=variableCheck::checkArguments($conf["variableCheck::checkArguments"]);
16907
		unset($conf["variableCheck::checkArguments"]);
16908
 
16909
		#如果檢查參數失敗
16910
		if($checkArguments["status"]==="false"){
16911
 
16912
			#設置執行不正常
16913
			$result["status"]="false";
16914
 
16915
			#設置執行錯誤
16916
			$result["error"]=$checkArguments;
16917
 
16918
			#回傳結果
16919
			return $result;
16920
 
16921
			}#if end
16922
 
16923
		#如果檢查參數不通過
16924
		if($checkArguments["passed"]==="false"){
16925
 
16926
			#設置執行不正常
16927
			$result["status"]="false";
16928
 
16929
			#設置執行錯誤
16930
			$result["error"]=$checkArguments;
16931
 
16932
			#回傳結果
16933
			return $result;
16934
 
16935
			}#if end
226 liveuser 16936
 
3 liveuser 16937
		#初始化要回傳的語法
16938
		$result["content"]="";
226 liveuser 16939
 
3 liveuser 16940
		#函式說明:
16941
		#將要執行的script語法透過該函式執行(會在程式外層用<script></script>包起來).
16942
		#回傳結果:
16943
		#$result["status"],執行是否正常,"true"為正常,"false"為不正常.
16944
		#$result["error"],錯誤訊息陣列
16945
		#$result["function"],當前執行的函數名稱
16946
		#$result["content"],要執行的javaScript語法
16947
		#必填參數:
16948
		#$conf["script"],字串,要執行的javaScript語法.
16949
		$conf["javaScript::toScript"]["script"]=
16950
		"
16951
			//設置要使用的投影片
16952
			window.qbpwcf.slide.eles=".json_encode($conf["slideHtml"]).";
226 liveuser 16953
 
3 liveuser 16954
			//設置放置投影片的區塊特徵
16955
			window.qbpwcf.slide.displayDivByQuerySelector='".$conf["place"]."';
226 liveuser 16956
 
3 liveuser 16957
			//初始化投影片的滯留時間,預設為3秒,時間到就換下一個投影片.
16958
			window.qbpwcf.slide.showTime=".$conf["sec"].";
226 liveuser 16959
 
3 liveuser 16960
			//呈現投影片
16961
			window.qbpwcf.slide.func();
16962
		";
16963
		#可省略參數:
16964
		#$conf["onReady"],字串,是否要在網頁完全載入後再執行,"false"為不等載入完就先執行,預設為"true"要等載入完再執行.
16965
		#$conf["onReady"]="true";
16966
		#$conf["globalJs"],字串陣列,為要放入<script>標籤的js全域變數.
16967
		#$conf["globalJs"]=array();
16968
		#$conf["jsFunciton"],字串陣列,為要放入<script>標籤的js函數.
16969
		#$conf["jsFunciton"]=array();
16970
		#參考資料:
16971
		#http://stackoverflow.com/questions/9899372/pure-javascript-equivalent-to-jquerys-ready-how-to-call-a-function-when-the
16972
		#備註:
16973
		#無.
16974
		$toScript=javaScript::toScript($conf["javaScript::toScript"]);
16975
		unset($conf["javaScript::toScript"]);
16976
 
16977
		#如果建立 script 語法失敗
16978
		if($toScript["status"]==="false"){
226 liveuser 16979
 
3 liveuser 16980
			#設置執行失敗
16981
			$result["status"]="false";
226 liveuser 16982
 
3 liveuser 16983
			#設置錯誤訊息
16984
			$result["error"]=$toScript;
226 liveuser 16985
 
3 liveuser 16986
			#回傳結果
16987
			return $result;
226 liveuser 16988
 
3 liveuser 16989
			}#if end
226 liveuser 16990
 
3 liveuser 16991
		#儲存內容
16992
		$result["content"]=$result["content"].$toScript["content"];
226 liveuser 16993
 
3 liveuser 16994
		#設置執行正常
16995
		$result["status"]="true";
226 liveuser 16996
 
3 liveuser 16997
		#回傳結果
16998
		return $result;
226 liveuser 16999
 
3 liveuser 17000
		}#functino slideDivPlus end
17001
 
207 liveuser 17002
	/*
17003
	#函式說明:
17004
	#將指定的字形套用在body上.
17005
	#回傳結果:
17006
	#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
17007
	#$result["error"],錯誤訊息.
17008
	#$result["function"],當前執行的函數名稱.
17009
	#$result["content"],語法.
17010
	#必填參數:
17011
	#無.
17012
	#可省略參數:
17013
	#$conf["fontPath"],字串,字形檔案的位置,預設為"liberation-mono/LiberationMono-Regular.ttf".
17014
	$conf["fontPath"]="";
17015
	#參考資料:
17016
	#無.
17017
	#備註:
17018
	#無.
17019
	*/
17020
	public static function setBodyFont(&$conf){
226 liveuser 17021
 
207 liveuser 17022
		#初始化要回傳的結果
17023
		$result=array();
17024
 
17025
		#取得當前執行的函數名稱
17026
		$result["function"]=__FUNCTION__;
17027
 
17028
		#取得參數
17029
		$result["argu"]=$conf;
17030
 
17031
		#如果 $conf 不為陣列
17032
		if(gettype($conf)!="array"){
17033
 
17034
			#設置執行失敗
17035
			$result["status"]="false";
17036
 
17037
			#設置執行錯誤訊息
17038
			$result["error"][]="\$conf變數須為陣列形態";
17039
 
17040
			#如果傳入的參數為 null
17041
			if(is_null($conf)){
17042
 
17043
				#設置執行錯誤訊息
17044
				$result["error"][]="\$conf變數不得為null,請檢查函數「".$result["function"]."」的參數設置有無正確!";
17045
 
17046
				}#if end
17047
 
17048
			#回傳結果
17049
			return $result;
17050
 
17051
			}#if end
226 liveuser 17052
 
207 liveuser 17053
		#函式說明:
17054
		#檢查必填與可省略的參數,可省略參數可指定預設要給與什麼數值內容.
17055
		#回傳結果:
17056
		#$result["status"],執行是否正常,"true"代表正常,"false"代表不正常.
17057
		#$result["error"],執行不正常結束的錯訊息陣列.
17058
		#$result["simpleError"],簡單表示的錯誤訊息.
17059
		#$result["function"],當前執行的函式名稱.
17060
		#$result["argu"],設置給予的參數.
17061
		#$result["passed"],識別要檢查的全體變數是否存在以及型態是否正確的變數,"true"代表檢查全部通過;"false"代表檢查不通過
17062
		#$result[$shouldBeCheckedVarName]["varExist"],所檢查的變數是否存在,"false"代表不存在;"true"代表存在
17063
		#$result[$shouldBeCheckedVarName]["varType"],所檢查的變數型態是否正確,"false"代表錯誤;"true"代表正確
17064
		#$result[$shouldBeCheckedVarName]["error"],每個參數設定的錯誤訊息
17065
		#$result["shouldNotBeEmpty"],不應該為空字串或控陣列的變數.
17066
		#$result["argu"],字串陣列,目前輸入的參數名稱陣列.
17067
		#$result["legalVarName"],字串陣列,合法可用的參數名稱陣列.
17068
		#$result["notNeedVar"],字串陣列,多餘的參數名稱.
17069
		#必填參數:
17070
		#$conf["varInput"],陣列變數,要檢查的陣列變數,請在要檢查的參數前面加上&,這樣變動的結果才能被套用。
17071
		$conf["variableCheck::checkArguments"]["varInput"]=&$conf;
17072
		#$conf["referenceVarKey"],字串,$conf參數後面的key值,用於移除不要的參考陣列.
17073
		$conf["variableCheck::checkArguments"]["referenceVarKey"]="variableCheck::checkArguments";
17074
		#可省略參數:
17075
		#$conf["mustBeFilledVariableName"],爲必填參數的變數名稱陣列,形態爲陣列變數,元素數量需要跟"mustBeFilledVariableType"參數的元素數量一致,例如: $conf["mustBeFilledVariableName"] = array("id","account","password");
17076
		#$conf["mustBeFilledVariableName"]=array();
17077
		#$conf["mustBeFilledVariableType"],爲必填參數的變數陣列應該爲何種變數形態,形態爲陣列,元素數量需要跟"mustBeFilledVariableName"參數的元素數量一致,例如: $conf["mustBeFilledVariableType"] = array("string",integer,"double","resource","object"); , null、any代表不指定變數形態.其中 resource也包含"resource (closed)".
17078
		#$conf["mustBeFilledVariableType"]=array();
17079
		#$conf["canBeEmptyString"],字串,必填變數內容如果是空字串就不能算是有設置的話,請設為"false",預設爲"true",可以為空字串.
17080
		#$conf["canBeEmptyString"]="false";
17081
		#$conf["canNotBeEmpty"],字串陣列,哪些必填參數的內容不得為空字串或空陣列,僅當$conf["canBeEmptyString"]為"true"時會生效.
17082
		#$conf["canNotBeEmpty"]=array();
17083
		#$conf["canBeEmpty"],字串陣列,哪些必填參數的內容可為空字串或空陣列,僅當$conf["canBeEmptyString"]為"false"時會生效.
17084
		#$conf["canBeEmpty"]=array();
17085
		#$conf["skipableVariableCanNotBeEmpty"],字串陣列,哪些可省略參數不可以為空字串或空陣列.
17086
		$conf["variableCheck::checkArguments"]["skipableVariableCanNotBeEmpty"]=array("fontPath","outsideFontUrl");
17087
		#$conf["skipableVariableName"],陣列字串,爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableName"] = array("id","account","password");
17088
		$conf["variableCheck::checkArguments"]["skipableVariableName"]=array("fontPath","outsideFontUrl");
17089
		#$conf["skipableVariableType"],陣列字串,爲可省略參數的變數名稱陣列,形態爲陣列變數,例如: $conf["skipableVariableType"] = array("string",integer,"double");
17090
		$conf["variableCheck::checkArguments"]["skipableVariableType"]=array("string","string");
17091
		#$conf["skipableVarDefaultValue"],字串陣列,每個不存在的可省略變數要初始化為什麼,null與代表不指定,若預設值是參數之一,請將$conf["mustBeFilledVar"]改成"\$conf["\mustBeFilledVar\"]".
17092
		$conf["variableCheck::checkArguments"]["skipableVarDefaultValue"]=array("liberation-mono-fonts/LiberationMono-Regular.ttf",null);
17093
		#$conf["disallowAllSkipableVarIsEmpty"],字串,是否允許每個可省略參數都為空字串,預設為"true"允許,反之為"false".
17094
		#$conf["disallowAllSkipableVarIsEmpty"]="";
17095
		#$conf["disallowAllSkipableVarIsEmptyArray"],字串,是否允許每個可省略參數都為空陣列,預設為"true"允許,反之為"false".
17096
		#$conf["disallowAllSkipableVarIsEmptyArray"]="";
17097
		#$conf["disallowAllSkipableVarNotExist"],字串,是否不允許每個可省略參數都不存在,預設為"false"代表允許,反之為"true".
17098
		#$conf["disallowAllSkipableVarNotExist"]="";
17099
		#$conf["arrayCountEqualCheck"],字串陣列,為檢查哪些陣列參數的元素數量要一樣,$conf["arrayCountEqualCheck"][$i]=array()為第$i組key為哪些的變數其元素數量要相等.
17100
		#$conf["arrayCountEqualCheck"][]=array();
17101
		#參考資料:
17102
		#array_keys=>http://php.net/manual/en/function.array-keys.php
17103
		#備註:
17104
		#無.
17105
		$checkArguments=variableCheck::checkArguments($conf["variableCheck::checkArguments"]);
17106
		unset($conf["variableCheck::checkArguments"]);
226 liveuser 17107
 
207 liveuser 17108
		#如果執行失敗
17109
		if($checkArguments["status"]==="false"){
226 liveuser 17110
 
207 liveuser 17111
			#設置執行異常
17112
			$result["status"]="false";
226 liveuser 17113
 
207 liveuser 17114
			#設置執行錯誤訊息
17115
			$result["error"]=$checkArguments;
226 liveuser 17116
 
207 liveuser 17117
			#回傳結果
17118
			return $result;
226 liveuser 17119
 
207 liveuser 17120
			}#if end
226 liveuser 17121
 
207 liveuser 17122
		#如果參數檢查不通過
17123
		if($checkArguments["passed"]==="false"){
226 liveuser 17124
 
207 liveuser 17125
			#設置執行異常
17126
			$result["status"]="false";
226 liveuser 17127
 
207 liveuser 17128
			#設置執行錯誤訊息
17129
			$result["error"]=$checkArguments;
226 liveuser 17130
 
207 liveuser 17131
			#回傳結果
17132
			return $result;
226 liveuser 17133
 
207 liveuser 17134
			}#if end
226 liveuser 17135
 
207 liveuser 17136
		#如果有設置 outsideFontUrl
17137
		if(isset($conf["outsideFontUrl"])){
226 liveuser 17138
 
207 liveuser 17139
			#設置字形是從 url 取得
17140
			$isWeb="true";
226 liveuser 17141
 
207 liveuser 17142
			#設置字形url
17143
			$fontsPath=$conf["outsideFontUrl"];
226 liveuser 17144
 
207 liveuser 17145
			}#if end
226 liveuser 17146
 
207 liveuser 17147
		#反之
17148
		else{
226 liveuser 17149
 
207 liveuser 17150
			#設置字形是從本地取得
17151
			$isWeb="false";
226 liveuser 17152
 
207 liveuser 17153
			#取得存在字形的根目錄
17154
			$fontsPath=pathinfo(__FILE__)["dirname"]."/fonts/".$conf["fontPath"];
226 liveuser 17155
 
207 liveuser 17156
			}#else end
17157
 
232 liveuser 17158
		#debug
17159
		#var_dump(__FILE__,__LINE__,$fontsPath);
17160
 
207 liveuser 17161
		#取得font檔案內容
17162
		#函式說明:
17163
		#依據行號分隔抓取檔案的內容,結果會回傳一個陣列
17164
		#回傳的變數說明:
17165
		#$result["status"],執行是否成功,"true"代表成功;"fasle"代表失敗.
17166
		#$result["error"],錯誤訊息提示.
17167
		#$result["warning"],警告訊息.
17168
		#$result["function"],當前執行的函數名稱.
17169
		#$result["fileContent"],爲檔案的內容陣列.
17170
		#$result["lineCount"],爲檔案內容總共的行數.
17171
		#$result["fullContent"],為檔案的完整內容.
17172
		#$result["base64dataOnly"],檔案的base64data.
17173
		#$result["base64data"],為在網頁上給予src參數的數值.
17174
		#$result["mimeType"],為檔案的mime type.
17175
		#必填參數:
17176
		#$conf["filePositionAndName"],字串,爲檔案的位置以及名稱.
17177
		$conf["fileAccess::getFileContent"]["filePositionAndName"]=$fontsPath;
17178
		#$conf["fileArgu"],字串,php變數__FILE__的內容,亦即該檔案在檔案系統的絕對路徑
17179
		$conf["fileAccess::getFileContent"]["fileArgu"]=__FILE__;
17180
		#可省略參數:
17181
		#$conf["web"],是要取得網路上的檔案則為"true";反之預設為"false".
17182
		$conf["fileAccess::getFileContent"]["web"]=$isWeb;
17183
		#$conf["createIfnotExist"],字串,預設為"false"代表檔案不存在也不需要建立;反之為"true".
17184
		#$conf["createIfnotExist"]="false";
17185
		#$conf["autoDeleteSpaceOnEachLineStart"],字串,預設為"false",不做額外處理;反之為"true"
17186
		#$conf["autoDeleteSpaceOnEachLineStart"]="false";
17187
		#參考資料:
17188
		#file(),取得檔案內容的行數.
17189
		#file=>http:#php.net/manual/en/function.file.php
17190
		#rtrim(),剔除透過file()取得每行內容結尾的換行符號.
17191
		#filesize=>http://php.net/manual/en/function.filesize.php
17192
		#參考資料:
17193
		#無.
17194
		#備註:
17195
		#無.
17196
		$getFileContent=fileAccess::getFileContent($conf["fileAccess::getFileContent"]);
17197
		unset($conf["fileAccess::getFileContent"]);
226 liveuser 17198
 
207 liveuser 17199
		#如果執行異常
17200
		if($getFileContent["status"]==="false"){
226 liveuser 17201
 
207 liveuser 17202
			#設置執行異常
17203
			$result["status"]="false";
226 liveuser 17204
 
207 liveuser 17205
			#設置執行錯誤訊息
17206
			$result["error"]=$getFileContent;
226 liveuser 17207
 
207 liveuser 17208
			#回傳結果
17209
			return $result;
226 liveuser 17210
 
207 liveuser 17211
			}#if end
226 liveuser 17212
 
232 liveuser 17213
		#debug
17214
		#var_dump(__FILE__,__LINE__,$getFileContent);
17215
 
207 liveuser 17216
		#set custom font path
17217
		$setFontPart=
17218
		"
17219
			//store font file in base64 encode string
17220
			window.qbpwcf.fonts.base64='".$getFileContent["base64dataOnly"]."';
226 liveuser 17221
 
17222
			//store font file in bufferArray
207 liveuser 17223
			window.qbpwcf.fonts.bufferArray=Uint8Array.fromBase64(window.qbpwcf.fonts.base64).buffer;
226 liveuser 17224
 
207 liveuser 17225
		";
226 liveuser 17226
 
207 liveuser 17227
		#函式說明:
17228
		#將要執行的script語法透過該函式執行(會在程式外層用<script></script>包起來).
17229
		#回傳結果:
17230
		#$result["status"],執行是否正常,"true"為正常,"false"為不正常.
17231
		#$result["error"],錯誤訊息陣列
17232
		#$result["function"],當前執行的函數名稱
17233
		#$result["content"],要執行的javaScript語法
17234
		#必填參數:
17235
		#$conf["script"],字串,要執行的javaScript語法.
17236
		$conf["javaScript::toScript"]["script"]=$setFontPart.
17237
		"
17238
			//load font function
17239
			await window.qbpwcf.fonts.load();
17240
		";
17241
		#可省略參數:
17242
		#$conf["onReady"],字串,是否要在網頁完全載入後再執行,"false"為不等載入完就先執行,預設為"true"要等載入完再執行.
17243
		#$conf["onReady"]="true";
17244
		#$conf["globalJs"],字串陣列,為要放入<script>標籤的js全域變數.
17245
		#$conf["globalJs"]=array();
17246
		#$conf["jsFunciton"],字串陣列,為要放入<script>標籤的js函數.
17247
		#$conf["jsFunciton"]=array();
17248
		#$conf["noScriptTag"],字串,是否不要輸出<script></script>,預設為"false",代表要輸出;反之為"true",代表不要輸出.
17249
		#$conf["noScriptTag"]="false";
17250
		#參考資料:
17251
		#http://stackoverflow.com/questions/9899372/pure-javascript-equivalent-to-jquerys-ready-how-to-call-a-function-when-the
17252
		#備註:
17253
		#無.
17254
		$toScript=javaScript::toScript($conf["javaScript::toScript"]);
17255
		unset($conf["javaScript::toScript"]);
226 liveuser 17256
 
207 liveuser 17257
		#儲存html(javascript)語法
17258
		$result["content"]=$toScript["content"];
226 liveuser 17259
 
207 liveuser 17260
		#設置執行正常
17261
		$result["status"]="true";
226 liveuser 17262
 
207 liveuser 17263
		#回傳結果
17264
		return $result;
226 liveuser 17265
 
207 liveuser 17266
		}#function setBodyFont end
17267
 
3 liveuser 17268
	}#class javaScript end
17269
 
17270
/*
17271
 
17272
宣告變數 - start
17273
 
17274
宣告變數請用var,若宣告在函式外面,則會變成全域變數.
17275
若不用var來宣告變數,則會被時為全域變數.函式多用會導致被最後一此呼叫的變數所覆蓋.
17276
var variable;
17277
 
17278
參考資料:
17279
https://developer.mozilla.org/zh-TW/docs/Web/JavaScript/Reference/Statements/var
17280
 
17281
宣告變數 - end
17282
 
17283
//直接將選擇好的圖片檔案直接用來使用 - start
17284
input=document.createElement('input');
17285
input.type='file';
17286
input.id='file';
17287
input.accept="image/*";
17288
input.style.display='none';
17289
input.addEventListener('change',function(event)
17290
{
17291
	event.preventDefault();
17292
	event.stopPropagation();
17293
 
17294
	//置換成選取的照片
17295
	document.getElementById('img').src=URL.createObjectURL(event.target.files[0]);
17296
 
17297
	//get selected file content
17298
	reader=new FileReader();
17299
	reader.readAsBinaryString(event.target.files[0]);
226 liveuser 17300
	reader.onload=function(event)
3 liveuser 17301
	{
17302
		//base64 encode
17303
		newVal=btoa(event.target.result);
226 liveuser 17304
 
3 liveuser 17305
		//obj to save
17306
		newValObj=
17307
		{
17308
			where:
17309
			{
17310
				id:'id', //識別要更新到哪一筆資料
17311
			},
17312
			col:'logo', //要儲存到資料表欄位
17313
			val:newVal, //圖片的base64 encode
207 liveuser 17314
		}
3 liveuser 17315
 
17316
		//encode post value
17317
		params=btoa(encodeURIComponent(JSON.stringify(newValObj)));
17318
 
17319
		//如果服務端有回傳完成的狀態
17320
		xmlhttp=new XMLHttpRequest();
17321
		xmlhttp.temp={}; //要依照ajax的回應來編輯的內容請設置在此,透過window變數來修改是無效的.
17322
		//xmlhttp.responseType='json';
17323
		//xmlhttp.timeout=60000;
17324
		xmlhttp.open('POST','update',false);
17325
		xmlhttp.setRequestHeader('Content-type','application/x-www-form-urlencoded');
17326
		xmlhttp.setRequestHeader('X-Requested-With','XMLHttpRequest');
17327
		xmlhttp.onreadystatechange=function(){}//function end
17328
		xmlhttp.send('params='+params); //如果是post則要將參數加在這邊 'key1=encodeURIComponent(val1)&key2=encodeURIComponent(val2)';
226 liveuser 17329
	};
17330
});
3 liveuser 17331
input.click(); //觸發事件
17332
// 直接將選擇好的圖片檔案直接用來使用 - end
17333
 
17334
//get new value
17335
reader=new FileReader();
17336
reader.readAsBinaryString(event.target.files[0]);
17337
 
17338
取得id為'bottom'的元素的上一層元素,將其儲存到變數bottomDiv裡面。
17339
var bottomDiv=document.getElementById('bottom').parentElement;
17340
 
17341
取得id為'target'的元素可見高度
17342
document.getElementById('target').clientHeight;
17343
 
17344
取得id為'bottom'的元素高度(含滾軸)
17345
document.getElementById('bottom').scrollHeight;
17346
 
17347
#視窗的高度(含滾軸)
17348
document.scrollingElement.scrollHeight
17349
 
401 liveuser 17350
#dom的滾軸目前x軸距離起點多少 px
17351
dom.scrollLeft;
17352
 
17353
#dom的滾軸的最大可滾動寬度(x)by scroll(x,y)
17354
dom.scrollLeftMax;
17355
 
3 liveuser 17356
#視窗的高度拉到頂
17357
document.scrollingElement.scrollTop=0;
17358
 
17359
#取得id為"ID"的元素位置與寬高
17360
var element = document.getElementById('ID');
17361
var domRect = element.getBoundingClientRect();
17362
output example => DOMRect { x: 404, y: 20, width: 155, height: 45, top: 20, right: 559, bottom: 65, left: 404 }
17363
 
17364
#當視窗大小改變,要觸發myFunction,只會跑一次
17365
window.addEventListener("resize", myFunction);
17366
 
17367
#當視窗大小改變,要觸發function
17368
window.addEventListener("resize" function(){
17369
	...
17370
	});
17371
 
17372
#當滾軸移動時觸發的事件
226 liveuser 17373
window.addEventListener('scroll', function(e){
3 liveuser 17374
	//get last scroll y, 0 means top.
17375
	var last_known_scroll_position = window.scrollY;
17376
	});
17377
 
17378
#建立物件函數,並透過addEventListener指定執行
17379
var someEvent=function(){
17380
	...
17381
	};
17382
window.addEventListener("resize",someEvent);
17383
 
17384
//在 load event 之前的狀態與事件綁定
17385
//https://developer.mozilla.org/zh-TW/docs/Web/API/Document/readyState
17386
document.onreadystatechange = function () {
17387
 
17388
	// alternative to DOMContentLoaded event
17389
	//文件已經完成讀取和解析,但是其他的子資源,如「圖片樣式層次表」,仍然在讀取。這個狀態表示 DOMContentLoaded 事件已經被觸發。
17390
	//可以開始使用 DOM 元素。
17391
	if (document.readyState == "interactive"){
17392
		initApplication();
17393
		}
17394
 
17395
	// alternative to load event
17396
	//文件及子資源都完成讀取。這個狀態表示 load 事件即將被觸發。
17397
	else if (document.readyState == "complete"){
17398
		initApplication();
17399
		}
17400
	}
17401
 
17402
//所有內容跑完之後再執行的事件
17403
window.addEventListener('load',function(){
17404
	...
17405
	});
17406
 
17407
//取消事件的預設效果
17408
document.getElementById("myCheckbox").addEventListener("click", function(event){
17409
 
17410
	event.preventDefault()
17411
 
17412
	});
17413
 
17414
//將下拉式選單綁定'mousedown'事件,並取消預設的效果
17415
document.getElementById("myInputSelect").addEventListener("mousedown",function(event){
17416
 
17417
	//取消預設按下滑鼠的效果
17418
	event.preventDefault();
17419
 
17420
	});
17421
 
17422
//取消事件的預設效果與傳播
17423
document.getElementById("myCheckbox").addEventListener("click", function(event){
17424
 
17425
	//取消事件的預設效果
17426
	event.preventDefault();
17427
 
17428
	//取消事件的傳播
17429
	event.stopPropagation();
17430
 
17431
	});
17432
 
17433
//參考資料
17434
//https://developer.mozilla.org/zh-TW/docs/Web/API/Event/stopPropagation
17435
 
17436
//將事件解除綁定
17437
var x = document.getElementById("myDIV");
17438
if (x.removeEventListener) {                   // For all major browsers, except IE 8 and earlier
17439
    x.removeEventListener("mousemove", myFunction);
17440
} else if (x.detachEvent) {                    // For IE 8 and earlier versions
17441
    x.detachEvent("onmousemove", myFunction);
17442
}
17443
 
17444
#使用Date物件
17445
var myDate = new Date();
17446
#取得unixtime
17447
myDate.getTime();
17448
#不宣告Dare物件也可取得unixtime
17449
Date.parse(Date());
17450
#參考資料:
17451
#https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/parse
17452
 
17453
#取得網頁body原始碼
17454
document.body.innerHTML;
17455
 
17456
#取得網頁head原始碼
17457
document.head.innerHTML;
17458
 
17459
#取得id為'bottom'的元素css style
17460
var bottomDiv=document.getElementById('bottom')
17461
window.getComputedStyle(bottomDiv,null);
17462
 
17463
#取得id為'bottom'的元素css的height數值.
17464
var bottomDiv=document.getElementById('bottom');
17465
var bottomDivStyle=window.getComputedStyle(bottomDiv,null);
17466
var bottomDivH=bottomDivStyle['height'];
17467
 
17468
#設置id為'bottom'的元素css的height數值為100px
17469
var bottomDiv=document.getElementById('bottom');
17470
bottomDiv.style.height='100px';
17471
 
17472
#取得iframe內id為"run"的元素.
17473
var if1= document.getElementById('run');
17474
if1.contentDocument.getElementById('run');
17475
 
17476
#設置過了3秒中後要做的事情.
17477
setTimeout(function()
17478
{
174 liveuser 17479
	do something
3 liveuser 17480
},3000);
17481
 
17482
#新增網頁元素
17483
var node = document.createElement('li');                // Create a <li> node
17484
var textnode = document.createTextNode('Water');        // Create a text node
17485
node.appendChild(textnode);                             // Append the text to <li>
17486
document.getElementById("myList").appendChild(node);    // Append <li> to <ul> with id="myList"
17487
 
17488
#取得第一個子元素
17489
element=document.getElementById('target');
17490
element.firstChild;
17491
 
17492
#取得下拉式選單的內容
17493
var inputSelect=下拉式選單元素;
17494
inputSelect.options.length; //取得選項數目
17495
inputSelect.options[0].value; //第1個選項傳送的數值
17496
inputSelect.options[0].innerHTML; //第1個選項的顯示內容
17497
 
17498
#設置元素的類別
17499
var a=目標元素;
17500
a.className='className1 className2 ...'
17501
 
17502
#取得所有含有 'className' 類別的元素
17503
var allOptions=document.getElementsByClassName('className');
17504
 
17505
#取得id為targetDiv的div標籤的data-val屬性數值
17506
document.getElementById("targetDiv").attributes['data-val'].value;
17507
 
17508
#移除id為targetDiv的div元素
17509
document.getElementById("targetDiv").remove();
17510
 
17511
#移除id為targetDiv的div標籤的data-val屬性
17512
document.getElementById("targetDiv").removeAttribute('data-val');
17513
 
17514
#若存在 scrollingListMiddleEvent 物件,則呼叫之.
17515
if(window.scrollingListMiddleEvent!==undefined){
17516
 
17517
	//debug
17518
	//console.log('scrollingListMiddleEvent()');
17519
 
17520
	//方法1
17521
	window.scrollingListMiddleEvent();
17522
 
17523
	//方法2,call()裡面可以覆寫物件.
17524
	//參考資料:https://www.w3schools.com/js/js_function_call.asp
17525
	window.scrollingListMiddleEvent.call();
17526
 
17527
	}
17528
 
17529
#下拉式選單於Browser上選擇新的數值之後,所要取得新的數值與所選擇的選項應以<select></select>的value來判斷,而非透過<option></option>是否有selected屬性來判斷。
17530
var select=document.getElementById('selectID');
17531
var selectVal=document.getElementById('selectID').value;
17532
for(var i=0;i<select.options.length;i++){
17533
	var opval=select.options[i].attributes['value'].value;
17534
	if(opval===selectVal){
17535
		var opName=select.options[i].innerHTML;
17536
		}
17537
	}
226 liveuser 17538
 
3 liveuser 17539
#下拉式選單選擇了哪個options;
17540
var select=document.getElementById('selectID');
17541
var optionIndex=select.options.selectedIndex; //選擇的選項是第幾個
17542
var selectedOptions=select.options[select.options..selectedIndex]; 選擇的選項元素.
17543
 
17544
#若用jquery取得元素,但想要透過原生js去存取,則其第一個元素就是接口.
17545
var nativeEleObject=$('#eleId')[0];
17546
 
17547
#元素用"onClick"會停止event bubbling,點擊內部元素不會傳導到外部元素.
17548
<tag onClick="do something">
17549
 
17550
#對元素進行變更,然後強迫瀏覽器刷新
17551
#change something
17552
var btn=document.getElementById('top_up_submit');
17553
btn.setAttribute('data-lock',0);
17554
btn.removeAttribute('disabled');
17555
btn.innerHTML='Applying';
17556
 
17557
#強迫刷新(不見得有效)
17558
var temp=document.createTextNode('');
17559
btn.appendChild(temp);
17560
var os=btn.style.display;
17561
btn.style.display='none';
17562
btn.style.display=os;
17563
btn.removeChild(temp);
17564
 
17565
#如果要讓使用者輸入的數值或選擇的選項能夠反應到dom上則必須透過屬性設置的方式才能取得.
17566
#亦即透過 setAttribute 方法來設置這些內容
17567
element.setAttribute('attr','value');
17568
 
17569
#取得所使用的html header
17570
document.head.innerHTML;
17571
 
17572
#取得所使用的hmtl body
17573
document.body.innerHTML;
17574
 
17575
#取得html所有dom物件
17576
document.all
17577
 
17578
#this的應用
17579
window.qbpwcf.lib.init=function(){
226 liveuser 17580
 
3 liveuser 17581
	//等同印出 window,以及this指的是等號左邊的最上層變數.
17582
	console.log(this);
226 liveuser 17583
 
3 liveuser 17584
	}
17585
 
17586
#判斷不是數字
17587
var oriVal=parseInt($(this).val());
17588
//如果不是數字
17589
if(oriVal.toString()==='NaN'){
17590
	//do something
17591
	}
17592
 
17593
//複製元素
17594
var copiedEle=element.cloneNode(true);
17595
//參考資料
17596
//https://developer.mozilla.org/zh-TW/docs/Web/API/Node/cloneNode
17597
 
17598
//複製物件
17599
var obj = { a: 1 };
17600
var copy = Object.assign({}, obj);
17601
console.log(copy); // { a: 1 }
17602
//參考資料
17603
//https://developer.mozilla.org/zh-TW/docs/Web/JavaScript/Reference/Global_Objects/Object/assign
17604
 
17605
//深層複製物件
17606
var a = { b: {c:4} , d: { e: {f:1}} }
17607
var g = Object.assign({},a) // 淺層
17608
var h = JSON.parse(JSON.stringify(a)); // 深層
17609
//參考資料
17610
https://developer.mozilla.org/zh-TW/docs/Web/JavaScript/Reference/Global_Objects/Object/assign
17611
 
17612
//json to string
17613
//參考資料:
17614
//https://developer.mozilla.org/zh-TW/docs/Web/JavaScript/Reference/Global_Objects/JSON/stringify
17615
JSON.stringify(json);
17616
 
17617
//jons string to json
17618
JSON.parse(jsonString);
17619
 
17620
#設置周期執行的涵式
17621
var myVar = setInterval(function()
17622
{
17623
	do something...
17624
}, 3000);
17625
#停止周期執行的程式
17626
clearInterval(myVar);
17627
 
17628
#加解密中文
17629
var str='中文';
17630
var encodeStr=btoa(encodeURIComponent(str));
17631
var decodeStr=decodeURIComponent(atob(encodeStr));
17632
console.log(encodeStr);
17633
console.log(decodeStr);
17634
 
17635
#呼叫由儲存在變數裡面的函數,可以藉此產生callback func
17636
var getPart=function(){
17637
	console.log('test');
17638
	}
17639
getPart.call(this);
17640
 
17641
#設置 XMLHttpRequest 的回應為何種類型
17642
xmlhttp=new XMLHttpRequest();
17643
XMLHttpRequest.responseType='blob'; //設置為2元碼
17644
XMLHttpRequest.responseType='arraybuffer'; //針對2元碼內容,存成陣列,適合各別byte處理的需要.
17645
XMLHttpRequest.responseType='json'; //設置為json
17646
XMLHttpRequest.responseType='text'; //設為文字,此為default
17647
XMLHttpRequest.responseType='document'; //html, do not set to document when send a not async request
17648
https://developer.mozilla.org/zh-TW/docs/Web/API/XMLHttpRequest/responseType
17649
https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/Sending_and_Receiving_Binary_Data
17650
 
17651
#取得 XMLHttpRequest  回應的內容(可以非dom)
17652
xmlhttp=new XMLHttpRequest();
17653
xmlhttp.responseType='blob';
17654
//false 代表要同步,亦即會等待ajax完成後再執行.
17655
xmlhttp.open('GET','fileAccessT.php',false);
17656
xmlhttp.response;
17657
 
17658
//如果服務端有回傳完成的狀態
17659
xmlhttp=new XMLHttpRequest();
17660
xmlhttp.temp={}; //要依照ajax的回應來編輯的內容請設置在此,透過window變數來修改是無效的.
17661
xmlhttp.responseType='json';
17662
xmlhttp.timeout=60000;
17663
xmlhttp.open('GET','fileAccessT.php',true);
17664
xmlhttp.setRequestHeader('Content-type','application/x-www-form-urlencoded');
17665
xmlhttp.setRequestHeader('X-Requested-With','XMLHttpRequest');
17666
xmlhttp.onreadystatechange=function(){
17667
 
17668
	//如果狀態為4且response code為200
17669
	if(xmlhttp.readyState==4 && xmlhttp.status==200){
17670
 
17671
		//將回應進行處理
17672
		xmlhttp.response;
226 liveuser 17673
 
3 liveuser 17674
		//取得回應的內容
17675
		res=xmlhttp.response;
17676
 
17677
		//取得回應的html並取代當前的內容,當xmlhttp.responseType='document'時 - start;
17678
 
17679
		//開新文件,要寫的內容類型為 'text/html' 繼承前頁面的資訊
17680
		document.open('text/html',true);
17681
 
17682
		//清空文件,寫入取得的完整回應
17683
		document.write(res.all[0].outerHTML);
17684
 
17685
		//結束輸出
17686
		document.close();
226 liveuser 17687
 
3 liveuser 17688
		//取得回應的html並取代當前的內容,當xmlhttp.responseType='document'時 - end;
17689
 
17690
		}//if end
17691
 
17692
	}//function end
17693
 
17694
//參數跟數值內容要用encodeURIComponent才不會有編碼的錯誤產生
17695
xmlhttp.send(); //如果是post則要將參數加在這邊 'encodeURIComponent(key1)=encodeURIComponent(val1)&encodeURIComponent(key2)=encodeURIComponent(val2)';
17696
 
226 liveuser 17697
//如果要在迴圈裏面執行異步的ajax,由於js是傳參考的語言,因此建議將每個ajax個別儲存在陣列裏面。 - start
3 liveuser 17698
 
207 liveuser 17699
//初始化儲存xmlhttp的陣列
3 liveuser 17700
xmlhttp=[];
17701
 
17702
//針對每列
17703
for(i=0;i<rowCount;i++)
17704
{
17705
	//取得列
17706
	tr=tbody.children[i];
17707
 
207 liveuser 17708
	//取得燈狀態
17709
	lightSta=tr.children[1].children[0];
226 liveuser 17710
 
3 liveuser 17711
	//取得gw id
17712
	gwId=tr.children[0].innerText;
17713
 
17714
	url='area/device/getDeviceInfoInJSON/'+gwId;
17715
	xmlhttp[i]=new XMLHttpRequest();
17716
	xmlhttp[i].temp={}; //用於儲存額外的資訊給ajax function - start
17717
	xmlhttp[i].temp.gwId=gwId;
17718
	xmlhttp[i].temp.lightSta=lightSta; //用於儲存額外的資訊給ajax function - end
17719
	xmlhttp[i].open('POST',url,true);
17720
	xmlhttp[i].setRequestHeader('Content-type','application/x-www-form-urlencoded; charset=UTF-8');
17721
	xmlhttp[i].setRequestHeader('X-Requested-With','XMLHttpRequest');
17722
	xmlhttp[i].onreadystatechange=function(e)
226 liveuser 17723
	{
17724
		//debug
3 liveuser 17725
		if(window.debug)
17726
		{
17727
			console.log('e - start');
17728
			console.log(e);
17729
			console.log(e.target); //xmlhttp[i] 自己
17730
			console.log(e.target.response); //xmlhttp[i] 的回應
17731
			console.log('e - end');
207 liveuser 17732
		}
226 liveuser 17733
 
3 liveuser 17734
		//get gw id
207 liveuser 17735
		gwId=e.target.temp.gwId;
3 liveuser 17736
 
17737
		//response ok
17738
		if(e.target.readyState===4 && e.target.status===200)
17739
		{
17740
			//do something,,,
17741
		}
17742
	}
17743
	xmlhttp[i].send(null);
17744
 
17745
}//for end
17746
 
17747
//如果要在迴圈裏面執行異步的ajax,由於js是傳參考的語言,因此建議將每個ajax個別儲存在陣列裏面。 - end
17748
 
17749
//所有內容跑完之後再執行的事件
17750
window.addEventListener('load',function(){
17751
 
17752
	//一段時間後再執行
17753
	setTimeout(function(){
226 liveuser 17754
 
3 liveuser 17755
		//get div
17756
		var div=document.getElementById('test');
226 liveuser 17757
 
3 liveuser 17758
		//set div content
17759
		div.innerText='Loading...';
226 liveuser 17760
 
3 liveuser 17761
		xmlhttp=new XMLHttpRequest();
17762
		xmlhttp.responseType='document';// do not set to document when send a not async request
17763
		xmlhttp.open('GET','javaScriptT/hang.php',true);
17764
		xmlhttp.response;
17765
		xmlhttp.onreadystatechange=function(){
17766
 
17767
			//如果狀態為4且response code為200
17768
			if(xmlhttp.readyState==4 && xmlhttp.status==200){
17769
 
17770
				div.innerText='finish!';
17771
 
17772
				}//if end
17773
 
17774
			}//function end
226 liveuser 17775
 
3 liveuser 17776
		xmlhttp.send();
226 liveuser 17777
 
3 liveuser 17778
		//debug
17779
		console.log(xmlhttp.response);
226 liveuser 17780
 
3 liveuser 17781
		//3 秒後再執行
17782
		},3000)
17783
	});
17784
 
17785
//設定要求的屬性、目的、是否要異步
17786
//建議要異步,火狐以外的瀏覽器才會正常呈現 loading 效果
17787
xmlhttp.open('POST','".$conf["receivePage"]."',true);
17788
 
17789
//設定 header
17790
xmlhttp.setRequestHeader('Content-type','application/x-www-form-urlencoded');
17791
 
17792
//設定 要求為ajax 的 header
17793
xmlhttp.setRequestHeader('X-Requested-With','XMLHttpRequest');
17794
 
17795
#設置XMLHttpRequest等待回應的時間上限(毫秒)
17796
XMLHttpRequest.timeout=60000;
17797
 
17798
//如果XMLHttpRequest等待回應逾時
17799
xmlhttp=new XMLHttpRequest();
17800
xmlhttp.addEventListener('timeout',function(){
17801
	do something...
17802
	}):
17803
 
17804
//如果XMLHttpRequest等待回應逾時
17805
xmlhttp=new XMLHttpRequest();
17806
xmlhttp.ontimeout=function(){
17807
	do something...
17808
	};
17809
 
17810
#建立與傳送表單物件 - start
17811
 
17812
//建立表單物件
17813
var formData = new FormData();
17814
 
17815
//新增表單的名稱與對應的數值
17816
formData.append('username', 'Chris');
17817
 
17818
//建立 XMLHttpRequest 物件
17819
xmlhttp=new XMLHttpRequest();
17820
 
17821
//設置回傳的形態為 html
17822
xmlhttp.responseType='document';
17823
 
17824
//設置 timeout 為 60 秒
17825
xmlhttp.timeout=60000;
17826
 
17827
//設定 header
17828
xmlhttp.setRequestHeader('Content-type','application/x-www-form-urlencoded');
17829
 
17830
//設定 要求為ajax 的 header
17831
xmlhttp.setRequestHeader('X-Requested-With','XMLHttpRequest');
17832
 
17833
//設置使用POST傳送到reveived page
17834
request.open("POST", "received page");
17835
 
17836
//傳送表單
17837
request.send(formData);
17838
 
17839
參考資料
17840
https://developer.mozilla.org/en-US/docs/Web/API/FormData
17841
https://developer.mozilla.org/en-US/docs/Web/API/FormData/FormData
17842
https://developer.mozilla.org/en-US/docs/Web/API/FormData/Using_FormData_Objects
17843
 
17844
#建立與傳送表單物件 - end
17845
 
17846
#用\r\n'分割字串'abc\r\nABC'為陣列
17847
var testStr='abc\r\nABC';
17848
var splitedStr=testStr.split('\r\n');
17849
https://developer.mozilla.org/zh-TW/docs/Web/JavaScript/Reference/Global_Objects/String/split
17850
 
17851
#字串轉成數字
17852
var stringInt='111';
17853
parseInt(stringInt);
17854
 
17855
#透過 prototype 實做 append blob data 的 function
17856
#https://stackoverflow.com/questions/15970729/appending-blob-data
17857
 
17858
//宣告 MyBlobBuilder 建構子
17859
var MyBlobBuilder = function() {
17860
	this.parts = []; //建立屬性
17861
	}
17862
 
17863
//新增 MyBlobBuilder 的 append 方法
17864
MyBlobBuilder.prototype.append = function(part) {
17865
	this.parts.push(part);
17866
	this.blob = undefined; // Invalidate the blob
17867
	};
17868
 
17869
//新增 MyBlobBuilder 的 getBlob 方法
17870
MyBlobBuilder.prototype.getBlob = function(mimeType) {
17871
	if(mimeType===''){
17872
		mimeType="text/plain";
17873
		}
17874
	if (!this.blob) {
17875
		this.blob = new Blob(this.parts, { type: mimeType });
17876
		}
17877
	return this.blob;
17878
	};
17879
var myBlobBuilder = new MyBlobBuilder(); //實做物件 MyBlobBuilder
17880
myBlobBuilder.append("Hello world, 2"); //append 內容
17881
myBlobBuilder.append(",another data"); //append 內容
17882
var bb = myBlobBuilder.getBlob('application/zip'); //取得 append 完的內容,並設置 mimeType
17883
 
17884
用FileReader讀取blob內容
17885
https://developer.mozilla.org/zh-TW/docs/Web/API/Blob
17886
https://developer.mozilla.org/zh-TW/docs/Web/API/FileReader
17887
var reader = new FileReader(); //實做FileReader
17888
reader.addEventListener("loadend", function() { //當讀取檔案結束後
17889
	reader.result; //base64字串
17890
	}
17891
reader.readAsDataURL(blob); //讀取blob物件
17892
 
17893
要設定元素的class請用classList
17894
element.classList=["classA classB ..."];
17895
 
17896
新增元素的class,例如增加hide類別.
17897
element.classList.value=element.classList.value+' hide';
17898
 
17899
新增元素的class,例如增加strong類別
17900
element.classList.add('strong');
17901
 
17902
移除元素的class,例如移除strong類別
17903
element.classList.remove('strong');
17904
 
17905
針對每個陣列元素做事情,不需要中斷.
17906
var testArray=[a,b,c,d,e];
17907
testArrayforEach.forEach(function(value,key)
17908
{
17909
	console.log('key:'+key+' val:'+value);
17910
});
17911
 
17912
//參考資料:
17913
//https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/forEach
17914
 
17915
針對每個陣列元素做事情,需要中斷.
17916
var testArray=['a','b','c','d','e'];
17917
testArray.find(function(key,value) // 回傳符合條件的數值內容
17918
{
17919
	console.log('key:'+key+' val:'+value);
17920
	if(key==='c')
17921
	{
17922
		return true;
17923
	}
17924
});
17925
 
17926
//參考資料:
17927
//https://developer.mozilla.org/zh-TW/docs/Web/JavaScript/Reference/Global_Objects/Array/find
17928
 
17929
對於物件也適用,需要中斷.
17930
const obj = { a: 1, b: 2, c: 3 };
17931
 
17932
for (const prop in obj) {
17933
	console.log(`obj.${prop} = ${obj[prop]}`);
17934
	}
17935
 
17936
// Logs:
17937
// "obj.a = 1"
17938
// "obj.b = 2"
17939
// "obj.c = 3"
17940
 
17941
//參考資料:
17942
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/for...in
17943
 
17944
#陣列操作,於尾端添加元素
17945
queue=[];
17946
queue.push('ele2add2tail');
17947
#陣列操作,於首端添加元素
17948
queue.unshift('ele2add2head');
17949
#陣列操作,移除尾端元素
17950
queue.pop('ele2delFromTail');
17951
 
17952
//參考資料:
17953
//https://developer.mozilla.org/zh-TW/docs/Web/JavaScript/Reference/Global_Objects/Array/pop
17954
 
17955
/*
17956
 
17957
//針對特定元素做操作
17958
 
17959
var myFish = ['angel', 'clown', 'mandarin', 'sturgeon'];
17960
var removed = myFish.splice(2, 0, 'drum');
17961
// myFish 為 ["angel", "clown", "drum", "mandarin", "sturgeon"]
17962
// removed 為 [], 沒有元素被刪除
17963
 
17964
var myFish = ['angel', 'clown', 'drum', 'mandarin', 'sturgeon'];
17965
var removed = myFish.splice(3, 1);
17966
// removed 為 ["mandarin"]
17967
// myFish 為 ["angel", "clown", "drum", "sturgeon"]
17968
 
17969
var myFish = ['angel', 'clown', 'drum', 'sturgeon'];
17970
var removed = myFish.splice(2, 1, 'trumpet');
17971
// myFish 為 ["angel", "clown", "trumpet", "sturgeon"]
17972
// removed 為 ["drum"]
17973
 
17974
*/
17975
 
17976
/*
17977
 
17978
針對物件中的每個key
17979
Object.keys(data.content).forEach(function(key)
17980
{
17981
	console.log('key');
17982
});
17983
//參考資料:
17984
https://stackoverflow.com/questions/921789/how-to-loop-through-a-plain-javascript-object-with-the-objects-as-members
17985
 
17986
//參考資料:
17987
//https://developer.mozilla.org/zh-TW/docs/Web/JavaScript/Reference/Global_Objects/Array/splice
17988
 
17989
*/
17990
 
17991
/*
17992
 
17993
物件長度
17994
temp0=
17995
{
17996
	0:'a',
17997
	1:'b',
17998
	2:'c',
17999
};
18000
Object.keys(temp0).length
18001
 
18002
*/
18003
 
18004
/*
18005
 
18006
存取複雜的物件屬性
18007
var object={
18008
	"@attribute":"complex",
18009
	};
18010
object["@attribute"];
18011
 
18012
*/
18013
 
18014
/*
18015
萬用的取得物件屬性方法
18016
bit16toNoZeroHead=function(p)
18017
{
18018
	//範例物件
18019
	table={a:A,b:B,c:C};
226 liveuser 18020
 
3 liveuser 18021
	//取得物件有多少key
18022
	keyCount=Object.keys(table).length;
226 liveuser 18023
 
3 liveuser 18024
	//針對物件每個key
18025
	for(i=0;i<keyCount;i++)
18026
	{
18027
		//如果物件的key等於參數p
18028
		if(p===Object.keys(table)[i])
18029
		{
18030
			//取得該key指到的value
18031
			return Object.values(table)[i];
18032
		}
18033
	}
18034
}
18035
*/
18036
 
18037
/*
18038
 
18039
desc:
18040
取得元素屬性的數值內容
18041
 
18042
param:
18043
element,元素
18044
name,屬性名稱
18045
 
18046
return:
18047
回傳屬性的數值
18048
function getAttrData(element,name)
18049
{
18050
	var attrs=element.attributes.length;
18051
	for(i=0;i<attrs;i++)
18052
	{
18053
		var attrName=element.attributes[i].name;
18054
		var attrValue=element.attributes[i].value;
18055
		if(attrName===name)
18056
		{
18057
			return attrValue;
18058
		}
18059
	}
18060
}
18061
 
18062
*/
18063
 
18064
/*
18065
 
18066
desc:
18067
設置屬性的數值內容
18068
 
18069
param:
18070
element,元素
18071
name,屬性名稱
18072
value,屬性的數值
18073
 
18074
return:
18075
回傳屬性的名稱與數值
18076
function setAttrData(element,name,value)
18077
{
18078
	var attrs=element.attributes.length;
18079
	for(i=0;i<attrs;i++)
18080
	{
18081
		var attrName=element.attributes[i].name;
18082
		var attrValue=element.attributes[i].value;
18083
		if(attrName===name)
18084
		{
18085
			element.attributes[i].value=value;
18086
			return element.attributes[i];
18087
		}
18088
	}
18089
}
18090
 
18091
*/
18092
 
18093
/*
18094
#取得屬性的列表與資訊
18095
#html:
18096
<span title="code" data-a="A" data-b="B">Fusion</span>
18097
#js console:
18098
spanStr=document.querySelector('span[title]');
18099
spanStr.dataset => DOMStringMap { a → "A", b → "B" }
18100
spanStr.dataset.a => "A"
18101
spanStr.dataset.b => "B"
18102
*/
18103
 
18104
/*
18105
#取得符合條件的第一個項目,選項的採用css的格式
18106
document.querySelector('span[title="code"]');
18107
*/
18108
 
18109
/*
18110
#取得每個符合的項目,選擇的方式採用css的格式
18111
#document.querySelectorAll('div > div._drags > span.img');
18112
*/
18113
 
18114
/*
18115
#用 inclues 來搜尋字串裡面有無對應的關鍵字.
18116
a="abc";
18117
a.includes('d'); //will be false
18118
a.includes('a'); //will be true
18119
*/
18120
 
18121
/*
18122
解析string為dom字串
18123
parser = new DOMParser();
18124
doc = parser.parseFromString(stringContainingHTMLSource, "text/html");
18125
// returns a HTMLDocument, which also is a Document.
18126
https://developer.mozilla.org/en-US/docs/Web/API/DOMParser
18127
*/
18128
 
18129
/*
18130
 
18131
#取得元素ID為eleID的下一個元素
18132
#document.getElementById('eleID').nextElementSibling;
18133
 
18134
#取得元素ID為eleID的上一個元素
18135
#document.getElementById('eleID').preElementSibling;
18136
 
18137
*/
18138
 
18139
/*
18140
 
18141
//no use?
18142
stateObj={};
18143
 
18144
//取得新 title
18145
title=res.title;
18146
 
18147
//取得新 url
18148
newUrl=res.URL;
18149
 
18150
//更新網頁標題與網址
18151
//參考資料:https://developer.mozilla.org/en-US/docs/Web/API/History_API
18152
history.pushState(stateObj, title, newUrl);
18153
 
18154
*/
18155
 
18156
/*
18157
#webSocket:
18158
 
18159
//設定webSocket的連線目標
18160
var conn = new WebSocket('wss://dns/wss/chatDemo');
18161
 
18162
//狀態1代表正常可通訊
18163
conn.readyState=1;
18164
 
18165
//建立與當連線成功後
18166
conn.onopen = function(e)
174 liveuser 18167
{
18168
 
3 liveuser 18169
}
18170
 
18171
//當有收到訊息時
18172
conn.onmessage = function(e)
174 liveuser 18173
{
3 liveuser 18174
	//將訊息顯現在console
18175
	console.log(e.data);
226 liveuser 18176
 
3 liveuser 18177
	//傳送訊息
18178
	conn.send('mag');
18179
}
18180
 
18181
//當連線斷開後, 每秒重新嘗試一次.
18182
conn.onclose = function(e)
174 liveuser 18183
{
3 liveuser 18184
	//指定1秒刷新一次
18185
	setTimeout('window.webSock.connWebSock.call(this)',1000);
18186
}
226 liveuser 18187
 
3 liveuser 18188
//所有內容跑完之後再執行的事件
18189
window.addEventListener('load',function()
18190
{
18191
	//傳送訊息
18192
	conn.send('mag');
226 liveuser 18193
});
3 liveuser 18194
 
18195
eval(),將變數的數值印出.
18196
i=0;
18197
window.eval(i)='aa';
18198
window.0 //會印出 aa
18199
 
18200
//定義物件的屬性 - start
18201
 
18202
//初始化物件
18203
var object1 = {};
18204
 
18205
Object.defineProperty(object1, 'property1', {
18206
  value: 42,
18207
  writable: false
18208
});
18209
 
18210
object1.property1 = 77;
18211
// throws an error in strict mode
18212
 
18213
console.log(object1.property1);
18214
// expected output: 42
18215
 
18216
//參考資料
18217
//https://developer.mozilla.org/zh-TW/docs/Web/JavaScript/Reference/Global_Objects/Object/defineProperty
18218
 
18219
//卸除 Object object1 的 property1 屬性
18220
delete object1.property1;
18221
 
18222
//參考資料
18223
//https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/seal
18224
 
18225
//定義物件的屬性 - end
18226
 
18227
//將圖片上下左右置中
226 liveuser 18228
#over {position:relative; text-align:center;
3 liveuser 18229
       width:100%; height:100%; background:#CCC;}
18230
 
18231
#over img{
18232
    position: absolute;
18233
    margin: auto;
18234
    top: 0;
18235
    left: 0;
18236
    right: 0;
18237
    bottom: 0;
18238
}
18239
 
18240
//參考資料
18241
https://stackoverflow.com/questions/4888223/align-image-in-center-and-middle-within-div
18242
 
18243
//override addEventListener
18244
(function(){
18245
	Element.prototype._addEventListener = Element.prototype.addEventListener;
18246
	Element.prototype.addEventListener = function(a,b,c){
18247
		this._addEventListener(a,b,c);
18248
		if(!this.eventListenerList) this.eventListenerList = {};
18249
		if(!this.eventListenerList[a]) this.eventListenerList[a] = [];
18250
		this.eventListenerList[a].push(b);
18251
		};
226 liveuser 18252
	})();
18253
 
3 liveuser 18254
//access binded events
18255
var clicks = someElement.eventListenerList.click;
18256
if(clicks) clicks.forEach(function(f) {
18257
  alert("I listen to this function: "+f.toString());
18258
});
226 liveuser 18259
 
3 liveuser 18260
//參考資料 https://stackoverflow.com/questions/446892/how-to-find-event-listeners-on-a-dom-node-when-debugging-or-from-the-javascript
18261
 
18262
//get user agent
18263
navigator.userAgent;
18264
 
18265
//參考資料 https://developer.mozilla.org/en-US/docs/Web/API/NavigatorID/userAgent
18266
 
18267
//判斷 user agent 是不是 windows
18268
navigator.userAgent.includes('Windows');
18269
 
401 liveuser 18270
//判斷 user agent 是不是 mobile
18271
navigator.userAgent.includes('Mobile');
18272
 
3 liveuser 18273
//參考資料 https://www.w3schools.com/jsref/jsref_includes.asp
18274
 
18275
//取得目前瀏覽的 hostname
18276
window.location.hostname
18277
 
18278
//參考資料 https://www.w3schools.com/jsref/prop_loc_hostname.asp
18279
 
18280
//DOMParser,解析html字串為dom
18281
parser = new DOMParser();
18282
doc = parser.parseFromString(stringContainingHTMLSource, "text/html");
18283
// returns a HTMLDocument, which also is a Document.
18284
//參考資料 https://developer.mozilla.org/zh-TW/docs/Web/API/DOMParser
18285
 
18286
//寫入減貼簿,需要時使用者的操作。
18287
ele.addEventListener('click',function(event)
18288
{
18289
	navigator.clipboard.writeText('text write to clipboard');
18290
});
18291
 
18292
//重複字串內容
18293
'a'.repeat(3)等於'aaa'
18294
 
18295
//類似php的substr
18296
//-1代表找不到關鍵字的位置
18297
str='123456';
18298
str.indexOf('abc'); // -1
18299
str.indexOf('123'); // 0
18300
//參考資料 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/indexOf
18301
 
18302
//reduce
18303
var tmpArray=[1,2,3,4,5,6,7,8,9];
18304
tmpArray.reduce(function(preValue,currentValue,currentIndex)
18305
{
18306
	return preValue+currentValue;
18307
});
18308
//參考資料 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/Reduce
18309
 
18310
//join
18311
var tmpArray=['Fire', 'Air', 'Water'];
18312
tmpArray.join(",");
18313
//參考資料 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/join
18314
 
18315
//產生uuid
18316
crypto.randomUUID();
18317
//參考資料 https://developer.mozilla.org/en-US/docs/Web/API/Crypto/randomUUID
18318
 
174 liveuser 18319
置換網頁整體內容 - start
18320
 
18321
//清空當前頁面的dom
18322
document.replaceChildren();
18323
 
18324
//建立html
18325
var html=document.createElement('html');
18326
 
18327
//建立head
18328
var head=document.createElement('head');
18329
 
18330
//建立body
18331
var body=document.createElement('body');
18332
 
18333
//將回應的dom放到body,res.dom為透過ajax取得的回應內容.
18334
body.append(res.dom);
18335
 
18336
//將head放到html裡面
18337
html.append(head);
18338
 
18339
//將body放到html裡面
18340
html.append(body);
18341
 
18342
//置換畫面為新的內榮
18343
document.replaceChildren(html);
18344
 
18345
置換網頁整體內容 - en
18346
 
18347
//參考資料
18348
//https://developer.mozilla.org/en-US/docs/Web/API/Document/replaceChildren
18349
 
399 liveuser 18350
//將元素dom的直向滾動到結尾
18351
dom.scrollIntoView({'behavior':'smooth','block':'end'});
18352
 
401 liveuser 18353
//將元素dom的橫向滾動到結尾,目前測試還是直向滾動.
399 liveuser 18354
dom.scrollIntoView({'behavior':'smooth','inline':'end'});
18355
 
3 liveuser 18356
*/
18357
 
18358
?>