/****************************
Slider.js
Ver.1.5 a

(c) Wataru Kanzaki, Wings-Winds, 2010
http://www.wi-wi.jp/
****************************/
/****************/
function Slider(container, bar){
	var ID='';
	var _cont=null;
	var _bar=null;
	var _ondrag=false;
	var _limit={
			left:false,
			right:false,
			top:false,
			bottom:false
		};
	var _interval={
			x:1,
			y:1
		};
	var _cpos={x:0,y:0}; // container's position
	var _bpos={x:0,y:0}; // bar element starting position
	var _ccenter={x:0,y:0}; // container's center
	var _bcenter={x:0,y:0}; // bar's center
	var self=this;
	var _callback=null;

	/****************/
	this.init=function(container, bar){
		if(container==undefined){
			return null;
		}
		
		ID=(typeof(container)=='string')?container:container.id||'';
		_cont=document.getElementById(ID);

		if(bar){
			_bar=(typeof(bar)=='string')?document.getElementById(bar):bar;
		}else if(_cont){
			for(var i=0;_bar=_cont.childNodes[i];i++){
				if(_bar.nodeType==1)
					break;
			}
		}

		if(!_cont || !_bar){
			alert('"'+ID+'" is null');
			return null;
		}

		_cont.style.position='relative';
		_bar.style.position='absolute';
		
		var p=Pos(_cont);
		_cpos.x=p.left;
		_cpos.y=p.top;
		var sz_c=Size(_cont);
		var sz_b=Size(_bar);
		
		_ccenter.x=parseInt(sz_c.width*0.5);
		_ccenter.y=parseInt(sz_c.height*0.5);

		_bcenter.x=parseInt(sz_b.width*0.5);
		_bcenter.y=parseInt(sz_b.height*0.5);
		
		_limit.top=0;
		_limit.left=0;
		_limit.right=sz_c.width-sz_b.width;
		_limit.bottom=sz_c.height-sz_b.height;
		_Slider.AddEvent(_cont, 'mousedown', this.mdown, false);

		delete p;
		delete sz_c;
		delete sz_b;
		return this;
	};//init
	
	/****************/
	// set callback function
	this.callback=function(f){
		_callback=f;
		return this;
	};//callback
	
	/****************/
	this.center=function(xy){
		if(xy.y===0)
			_ccenter.y=0;
		else if(xy.y=='center')
			_ccenter.y=_ccenter.y;
		else
			_ccenter.y=isNaN(parseInt(xy.y))?0:parseInt(xy.y);
		
		if(xy.x===0)
			_ccenter.x=0;
		else if(xy.x=='center')
			_ccenter.x=_ccenter.x;
		else
			_ccenter.y=isNaN(parseInt(xy.x))?0:parseInt(xy.x);
		return this;
	};//center
	
	/****************/
	this.bcenter=function(xy){
		if(xy.y===0)
			_bcenter.y=0;
		else if(xy.y=='center')
			_bcenter.y=_bcenter.y;
		else
			_bcenter.y=isNaN(parseInt(xy.y))?0:parseInt(xy.y);
		
		if(xy.x===0)
			_bcenter.x=0;
		else if(xy.x=='center')
			_bcenter.x=_bcenter.x;
		else
			_bcenter.y=isNaN(parseInt(xy.x))?0:parseInt(xy.x);
		return this;
	};//bcenter
	
	/****************/
	this.getValue=function(){
		return {x:parseInt((_bpos.x+_bcenter.x-_ccenter.x)/_interval.x),y:parseInt((_bpos.y+_bcenter.y-_ccenter.y)/_interval.y),ID:ID};
	};//getValue
	
	/****************/
	this.setValue=function(x, y){
		if(x!=null)_bpos.x=parseInt(x);
		if(y!=null)_bpos.y=parseInt(y);
		Limit();
		Move();
		return this;
	};//getValue
	
	/****************/
	this.getContainer=function(){
		return _cont;
	};//getValue
	
	/****************/
	this.getBar=function(){
		return _bar;
	};//getValue
	
	
	// prepare to start D&D
	/****************/
	this.start=function(){
		return this;
	};//start

	//  to start D&D
	/****************/
	this.end=function(){
		return this;
	};//end
	
	/****************/
	this.limit=function(pos, lim){
		_limit[pos]=lim;
		return this;
	};//limit

	/****************/
	this.interval=function(o){
		if(o.x!=undefined)
			_interval.x=o.x;
		if(o.y!=undefined)
			_interval.y=o.y;
		return this;
	};//interval

	
	/****************/
	this.mdown=function(e){
		var tar=e?e.target||event.srcElement:event.srcElement;

		if(tar!=_cont && tar!=_bar)
			return true;
		_Slider.StopEvent(e);
		tar.blur();

		_Slider.start(self, _cont, _bar);
		var p=Pos(_cont);
		_cpos.x=p.left;
		_cpos.y=p.top;

		SetPos(e);

		_ondrag=true;
		
		Limit();
		Move();
		
		
		if(_callback){
			_callback(self.getValue());
		}
		return false;
	};//mdown

	/****************/
	this.drag=function(e){
		if(!_ondrag)
			return false;

		var px=0;
		var py=0;

		SetPos(e);
		Limit();
		Move();

		if(!!_callback){
			_callback(self.getValue());
		}
		return false;
	};//drag

	/****************/
	this.drop=function(e){
		if(!_ondrag)
			return false;
		_ondrag=false;

		if(_callback){
			_callback(self.getValue());
		}
		return false;
	};//drop

	// via motel
	/****************/
	function Pos(el,opt){
	var _pos={left:0,top:0};
	var isMac=(navigator.platform.toLowerCase().indexOf("mac")!=-1);
	if(!el)return _pos;
		if(el.getBoundingClientRect){
			var t=document.body.scrollTop||document.documentElement.scrollTop||0;
			var l=document.body.scrollLeft||document.documentElement.scrollLeft||0;
			t=parseInt(t);
			l=parseInt(l);
			var rect=el.getBoundingClientRect();
			_pos.top=parseInt(rect.top+t);
			_pos.left=parseInt(rect.left+l);

		}else if(document.getBoxObjectFor){
			var rect=document.getBoxObjectFor(el);
			_pos.top=rect.y;
			_pos.left=rect.x;

		}else{
			while(el){
				_pos.left+=parseInt(el.offsetLeft);
				_pos.top+=parseInt(el.offsetTop);
				el=el.offsetParent;
			}
			if (!isMac){
			_pos.left-=document.body.offsetLeft; // html margin-left
			_pos.top-=document.body.offsetTop; // html margin-top
			}

		}
		return _pos;
	}//Pos
	
	// via motel
	/****************/
	function Size(el){
		var sz={width:0,height:0};
		if(!el)return sz;
		if(el.getBoundingClientRect){
			var rect=el.getBoundingClientRect();
			sz.width=rect.right-rect.left;
			sz.height=rect.bottom-rect.top;
		}else if(document.getBoxObjectFor){
			var rect=document.getBoxObjectFor(el);
			sz.width=rect.width;
			sz.height=rect.height;
		}else{
			sz.width=el.clientWidth;
			sz.height=el.clientHeight;
		}
		return sz;
	}//Size

	/****************/
	function Move(){
		_bar.style.left=_bpos.x+'px';
		_bar.style.top =_bpos.y+'px';
		return true;
	}//Move
	
	/****************/
	function Limit(){
		_bpos.x-=_bcenter.x;
		_bpos.y-=_bcenter.y;

		if(_limit.left!==false && _bpos.x<_limit.left)
			_bpos.x=_limit.left;
		else if(_limit.right!==false && _limit.right<_bpos.x)
			_bpos.x=_limit.right;
		if(_limit.top!==false && _bpos.y<_limit.top)
			_bpos.y=_limit.top;
		else if(_limit.bottom!==false && _limit.bottom<_bpos.y)
			_bpos.y=_limit.bottom;

		return _bpos;
	}//Limit
	
	/****************/
	function SetPos(e){
		if(e.pageX) {
		// gecko, webkit, presto, etc
			_bpos.x=e.pageX-_cpos.x;
			_bpos.y=e.pageY-_cpos.y;
		}else{
		// trident
			var x=event.x||document.body.scrollLeft||window.scrollX+e.clientX||0;
			var y=event.y||document.body.scrollTop||window.scrollY+e.clientY||0;
			var t=e.srcElement;
			if(t==_cont || t==_bar){
			//  スライダー内部、position:absoluteに影響
				_bpos.x=x;
				_bpos.y=y;
			}else{
			// スライダー外部
				_bpos.x=x-_cpos.x;
				_bpos.y=y-_cpos.y;
			}
		}
	}//SetPos

/**********************/
};//


/****************/
var _Slider;
if(!_Slider){
_Slider=new (function(){
	var _sld=null;
	var _cont=null;
	var _bar=null;
	/****************/
	this.start=function(o, c, b){
		_sld=o;
		_cont=c;
		_bar=b;
	};
	/****************/
	this.drag=function(e){
		var tar=e?e.target||event.srcElement:event.srcElement;
		if(!_sld)
			return true;
		
		_Slider.StopEvent(e);
		_sld.drag(e);
		return false;
	};//drag

	/****************/
	this.drop=function(e){
		var tar=e?e.target||event.srcElement:event.srcElement;
		if(!_sld)
			return false;
		_Slider.StopEvent(e);
		_Slider.Deselect();
		_sld.drop(e);
		
		_bar=_cont=_sld=null;
		return false;
	};//drop

	/****************/
	this.AddEvent;
	this.RemoveEvent;

	/****************/
	this.StopEvent=function(e){
		if(e && e.stopPropagation){
			e.stopPropagation();
			e.preventDefault();
		}
		if(window.event){
			window.event.returnValue=null;
			window.event.cancelBubble=true;
		}
	};//StopEvent

}//function
);//new

if(window.addEventListener){
	_Slider.AddEvent=function(elm, handler, func, r){
		return elm.addEventListener(handler, func, r);
	};
	_Slider.RemoveEvent=function(elm, handler, func, r){
		return elm.removeEventListener(handler, func, r);
	};
}else if(window.attachEvent){
	_Slider.AddEvent=function(elm, handler, func, r){
		return elm.attachEvent('on'+handler, func);
	};
	_Slider.RemoveEvent=function(elm, handler, func, r){
		return elm.dettachEvent('on'+handler, func);
	};
}else{
	_Slider.AddEvent=function(elm, handler, func, r){
		return null;
	};
	_Slider.RemoveEvent=function(elm, handler, func, r){
		return null;
	};
}

if(window.getSelection){
	_Slider.Deselect=function(){
		var selection = window.getSelection();
		selection.collapse(document.body, 0);
	}
}else if(document.selection && document.selection.createRange){
	_Slider.Deselect=function(){
//		var selection = document.selection.createRange();
//		selection.setEndPoint("EndToStart", selection);
//		selection.select();
	}
}




if(document.body){
	_Slider.AddEvent(document.body, 'mousemove', _Slider.drag, false);
	_Slider.AddEvent(document.body, 'mouseup', _Slider.drop, false);
}else{
	_Slider.AddEvent(window, 'load', function(){
		_Slider.AddEvent(document.body, 'mousemove', _Slider.drag, false);
		_Slider.AddEvent(document.body, 'mouseup', _Slider.drop, false);
		}, false);
}

}//if(!_Slider)


