Develop and Download Open Source Software

Browse Subversion Repository

Annotation of /js/domain.js

Parent Directory Parent Directory | Revision Log Revision Log


Revision 42 - (hide annotations) (download) (as text)
Mon Mar 22 01:45:43 2010 UTC (14 years, 2 months ago) by berupon
File MIME type: application/x-javascript
File size: 13700 byte(s)
onHashChangeイベントを使うように変更。
1 berupon 4
2 berupon 6 // Copyright (c) 2009 Katsuhisa Yuasa <berupon [at] gmail.com>
3     // License http://www.opensource.org/licenses/mit-license.html
4    
5 berupon 10 // このファイルにはシステム固有の処理を配置する。
6    
7 berupon 4 if (!behaviourAssignors) {
8     var behaviourAssignors = {};
9     }
10    
11     behaviourAssignors['number'] = function (elem) {
12 berupon 10 Event.observe(
13 berupon 4 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 berupon 10 Event.observe(
26 berupon 4 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 berupon 10 Event.observe(
38 berupon 4 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 berupon 10 Event.observe(
50 berupon 4 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 berupon 10 Event.observe(
63 berupon 4 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 berupon 10 Event.observe(
75 berupon 4 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 berupon 31 // 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 berupon 9 function setAutoFocus() {
95 berupon 4 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 berupon 9 function toDateFormat(num) {
127 berupon 4 if (num.match(/\d{8,8}/)) {
128 berupon 14 var year = "00" + Math.floor(num / 10000);
129 berupon 4 var remain = num % 10000;
130 berupon 14 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 berupon 4 + "/"
135 berupon 14 + month.substr(month.length-2, 2)
136 berupon 4 + "/"
137 berupon 14 + day.substr(day.length-2, 2)
138 berupon 4 ;
139 berupon 14 return ret;
140 berupon 4 }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 berupon 9 // cookie中の指定した名前の値をObjectとして取り出し。JSON形式で格納されている事前提。
160 berupon 4 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 berupon 9 // cookieに指定した名前で値を保存。JSON形式で格納。
173 berupon 4 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 berupon 34 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 berupon 10 var app = (function () {
217 berupon 9
218     /// private ///
219 berupon 10 Application = function () {
220    
221     this.title = "SimpleLightWeb";
222 berupon 14 this.pageTitle = "";
223 berupon 10
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 berupon 14 // prototype.js の String.toQueryParams は = で右辺に値を設定していないとパラメータとして拾ってくれないので自作。
244     this.getHashParams = function () {
245     var hash = this.getPathFromLocationHash();
246     var paraPos = hash.indexOf('?');
247     if (paraPos < 1) {
248 berupon 20 return {};
249 berupon 14 }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 berupon 10 // 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 berupon 14 this.ajaxRequest = function (url, method, parameters, onSuccess, onFailure) {
299     ajaxRequest(url, method, parameters, onSuccess, onFailure);
300     };
301    
302 berupon 10 // postによるデータ登録処理。エラー時にメッセージ表示を行うElementを用意する事。
303     var okToPost = true;
304 berupon 14 this.postRequest = function (params, newLocation) {
305 berupon 10 if (!okToPost) {
306     alert("ただいま結果待ちな為送信出来ません。");
307     return;
308     }
309     if (params instanceof HTMLFormElement) {
310     params = Form.serialize(params, true);
311     }
312 berupon 14 // alert(Object.toJSON(params));
313     this.ajaxRequest(
314     null,
315 berupon 10 'post',
316     params,
317     function(transport) {
318     var ret = transport.responseJSON;
319 berupon 14 if (!ret)
320     {
321 berupon 10 alert(transport.responseText);
322     }
323     if (ret.errors.length) {
324     $("messages").innerHTML = ret.errors.join("<BR>");
325 berupon 12 $("error").appear({ duration: 0.6 });
326 berupon 10 }else {
327 berupon 14 if (Object.isFunction(newLocation)) {
328     newLocation(ret);
329     }else {
330     if (newLocation == undefined) {
331     newLocation = "list";
332     }
333     this.moveLocation(newLocation);
334     }
335 berupon 10 }
336     okToPost = true;
337 berupon 12 }.bind(this),
338 berupon 10 function () {
339     alert('Something went wrong...')
340     okToPost = true;
341     }
342     );
343     okToPost = false;
344     };
345    
346     // template文字列は指定要素の最初の要素であるHTML comment中にあるという前提。
347 berupon 14 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 berupon 10 var comment = templateEl.firstChild;
357     var src = comment.data;
358     src = modifyTemplate(src, data);
359     var template = new EJS({text: src});
360 berupon 14 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 berupon 10 };
372 berupon 14
373 berupon 10 };
374     var self = new Application();
375 berupon 9
376     var box = null;
377     var contents = null;
378     Event.observe(window, "load", function () {
379     contents = $('contents');
380 berupon 42 if ("onhashchange" in window) {
381     Event.observe(window, "hashchange", checkLocationHash);
382     checkLocationHash();
383     }else {
384     var timerID = setInterval(checkLocationHash, 10);
385     }
386 berupon 9 });
387     var draggable = new Draggable();
388    
389 berupon 14 var pageUrl = null;
390     function ajaxRequest(url, method, parameters, onSuccess, onFailure) {
391     if (url == null) {
392     url = self.getPathFromLocationHash();
393     }
394     var launchURL = pageUrl;
395     new Ajax.Request(
396     url,
397     {
398     "method" : method,
399     "parameters" : parameters,
400     "onSuccess": function(transport) {
401     try {
402     if (pageUrl == launchURL) {
403     onSuccess(transport);
404     }
405     }catch (e) {
406     a(e);
407 berupon 9 }
408 berupon 14 },
409     "onFailure": function () {
410     if (onFailure) {
411     try {
412     onFailure();
413     }catch (e) {
414     alert(e);
415     }
416     }
417 berupon 9 }
418     }
419     );
420     }
421    
422 berupon 14 // 画面設定処理
423     function setPage(html) {
424     self.pageLoadHandler = null;
425 berupon 31 box = createNodeWithScript(html);
426 berupon 14 contents.appendChild(box);
427     var loc = self.getPathFromLocationHash();
428     if (self.pageLoadHandler) {
429 berupon 33 self.pageLoadHandler(box);
430 berupon 14 }
431     document.title = self.title + ' ' + self.pageTitle;
432     $("title").innerHTML = self.pageTitle;
433     // $("breadcrumbs").innerHTML = loc.split('/').join(' / ');
434     var navisrc = $("navisrc");
435     $("navi").innerHTML = navisrc.innerHTML;
436     navisrc.innerHTML = '';
437     self.setHelpers();
438     }
439    
440     // AJAXによる画面データ読込処理
441     var pageCache = {};
442     function loadPage(dest, params) {
443     if (dest in pageCache) {
444     var html = pageCache[dest];
445     pageUrl = dest;
446     setPage(html);
447     }else {
448     self.ajaxRequest(
449     dest,
450     'get',
451     params,
452     function(transport) {
453     var html = transport.responseText;
454     pageCache[dest] = html;
455     pageUrl = dest;
456     setPage(html);
457     },
458     function () {
459     alert("ページ読み込み失敗");
460     }
461     );
462     }
463     }
464    
465     // location.hash を監視して変更されていたらpathに相当する画面のデータを設定する。
466 berupon 9 var prevHash = "nullpo";
467     function checkLocationHash() {
468     if (location.hash != prevHash) {
469     if (box) {
470 berupon 10 if (self.pageUnloadHandler) {
471     var ret = self.pageUnloadHandler();
472 berupon 9 if (ret) {
473     dumpCookie(prevHash, ret);
474     }
475     }
476     contents.removeChild(box);
477 berupon 10 self.pageUnloadHandler = null;
478 berupon 9 }
479     prevHash = location.hash;
480     if (location.hash == "" || location.hash == "#") {
481 berupon 14 loadPage("menu" + ".html", {});
482 berupon 9 }else {
483     var pagePath = location.hash.substr(1, location.hash.length);
484 berupon 14 var paraPos = pagePath.indexOf('?');
485     if (paraPos >= 1) {
486     pagePath = pagePath.substr(0, paraPos);
487     }
488     loadPage(pagePath + ".html", {});
489 berupon 9 }
490     }
491     }
492    
493 berupon 10 return self;
494 berupon 9
495 berupon 10 })();
496 berupon 9
497 berupon 10 // debug用のalert関数
498     function a(p) {
499     if (typeof p == "object") {
500     alert(Object.toJSON(p));
501     }else {
502     alert(p);
503     }
504     }
505 berupon 9
506 berupon 21 // TODO: 起動時にAjaxでServerから読み取る。
507 berupon 14 var prefectures = {
508     1 : '北海道',
509     2 : '青森県',
510     3 : '岩手県',
511     4 : '宮城県',
512     5 : '秋田県',
513     6 : '山形県',
514     7 : '福島県',
515     8 : '茨城県',
516     9 : '栃木県',
517     10 : '群馬県',
518     11 : '埼玉県',
519     12 : '千葉県',
520     13 : '東京都',
521     14 : '神奈川県',
522     15 : '新潟県',
523     16 : '富山県',
524     17 : '石川県',
525     18 : '福井県',
526     19 : '山梨県',
527     20 : '長野県',
528     21 : '岐阜県',
529     22 : '静岡県',
530     23 : '愛知県',
531     24 : '三重県',
532     25 : '滋賀県',
533     26 : '京都府',
534     27 : '大阪府',
535     28 : '兵庫県',
536     29 : '奈良県',
537     30 : '和歌山県',
538     31 : '鳥取県',
539     32 : '島根県',
540     33 : '岡山県',
541     34 : '広島県',
542     35 : '山口県',
543     36 : '徳島県',
544     37 : '香川県',
545     38 : '愛媛県',
546     39 : '高知県',
547     40 : '福岡県',
548     41 : '佐賀県',
549     42 : '長崎県',
550     43 : '熊本県',
551     44 : '大分県',
552     45 : '宮崎県',
553     46 : '鹿児島県',
554     47 : '沖縄県'
555     };

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