source: branches/feature-module-update/html/js/layout_design.js @ 15079

Revision 15079, 18.0 KB checked in by nanasess, 17 years ago (diff)

svn:mime-type application/x-httpd-php; charset=UTF-8 設定

  • Property svn:mime-type set to application/x-httpd-php; charset=UTF-8
Line 
1/*
2 * Copyright(c) 2000-2007 LOCKON CO.,LTD. All Rights Reserved.
3 *
4 * http://www.lockon.co.jp/
5 */
6// サイズ管理クラスの定義
7function SC_Size() {
8    this.id = '';               // ID
9    this.left = 0;              // 配置するY軸座標
10    this.top = 0;               // 配置するX軸座標
11    this.width = 0;             // オブジェクトの幅
12    this.height = 0;            // オブジェクトの高さ
13    this.target_id = '';        // 配置場所(左ナビとか)
14    this.margin = 10;           // 上のオブジェクトとの幅
15    this.obj;
16};
17
18// 変数宣言
19var defUnused = 500;    // 未使用領域のデフォルトの高さ
20var defNavi   = 400;    // 左右ナビのデフォルトの高さ
21var defMainNavi  = 100; // メイン上下のデフォルトの高さ
22var defMain   = 200;    // メインのデフォルトの高さ
23
24var NowMaxHeight = 0;       // 現在の最大の高さ
25var MainHeight = 200;
26
27var marginUnused    = 688;  // 未使用領域の左マージン
28var marginLeftNavi  = 180;  // 左ナビの左マージン
29var marginRightNavi = 512;  // 右ナビの左マージン
30var marginMain      = 348;  // メイン上下の左マージン
31var marginMainFootTop= 595; // メイン下の上マージン
32
33var gDragged = "";          // ドラッグ中オブジェクト
34var gDropTarget = "";       // ドラッグ開始時のDropTarget
35
36var arrObj = new Object();  // ブロックオブジェクト格納用
37
38var mouseFlg = false;
39
40var all_elms;               // divタグオブジェクト格納用
41
42// ウィンドウサイズ
43var scrX;
44var scrY;
45
46// イベントの関連付けを行う
47function addEvent( elm, evtType, fn, useCapture) {
48
49    if (elm.addEventListener) {
50        elm.addEventListener(evtType, fn, useCapture);
51        return true;
52
53    }
54    else if (elm.attachEvent) {
55
56        var r = elm.attachEvent('on' + evtType, fn);
57        return r;
58
59    }
60    else {
61        elm['on'+evtType] = fn;
62
63    }
64   
65}
66
67
68// イベントの関連付けを解除
69function removeEvent( elm, evtType, fn, useCapture) {
70
71    if (elm.removeEventListener) {
72
73        elm.removeEventListener(evtType, fn, useCapture);
74        return true;
75
76    }
77    else if (elm.detachEvent) {
78
79        var r = elm.detachEvent('on' + evtType, fn);
80        return r;
81
82    }
83    else {
84
85        elm['on'+evtType] = fn;
86
87    }
88   
89}
90
91// マウスカーソルを変更
92function setCursor ( elm, curtype ) {
93    elm.style.cursor = curtype;
94}
95
96// オブジェクトの透明度を変更   
97function setOpacity(node,val) {
98
99    if (node.filters) {
100        node.filters["alpha"].opacity = val*100;
101    } else if (node.style.opacity) {
102        node.style.opacity = val;
103    }
104}
105
106// Zindexを変更する(前面表示切替)
107function setZindex(node, val) {
108    node.style.zIndex = val;
109//  alert(val);
110}
111
112// 値を取得
113function getAttrValue ( elm, attrname ) {
114
115    if (typeof(elm.attributes[ attrname ]) != 'undefined') {
116        return elm.attributes[ attrname ].nodeValue;
117    }
118
119/*
120//  if (typeof(elm.attributes.getNamedItem(attrname)) != 'object'){
121        val = "";
122        if((typeof ScriptEngineMajorVersion)=='function')
123        {
124            if( Math.floor(ScriptEngineMajorVersion()) == 5 &&
125                navigator.userAgent.indexOf("Win")!=-1) //win-e5対応
126                {
127                val = elm.attributes.item(attrname)
128                }
129            else
130            {
131                val = elm.attributes.getNamedItem(attrname)
132            }
133        } else {
134            val = elm.attributes.getNamedItem(attrname)
135        }
136       
137        alert(val.value);
138       
139        return val.value;
140//  }
141*/
142}
143
144// 値をセット
145function setAttrValue ( elm, attrname, val ) {
146    elm.attributes[ attrname ].nodeValue = val;
147}
148
149// オブジェクトのX座標を取得
150function getX ( elm ) {
151//   return parseInt(elm.style.left);
152    return parseInt(elm.offsetLeft);
153}
154
155// オブジェクトのY座標を取得
156function getY ( elm ) {
157    return parseInt(elm.offsetTop);
158//    return parseInt(elm.style.top);
159}
160
161// X座標を取得
162function getEventX ( evt ) {
163    return evt.clientX ? evt.clientX : evt.pageX;
164}
165
166// Y座標を取得
167function getEventY ( evt ) {
168    return evt.clientY ? evt.clientY : evt.pageY;
169}
170
171// オブジェクトの幅を取得
172function getWidth ( elm ) {
173    return parseInt( elm.style.width );
174}
175
176// オブジェクトの高さを取得
177function getHeight ( elm ) {
178//    return parseInt( elm.style.height );
179    return parseInt( elm.offsetHeight );
180}
181
182// ページの可視領域のX座標を取得する
183function getPageScrollX()
184{
185    var x = 0;
186
187    if (document.body && document.body.scrollLeft != null) {
188        x = document.body.scrollLeft;
189    } else if (document.documentElement && document.documentElement.scrollLeft != null) {
190        x = document.documentElement.scrollLeft;
191    } else if (window.scrollX != null) {
192        x = window.scrollX;
193    } else if (window.pageXOffset != null) {
194        x = window.pageXOffset;
195    }
196   
197    return x;
198}
199
200// ページの可視領域のY座標を取得する
201function getPageScrollY()
202{
203    var y = 0;
204   
205    if (document.body && document.body.scrollTop != null) {
206        y = document.body.scrollTop;
207    } else if (document.documentElement && document.documentElement.scrollTop != null) {
208        y = document.documentElement.scrollTop;
209    } else if (window.scrollY != null) {
210        y = window.scrollY;
211    } else if (window.pageYOffset != null) {
212        y = window.pageYOffset;
213    }
214   
215    return y;
216}
217
218
219// オブジェクトの座標をセット
220function moveElm ( elm, x, y ) {
221    elm.style.left = x + 'px';
222    elm.style.top = y + 'px';
223}
224
225// マウスダウンイベント
226function onMouseDown (evt) {
227
228    var target = evt.target ? evt.target : evt.srcElement;
229    var x = getEventX ( evt );
230    var y = getEventY ( evt );
231
232    //
233    // Save Information to Globals
234    //
235    if (mouseFlg == false) {
236   
237        gDragged = target;
238   
239        gDeltaX = x - getX(gDragged);
240        gDeltaY = y - getY(gDragged);
241   
242        gDraggedId = getAttrValue ( gDragged, 'did' );
243        setCursor ( gDragged, 'move' );
244   
245        gOrgX = getX ( gDragged );
246        gOrgY = getY ( gDragged );
247        gtarget_id = getAttrValue ( gDragged, 'target_id' );
248   
249        //
250        // Set
251        //
252       
253        // ドラッグ中は半透明
254        setOpacity ( gDragged, 0.6 );
255   
256        // ドラッグ中は最前面表示
257        setZindex ( gDragged , 2);
258       
259        addEvent ( document, 'mousemove', onMouseMove, false );
260        addEvent ( document, 'mouseup', onMouseUp, false );
261
262        // ドラッグを開始したときは高さを一度初期化する。
263        NowMaxHeight = defNavi;
264               
265        mouseFlg = true;
266    }
267}
268
269
270// マウスムーブイベント
271function onMouseMove(evt) {
272
273    // 現在の座標を取得
274    var x = getEventX ( evt ) + document.body.scrollLeft;                   // マウス座標 X
275    var y = getEventY ( evt ) + document.body.scrollTop;                    // マウス座標 Y
276    var nowleft = getEventX ( evt ) - gDeltaX;  // オブジェクト座標 LEFT
277    var nowtop = getEventY ( evt ) - gDeltaY;   // オブジェクト座標 TOP
278
279    // オブジェクトを移動
280    moveElm ( gDragged, nowleft, nowtop );
281   
282    for ( var i = 0; i < all_elms.length; i++ ) {
283        // drop_target上にきた場合にのみ処理を行う
284        if ( isEventOnElm ( evt, all_elms[i].id ) ) {       
285            if ( all_elms[i].attributes['tid'] ) {
286                var tid = getAttrValue ( all_elms[i], 'tid' );
287               
288                // 背景色の変更 未使用領域は変更しない
289                all_elms[i].style.background="#ffffdd";
290               
291                // target_id の書き換え
292                setAttrValue ( gDragged, 'target_id', tid );
293
294                //objCheckLine.style.top = parseInt(nowtop) + parseInt(gDragged.style.height) / 2 + 'px';
295                //objCheckLine.style.top = y;
296
297                // 配列の再作成
298                fnCreateArr(1, y, x);
299                // 配列の並び替え
300                fnChangeObj(tid);
301            }
302        }else{
303            if ( all_elms[i].attributes['tid'] && all_elms[i].style.background!="#ffffff") {
304                // 背景色の変更
305                all_elms[i].style.background="#ffffff";
306            }
307        }
308    }
309}
310
311// マウスアップイベント       
312function onMouseUp(evt) {
313    // イベントの関連付け解除
314    if (mouseFlg == true) {
315        removeEvent ( document, 'mousemove', onMouseMove, false );
316        removeEvent ( document, 'mouseup', onMouseUp, false );
317        mouseFlg = false;
318    }
319
320    if ( !isOnDropTarget (evt) ) {
321        // 元の位置に戻す
322        moveElm ( gDragged, gOrgX, gOrgY );
323        setAttrValue ( gDragged, 'target_id', gtarget_id );
324
325        // 配列の再作成
326        fnCreateArr(1, gOrgY, gOrgX);
327    }
328   
329    // hidden要素の書き換え
330    var did = getAttrValue( gDragged, 'did' );
331    var target_id = "target_id_"+did;
332    document.form1[target_id].value = getAttrValue( gDragged, 'target_id' );
333   
334    // 半透明、マウスポインタ、最前面処理を戻す
335    setOpacity( gDragged, 1);
336    setCursor ( gDragged, 'move' );
337    setZindex ( gDragged , 1);
338   
339    // 並び替え
340    fnSortObj();
341   
342    // 背景色を戻す
343    for ( var i = 0; i < all_elms.length; i++ ) {
344        // drop_target上にきた場合にのみ処理を行う
345        if ( isEventOnElm ( evt, all_elms[i].id ) && all_elms[i].attributes['tid']) {
346            // 背景色の変更
347            all_elms[i].style.background="#ffffff";
348        }
349    }
350}
351
352// DropTarget上にオブジェクトが来たかを判断する
353function isOnDropTarget ( evt ) {
354   
355    for ( var i=0; i<all_elms.length; i++ ) {
356        if ( isEventOnElm ( evt, all_elms[i].id ) ) {
357            if ( all_elms[i].attributes['tid'] ) {
358                return true;
359            }
360        }
361    }
362    return false;
363}
364function isEventOnElm (evt, drop_target_id) {
365
366    if (drop_target_id == '') {
367        return '';
368    }
369
370    var evtX = getEventX(evt) + getPageScrollX();
371    var evtY = getEventY(evt) + getPageScrollY();
372   
373    var drop_target = document.getElementById( drop_target_id );
374
375    drp_left = getX( drop_target );
376    drp_top = getY( drop_target );
377
378    var x = drp_left;
379    var y = drp_top;
380
381    var width = getWidth ( drop_target );
382    var height = getHeight ( drop_target );
383   
384//  alert(evtX +" / "+ x +" / "+ evtY +" / "+ y +" / "+ width +" / "+ height);
385
386    return evtX > x && evtY > y && evtX < x + width && evtY < y + height;
387}
388
389// オブジェクトの並び替えを行う
390function fnSortObj(){
391    fnSetTargetHeight();
392    for ( var cnt = 0; cnt < all_elms.length; cnt++ ) {
393
394        // classが drop_target の場合のみ処理を行う
395        if ( getAttrValue ( all_elms[cnt], 'class' ) == 'drop_target' ) {
396            var tid = getAttrValue ( all_elms[cnt], 'tid' );
397           
398            // 配列の並び替え
399            fnChangeObj(tid);
400           
401            // 配置
402            fnSetObj( tid, cnt );
403        }
404    }
405}
406
407function alerttest(msg, x, y){
408    alert(msg);
409}
410
411// 配列の作成
412function fnCreateArr( addEvt , top , left ){
413
414    var arrObjtmp = new Object();
415    arrObjtmp['LeftNavi'] = Array();
416    arrObjtmp['RightNavi'] = Array();
417    arrObjtmp['MainHead'] = Array();
418    arrObjtmp['MainFoot'] = Array();
419    arrObjtmp['Unused'] = Array();
420
421    for ( var i = 1; i < all_elms.length; i++ ) {
422        // classが dragged_elm の場合のみ処理を行う
423        if ( getAttrValue ( all_elms[i], 'class' ) == 'dragged_elm' ) {
424       
425            // マウスダウンイベントと関連付けを行う
426            if (addEvt == 0) {
427                addEvent ( all_elms[i], 'mousedown', onMouseDown, false );
428            }
429
430            var target_id = getAttrValue ( all_elms[i], 'target_id' ); 
431            var len = arrObjtmp[target_id].length;
432            var did = getAttrValue ( all_elms[i], 'did' );
433           
434            arrObjtmp[target_id][len] = new SC_Size();
435            arrObjtmp[target_id][len].id = did;
436            arrObjtmp[target_id][len].obj = all_elms[i];
437            arrObjtmp[target_id][len].width = getWidth( all_elms[i] );
438            arrObjtmp[target_id][len].height = getHeight( all_elms[i] );
439
440            // ドラッグ中のオブジェクトが存在すれば、そのオブジェクトだけマウスポインタの座標を指定する。
441            if (gDragged != "") {
442                if (did != getAttrValue ( gDragged, 'did' )) {
443                    // top は常にオブジェクトの中心を取得するようにする
444                    arrObjtmp[target_id][len].top = (parseInt(getY( all_elms[i] )) + arrObjtmp[target_id][len].height / 2 );
445                    arrObjtmp[target_id][len].left = getX( all_elms[i] );
446                }else {
447                    arrObjtmp[target_id][len].top = top;
448                    arrObjtmp[target_id][len].left = left;
449                }
450            } else {
451                // top は常にオブジェクトの中心を取得するようにする
452                arrObjtmp[target_id][len].top = i;
453                arrObjtmp[target_id][len].left = getX( all_elms[i] );
454            }
455        }
456    }
457   
458    arrObj = arrObjtmp;
459}
460
461// 配列の並び替え (バブルソートで並び替えを行う)
462function fnChangeObj( tid ){
463    for ( var i = 0; i < arrObj[tid].length-1; i++ ) {
464        for ( var j = arrObj[tid].length-1; j > i; j-- ) {
465            if ( arrObj[tid][j].top < arrObj[tid][i].top ) {
466                var arrTemp = new Array();
467                arrTemp = arrObj[tid][j];
468                arrObj[tid][j] = arrObj[tid][i];
469                arrObj[tid][i] = arrTemp;
470            }
471        }
472    }
473}
474
475// 配置
476function fnSetObj( tid, cnt ){
477    var target_height = 0;
478   
479    drp_left = getX(all_elms[cnt]); //all_elms[cnt].offsetLeft;
480    drp_top = getY(all_elms[cnt]); //all_elms[cnt].offsetTop;
481
482    for ( var j = 0; j < arrObj[tid].length; j++ ) {
483        // 配置する座標の取得
484        var left = parseInt(drp_left) + parseInt(all_elms[cnt].style.width) / 2 - parseInt(arrObj[tid][j].width) / 2;
485        if (j == 0){
486            var top = drp_top + arrObj[tid][j].margin;
487        }else{
488            var top = arrObj[tid][j-1].top + arrObj[tid][j].margin + arrObj[tid][j-1].height
489        }
490
491        // 座標を保持
492        arrObj[tid][j].top = top;
493        arrObj[tid][j].left = left;
494
495        // 配置を行う
496        moveElm ( arrObj[tid][j].obj, left ,top);
497
498        // 高さ計算
499        target_height = target_height + arrObj[tid][j].margin + arrObj[tid][j].height;
500
501        // hiddenの値を書き換え
502        var top_id = "top_" + arrObj[tid][j].id;
503        document.form1[top_id].value = top;
504
505    }
506}
507
508// ドロップターゲットの高さ調整
509function fnSetTargetHeight(){
510
511    var NaviHeight = defNavi;
512    var MainHeadHeight = defMainNavi;
513    var MainFootHeight = defMainNavi;
514    var UnusedHeight = defUnused;
515
516    // 高さ計算
517    for ( var cnt = 0; cnt < all_elms.length; cnt++ ) {
518        var target_height = 0;
519   
520        // classが drop_target の場合のみ処理を行う
521        if ( getAttrValue ( all_elms[cnt], 'class' ) == 'drop_target' ) {
522            var tid = getAttrValue ( all_elms[cnt], 'tid' );
523
524            for ( var j = 0; j < arrObj[tid].length; j++ ) {
525                target_height = target_height + arrObj[tid][j].margin + arrObj[tid][j].height;
526            }
527
528            // 下の幅
529            target_height = target_height + 20;
530
531            // 左右ナビ、未使用領域の高さを保持
532            if (tid == 'LeftNavi' || tid == 'RightNavi' || tid == 'Unused') {
533                if (NaviHeight < target_height) {
534                    NaviHeight = target_height;
535                }
536            }
537
538            // メイン上部領域の高さを保持
539            if (tid == 'MainHead') {
540                if (target_height > defMainNavi) {
541                    MainHeadHeight = target_height;
542                }
543            }
544
545            // メイン下部領域の高さを保持
546            if (tid == 'MainFoot') {
547                if (target_height > defMainNavi) {
548                    MainFootHeight = target_height;
549                }
550            }   
551        }
552    }
553
554    // メイン領域の高さを保持
555//  alert(NaviHeight+"/"+MainHeadHeight+"/"+MainFootHeight);
556    MainHeight = NaviHeight - ( MainHeadHeight + MainFootHeight );
557    if (MainHeight < defMain) {
558        MainHeight = defMain;
559    }
560
561    // メイン部分のほうが大きい場合には左右ナビも大きくする
562    if (NaviHeight < MainHeadHeight + MainFootHeight + MainHeight) {
563        NaviHeight = MainHeadHeight + MainFootHeight + MainHeight; 
564    }
565    // 変更
566    for ( var cnt = 0; cnt < all_elms.length; cnt++ ) {
567        var target_height = 0;
568
569        // classが drop_target の場合のみ処理を行う
570        if ( getAttrValue ( all_elms[cnt], 'class' ) == 'drop_target' ) {
571            var tid = getAttrValue ( all_elms[cnt], 'tid' );
572           
573            // tidによって処理を分ける
574            if (tid == 'LeftNavi' || tid == 'RightNavi') {
575                target_height = NaviHeight;
576            }else if (tid == 'MainHead' ) {
577                target_height = MainHeadHeight;
578            }else if (tid == 'MainFoot') {
579                target_height = MainFootHeight;
580            }else if (tid == 'Unused'){
581                target_height = NaviHeight+100;
582            }
583
584            all_elms[cnt].style.height = target_height;
585        }
586    }
587   
588    // メインテーブルの高さも変更
589    for (var i = 0; i < all_td.length; i++) {
590        name = getAttrValue ( all_td[i], 'name' );
591        if (name == 'Main') {
592            all_td[i].height = MainHeight-2;
593        }
594    }
595}
596
597//ウインドウサイズ取得
598function GetWindowSize(type){
599    var ua = navigator.userAgent;                                               // ユーザーエージェント
600    var nWidth, nHeight;                                                        // サイズ
601    var nHit = ua.indexOf("MSIE");                                              // 合致した部分の先頭文字の添え字
602    var bIE = (nHit >=  0);                                                     // IE かどうか
603    var bVer6 = (bIE && ua.substr(nHit+5, 1) == "6");                           // バージョンが 6 かどうか
604    var bStd = (document.compatMode && document.compatMode=="CSS1Compat");      // 標準モードかどうか
605
606    switch(type){
607        case "width":
608            if(bIE){
609                if (bVer6 && bStd) {
610                    return document.documentElement.clientWidth;
611                } else {
612                    return document.body.clientWidth;
613                }
614            }else if(document.layers){
615                return(innerWidth);
616            }else{
617                return(-1);
618            }
619        break;
620        case "height":
621            if(bIE){
622                if (bVer6 && bStd) {
623                    return document.documentElement.clientHeight;
624                } else {
625                    return document.body.clientHeight;
626                }
627                return(document.body.clientHeight);
628            }else if(document.layers){
629                return(innerHeight);
630            }else{
631                return(-1);
632            }
633        break;
634        default:
635            return(-1);
636        break;
637    }
638}
639
640// ウィンドウサイズが変更になったときは全てのオブジェクトも移動する
641function fnMoveObject() {
642
643    // ウィンドウの幅変更比率を取得
644    var moveX = GetWindowSize("width") - scrX;
645    var BlankX = ( GetWindowSize("width") - 878 ) / 2
646   
647    for ( var i = 0; i < all_elms.length; i++) {
648        if (all_elms[i].style.left != "" ) {
649
650            var elm_class = getAttrValue ( all_elms[i], 'class' );
651
652            if (elm_class == 'drop_target') {
653                var tid = getAttrValue ( all_elms[i], 'tid' );
654               
655                if (tid == 'LeftNavi') {
656                    LeftMargin = marginLeftNavi;
657                }else if (tid == 'RightNavi') {
658                    LeftMargin = marginRightNavi;
659                }else if (tid == 'MainHead' || tid == 'MainFoot') {
660                    LeftMargin = marginMain;
661                }else{
662                    LeftMargin = marginUnused;
663                }
664
665                if (BlankX > 0) {
666                    all_elms[i].style.left = BlankX + LeftMargin + 'px';
667                }else{
668                    all_elms[i].style.left = LeftMargin + 'px';
669                }
670            }
671        }
672    }
673   
674    scrX = GetWindowSize("width");
675    scrY = GetWindowSize("height");
676   
677    fnSortObj();
678}
679// 画面のロードイベントに関連付け
680addEvent ( window, 'load', init, false );
Note: See TracBrowser for help on using the repository browser.