Develop and Download Open Source Software

Browse Subversion Repository

Contents of /js/domain.js

Parent Directory Parent Directory | Revision Log Revision Log


Revision 10 - (show annotations) (download) (as text)
Tue Dec 8 11:41:01 2009 UTC (14 years, 5 months ago) by berupon
File MIME type: application/x-javascript
File size: 10693 byte(s)
Title表示に失敗していたので修正。
JavaScriptを整理。
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
86 function setAutoFocus() {
87 var cnt = document.forms.length;
88 for (var i=0; i<cnt; ++i) {
89 var form = document.forms[i];
90 var cnt2 = form.elements.length;
91 for (var j=0; j<cnt2; ++j) {
92 var elem = form.elements[j];
93 if (elem.attributes.getNamedItem("autofocus")) {
94 if (document.activeElement == elem) {
95 return;
96 }
97 var e = elem;
98 do {
99 if (e.style) {
100 if (0
101 || (e.style.display && e.style.display == 'none')
102 || (e.style.visibility && e.style.visibility == 'hidden')
103 ) {
104 return;
105 }
106 }
107 }while (e = e.parentNode);
108 elem.focus();
109 elem.select();
110 return;
111 }
112 }
113 }
114 }
115
116 Event.observe(window, "load", setAutoFocus);
117
118 function toDateFormat(num) {
119 if (num.match(/\d{8,8}/)) {
120 var year = Math.floor(num / 10000);
121 var remain = num % 10000;
122 var month = Math.floor(remain / 100);
123 var day = remain % 100;
124 return "" // damn Automatic Semicolon Insertion ;;
125 + ("00" + year).substr(-4)
126 + "/"
127 + ("00" + month).substr(-2)
128 + "/"
129 + ("00" + day).substr(-2)
130 ;
131 }else {
132 return num;
133 }
134 }
135
136 function clearForm(id) {
137 var form = Event.findElement(windowEvent()).form;
138 clearFormElementsValues(form, id);
139 }
140
141 Ajax.Responders.register({
142 onCreate: function() {
143 $("loading").appear({ duration: 0.1 });
144 },
145 onComplete: function() {
146 $("loading").fade({ duration: 0.5 });
147 }
148 });
149
150 function ajaxRequest(url, method, parameters, onSuccess, onFailure) {
151 new Ajax.Request(
152 url,
153 {
154 "method" : method,
155 "parameters" : parameters,
156 "onSuccess": function(transport) {
157 try {
158 onSuccess(transport);
159 }catch (e) {
160 alert(e);
161 }
162 },
163 "onFailure": function () {
164 if (onFailure) {
165 try {
166 onFailure();
167 }catch (e) {
168 alert(e);
169 }
170 }
171 }
172 }
173 );
174 }
175
176 // cookie中の指定した名前の値をObjectとして取り出し。JSON形式で格納されている事前提。
177 function digestCookie(key) {
178 var pieces = document.cookie.split('; ');
179 for (var i=0; i<pieces.length; ++i) {
180 var piece = pieces[i];
181 var pair = piece.split('=');
182 if (pair[0] == key) {
183 return unescape(pair[1]).evalJSON();
184 }
185 }
186 return {};
187 }
188
189 // cookieに指定した名前で値を保存。JSON形式で格納。
190 function dumpCookie(key, value) {
191 if (!Object.isString(value)) {
192 value = Object.toJSON(value);
193 }
194 var str = key + '=' + escape(value) + ";";
195 var d = new Date();
196 // future yet unknown XD
197 d.setYear(2012);
198 d.setMonth(12);
199 d.setDate(21);
200 str += "expires=" + d.toGMTString() + ";";
201 document.cookie = str;
202 }
203
204 // TODO: rename to DualSelect routines
205 function resetGridSetting(visibles, hiddens, cols) {
206 visibles.options.length = 0;
207 hiddens.options.length = 0;
208 for (var i=0; i<cols.length; ++i) {
209 var col = cols[i];
210 visibles.options[i] = new Option(col.text, col.value);
211 }
212 }
213
214 function setGridSetting(visibles, hiddens, defaultCols, cols) {
215 visibles.options.length = 0;
216 hiddens.options.length = 0;
217 for (var i=0; i<defaultCols.length; ++i) {
218 var col = defaultCols[i];
219 var found = false;
220 for (var j=0; j<cols.length; ++j) {
221 if (cols[j] == col.value) {
222 found = true;
223 break;
224 }
225 }
226 var el = found ? visibles : hiddens;
227 el.options[el.options.length] = new Option(col.text, col.value);
228 }
229 }
230
231 function getGridSetting(visibles) {
232 return collectMember(visibles.options, 'value');
233 }
234
235 var app = (function () {
236
237 /// private ///
238 Application = function () {
239
240 this.title = "SimpleLightWeb";
241
242 // 擬似ページの読込時に呼び出すコールバック。
243 this.pageLoadHandler = null;
244
245 // 擬似ページの破棄時に呼び出すコールバック。戻り値が有る場合はcookieに保存
246 this.pageUnloadHandler = null;
247
248 // Modal PopUp 用の処理
249 this.showPopup = function () {
250 popup.show();
251 };
252
253 this.hidePopup = function () {
254 popup.hide();
255 };
256
257 this.setPopup = function (elem) {
258 popup.elem.appendChild(elem);
259 };
260
261 // 入力補助等のevent handlers設定
262 this.setHelpers = function () {
263 setAutoFocus();
264 draggable.attach();
265 ResizableColumns();
266 assignBehaviours();
267 };
268
269 this.getPathFromLocationHash = function () {
270 var url = location.hash;
271 return url.substr(1, url.length);
272 };
273
274 // hash指定によるページ切り替え処理
275 // this routine understands relative path
276 this.moveLocation = function (path) {
277 var curHash = location.hash;
278 if (path.substr(0,1) == '/') {
279 location.hash = path.substr(1,path.length);
280 }else {
281 var upLevel = 0;
282 while (1) {
283 if (path.substr(0, 3) == '../') {
284 ++upLevel;
285 path = path.substr(3, path.length);
286 }else {
287 break;
288 }
289 }
290 var curPath = location.hash;
291 curPath = curPath.substr(1, curPath.length);
292 var parts = curPath.split('/');
293 parts = parts.slice(0, parts.length - (upLevel+1));
294 var newPath = parts.join('/');
295 if (newPath) {
296 newPath += '/';
297 }
298 newPath += path;
299 location.hash = newPath;
300 }
301 };
302
303 // postによるデータ登録処理。エラー時にメッセージ表示を行うElementを用意する事。
304 var okToPost = true;
305 this.postRequest = function (params) {
306 if (!okToPost) {
307 alert("ただいま結果待ちな為送信出来ません。");
308 return;
309 }
310 if (params instanceof HTMLFormElement) {
311 params = Form.serialize(params, true);
312 }
313 // alert(Object.toJSON(params));
314 ajaxRequest(
315 this.getPathFromLocationHash(),
316 'post',
317 params,
318 function(transport) {
319 var ret = transport.responseJSON;
320 if (!ret) {
321 alert(transport.responseText);
322 }
323 if (ret.errors.length) {
324 $("messages").innerHTML = ret.errors.join("<BR>");
325 $("error").appear({ duration: 1.0 });
326 }else {
327 this.moveLocation("list");
328 }
329 okToPost = true;
330 },
331 function () {
332 alert('Something went wrong...')
333 okToPost = true;
334 }
335 );
336 okToPost = false;
337 };
338
339 // template文字列は指定要素の最初の要素であるHTML comment中にあるという前提。
340 this.templateUpdate = function (templateEl, updateEl, data) {
341 var comment = templateEl.firstChild;
342 var src = comment.data;
343 src = modifyTemplate(src, data);
344 var template = new EJS({text: src});
345 template.update(updateEl, data);
346 };
347
348 };
349 var self = new Application();
350
351 var box = null;
352 var contents = null;
353 Event.observe(window, "load", function () {
354 contents = $('contents');
355 });
356 var draggable = new Draggable();
357 var popup = new ModalPopUp();
358
359 // AJAXによる擬似ページ読込処理
360 function loadPage(dest, params) {
361 ajaxRequest(
362 dest,
363 'get',
364 params,
365 function(transport) {
366 self.pageLoadHandler = null;
367 box = document.createElement("div");
368 box.innerHTML = transport.responseText;
369 contents.appendChild(box);
370 var title = $("pageTitle").innerHTML;
371 document.title = self.title + ' ' + title;
372 var loc = self.getPathFromLocationHash();
373 $("title").innerHTML = title;
374 // $("breadcrumbs").innerHTML = loc.split('/').join(' / ');
375 if (Prototype.Browser.IE || Prototype.Browser.WebKit || Prototype.Browser.Opera) {
376 var texts = new Array();
377 var scripts = box.getElementsByTagName("script");
378 for (var i=0; i<scripts.length; ++i) {
379 var script = scripts[i];
380 texts.push(script.text);
381 }
382 var script = document.createElement("script");
383 script.text = texts.join("\r");
384 box.appendChild(script);
385 }
386 if (self.pageLoadHandler) {
387 self.pageLoadHandler();
388 }
389 self.setHelpers();
390 },
391 function () {
392 alert("ページ読み込み失敗");
393 }
394 );
395 }
396
397 // location.hash を監視して変更されていたらpathに相当する擬似ページをAJAXで読み込む。
398 var prevHash = "nullpo";
399 var timerID = setInterval(checkLocationHash, 10);
400 function checkLocationHash() {
401 if (location.hash != prevHash) {
402 if (box) {
403 popup.hide();
404 popup.clear();
405 if (self.pageUnloadHandler) {
406 var ret = self.pageUnloadHandler();
407 if (ret) {
408 dumpCookie(prevHash, ret);
409 }
410 }
411 contents.removeChild(box);
412 self.pageUnloadHandler = null;
413 }
414 prevHash = location.hash;
415 if (location.hash == "" || location.hash == "#") {
416 loadPage("menu", {});
417 }else {
418 var pagePath = location.hash.substr(1, location.hash.length);
419 loadPage(pagePath, {});
420 }
421 }
422 }
423
424 return self;
425
426 })();
427
428 // debug用のalert関数
429 function a(p) {
430 if (typeof p == "object") {
431 alert(Object.toJSON(p));
432 }else {
433 alert(p);
434 }
435 }
436

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