Develop and Download Open Source Software

Browse Subversion Repository

Contents of /js/domain.js

Parent Directory Parent Directory | Revision Log Revision Log


Revision 41 - (show annotations) (download) (as text)
Fri Jan 22 14:20:16 2010 UTC (14 years, 4 months ago) by berupon
File MIME type: application/x-javascript
File size: 13563 byte(s)
ポップアップをプログラムで作成するのではなくCSS指定で最初から画面に隠して用意するように変更。
その方がプログラムが単純になる。

伝票編集画面から事務所やユーザーの一覧表示を開けるようにして、
そこで選択したら編集画面に選択したのが反映されるように機能追加。
併せて入力補助機能の修正。

HTMLのコードが横に長いと見難い場合があるのでインデント。
(縦に長くなってしまうけれど)
1
2 // Copyright (c) 2009 Katsuhisa Yuasa <berupon [at] gmail.com>
3 // License http://www.opensource.org/licenses/mit-license.html
4
5 // このファイルにはシステム固有の処理を配置する。
6
7 if (!behaviourAssignors) {
8 var behaviourAssignors = {};
9 }
10
11 behaviourAssignors['number'] = function (elem) {
12 Event.observe(
13 elem,
14 'keypress',
15 // nonnegative_integers
16 function (event) {
17 var char = pressedChar(event);
18 var unmatched = (char && !char.match(/\d/));
19 cancelEvent(event, unmatched);
20 }
21 );
22 }
23
24 behaviourAssignors['integer'] = function (elem) {
25 Event.observe(
26 elem,
27 'keypress',
28 function (event) {
29 var char = pressedChar(event);
30 var unmatched = (char && !char.match(/[\-0-9]/));
31 cancelEvent(event, unmatched);
32 }
33 );
34 }
35
36 behaviourAssignors['word'] = function (elem) {
37 Event.observe(
38 elem,
39 'keypress',
40 function (event) {
41 var char = pressedChar(event);
42 var unmatched = (char && !char.match(/\w/));
43 cancelEvent(event, unmatched);
44 }
45 );
46 }
47
48 behaviourAssignors['date'] = function (elem) {
49 Event.observe(
50 elem,
51 'keypress',
52 function (event) {
53 var char = pressedChar(event);
54 var unmatched = (char && !char.match(/\d/) && char != '/');
55 cancelEvent(event, unmatched);
56 }
57 );
58 elem.maxLength = 10;
59 }
60
61 behaviourAssignors['slip_code'] = function (elem) {
62 Event.observe(
63 elem,
64 'keypress',
65 function(event) {
66 var char = pressedChar(event);
67 var unmatched = (char && !char.match(/[a-zA-Z0-9\-]/));
68 cancelEvent(event, unmatched);
69 }
70 );
71 }
72
73 behaviourAssignors['sales_code'] = function (elem) {
74 Event.observe(
75 elem,
76 'keypress',
77 function(event) {
78 var char = pressedChar(event);
79 var unmatched = (char && !char.match(/[a-zA-Z0-9]/));
80 cancelEvent(event, unmatched);
81 }
82 );
83 }
84
85 // CheckBoxの親要素をクリックしたらCheckBoxのクリックと同様の効果にする処理。
86 // behaviourAssignor は Formの要素にしか働かないので関数で用意。
87 function selectInnerCheckBox(e) {
88 var check = $A(Event.element(e).childNodes).filter(function(elem) { return elem.tagName == "INPUT" && elem.getAttribute("type") == "checkbox"; });
89 if (check.length) {
90 check[0].checked = !check[0].checked;
91 }
92 }
93
94 function setAutoFocus() {
95 var cnt = document.forms.length;
96 for (var i=0; i<cnt; ++i) {
97 var form = document.forms[i];
98 var cnt2 = form.elements.length;
99 for (var j=0; j<cnt2; ++j) {
100 var elem = form.elements[j];
101 if (elem.attributes.getNamedItem("autofocus")) {
102 if (document.activeElement == elem) {
103 return;
104 }
105 var e = elem;
106 do {
107 if (e.style) {
108 if (0
109 || (e.style.display && e.style.display == 'none')
110 || (e.style.visibility && e.style.visibility == 'hidden')
111 ) {
112 return;
113 }
114 }
115 }while (e = e.parentNode);
116 elem.focus();
117 elem.select();
118 return;
119 }
120 }
121 }
122 }
123
124 Event.observe(window, "load", setAutoFocus);
125
126 function toDateFormat(num) {
127 if (num.match(/\d{8,8}/)) {
128 var year = "00" + Math.floor(num / 10000);
129 var remain = num % 10000;
130 var month = "00" + Math.floor(remain / 100);
131 var day = "00" + remain % 100;
132 var ret = "" // damn Automatic Semicolon Insertion ;;
133 + year.substr(year.length-4, 4)
134 + "/"
135 + month.substr(month.length-2, 2)
136 + "/"
137 + day.substr(day.length-2, 2)
138 ;
139 return ret;
140 }else {
141 return num;
142 }
143 }
144
145 function clearForm(id) {
146 var form = Event.findElement(windowEvent()).form;
147 clearFormElementsValues(form, id);
148 }
149
150 Ajax.Responders.register({
151 onCreate: function() {
152 $("loading").appear({ duration: 0.1 });
153 },
154 onComplete: function() {
155 $("loading").fade({ duration: 0.5 });
156 }
157 });
158
159 // cookie中の指定した名前の値をObjectとして取り出し。JSON形式で格納されている事前提。
160 function digestCookie(key) {
161 var pieces = document.cookie.split('; ');
162 for (var i=0; i<pieces.length; ++i) {
163 var piece = pieces[i];
164 var pair = piece.split('=');
165 if (pair[0] == key) {
166 return unescape(pair[1]).evalJSON();
167 }
168 }
169 return {};
170 }
171
172 // cookieに指定した名前で値を保存。JSON形式で格納。
173 function dumpCookie(key, value) {
174 if (!Object.isString(value)) {
175 value = Object.toJSON(value);
176 }
177 var str = key + '=' + escape(value) + ";";
178 var d = new Date();
179 // future yet unknown XD
180 d.setYear(2012);
181 d.setMonth(12);
182 d.setDate(21);
183 str += "expires=" + d.toGMTString() + ";";
184 document.cookie = str;
185 }
186
187 syncLoad = (function() {
188
189 var cache = {};
190
191 return function (url, useCache) {
192 if (useCache && url in cache) {
193 return cache[url];
194 }
195
196 var ret = false;
197 new Ajax.Request(
198 url,
199 {
200 "method" : "get",
201 "parameters" : {},
202 "onSuccess": function(transport) {
203 ret = transport.responseText;
204 cache[url] = ret;
205 },
206 "onFailure": function () {
207 ret = false;
208 },
209 "asynchronous" : false
210 }
211 );
212 return ret;
213 }
214 })();
215
216 var app = (function () {
217
218 /// private ///
219 Application = function () {
220
221 this.title = "SimpleLightWeb";
222 this.pageTitle = "";
223
224 // 擬似ページの読込時に呼び出すコールバック。
225 this.pageLoadHandler = null;
226
227 // 擬似ページの破棄時に呼び出すコールバック。戻り値が有る場合はcookieに保存
228 this.pageUnloadHandler = null;
229
230 // 入力補助等のevent handlers設定
231 this.setHelpers = function () {
232 setAutoFocus();
233 draggable.attach();
234 ResizableColumns();
235 assignBehaviours();
236 };
237
238 this.getPathFromLocationHash = function () {
239 var url = location.hash;
240 return url.substr(1, url.length);
241 };
242
243 // prototype.js の String.toQueryParams は = で右辺に値を設定していないとパラメータとして拾ってくれないので自作。
244 this.getHashParams = function () {
245 var hash = this.getPathFromLocationHash();
246 var paraPos = hash.indexOf('?');
247 if (paraPos < 1) {
248 return {};
249 }else {
250 var paraStr = hash.substr(paraPos+1, hash.length);
251 var params = paraStr.split('&');
252 var ret = {};
253 for (var i=0; i<params.length; ++i) {
254 var para = params[i];
255 var pair = para.split('=');
256 for (var j=0; j<pair.length; ++j) {
257 pair[j] = decodeURIComponent(pair[j]);
258 }
259 if (pair.length == 1) {
260 ret[pair[0]] = null;
261 }else if (pair.length == 2) {
262 ret[pair[0]] = pair[1];
263 }
264 }
265 return ret;
266 }
267 }
268
269 // hash指定によるページ切り替え処理
270 // this routine understands relative path
271 this.moveLocation = function (path) {
272 var curHash = location.hash;
273 if (path.substr(0,1) == '/') {
274 location.hash = path.substr(1,path.length);
275 }else {
276 var upLevel = 0;
277 while (1) {
278 if (path.substr(0, 3) == '../') {
279 ++upLevel;
280 path = path.substr(3, path.length);
281 }else {
282 break;
283 }
284 }
285 var curPath = location.hash;
286 curPath = curPath.substr(1, curPath.length);
287 var parts = curPath.split('/');
288 parts = parts.slice(0, parts.length - (upLevel+1));
289 var newPath = parts.join('/');
290 if (newPath) {
291 newPath += '/';
292 }
293 newPath += path;
294 location.hash = newPath;
295 }
296 };
297
298 this.ajaxRequest = function (url, method, parameters, onSuccess, onFailure) {
299 ajaxRequest(url, method, parameters, onSuccess, onFailure);
300 };
301
302 // postによるデータ登録処理。エラー時にメッセージ表示を行うElementを用意する事。
303 var okToPost = true;
304 this.postRequest = function (params, newLocation) {
305 if (!okToPost) {
306 alert("ただいま結果待ちな為送信出来ません。");
307 return;
308 }
309 if (params instanceof HTMLFormElement) {
310 params = Form.serialize(params, true);
311 }
312 // alert(Object.toJSON(params));
313 this.ajaxRequest(
314 null,
315 'post',
316 params,
317 function(transport) {
318 var ret = transport.responseJSON;
319 if (!ret)
320 {
321 alert(transport.responseText);
322 }
323 if (ret.errors.length) {
324 $("messages").innerHTML = ret.errors.join("<BR>");
325 $("error").appear({ duration: 0.6 });
326 }else {
327 if (Object.isFunction(newLocation)) {
328 newLocation(ret);
329 }else {
330 if (newLocation == undefined) {
331 newLocation = "list";
332 }
333 this.moveLocation(newLocation);
334 }
335 }
336 okToPost = true;
337 }.bind(this),
338 function () {
339 alert('Something went wrong...')
340 okToPost = true;
341 }
342 );
343 okToPost = false;
344 };
345
346 // template文字列は指定要素の最初の要素であるHTML comment中にあるという前提。
347 this.templateUpdate = function (templateEl, updateEl, data, setupFunc) {
348 if (!templateEl || !updateEl) {
349 return;
350 }
351 var st = new Date();
352 // to workaround IE and WebKit bug. do not directly set innerHTML.
353 while (updateEl.firstChild) {
354 updateEl.removeChild(updateEl.firstChild);
355 }
356 var comment = templateEl.firstChild;
357 var src = comment.data;
358 src = modifyTemplate(src, data);
359 var template = new EJS({text: src});
360 var newdiv = document.createElement("div");
361 newdiv.innerHTML = template.render(data);
362 // setupFunc can process newly created elements before rendering. (this speeds up page redndering)
363 if (setupFunc) {
364 setupFunc(newdiv);
365 }
366 updateEl.appendChild(newdiv);
367 // updateEl.appear({ duration: 0.1 });
368 var et = new Date();
369 //a(et-st);
370
371 };
372
373 };
374 var self = new Application();
375
376 var box = null;
377 var contents = null;
378 Event.observe(window, "load", function () {
379 contents = $('contents');
380 var timerID = setInterval(checkLocationHash, 10);
381 });
382 var draggable = new Draggable();
383
384 var pageUrl = null;
385 function ajaxRequest(url, method, parameters, onSuccess, onFailure) {
386 if (url == null) {
387 url = self.getPathFromLocationHash();
388 }
389 var launchURL = pageUrl;
390 new Ajax.Request(
391 url,
392 {
393 "method" : method,
394 "parameters" : parameters,
395 "onSuccess": function(transport) {
396 try {
397 if (pageUrl == launchURL) {
398 onSuccess(transport);
399 }
400 }catch (e) {
401 a(e);
402 }
403 },
404 "onFailure": function () {
405 if (onFailure) {
406 try {
407 onFailure();
408 }catch (e) {
409 alert(e);
410 }
411 }
412 }
413 }
414 );
415 }
416
417 // 画面設定処理
418 function setPage(html) {
419 self.pageLoadHandler = null;
420 box = createNodeWithScript(html);
421 contents.appendChild(box);
422 var loc = self.getPathFromLocationHash();
423 if (self.pageLoadHandler) {
424 self.pageLoadHandler(box);
425 }
426 document.title = self.title + ' ' + self.pageTitle;
427 $("title").innerHTML = self.pageTitle;
428 // $("breadcrumbs").innerHTML = loc.split('/').join(' / ');
429 var navisrc = $("navisrc");
430 $("navi").innerHTML = navisrc.innerHTML;
431 navisrc.innerHTML = '';
432 self.setHelpers();
433 }
434
435 // AJAXによる画面データ読込処理
436 var pageCache = {};
437 function loadPage(dest, params) {
438 if (dest in pageCache) {
439 var html = pageCache[dest];
440 pageUrl = dest;
441 setPage(html);
442 }else {
443 self.ajaxRequest(
444 dest,
445 'get',
446 params,
447 function(transport) {
448 var html = transport.responseText;
449 pageCache[dest] = html;
450 pageUrl = dest;
451 setPage(html);
452 },
453 function () {
454 alert("ページ読み込み失敗");
455 }
456 );
457 }
458 }
459
460 // location.hash を監視して変更されていたらpathに相当する画面のデータを設定する。
461 var prevHash = "nullpo";
462 function checkLocationHash() {
463 if (location.hash != prevHash) {
464 if (box) {
465 if (self.pageUnloadHandler) {
466 var ret = self.pageUnloadHandler();
467 if (ret) {
468 dumpCookie(prevHash, ret);
469 }
470 }
471 contents.removeChild(box);
472 self.pageUnloadHandler = null;
473 }
474 prevHash = location.hash;
475 if (location.hash == "" || location.hash == "#") {
476 loadPage("menu" + ".html", {});
477 }else {
478 var pagePath = location.hash.substr(1, location.hash.length);
479 var paraPos = pagePath.indexOf('?');
480 if (paraPos >= 1) {
481 pagePath = pagePath.substr(0, paraPos);
482 }
483 loadPage(pagePath + ".html", {});
484 }
485 }
486 }
487
488 return self;
489
490 })();
491
492 // debug用のalert関数
493 function a(p) {
494 if (typeof p == "object") {
495 alert(Object.toJSON(p));
496 }else {
497 alert(p);
498 }
499 }
500
501 // TODO: 起動時にAjaxでServerから読み取る。
502 var prefectures = {
503 1 : '北海道',
504 2 : '青森県',
505 3 : '岩手県',
506 4 : '宮城県',
507 5 : '秋田県',
508 6 : '山形県',
509 7 : '福島県',
510 8 : '茨城県',
511 9 : '栃木県',
512 10 : '群馬県',
513 11 : '埼玉県',
514 12 : '千葉県',
515 13 : '東京都',
516 14 : '神奈川県',
517 15 : '新潟県',
518 16 : '富山県',
519 17 : '石川県',
520 18 : '福井県',
521 19 : '山梨県',
522 20 : '長野県',
523 21 : '岐阜県',
524 22 : '静岡県',
525 23 : '愛知県',
526 24 : '三重県',
527 25 : '滋賀県',
528 26 : '京都府',
529 27 : '大阪府',
530 28 : '兵庫県',
531 29 : '奈良県',
532 30 : '和歌山県',
533 31 : '鳥取県',
534 32 : '島根県',
535 33 : '岡山県',
536 34 : '広島県',
537 35 : '山口県',
538 36 : '徳島県',
539 37 : '香川県',
540 38 : '愛媛県',
541 39 : '高知県',
542 40 : '福岡県',
543 41 : '佐賀県',
544 42 : '長崎県',
545 43 : '熊本県',
546 44 : '大分県',
547 45 : '宮崎県',
548 46 : '鹿児島県',
549 47 : '沖縄県'
550 };

Back to OSDN">Back to OSDN
ViewVC Help
Powered by ViewVC 1.1.26