//lightweight ui library 
// by wakufactory.jp 
//   2009/11/30 versiont 1.3
//   license BSD 

if(!jp) var jp={} ;
if(!jp.wakufactory) jp.wakufactory = {} ;

jp.wakufactory.lui = {

_ie_attach:function(obj,ev,cb) {
	var _obj = obj ;
	_obj.attachEvent("on"+ev,function() {
			var event = {
				clientX : window.event.clientX ,
				clientY : window.event.clientY ,
				pageX : window.event.clientX + document.documentElement.scrollLeft,
				pageY : window.event.clientY + document.documentElement.scrollTop,
				offsetX : window.event.offsetX ,
				offsetY : window.event.offsetY ,
				keyCode : window.event.keyCode ,
				event: window.event
			} ;
			return cb.apply(_obj,[event]) ;		
	});
}
,
addEvent:function(obj,ev,func) {
	if(obj.constructor==String || obj[0]==undefined ) obj =[obj] ;
	var _obj = [] ;
	var i ;
	for(i in obj) {
		_obj[i] = Elem(obj[i]) ;
		if(_obj[i]==null) return ;
		if(_obj[i].addEventListener) {
			_obj[i].addEventListener(ev,function(ev) {
				var event = {
					clientX : ev.clientX ,
					clientY : ev.clientY ,
					pageX : ev.pageX ,
					pageY : ev.pageY ,
					offsetX : ev.pageX - this.offsetLeft ,
					offsetY : ev.pageY - this.offsetTop ,
					keyCode : ev.keyCode ,
					event: ev
				} ;
				if(!func.apply(this,[event])) ev.preventDefault() ;
			},true) ;
		} else if(_obj[i].attachEvent) {
			this._ie_attach(_obj[i],ev,func) ;
		}
	}
},

applyEvent:function(list) {
	if(list.constructor!=Array) list =[list] ;
	for(i in list) {
		ol = list[i].OBJECT ;
		if(ol==null) continue ;
		if(ol.constructor!==Array) ol =[ol] ;
		for(o in ol) {
			for(e in list[i].EVENT) {
				jp.wakufactory.lui.addEvent(ol[o],e,list[i].EVENT[e]) ;
			}
		}
	}
},

getChildNodes:function(ol,cond,count,func) {
	var ret = [] ;
	if(typeof(ol)!='object' || typeof(ol.length)!='number') ol=[ol];
	for(o in ol) {
		var obj = ol[o] ;
		if(!obj || !obj.childNodes) continue ;
		var l = obj.childNodes ;
		for(c in l ) {
			var cobj = l[c] ;
			if(cobj.childNodes && count > 0) {
				ret = ret.concat(this.getChildNodes( cobj.childNodes,cond,count-1,func)) ;	
			}
			if(cond.tagName!=null && cobj.tagName != cond.tagName.toUpperCase() ) continue ;
			if(cond.className!=null && cobj.className != cond.className ) continue ;
			ret.push( cobj );
			if(func) func.apply(cobj,[cobj]) ;
		}
	}
	return ret ;
},

display:function(o,f) {
	o = Elem(o) ;
	if(f) {
		switch(o.tagName) {
		case 'DIV':
		case 'TABLE':
			o.style.display = "block" ;
			break ;
		case 'SPAN':
		case 'INPUT':
			o.style.display = "inline" ;
			break 
		case 'LI':	
			o.style.display = "list-item" ;
			break ;
		}
	}else {
		o.style.display = "none" ;
	}
},

is_disp:function(o) {
	o = Elem(o) ;
//	alert(o.style.display) ;
	return o.style.display != "none" ;
},

newElement:function(type,inner,attr) {
	var e = document.createElement(type) ;
	e.innerHTML = inner ;
	if(attr) 
		for(a in attr) {
			if(a == "class" || a=="className") e.className = attr[a] ;
			else if(a == "id" ) e.id = attr[a] ;
			else e.setAttribute(a,attr[a]) ;
		}
	return e ;
},

// calc element position on absolute axis
elemPos:function(obj) {
	var t = obj ;
	var x=0,y=0 ;
	while(t) {
		x += t.offsetLeft ;
		y += t.offsetTop ;
		t = t.offsetParent ;
	}
	return {x:x,y:y } ;
},

//scroll controller
scroller: function(base,dir) {
	var _base,_cont ;
	var _pos ;
	var _cellsize ;
	var _basesize ;
	var _contsize ;
	var _vertical ;
	var _cb_s, _cb_p ;

	this._base = $(base) ;	
	this._vertical =(dir=="V") ;
	this._pos = 0 ;
	var c = jp.wakufactory.lui.getChildNodes(this._base,{tagName:"div"});
	this._cont = c[0] ;
	if(this._vertical) {
		this._contsize = this._cont.offsetHeight ;
		this._basesize = this._base.offsetHeight ;
	} else {
		this._contsize = this._cont.offsetWidth ;
		this._basesize = this._base.offsetWidth ;
	}

	this.setCellSize = function(psize) {
		this._cellsize = psize ;
	}
	this.setCallback = function(onscroll,onpage) {
		this._cb_s = onscroll ;
		this._cb_p = onpage ;
	}

	this._jumpto = function(pos,force) {
		if(!force) {
			if(pos<0)pos = 0 ;
			if(this._contsize-pos < this._basesize) pos = this._contsize - this._basesize ;
			if(pos == this._pos) return ;
		}
		if(this._vertical) this._cont.style.top = -pos + "px" ;	
		else this._cont.style.left = -pos + "px" ;	
		this._pos = pos ;
		if(this._cb_s) {
			this._cb_s.apply(this,[pos]) ;
		}
		if(this._cb_p) {
			var sp = Math.floor( pos / this._cellsize) ;
			var n = Math.floor(this._basesize/this._cellsize)+1 ;
			for(var i=0;i<n;i++) {
				this._cb_p.apply(this,[sp+i]) ;
			}
		}
	}
	this.redraw = function() {
		this._jumpto(this._pos,true) ;
	}
	this.setCell = function(page) {
		var pos = page*this._cellsize ;
		this._jumpto(pos) ;
	}
	this.scrollCell = function(dir) {
		var pos = this._pos + dir*this._cellsize ;
		this._jumpto(pos) ;
	}
}

}

