| 81 |
} |
} |
| 82 |
|
|
| 83 |
|
|
| 84 |
function setAutoFocus() |
function setAutoFocus() { |
|
{ |
|
| 85 |
var cnt = document.forms.length; |
var cnt = document.forms.length; |
| 86 |
for (var i=0; i<cnt; ++i) { |
for (var i=0; i<cnt; ++i) { |
| 87 |
var form = document.forms[i]; |
var form = document.forms[i]; |
| 113 |
|
|
| 114 |
Event.observe(window, "load", setAutoFocus); |
Event.observe(window, "load", setAutoFocus); |
| 115 |
|
|
| 116 |
function toDateFormat(num) |
function toDateFormat(num) { |
|
{ |
|
| 117 |
if (num.match(/\d{8,8}/)) { |
if (num.match(/\d{8,8}/)) { |
| 118 |
var year = Math.floor(num / 10000); |
var year = Math.floor(num / 10000); |
| 119 |
var remain = num % 10000; |
var remain = num % 10000; |
| 131 |
} |
} |
| 132 |
} |
} |
| 133 |
|
|
| 134 |
|
function windowEvent() { |
|
function windowEvent(){ |
|
| 135 |
if (window.event) return window.event; |
if (window.event) return window.event; |
| 136 |
var caller = arguments.callee.caller; |
var caller = arguments.callee.caller; |
| 137 |
while (caller) { |
while (caller) { |
| 182 |
); |
); |
| 183 |
} |
} |
| 184 |
|
|
| 185 |
// 列の表示切り替え&並び替え用、templateの文字列時点で入れ替えを行う |
// 列の表示切り替え&並び替え用、DOMにする前に templateの文字列時点で入れ替えを行う |
| 186 |
function modifyTemplate(src, data) |
// |
| 187 |
{ |
// 以下概要 |
| 188 |
|
// # で始まる行を対象として処理を行う。 |
| 189 |
|
// #hoge{ でhogeグループ開始 |
| 190 |
|
// グループ中の#key1 で始まる行頭から次の#key2 で始まる行頭までを key1 要素とする。 |
| 191 |
|
// #} でグループ終了。 |
| 192 |
|
// 引数の data 中の hoge 配列の値どうりに、key要素を出現させていく。 |
| 193 |
|
// |
| 194 |
|
function modifyTemplate(src, data) { |
| 195 |
var r = /^#/gm; |
var r = /^#/gm; |
| 196 |
var r2 = /^[^\s]+/g; |
var r2 = /^[^\s]+/g; |
| 197 |
var indexes = []; |
var indexes = []; |
| 204 |
return src; |
return src; |
| 205 |
} |
} |
| 206 |
|
|
| 207 |
function attachParts(pieces, parts, setting) |
function attachParts(pieces, parts, setting) { |
|
{ |
|
| 208 |
if (!setting) { |
if (!setting) { |
| 209 |
for (var j=0; j<parts.length; ++j) { |
for (var j=0; j<parts.length; ++j) { |
| 210 |
var part = parts[j]; |
var part = parts[j]; |
| 266 |
return pieces.join(""); |
return pieces.join(""); |
| 267 |
} |
} |
| 268 |
|
|
| 269 |
|
// cookie中の指定した名前の値をObjectとして取り出し。JSON形式で格納されている事前提。 |
| 270 |
function digestCookie(key) { |
function digestCookie(key) { |
| 271 |
var pieces = document.cookie.split('; '); |
var pieces = document.cookie.split('; '); |
| 272 |
for (var i=0; i<pieces.length; ++i) { |
for (var i=0; i<pieces.length; ++i) { |
| 279 |
return {}; |
return {}; |
| 280 |
} |
} |
| 281 |
|
|
| 282 |
|
// cookieに指定した名前で値を保存。JSON形式で格納。 |
| 283 |
function dumpCookie(key, value) { |
function dumpCookie(key, value) { |
| 284 |
if (!Object.isString(value)) { |
if (!Object.isString(value)) { |
| 285 |
value = Object.toJSON(value); |
value = Object.toJSON(value); |
| 325 |
return collectMember(visibles.options, 'value'); |
return collectMember(visibles.options, 'value'); |
| 326 |
} |
} |
| 327 |
|
|
| 328 |
|
// Application クラス |
| 329 |
|
// グローバル変数 app の予約。 |
| 330 |
|
if (app != undefined) { |
| 331 |
|
alert("error: global variable 'app' is already defined."); |
| 332 |
|
} |
| 333 |
|
var app = null; |
| 334 |
|
Application = function () { |
| 335 |
|
if (app) { |
| 336 |
|
return; |
| 337 |
|
} |
| 338 |
|
|
| 339 |
|
/// private /// |
| 340 |
|
|
| 341 |
|
var box = null; |
| 342 |
|
var contents = null; |
| 343 |
|
Event.observe(window, "load", function () { |
| 344 |
|
contents = $('contents'); |
| 345 |
|
}); |
| 346 |
|
var draggable = new Draggable(); |
| 347 |
|
var popup = new ModalPopUp(); |
| 348 |
|
|
| 349 |
|
// AJAXによる擬似ページ読込処理 |
| 350 |
|
function loadPage(dest, params) { |
| 351 |
|
ajaxRequest( |
| 352 |
|
dest, |
| 353 |
|
'get', |
| 354 |
|
params, |
| 355 |
|
function(transport) { |
| 356 |
|
app.pageLoadHandler = null; |
| 357 |
|
box = document.createElement("div"); |
| 358 |
|
box.innerHTML = transport.responseText; |
| 359 |
|
contents.appendChild(box); |
| 360 |
|
var title = $("pageTitle").innerHTML; |
| 361 |
|
document.title = "#{APP_TITLE}" + ' ' + title; |
| 362 |
|
var loc = app.getPathFromLocationHash(); |
| 363 |
|
$("title").innerHTML = title; |
| 364 |
|
// $("breadcrumbs").innerHTML = loc.split('/').join(' / '); |
| 365 |
|
if (Prototype.Browser.IE || Prototype.Browser.WebKit || Prototype.Browser.Opera) { |
| 366 |
|
var texts = new Array(); |
| 367 |
|
var scripts = box.getElementsByTagName("script"); |
| 368 |
|
for (var i=0; i<scripts.length; ++i) { |
| 369 |
|
var script = scripts[i]; |
| 370 |
|
texts.push(script.text); |
| 371 |
|
} |
| 372 |
|
var script = document.createElement("script"); |
| 373 |
|
script.text = texts.join("\r"); |
| 374 |
|
box.appendChild(script); |
| 375 |
|
} |
| 376 |
|
if (app.pageLoadHandler) { |
| 377 |
|
app.pageLoadHandler(); |
| 378 |
|
} |
| 379 |
|
app.setHelpers(); |
| 380 |
|
}, |
| 381 |
|
function () { |
| 382 |
|
alert("ページ読み込み失敗"); |
| 383 |
|
} |
| 384 |
|
); |
| 385 |
|
} |
| 386 |
|
|
| 387 |
|
// location.hash を監視して変更されていたらpathに相当する擬似ページをAJAXで読み込む。 |
| 388 |
|
var prevHash = "nullpo"; |
| 389 |
|
var timerID = setInterval(checkLocationHash, 10); |
| 390 |
|
function checkLocationHash() { |
| 391 |
|
if (location.hash != prevHash) { |
| 392 |
|
if (box) { |
| 393 |
|
popup.hide(); |
| 394 |
|
popup.clear(); |
| 395 |
|
if (app.pageUnloadHandler) { |
| 396 |
|
var ret = app.pageUnloadHandler(); |
| 397 |
|
if (ret) { |
| 398 |
|
dumpCookie(prevHash, ret); |
| 399 |
|
} |
| 400 |
|
} |
| 401 |
|
contents.removeChild(box); |
| 402 |
|
app.pageUnloadHandler = null; |
| 403 |
|
} |
| 404 |
|
prevHash = location.hash; |
| 405 |
|
if (location.hash == "" || location.hash == "#") { |
| 406 |
|
loadPage("menu", {}); |
| 407 |
|
}else { |
| 408 |
|
var pagePath = location.hash.substr(1, location.hash.length); |
| 409 |
|
loadPage(pagePath, {}); |
| 410 |
|
} |
| 411 |
|
} |
| 412 |
|
} |
| 413 |
|
|
| 414 |
|
/// public /// |
| 415 |
|
|
| 416 |
|
// 擬似ページの読込時に呼び出すコールバック。 |
| 417 |
|
this.pageLoadHandler = null; |
| 418 |
|
|
| 419 |
|
// 擬似ページの破棄時に呼び出すコールバック。戻り値が有る場合はcookieに保存 |
| 420 |
|
this.pageUnloadHandler = null; |
| 421 |
|
|
| 422 |
|
// Modal PopUp 用の処理 |
| 423 |
|
this.showPopup = function () { |
| 424 |
|
popup.show(); |
| 425 |
|
}; |
| 426 |
|
|
| 427 |
|
this.hidePopup = function () { |
| 428 |
|
popup.hide(); |
| 429 |
|
}; |
| 430 |
|
|
| 431 |
|
this.setPopup = function (elem) { |
| 432 |
|
popup.elem.appendChild(elem); |
| 433 |
|
}; |
| 434 |
|
|
| 435 |
|
// 入力補助等のevent handlers設定 |
| 436 |
|
this.setHelpers = function () { |
| 437 |
|
setAutoFocus(); |
| 438 |
|
draggable.attach(); |
| 439 |
|
ResizableColumns(); |
| 440 |
|
assignBehaviours(); |
| 441 |
|
}; |
| 442 |
|
|
| 443 |
|
this.getPathFromLocationHash = function () { |
| 444 |
|
var url = location.hash; |
| 445 |
|
return url.substr(1, url.length); |
| 446 |
|
}; |
| 447 |
|
|
| 448 |
|
// hash指定によるページ切り替え処理 |
| 449 |
|
// this routine understands relative path |
| 450 |
|
this.moveLocation = function (path) { |
| 451 |
|
var curHash = location.hash; |
| 452 |
|
if (path.substr(0,1) == '/') { |
| 453 |
|
location.hash = path.substr(1,path.length); |
| 454 |
|
}else { |
| 455 |
|
var upLevel = 0; |
| 456 |
|
while (1) { |
| 457 |
|
if (path.substr(0, 3) == '../') { |
| 458 |
|
++upLevel; |
| 459 |
|
path = path.substr(3, path.length); |
| 460 |
|
}else { |
| 461 |
|
break; |
| 462 |
|
} |
| 463 |
|
} |
| 464 |
|
var curPath = location.hash; |
| 465 |
|
curPath = curPath.substr(1, curPath.length); |
| 466 |
|
var parts = curPath.split('/'); |
| 467 |
|
parts = parts.slice(0, parts.length - (upLevel+1)); |
| 468 |
|
var newPath = parts.join('/'); |
| 469 |
|
if (newPath) { |
| 470 |
|
newPath += '/'; |
| 471 |
|
} |
| 472 |
|
newPath += path; |
| 473 |
|
location.hash = newPath; |
| 474 |
|
} |
| 475 |
|
}; |
| 476 |
|
|
| 477 |
|
// postによるデータ登録処理。エラー時にメッセージ表示を行うElementを用意する事。 |
| 478 |
|
var okToPost = true; |
| 479 |
|
this.postRequest = function (params) { |
| 480 |
|
if (!okToPost) { |
| 481 |
|
alert("ただいま結果待ちな為送信出来ません。"); |
| 482 |
|
return; |
| 483 |
|
} |
| 484 |
|
if (params instanceof HTMLFormElement) { |
| 485 |
|
params = Form.serialize(params, true); |
| 486 |
|
} |
| 487 |
|
// alert(Object.toJSON(params)); |
| 488 |
|
ajaxRequest( |
| 489 |
|
this.getPathFromLocationHash(), |
| 490 |
|
'post', |
| 491 |
|
params, |
| 492 |
|
function(transport) { |
| 493 |
|
var ret = transport.responseJSON; |
| 494 |
|
if (!ret) { |
| 495 |
|
alert(transport.responseText); |
| 496 |
|
} |
| 497 |
|
if (ret.errors.length) { |
| 498 |
|
$("messages").innerHTML = ret.errors.join("<BR>"); |
| 499 |
|
$("error").appear({ duration: 1.0 }); |
| 500 |
|
}else { |
| 501 |
|
this.moveLocation("list"); |
| 502 |
|
} |
| 503 |
|
okToPost = true; |
| 504 |
|
}, |
| 505 |
|
function () { |
| 506 |
|
alert('Something went wrong...') |
| 507 |
|
okToPost = true; |
| 508 |
|
} |
| 509 |
|
); |
| 510 |
|
okToPost = false; |
| 511 |
|
}; |
| 512 |
|
|
| 513 |
|
// template文字列は指定要素の最初の要素であるHTML comment中にあるという前提。 |
| 514 |
|
this.templateUpdate = function (templateEl, updateEl, data) { |
| 515 |
|
var comment = templateEl.firstChild; |
| 516 |
|
var src = comment.data; |
| 517 |
|
src = modifyTemplate(src, data); |
| 518 |
|
var template = new EJS({text: src}); |
| 519 |
|
template.update(updateEl, data); |
| 520 |
|
}; |
| 521 |
|
|
| 522 |
|
}; |
| 523 |
|
|
| 524 |
|
app = new Application(); |
| 525 |
|
|