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

/* provided objects/methods
 *   var isIE
 *   var resizable (object)
 *   function resizableById(id, maxheight, maxwidth, minheight, minwidth)
 *   function resizableByObj(obj, maxheight, maxwidth, minheight, minwidth, name)
 *   function resizableAllTextarea(maxheight, maxwidth, minheight, minwidth)
 *   function resizableAllTextbox(maxheight, maxwidth, minheight, minwidth)
 */

var isIE = /*@cc_on ! @*/ false;
var isIE8 = (isIE<8 && 0<appVer.indexOf("Trident/")) ? true : false;

////////////////////////////////////////////////////////////////////////////////
var resizable = {
	debug         : false,
	dragdirection : null,
	draginfo      : null,
	dragobj       : null,
	gripsize      : 6,
	gripshift     : -4,
	targets       : new Array(),
	getPosition: function (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 = 0;
		var curY = 0;
		var parent = obj;
		var style;
		while (parent) {
			curX += parent.offsetLeft;
			curY += parent.offsetTop;
/*			style = this.getStyle(parent);
			if(style.position == 'absolute')
				break; /* */
			parent = parent.offsetParent;
		}

	    return [curX,curY,width,height];
	},
	getStyle: function(obj) {
		return obj.currentStyle || (document.defaultView && document.defaultView.getComputedStyle(obj, '')) || null;
	},

	reg           : /^grip(H|V|X)_(.*)$/,
	dragstart: function (event){
		if(resizable.dragobj) return;

		var target = event.srcElement || event.target;
		var res = resizable.reg.exec(target.id);

		resizable.dragdirection = res[1];
		resizable.draginfo = resizable.targets[res[2]];
		resizable.dragobj  = resizable.draginfo.obj; //document.getElementById(res[2]);

		// ドラッグ中のカーソルを変更
		switch(resizable.dragdirection){
			case 'H': document.body.style.cursor = 'w-resize';  break;
			case 'V': document.body.style.cursor = 'n-resize';  break;
			case 'X': document.body.style.cursor = 'se-resize'; break;
		}

		// ドラッグ中のイベントを追加
		resizable.addEvent(document.body, 'mousemove', resizable.dragging);
		resizable.addEvent(document.body, 'mouseup',   resizable.dragend);
	},
	dragend: function(event){
		// カーソルを戻す
		document.body.style.cursor = 'auto';

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

		resizable.resetpos();
		resizable.dragobj = null;
	}, 

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

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

		resizable.preventDefault(event);
//		resizable.stopPropagation(event);
		resizable.resetpos();
		return true;
	},

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

			// グリップの位置を調整
			var tmp;
			var shift = resizable.gripshift;
			// widthとheightは負の値にならないようにする
			if(target.gripV){
				target.gripV.style.left   = (target.base[0])+'px';
				target.gripV.style.top    = (target.base[1]+target.base[3]+shift)+'px';
//				target.gripV.style.width  = (target.base[2]-resizable.gripsize)+'px';
				target.gripV.style.width  = (target.base[2]+shift)+'px';
				target.gripV.style.height = (resizable.gripsize)+'px';
				target.gripV.style.cliehtHeight = (resizable.gripsize)+'px';
			}
			if(target.gripH){
				target.gripH.style.left   = (target.base[0]+target.base[2]+shift)+'px';
				target.gripH.style.top    = (target.base[1])+'px';
				target.gripH.style.width  = (resizable.gripsize)+'px';
//				target.gripH.style.height = (target.base[3]-resizable.gripsize)+'px';
//				target.gripH.style.height = (target.base[3]-resizable.gripsize) >= 0 ? (target.base[3]-resizable.gripsize)+'px' : '1px';
				if (target.gripV) {
					target.gripH.style.height = (target.base[3]+shift)+'px';
				} else {
					target.gripH.style.height = (target.base[3])+'px';
				}
			}
			if(target.gripX){
				if(isIE){
					tmp = (target.base[0]+target.base[2]-18);
					if(tmp < 0)
						tmp = target.base[0]+target.base[2] / 2;
					target.gripX.style.left   = (tmp+shift)+'px';
					target.gripX.style.width  = (resizable.gripsize+16)+'px';
				}else{
					target.gripX.style.left   = (target.base[0]+target.base[2]+shift)+'px';
					target.gripX.style.width  = (resizable.gripsize)+'px';
				}
				target.gripX.style.top    = (target.base[1]+target.base[3]+shift)+'px';
				target.gripX.style.height = (resizable.gripsize)+'px';
			}
		}
	},


	////////////////////////////////////
	// some useful method
	addEvent : function (obj, name, func) {
		if(obj == undefined || name == '' || func == undefined) return false;

		if(obj.addEventListener) obj.addEventListener(name, func, false);
		else if(obj.attachEvent) obj.attachEvent('on'+name, func);
		else return false;// setAttribute('on'+name, func);

		return true;
	},
	delEvent : function (obj, name, func) {
		if(obj == undefined || name == '' || func == undefined) return false;

		if(obj.removeEventListener) obj.removeEventListener(name, func, false);
		else if(obj.detachEvent)    obj.detachEvent('on'+name, func);
		else return false;// setAttribute('on'+name, '');

		return true;
	},
	preventDefault : function (ev){
		if(isIE)  ev.returnValue = false;
		else      ev.preventDefault();
	},
	stopPropagation : function (ev){
		if(ADIARY.isIE) ev.cancelBubble = true;
		else            ev.stopPropagation();
	}
};

////////////////////////////////////////////////////////////////////////////////
// リサイズ対策
////////////////////////////////////////////////////////////////////////////////
{
	var resetpos_callfunc = function() {
		resizable.resetpos();
	}
	addEvent(window, 'resize', resetpos_callfunc);

//	addEvent(window, 'resize', resize_func);
}

////////////////////////////////////////////////////////////////////////////////
// インターフェース
////////////////////////////////////////////////////////////////////////////////
//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 || resizable.gripsize;
	minwidth  = minwidth  || resizable.gripsize;
	if(obj == undefined || obj == null)return false;
	if(maxheight < 0 && maxwidth < 0)  return false;
	if(minheight < resizable.gripsize) minheight = resizable.gripsize; // 最低gripsizeピクセルは残す
	if(minwidth < resizable.gripsize)  minwidth  = resizable.gripsize;  // 最低gripsizeピクセルは残す

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

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

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

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

	// オブジェクトに被らせるようにダミーのdivブロックを生成
	var parentobj = document.getElementsByTagName('body');
	parentobj = parentobj[0];
	//	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';
		target.gripV.setAttribute('title', 'resizable');
		if(isIE){
			target.gripV.style.borderTop  = ''+resizable.gripsize+'px solid red';
			if(!resizable.debug) target.gripV.style.filter     = 'alpha(opacity=0)';
		}else
			if(resizable.debug) target.gripV.style.backgroundColor = 'red';
		resizable.addEvent(target.gripV, 'mousedown', resizable.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';
		target.gripH.setAttribute('title', 'resizable');
		if(isIE){
			target.gripH.style.borderLeft = ''+resizable.gripsize+'px solid blue';
			if(!resizable.debug) target.gripH.style.filter     = 'alpha(opacity=0)';
		}else
			if(resizable.debug) target.gripH.style.backgroundColor = 'blue';
		resizable.addEvent(target.gripH, 'mousedown', resizable.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';
		target.gripX.setAttribute('title', 'resizable');
		if(isIE){
			target.gripX.style.borderTop  = ''+resizable.gripsize+'px solid green';
			if(!resizable.debug) target.gripX.style.filter     = 'alpha(opacity=0)';
		}else
			if(resizable.debug) target.gripX.style.backgroundColor = 'green';
		resizable.addEvent(target.gripX, 'mousedown', resizable.dragstart);
	}

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

	return true;
}

// すべてのテキストエリアを追加
function resizableAllTextarea(maxheight, maxwidth, minheight, minwidth)
{
	// Safari(Google Chrome)は標準で対応してるので何もしない
	if (0 < navigator.appVersion.indexOf('Safari'))
		return;

    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; // idがついていなければ適当に付ける
    	else
    		name = T[i].id;
    	resizableByObj(T[i], maxheight, maxwidth, minheight, minwidth, name);
    }
}

// すべてのinput type="text", "password"を追加
function resizableAllTextbox(maxheight, maxwidth, minheight, minwidth)
{
    T = document.getElementsByTagName('INPUT');
 	maxheight = maxheight || -1;
    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; // idがついていなければ適当に付ける
	    	else
	    		name = T[i].id;
	    	resizableByObj(T[i], maxheight, maxwidth, minheight, minwidth, name);
        }
    }
}
