Develop and Download Open Source Software

Browse Subversion Repository

Contents of /js/domain.js

Parent Directory Parent Directory | Revision Log Revision Log


Revision 12 - (show annotations) (download) (as text)
Thu Dec 10 17:45:25 2009 UTC (14 years, 5 months ago) by berupon
File MIME type: application/x-javascript
File size: 10867 byte(s)
仕入と出庫の伝票画面を同じにする事にした。
ListBoxを左右に並べるUI、HTMLをtemplate式に変更。
事務所分類、1件目の新規登録に失敗する問題を修正。
主に数値に対応する文字列の記録する為にdatabaseにkey_value tableを追加。
type等のflag処理修正。

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 function renderDoubleList(lhs, rhs)
236 {
237 var str = new EJS({url: 'js/doublelist.ejs'}).render(
238 {
239 'lhs' : lhs,
240 'rhs' : rhs
241 }
242 );
243 return str;
244 }
245
246 var app = (function () {
247
248 /// private ///
249 Application = function () {
250
251 this.title = "SimpleLightWeb";
252
253 // 擬似ページの読込時に呼び出すコールバック。
254 this.pageLoadHandler = null;
255
256 // 擬似ページの破棄時に呼び出すコールバック。戻り値が有る場合はcookieに保存
257 this.pageUnloadHandler = null;
258
259 // Modal PopUp 用の処理
260 this.showPopup = function () {
261 popup.show();
262 };
263
264 this.hidePopup = function () {
265 popup.hide();
266 };
267
268 this.setPopup = function (elem) {
269 popup.elem.appendChild(elem);
270 };
271
272 // 入力補助等のevent handlers設定
273 this.setHelpers = function () {
274 setAutoFocus();
275 draggable.attach();
276 ResizableColumns();
277 assignBehaviours();
278 };
279
280 this.getPathFromLocationHash = function () {
281 var url = location.hash;
282 return url.substr(1, url.length);
283 };
284
285 // hash指定によるページ切り替え処理
286 // this routine understands relative path
287 this.moveLocation = function (path) {
288 var curHash = location.hash;
289 if (path.substr(0,1) == '/') {
290 location.hash = path.substr(1,path.length);
291 }else {
292 var upLevel = 0;
293 while (1) {
294 if (path.substr(0, 3) == '../') {
295 ++upLevel;
296 path = path.substr(3, path.length);
297 }else {
298 break;
299 }
300 }
301 var curPath = location.hash;
302 curPath = curPath.substr(1, curPath.length);
303 var parts = curPath.split('/');
304 parts = parts.slice(0, parts.length - (upLevel+1));
305 var newPath = parts.join('/');
306 if (newPath) {
307 newPath += '/';
308 }
309 newPath += path;
310 location.hash = newPath;
311 }
312 };
313
314 // postによるデータ登録処理。エラー時にメッセージ表示を行うElementを用意する事。
315 var okToPost = true;
316 this.postRequest = function (params) {
317 if (!okToPost) {
318 alert("ただいま結果待ちな為送信出来ません。");
319 return;
320 }
321 if (params instanceof HTMLFormElement) {
322 params = Form.serialize(params, true);
323 }
324 // alert(Object.toJSON(params));
325 ajaxRequest(
326 this.getPathFromLocationHash(),
327 'post',
328 params,
329 function(transport) {
330 var ret = transport.responseJSON;
331 if (!ret) {
332 alert(transport.responseText);
333 }
334 if (ret.errors.length) {
335 $("messages").innerHTML = ret.errors.join("<BR>");
336 $("error").appear({ duration: 0.6 });
337 }else {
338 this.moveLocation("list");
339 }
340 okToPost = true;
341 }.bind(this),
342 function () {
343 alert('Something went wrong...')
344 okToPost = true;
345 }
346 );
347 okToPost = false;
348 };
349
350 // template文字列は指定要素の最初の要素であるHTML comment中にあるという前提。
351 this.templateUpdate = function (templateEl, updateEl, data) {
352 var comment = templateEl.firstChild;
353 var src = comment.data;
354 src = modifyTemplate(src, data);
355 var template = new EJS({text: src});
356 template.update(updateEl, data);
357 };
358
359 };
360 var self = new Application();
361
362 var box = null;
363 var contents = null;
364 Event.observe(window, "load", function () {
365 contents = $('contents');
366 });
367 var draggable = new Draggable();
368 var popup = new ModalPopUp();
369
370 // AJAXによる擬似ページ読込処理
371 function loadPage(dest, params) {
372 ajaxRequest(
373 dest,
374 'get',
375 params,
376 function(transport) {
377 self.pageLoadHandler = null;
378 box = document.createElement("div");
379 box.innerHTML = transport.responseText;
380 contents.appendChild(box);
381 var title = $("pageTitle").innerHTML;
382 document.title = self.title + ' ' + title;
383 var loc = self.getPathFromLocationHash();
384 $("title").innerHTML = title;
385 // $("breadcrumbs").innerHTML = loc.split('/').join(' / ');
386 if (Prototype.Browser.IE || Prototype.Browser.WebKit || Prototype.Browser.Opera) {
387 var texts = new Array();
388 var scripts = box.getElementsByTagName("script");
389 for (var i=0; i<scripts.length; ++i) {
390 var script = scripts[i];
391 texts.push(script.text);
392 }
393 var script = document.createElement("script");
394 script.text = texts.join("\r");
395 box.appendChild(script);
396 }
397 if (self.pageLoadHandler) {
398 self.pageLoadHandler();
399 }
400 self.setHelpers();
401 },
402 function () {
403 alert("ページ読み込み失敗");
404 }
405 );
406 }
407
408 // location.hash を監視して変更されていたらpathに相当する擬似ページをAJAXで読み込む。
409 var prevHash = "nullpo";
410 var timerID = setInterval(checkLocationHash, 10);
411 function checkLocationHash() {
412 if (location.hash != prevHash) {
413 if (box) {
414 popup.hide();
415 popup.clear();
416 if (self.pageUnloadHandler) {
417 var ret = self.pageUnloadHandler();
418 if (ret) {
419 dumpCookie(prevHash, ret);
420 }
421 }
422 contents.removeChild(box);
423 self.pageUnloadHandler = null;
424 }
425 prevHash = location.hash;
426 if (location.hash == "" || location.hash == "#") {
427 loadPage("menu", {});
428 }else {
429 var pagePath = location.hash.substr(1, location.hash.length);
430 loadPage(pagePath, {});
431 }
432 }
433 }
434
435 return self;
436
437 })();
438
439 // debug用のalert関数
440 function a(p) {
441 if (typeof p == "object") {
442 alert(Object.toJSON(p));
443 }else {
444 alert(p);
445 }
446 }
447

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