//
//uses jz
with(jz){


	$.setOpacity= function(elem,opacity){
		var style= elem.style
		style.MozOpacity= style.khtmlOpacity= style.opacity = opacity
		style.filter="alpha(opacity="+(100*opacity)+")"
		}

	$.offsetPage= function(elem){
		var x=0, y=0, p=elem
		while (p) x+= p.offsetLeft, y+= p.offsetTop, p= p.offsetParent
		return [x,y]
		}
		
	$.offsetInfo= function(elem){
		var x=0, y=0, w=0, h=0, ref=elem, p=elem
		while (p && !((w=p.offsetWidth) && (h=p.offsetHeight))) ref=p=p.offsetParent //find first width and heigth
		while (p) x+= p.offsetLeft, y+= p.offsetTop, p= p.offsetParent
		return [x,y,w,h,ref]
		}
	
	$.findDragTarget= function(elem){
		//scan this and parents for a classname that starts with jz_drag
		var p=elem
		while (p && !(p.jz_draggable || (p.className && p.className.indexOf('jz_drag')!=-1))) p= p.parentNode
		if (p && !p.jz_draggable) initDraggable(p)
		return p
		}

	$.Drag = false
	
	$.dragStart = function(evt){
		//alert('start drag on '+evt.target+' jz_d='+evt.target.jz_draggable)
		var target= evt.target
		var dragTarget= findDragTarget(target)
		if (!dragTarget) return defDragStart(evt)

		target= dragTarget
		$.Drag = {
			target : target,
			ex: evt.clientX,
			ey: evt.clientY,
			x :	evt.clientX-(parseInt(evt.target.style.left)||0),
			y : evt.clientY-(parseInt(evt.target.style.top)||0)
			}

		var pos= getId('pos1')
		if (pos) pos.innerHTML+= 'drag start on '+target+' taget.ondragstart='+target.ondragstart+'<br/>'

		if ( Drag.target.ondragstart ) Drag.target.ondragstart.call(target,evt,'start')
		evt.preventDefault()

		}

	$.defDragStart= function(evt){ //no drag info for target normaly do nothing
		return //no default action for now ...
		var target= evt.target		
		var i= offsetInfo(target)
		var x=i[0], y=i[1], w=i[2], h=i[3]
		target= i[4]

		//if ( !(target && w && h && xy[0] && xy[1])) alert('got '+[target,w,h,xy])
		var div
		if (!$.DragDiv) {
			div= $.DragDiv= document.createElement("div")
			div.style.display='none'
			document.body.appendChild(div)
			}
		else div= $.DragDiv
		update(div.style,{
			display:'block',
			position: 'absolute',
			background: 'blue',
			top: y+'px',
			left: x+'px',
			width: Math.max(10,w)+'px',
			height: Math.max(10,h)+'px'})
		setOpacity(div,0.4)
		target= div

		$.Drag = {
			dragdiv: div,
			target : target,
			ex: evt.clientX,
			ey: evt.clientY,
			x :	evt.clientX-(parseInt(target.style.left)||0),
			y : evt.clientY-(parseInt(target.style.top)||0)
			}


		//if (Drag.target.ondragstart) Drag.target.ondragstart.call(target,evt,'start')
		evt.preventDefault()
		return
		
		}

	$.drag = function(evt){
		if (!Drag) return

		//var pos= getId('pos2')
		//pos.innerHTML+= 'dragging '+evt+'<br/>'

		if (Drag.target.ondrag) Drag.target.ondrag.call(Drag.target,evt,'drag')
		else {
			alert('ENNN def drag')
			var style=Drag.target.style
			var y=(evt.clientY-Drag.y)+'px'
			var x=(evt.clientX-Drag.x)+'px'
			style.top=y
			style.left=x
			}
		}

	$.dragEnd = function(evt){
		if (!Drag) return
		
		if (Drag.dragdiv) {
			Drag.dragdiv.style.display='none'
			}
		if (Drag.target.ondragend) Drag.target.ondragend.call(Drag.target,evt,'end')
		Drag=false
		}

	$.dragOut = function(evt){
		//var pos= getId('pos')
		//var target= evt.target
		//pos.innerHTML= 'out on '+evt.target+' doc='+(document===target)+' body='+(document.body===target)+' par='+(document.body.parent===target)+' win='+(window===target)+' bodyp='+(document.body.parentNode===target)+' par='+(document.body.parent==target)
		//return
		if (evt.target !== document.body.parentNode) return
		if (!Drag) return
		return dragEnd(evt)
		}

	addListener(window,'load',function(){
		addListener(document,'mousedown',dragStart)
		addListener(document,'mousemove',drag)
		addListener(document,'mouseup',dragEnd)
		addListener(document,'mouseout',dragOut)
		})

	$.initCallBack = function(target,callbackname){
		var attr= target.getAttribute(callbackname)
		if (typeof attr == 'function'){
			}
		else {
			if (typeof attr == 'string'){
				if (attr[0]==':') {
					attr= eval(attr.substr(1))
					}
				else {
					attr= new Function('event',attr)
					}
				}
			if (!attr) attr= false
			target[callbackname]= attr
			}
		}

	$.initDraggable= function(elem){
		elem.jz_draggable= true
		initCallBack(elem,'ondragstart')
		initCallBack(elem,'ondrag')
		initCallBack(elem,'ondragend')
		}

	$.DomClasses['draggable']= $.initDraggable

}  //close the withs 