6 * LICENSE: This source file is licensed under the terms of the GNU General Public License.
\r
8 * @package Magic3 Framework
\r
9 * @author 平田直毅(Naoki Hirata) <naoki@aplo.co.jp>
\r
10 * @copyright Copyright 2006-2017 Magic3 Project.
\r
11 * @license http://www.gnu.org/copyleft/gpl.html GPL License
\r
12 * @version SVN: $Id$
\r
13 * @link http://www.magic3.org
\r
17 * @param string request_widget 指定ウィジェット
\r
18 * @param string request_params リクエストパラメータ
\r
19 * @param function success_func(request, retcode, jsondata) 通信成功時の呼び出し関数
\r
20 * @param function failure_func(request) 通信失敗時の呼び出し関数
\r
21 * @param bool async 同期通信かどうか(true=非同期,false=同期)
\r
22 * @param string request_url リクエスト先URL
\r
24 function m3_ajax_request(request_widget, request_params, success_func, failure_func, request_url, async)
\r
26 if (request_url == null || request_url == "") request_url = document.location.pathname;
\r
27 if (async == null) async = true;
\r
30 if (request_widget != null && request_widget != "") params += "cmd=dowidget&widget=" + request_widget;
\r
31 if (request_params != null && request_params != "") params += "&" + request_params;
\r
33 $.ajax({ url: request_url,
\r
38 success: function(data, textStatus){
\r
39 if (data) alert("JSON data must be in header with 'X-JSON' type");
\r
41 error: function(request, textStatus, errorThrown){
\r
42 if (request.status == 200){
\r
43 var json = eval(request.getResponseHeader("X-JSON"));
\r
44 m3_ajax_success(request, json, success_func);
\r
46 m3_ajax_failure(request, json, failure_func);
\r
52 * Ajax非同期通信(レスポンスボディも使用してデータを受信)
\r
53 * @param string request_widget 指定ウィジェット
\r
54 * @param string request_params リクエストパラメータ
\r
55 * @param function success_func(request, retcode, jsondata) 通信成功時の呼び出し関数
\r
56 * @param function failure_func(request) 通信失敗時の呼び出し関数
\r
57 * @param string request_url リクエスト先URL
\r
59 function m3_ajax_request_ex(request_widget, request_params, success_func, failure_func, request_url)
\r
61 if (request_url == null || request_url == "") request_url = document.location.pathname;
\r
64 if (request_widget != null && request_widget != "") params += "cmd=dowidget&widget=" + request_widget;
\r
65 if (request_params != null && request_params != "") params += "&" + request_params;
\r
67 $.ajax({ url: request_url,
\r
71 success: function(data, textStatus){
\r
72 if (data) alert("JSON data must be in header with 'X-JSON' type");
\r
74 error: function(request, textStatus, errorThrown){
\r
75 if (request.status == 200){
\r
76 var json = eval(request.getResponseHeader("X-JSON"));
\r
77 m3_ajax_success_ex(request, json, success_func, request.responseText);
\r
79 m3_ajax_failure(request, json, failure_func);
\r
85 * Ajax非同期通信正常時に呼ばれるデフォルト関数
\r
86 * @param XMLHttpRequest request サーバからのレスポンス
\r
87 * @param Object json JSON型データ
\r
88 * @param function success_func 呼び出し関数
\r
90 function m3_ajax_success(request, json, success_func)
\r
92 if (success_func == ''){
\r
93 alert(request.statusText + "\nstatus code = " + request.status);
\r
94 } else if (success_func){
\r
95 if (typeof success_func == "function"){
\r
99 retcode = json.retcode;
\r
100 jsondata = json.data;
\r
102 success_func(request, retcode, jsondata);
\r
104 alert('cannot found success function');
\r
109 * Ajax非同期通信正常時に呼ばれるデフォルト関数
\r
110 * @param XMLHttpRequest request サーバからのレスポンス
\r
111 * @param Object json JSON型データ
\r
112 * @param function success_func 呼び出し関数
\r
114 function m3_ajax_success_ex(request, json, success_func, responseText)
\r
116 if (success_func == ''){
\r
117 alert(request.statusText + "\nstatus code = " + request.status);
\r
118 } else if (success_func){
\r
119 if (typeof success_func == "function"){
\r
123 retcode = json.retcode;
\r
124 if (json.data) jsondata = json.data;
\r
126 success_func(request, retcode, jsondata, responseText);
\r
128 alert('cannot found success function');
\r
133 * Ajax非同期通信の通信エラー時に呼ばれるデフォルト関数
\r
134 * @param XMLHttpRequest request サーバからのレスポンス
\r
136 function m3_ajax_failure(request, json, failure_func)
\r
138 if (failure_func == ''){
\r
139 alert(request.statusText + "\nstatus code = " + request.status);
\r
140 } else if (failure_func){
\r
141 if (typeof failure_func == "function"){
\r
142 failure_func(request);
\r
144 alert('cannot found failure function');
\r
151 * テーブルの表示領域を指定行数に制限し、テーブルに縦のスクロールバー付加する
\r
153 * @param object object テーブルオブジェクトまたはテーブルID文字列
\r
154 * @param int viewLineCount 表示行数(-1のときはスクロールバーなし)
\r
155 * @param int viewTopLineNo 先頭に表示する行番号(0~)
\r
158 function m3_tableWithScrollbar(object, viewLineCount, viewTopLineNo)
\r
160 var tHeight; // 表示高さ
\r
161 var srcTable; // テーブルオブジェクト
\r
163 if(!document.createElement) return;
\r
164 if(navigator.userAgent.match('Opera')) return;
\r
167 if (typeof object == "string"){
\r
168 srcTable = document.getElementById(object);
\r
172 if (!srcTable) return;
\r
173 var hasHead = (srcTable.tHead == null) ? false : true; // ヘッダがあるかどうか
\r
174 var hasFoot = (srcTable.tFoot == null) ? false : true; // フッタがあるかどうか
\r
176 // データ行数が表示行数よりも少ないときは終了
\r
177 var bodyRowCount = srcTable.tBodies[0].rows.length; // データ行数
\r
178 if (viewLineCount < 0 || bodyRowCount <= viewLineCount){
\r
180 m3_tableWithCololor(srcTable, true);
\r
185 if (srcTable.tHead.rows[0].cells.length != srcTable.tBodies[0].rows[0].cells.length){
\r
186 alert('カラム数にエラーがあります\nヘッダカラム数=' + srcTable.tHead.rows[0].cells.length +
\r
187 ',ボディカラム数=' + srcTable.tBodies[0].rows[0].cells.length);
\r
191 if (srcTable.tFoot.rows[0].cells.length != srcTable.tBodies[0].rows[0].cells.length){
\r
192 alert('カラム数にエラーがあります\nフッタカラム数=' + srcTable.tFoot.rows[0].cells.length +
\r
193 ',ボディカラム数=' + srcTable.tBodies[0].rows[0].cells.length);
\r
197 // カラムの幅をヘッダのカラム幅に合わせる
\r
198 for(var i = 0; i < srcTable.tHead.rows[0].cells.length; i++) {
\r
199 srcTable.tHead.rows[0].cells[i].style.width =
\r
200 srcTable.tBodies[0].rows[0].cells[i].style.width =
\r
201 (srcTable.tHead.rows[0].cells[i].clientWidth - srcTable.cellPadding * 2)+ 'px';
\r
202 if (hasFoot) srcTable.tFoot.rows[0].cells[i].style.width = srcTable.tHead.rows[0].cells[i].style.width;
\r
206 var thHeight = srcTable.tHead.offsetHeight;
\r
207 if (hasFoot) var tfHeight = srcTable.tFoot.offsetHeight;
\r
209 srcTable.style.width = srcTable.offsetWidth + 'px';
\r
210 var tWidth = srcTable.offsetWidth; // ヘッダ、フッタ、データ領域の幅
\r
212 // テーブルを複製、tbodyの中身を削除
\r
213 var destTableHead = srcTable.cloneNode(true);
\r
214 while (destTableHead.tBodies[0].rows.length) {
\r
215 destTableHead.tBodies[0].deleteRow(0);
\r
218 // 新規DIV - ヘッダ部用を作成
\r
219 var newDivHead = document.createElement('div');
\r
220 newDivHead.style.width = tWidth+'px';
\r
221 newDivHead.style.height = thHeight+'px';
\r
222 newDivHead.style.overflow = 'hidden';
\r
223 newDivHead.style.position = 'relative';
\r
224 destTableHead.style.position = 'absolute';
\r
225 destTableHead.style.left = '0';
\r
226 destTableHead.style.top = '0';
\r
227 newDivHead.appendChild(destTableHead);
\r
228 srcTable.parentNode.insertBefore(newDivHead, srcTable);
\r
230 // テーブルの複製を作成 ヘッダ部を削除
\r
231 var destTableBody = srcTable.cloneNode(true);
\r
232 destTableBody.deleteTHead();
\r
233 if (hasFoot) destTableBody.deleteTFoot(); // フッタ削除
\r
235 // 新規DIV - ボディ部用を作成
\r
236 var newDivBody = document.createElement('div');
\r
237 newDivBody.style.width = (tWidth+18)+'px';
\r
238 newDivBody.style.overflow = 'auto';
\r
239 newDivBody.appendChild(destTableBody);
\r
240 srcTable.parentNode.insertBefore(newDivBody, srcTable);
\r
243 var rowHeight = destTableBody.clientHeight / bodyRowCount; // データ行の高さ
\r
244 tHeight = rowHeight * viewLineCount;
\r
245 newDivBody.style.height = tHeight + 'px';
\r
246 newDivBody.scrollTop = rowHeight * viewTopLineNo; // 表示領域の先頭行を設定
\r
248 // 新規DIV - フッタ部用を作成
\r
251 var destTableFoot = srcTable.cloneNode(true);
\r
252 while (destTableFoot.tHead.rows.length) {
\r
253 destTableFoot.tHead.deleteRow(0);
\r
255 while (destTableFoot.tBodies[0].rows.length) {
\r
256 destTableFoot.tBodies[0].deleteRow(0);
\r
259 var newDivFoot = document.createElement('div');
\r
260 newDivFoot.style.width = tWidth+'px';
\r
261 newDivFoot.style.height = tfHeight+'px';
\r
262 newDivFoot.style.overflow = 'hidden';
\r
263 newDivFoot.style.position = 'relative';
\r
264 destTableFoot.style.position = 'absolute';
\r
265 destTableFoot.style.left = '0';
\r
266 destTableFoot.style.top = '0';
\r
267 newDivFoot.appendChild(destTableFoot);
\r
268 srcTable.parentNode.insertBefore(newDivFoot, srcTable);
\r
272 srcTable.parentNode.removeChild(srcTable);
\r
275 m3_tableWithCololor(destTableBody, true);
\r
280 * テーブル行の行ごとに色分け、カレント行の色分けのためのクラス設定を行う
\r
282 * @param object object テーブルオブジェクトまたはテーブルID文字列
\r
283 * @param bool withMouse マウスに合わせて色を変えるかどうか
\r
286 function m3_tableWithCololor(object, withMouse)
\r
288 var tableObj; // テーブルオブジェクト
\r
290 if (typeof object == "string"){
\r
291 tableObj = document.getElementById(object);
\r
296 $(tableObj).find('tbody tr:odd').addClass("even");
\r
299 if (!withMouse) return;
\r
300 $(tableObj).find('tbody tr').mouseover(function(){
\r
301 $(this).addClass("ruled");
\r
302 }).mouseout(function(){
\r
303 $(this).removeClass("ruled");
\r
304 }).click(function(){
\r
305 $(this).toggleClass("selected");
\r