////////////////////////////////////////////////////////////////////////////////
// オブジェクトリサイズスクリプト用 Javascript
//   Copyright (C) 2008 せりか/せりか式
////////////////////////////////////////////////////////////////////////////////

var targets = new Array();
var gripsize = 7;
var isIE = /*@cc_on ! @*/ false;

////////////////////////////////////////////////////////////////////////////////
// 汎用関数
////////////////////////////////////////////////////////////////////////////////
// 指定されたオブジェクトの座標とかを取得
function getPosition(obj){
	if(obj == undefined){
		return [-1,-1,-1,-1];
	}
	var height = obj.offsetHeight;
	if(height == undefined){
		height = obj.clientHeight;
	}
	var width = obj.offsetWidth;
	if(width == undefined){
		width = obj.clientWidth;
	}
	var curX = obj.offsetLeft;
	var curY = obj.offsetTop;
	while (obj.offsetParent) {
		curX += obj.offsetParent.offsetLeft;
		curY += obj.offsetParent.offsetTop;
		obj = obj.offsetParent;
	}
    return [curX,curY,width,height];
}

// イベント追加
function addEvent(target, event, method){
	if(target.addEventListener){
		target.addEventListener(event, method, false);
	}else{
		target.attachEvent('on'+event, method);
	}
}
// イベント削除
function delEvent(target, event, method){
	if(target.removeEventListener){
		target.removeEventListener(event, method, false);
	}else{
		target.detachEvent('on'+event, method);
	}
}

////////////////////////////////////////////////////////////////////////////////
// ドラッグ処理
var reg = /^grip(H|V|X)_(.*)$/;
var draggrip      = null;
var dragdirection = null;
var draginfo      = null;
var dragobj       = null;
function dragstart(event){
	var res;
	if(event.target)
		res = reg.exec(event.target.id);
	else
		res = reg.exec(event.srcElement.id);
	draggrip = event.target;
	dragdirection = res[1];
	draginfo = targets[res[2]]
	dragobj = draginfo.obj; //document.getElementById(res[2]);

	// ドラッグ中のカーソルを変更
	if(dragdirection == 'H')
		document.body.style.cursor     = 'w-resize';
	else if(dragdirection == 'V')
		document.body.style.cursor     = 'n-resize';
	else
		document.body.style.cursor     = 'se-resize';

	// ドラッグ中のイベント追加
	addEvent(document.body, 'mousemove', dragging);
	addEvent(document.body, 'mouseup',   dragend);
}
function dragend(event){
	dragobj = null;

	// カーソルを戻す
	document.body.style.cursor     = 'auto';

	// ドラッグ中のイベントを削除
	delEvent(document.body, 'mousemove', dragging);
	delEvent(document.body, 'mouseup',   dragend);

	resetpos();
}

// オブジェクトのサイズをリサイズする
function dragging(event){
	if(dragobj == null){
		dragend();
		return false;
	}

	if(dragdirection == 'H' || dragdirection == 'X'){
		var tmp = event.clientX - draginfo.base[0] - gripsize;
		if(!isIE){	// Firefoxでのオブジェクト位置微調整
			var style = document.defaultView.getComputedStyle(dragobj, '');
			tmp -= style.paddingRight.match(/^\d+/);
		}
		if(window.pageXOffset) tmp += window.pageXOffset;
		else if(document.body.scrollLeft) tmp += document.body.scrollLeft;
		if(tmp < draginfo.min[0])                        tmp = draginfo.min[0];
		if(draginfo.max[0] > 0 && tmp > draginfo.max[0]) tmp = draginfo.max[0];
		dragobj.style.width  = tmp + 'px';
	}
	if(dragdirection == 'V' || dragdirection == 'X'){
		var tmp = event.clientY - draginfo.base[1] - gripsize;
		if(!isIE){	// Firefoxでのオブジェクト位置微調整
			var style = document.defaultView.getComputedStyle(dragobj, '');
			tmp -= style.paddingBottom.match(/^\d+/);
		}
		if(window.pageYOffset) tmp += window.pageYOffset;
		else if(document.body.scrollTop) tmp += document.body.scrollTop;
		if(tmp < draginfo.min[1])                        tmp = draginfo.min[1];
		if(draginfo.max[1] > 0 && tmp > draginfo.max[1]) tmp = draginfo.max[1];
		dragobj.style.height  = tmp + 'px';
	}

	resetpos();
	return true;
}

////////////////////////////////////////////////////////////////////////////////
// グリップ位置の調整
function resetpos(){
	var target;
	for(var i in targets){
		target = targets[i];
		// オブジェクトの位置とサイズを取得
		target.base = getPosition(target.obj);

		// グリップの位置を調整
		// widthとheightは負の値にならないようにする
		if(target.gripV){
			target.gripV.style.left   = (target.base[0])+'px';
			target.gripV.style.top    = (target.base[1]+target.base[3]-2)+'px';
			target.gripV.style.width  = (target.base[2]-gripsize) >= 0 ? (target.base[2]-gripsize)+'px' : '0px';
			target.gripV.style.height = (gripsize)+'px';

			target.gripV.style.clientHeight = (gripsize)+'px';
			target.gripV.style.clientHeight = (gripsize)+'px';
		}
		if(target.gripH){
			target.gripH.style.left   = (target.base[0]+target.base[2]-2)+'px';
			target.gripH.style.top    = (target.base[1])+'px';
			target.gripH.style.width  = (gripsize)+'px';
			target.gripH.style.height = (target.base[3]-gripsize) >= 0 ? (target.base[3]-gripsize)+'px' : '0px';
		}
		if(target.gripX){
			target.gripX.style.left   = (target.base[0]+target.base[2]-2)+'px';
			target.gripX.style.top    = (target.base[1]+target.base[3]-2)+'px';
			target.gripX.style.width  = (gripsize)+'px';
			target.gripX.style.height = (gripsize)+'px';
		}
	}
}

////////////////////////////////////////////////////////////////////////////////
// インターフェース
////////////////////////////////////////////////////////////////////////////////
function resizable(id, maxheight, maxwidth, minheight, minwidth){
	return resizableById(id, maxheight, maxwidth, minheight, minwidth);
}
function resizableById(id, maxheight, maxwidth, minheight, minwidth)
{
	obj = document.getElementById(id);
	if(obj == undefined){
		return false;
	}
	return resizableByObj(obj, maxheight, maxwidth, minheight, minwidth, id);
}

// リサイズ
function resizableByObj(obj, maxheight, maxwidth, minheight, minwidth, name)
{
	// デフォルト値
	if(maxheight == undefined){
		maxheight = 0;              // 無制限
	}
	if(maxwidth  == undefined){
		maxwidth  = 0;              // 無制限
	}
	minheight = minheight || gripsize;
	minwidth  = minwidth  || gripsize;

	// 引数テスト
	if(obj == undefined || obj == null){
		return false;
	}
	if(maxheight < 0 && maxwidth < 0){
		return false;
	}
	if(minheight < gripsize){
		minheight = gripsize; // 最低gripsizeピクセルは残す
	}
	if(minwidth < gripsize){
		minwidth = gripsize;  // 最低gripsizeピクセルは残す
	}

	// 指定されたオブジェクトを取得
	var target = new Object;
	target.obj = obj; //document.getElementById(id);
	if(target.obj == undefined){
		return false;
	}

	if(name == undefined || name == null){
		id = obj.id;
	}else{
		id = name;
	}

	// targetに名前を付けておく
	target.name = id;
	if(target.name == undefined || target.name == null){
		return false;
	}

	// already registerd
	draginfo = targets[id];
	if(draginfo != undefined){
		return false;
	}

	// オブジェクトのサイズ制限を保存
	target.max  = [maxwidth, maxheight];
	target.min  = [minwidth, minheight];

	// オブジェクトに被らせるようにダミーのdivブロックを生成
	var parentobj = document.getElementById('body');
	//	var parentobj = target.obj.parentNode || target.obj;
	if(maxheight >= 0){
		target.gripV = document.createElement('div');
		parentobj.appendChild(target.gripV);
		target.gripV.id = 'gripV_'+id;
		target.gripV.style.position   = 'absolute';
		target.gripV.style.cursor     = 'n-resize';
		if(isIE){
			target.gripV.style.borderTop  = ''+gripsize+'px solid red';
			target.gripV.style.filter     = 'alpha(opacity=0)';
		}
		addEvent(target.gripV, 'mousedown', dragstart);
	}
	if(maxwidth >= 0){
		target.gripH = document.createElement('div');
		parentobj.appendChild(target.gripH);
		target.gripH.id = 'gripH_'+id;
		target.gripH.style.position   = 'absolute';
		target.gripH.style.cursor     = 'w-resize';
		if(isIE){
			target.gripH.style.borderLeft = ''+gripsize+'px solid blue';
			target.gripH.style.filter     = 'alpha(opacity=0)';
		}
		addEvent(target.gripH, 'mousedown', dragstart);
	}
	if(maxheight >= 0 && maxwidth >= 0){
		target.gripX = document.createElement('div');
		parentobj.appendChild(target.gripX);
		target.gripX.id = 'gripX_'+id;
		target.gripX.style.position   = 'absolute';
		target.gripX.style.cursor     = 'se-resize';
		if(isIE){
			target.gripX.style.borderTop  = '5px solid green';
			target.gripX.style.filter     = 'alpha(opacity=0)';
		}
		addEvent(target.gripX, 'mousedown', dragstart);
	}

	// リストに追加して，オブジェクトの位置を調整
	targets[target.name] = target;
	resetpos();

	return true;
}

// すべてのテキストボックスを追加
function resizableAllTextarea(maxheight, maxwidth, minheight, minwidth)
{
    T = document.getElementsByTagName('TEXTAREA');
    var i = T.length;
    while(i--){
    	if(T[i].id == undefined || T[i].id == null || T[i].id == ''){
    		name = 'TEXTAREA_' + i;
    	}else{
    		name = T[i].id;
    	}
    	resizableByObj(T[i], maxheight, maxwidth, minheight, minwidth, name);
    }
}

// すべてのinput type="text"を追加
function resizableAllTextbox(maxheight, maxwidth, minheight, minwidth)
{
	maxheight = maxheight || -1;
    T = document.getElementsByTagName('INPUT');
    var i = T.length;
    while(i--){
        var elem = T[i];
        if(elem.getAttribute("type") == "text" || elem.getAttribute("type") == "password"){
	    	if(T[i].id == undefined || T[i].id == null || T[i].id == ''){
	    		name = 'TEXTBOX_' + i;
	    	}else{
	    		name = T[i].id;
	    	}
	    	resizableByObj(T[i], maxheight, maxwidth, minheight, minwidth, name);
        }
    }
}

