// xEnableDrag r8, Copyright 2002-2007 Michael Foster (Cross-Browser.com)
// Part of X, a Cross-Browser Javascript Library, Distributed under the terms of the GNU LGPL

function xEnableDrag2(id,fS,fD,fE,x1,y1,x2,y2)
{
  var b = null; // boundary element
  if (typeof x1 != 'undefined' && !x2) {
    b = xGetElementById(x1);
  }
  xEnableDrag(id,
    function (el, x, y, ev) { // dragStart
      if (b) { // get rect from current size of ele
        x1 = xPageX(b);
        y1 = xPageY(b);
        x2 = x1 + b.offsetWidth-1;
        y2 = y1 + b.offsetHeight-1;
      }
      if (fS) fS(el, x, y, ev);
    },
    function (el, dx, dy, ev) { // drag
      var x = xPageX(el) + dx; // absolute coords of target
      var y = xPageY(el) + dy;
      var mx = ev.pageX; // absolute coords of mouse
      var my = ev.pageY;
      if  (!(x < x1 || x + el.offsetWidth > x2) && !(mx < x1 || mx > x2)) {
        //xLeft(el,(el.offsetLeft + dx));
		el.style.left = (xLeft(el) + dx) + 'px';
      }
      if (!(y < y1 || y + el.offsetHeight > y2) && !(my < y1 || my > y2)) {
		//xTop(el,(el.offsetTop + dy) );
        el.style.top = (xTop(el) + dy) + 'px';
      }
      if (fD) fD(el, dx, dy, ev);
    },
    function (el, x, y, ev) { // dragEnd
      if (fE) fE(el, x, y, ev);
    }
  );
}

function xEnableDrag(id,fS,fD,fE)
{
  var mx = 0, my = 0, el = xGetElementById(id);
  if (el && (typeof el.xDragEnabled == 'undefined' || el.xDragEnabled != true)) {
    el.xDragEnabled = true;
    xAddEventListener(el, 'mousedown', dragStart, false);
  }
  // Private Functions
  function dragStart(e)
  {
    if (el.xDragEnabled) {
      var ev = new xEvent(e);
      xPreventDefault(e);
      mx = ev.pageX;
      my = ev.pageY;
      xAddEventListener(document, 'mousemove', drag, false);
      xAddEventListener(document, 'mouseup', dragEnd, false);
      if (fS) {
        fS(el, ev.pageX, ev.pageY, ev);
      }
    }
  }
  function drag(e)
  {
    var ev, dx, dy;
    xPreventDefault(e);
    ev = new xEvent(e);
    dx = ev.pageX - mx;
    dy = ev.pageY - my;
    mx = ev.pageX;
    my = ev.pageY;
    if (fD) {
      fD(el, dx, dy, ev);
    }
    else {
      xMoveTo(el, xLeft(el) + dx, xTop(el) + dy);
    }
  }
  function dragEnd(e)
  {
    var ev = new xEvent(e);
    xPreventDefault(e);
    xRemoveEventListener(document, 'mouseup', dragEnd, false);
    xRemoveEventListener(document, 'mousemove', drag, false);
    if (fE) {
      fE(el, ev.pageX, ev.pageY, ev);
    }
    if (xEnableDrag.drop) {
      xEnableDrag.drop(el, ev);
    }
  }
}

xEnableDrag.drops = []; // static property 

function xEnableDrop(id, f)
{
  var e = xGetElementById(id);
  if (e) {
    e.xDropEnabled = true;
    xEnableDrag.drops[xEnableDrag.drops.length] = {eid:e.id, f:f};
  }
}

xEnableDrag.drop = function (el, ev) // static method
{
  var i, z, hz = 0, d = null, da = xEnableDrag.drops;
  for (i = 0; i < da.length; ++i) {
	if  (da[i] && da[i].eid)
	{
		var e = xGetElementById(da[i].eid);
	    if (e && e.xDropEnabled && xHasPoint(e, ev.pageX, ev.pageY)) {
	      z = parseInt(e.style.zIndex) || 0;
	      if (z >= hz) {
	        hz = z;
	        d = da[i];
	      } 
	    }
	}
  }
  if (d) {
	var e = xGetElementById(d.eid);
    d.f(e, el, ev.pageX, ev.pageY); // drop event
  }
} 

function xDisableDrag(id)
{
  xGetElementById(id).xDragEnabled = false;
} 

function xDisableDrop(id)
{
  xGetElementById(id).xDropEnabled = false;
} 
function xGetElementById(e) {
	if (typeof (e) == 'string') {
		if (document.getElementById) {
			e = document.getElementById(e);
		} else if (document.all) {
			e = document.all[e];
		} else {
			e = null;
		}
	}
	return e;
}
function xAddEventListener(e, eT, eL, cap) {
	if (!(e=xGetElementById(e))) {
		return;
	}
	eT = eT.toLowerCase();
	if (e.addEventListener) {
		e.addEventListener(eT, eL, cap || false);
	} else if (e.attachEvent) {
		e.attachEvent('on'+eT, eL);
	} else {
		var o = e['on'+eT];
		e['on'+eT] = typeof o == 'function' ? function (v) {
			o(v);
			eL(v);
		} : eL;
	}
}
function xDef() {
	for (var i = 0; i<arguments.length; ++i) {
		if (typeof (arguments[i]) == 'undefined') {
			return false;
		}
	}
	return true;
}
function xStr(s) {
	for (var i = 0; i<arguments.length; ++i) {
		if (typeof (arguments[i]) != 'string') {
			return false;
		}
	}
	return true;
}
function xNum() {
	for (var i = 0; i<arguments.length; ++i) {
		if (isNaN(arguments[i]) || typeof (arguments[i]) != 'number') {
			return false;
		}
	}
	return true;
}
function xGetComputedStyle(e, p, i) {
	if (!(e=xGetElementById(e))) {
		return null;
	}
	var s, v = 'undefined', dv = document.defaultView;
	
	if (dv && dv.getComputedStyle) {
	  
		s = dv.getComputedStyle(e, '');
		if (s) {
			v = s.getPropertyValue(p);
		}
	} else if (e.currentStyle) {
	  
		v = e.currentStyle[xCamelize(p)];
		if (v== 'auto'){
		  if (p == 'left')
		    v=xPageX(e);
		  if (p == 'top')
		    v=xPageY(e);
		}
	} else {
		return null;
	}
	return i ? (parseInt(v) || 0) : v;
}
function xRemoveEventListener(e, eT, eL, cap) {
	if (!(e=xGetElementById(e))) {
		return;
	}
	eT = eT.toLowerCase();
	if (e.removeEventListener) {
		e.removeEventListener(eT, eL, cap || false);
	} else if (e.detachEvent) {
		e.detachEvent('on'+eT, eL);
	} else {
		e['on'+eT] = null;
	}
}
function xPreventDefault(e) {
	if (e && e.preventDefault) {
		e.preventDefault();
	} else if (window.event) {
		window.event.returnValue = false;
	}
}
function xLeft(e, iX)
{
  if(!(e=xGetElementById(e))) return 0;
  
  var css=xDef(e.style);
  
  if (css && xStr(e.style.left)) {
    
    if(xNum(iX)){ e.style.left=iX+'px';
      
    }
    else {
      
      iX=parseInt(e.style.left);
      if(isNaN(iX)){
	iX=xGetComputedStyle(e,'left',1);
      }
      if(isNaN(iX)) {
	iX=0;
      }
    }
  }
  else if(css && xDef(e.style.pixelLeft)) {
    
    if(xNum(iX)) e.style.pixelLeft=iX;
    else iX=e.style.pixelLeft;
  }
  return iX;
}

function xTop(e, iY)
{
  if(!(e=xGetElementById(e))) return 0;
  var css=xDef(e.style);
  if(css && xStr(e.style.top)) {
    if(xNum(iY)) e.style.top=iY+'px';
    else {
      iY=parseInt(e.style.top);
      if(isNaN(iY)) iY=xGetComputedStyle(e,'top',1);
      if(isNaN(iY)) iY=0;
    }
  }
  else if(css && xDef(e.style.pixelTop)) {
    if(xNum(iY)) e.style.pixelTop=iY;
    else iY=e.style.pixelTop;
  }
  return iY;
}

function xMoveTo(e, x, y) {
	xLeft(e, x);
	xTop(e, y);
}
function xPageX(e) {
	var x = 0;
	e = xGetElementById(e);
	while (e) {
		if (xDef(e.offsetLeft)) {
			x += e.offsetLeft;
		}
		e = xDef(e.offsetParent) ? e.offsetParent : null;
	}
	return x;
}
function xPageY(e) {
	var y = 0;
	e = xGetElementById(e);
	while (e) {
		if (xDef(e.offsetTop)) {
			y += e.offsetTop;
		}
		e = xDef(e.offsetParent) ? e.offsetParent : null;
	}
	return y;
}
function xScrollLeft(e, bWin) {
	var offset = 0;
	if (!xDef(e) || bWin || e == document || e.tagName.toLowerCase() == 'html' || e.tagName.toLowerCase() == 'body') {
		var w = window;
		if (bWin && e) {
			w = e;
		}
		if (w.document.documentElement && w.document.documentElement.scrollLeft) {
			offset = w.document.documentElement.scrollLeft;
		} else if (w.document.body && xDef(w.document.body.scrollLeft)) {
			offset = w.document.body.scrollLeft;
		}
	} else {
		e = xGetElementById(e);
		if (e && xNum(e.scrollLeft)) {
			offset = e.scrollLeft;
		}
	}
	return offset;
}
function xScrollTop(e, bWin) {
	var offset = 0;
	if (!xDef(e) || bWin || e == document || e.tagName.toLowerCase() == 'html' || e.tagName.toLowerCase() == 'body') {
		var w = window;
		if (bWin && e) {
			w = e;
		}
		if (w.document.documentElement && w.document.documentElement.scrollTop) {
			offset = w.document.documentElement.scrollTop;
		} else if (w.document.body && xDef(w.document.body.scrollTop)) {
			offset = w.document.body.scrollTop;
		}
	} else {
		e = xGetElementById(e);
		if (e && xNum(e.scrollTop)) {
			offset = e.scrollTop;
		}
	}
	return offset;
}
function xWidth(e, w) {
	if (!(e=xGetElementById(e))) {
		return 0;
	}
	if (xNum(w)) {
		if (w<0) {
			w = 0;
		} else {
			w = Math.round(w);
		}
	} else {
		w = -1;
	}
	var css = xDef(e.style);
	if (e == document || e.tagName.toLowerCase() == 'html' || e.tagName.toLowerCase() == 'body') {
		w = xClientWidth();
	} else if (css && xDef(e.offsetWidth) && xStr(e.style.width)) {
		if (w>=0) {
			var pl = 0, pr = 0, bl = 0, br = 0;
			if (document.compatMode == 'CSS1Compat') {
				var gcs = xGetComputedStyle;
				pl = gcs(e, 'padding-left', 1);
				if (pl !== null) {
					pr = gcs(e, 'padding-right', 1);
					bl = gcs(e, 'border-left-width', 1);
					br = gcs(e, 'border-right-width', 1);
				} else if (xDef(e.offsetWidth, e.style.width)) {
					e.style.width = w+'px';
					pl = e.offsetWidth-w;
				}
			}
			w -= (pl+pr+bl+br);
			if (isNaN(w) || w<0) {
				return;
			} else {
				e.style.width = w+'px';
			}
		}
		w = e.offsetWidth;
	} else if (css && xDef(e.style.pixelWidth)) {
		if (w>=0) {
			e.style.pixelWidth = w;
		}
		w = e.style.pixelWidth;
	}
	return w;
}
function xHeight(e, h) {
	if (!(e=xGetElementById(e))) {
		return 0;
	}
	if (xNum(h)) {
		if (h<0) {
			h = 0;
		} else {
			h = Math.round(h);
		}
	} else {
		h = -1;
	}
	var css = xDef(e.style);
	if (e == document || e.tagName.toLowerCase() == 'html' || e.tagName.toLowerCase() == 'body') {
		h = xClientHeight();
	} else if (css && xDef(e.offsetHeight) && xStr(e.style.height)) {
		if (h>=0) {
			var pt = 0, pb = 0, bt = 0, bb = 0;
			if (document.compatMode == 'CSS1Compat') {
				var gcs = xGetComputedStyle;
				pt = gcs(e, 'padding-top', 1);
				if (pt !== null) {
					pb = gcs(e, 'padding-bottom', 1);
					bt = gcs(e, 'border-top-width', 1);
					bb = gcs(e, 'border-bottom-width', 1);
				} else if (xDef(e.offsetHeight, e.style.height)) {
					e.style.height = h+'px';
					pt = e.offsetHeight-h;
				}
			}
			h -= (pt+pb+bt+bb);
			if (isNaN(h) || h<0) {
				return;
			} else {
				e.style.height = h+'px';
			}
		}
		h = e.offsetHeight;
	} else if (css && xDef(e.style.pixelHeight)) {
		if (h>=0) {
			e.style.pixelHeight = h;
		}
		h = e.style.pixelHeight;
	}
	return h;
}
function xHasPoint(e, x, y, t, r, b, l) {
	if (!xNum(t)) {
		t = r=b=l=0;
	} else if (!xNum(r)) {
		r = b=l=t;
	} else if (!xNum(b)) {
		l = r;
		b = t;
	}
	var eX = xPageX(e), eY = xPageY(e);
	return (x>=eX+l && x<=eX+xWidth(e)-r && y>=eY+t && y<=eY+xHeight(e)-b);
}
function xEvent(evt) {
	var e = evt || window.event;
	if (!e) {
		return;
	}
	this.type = e.type;
	this.target = e.target || e.srcElement;
	this.relatedTarget = e.relatedTarget;
	/*@cc_on if(e.type=='mouseover')this.relatedTarget=e.fromElement;else if(e.type=='mouseout')this.relatedTarget=e.toElement;@*/
	if (xDef(e.pageX)) {
		this.pageX = e.pageX;
		this.pageY = e.pageY;
	} else if (xDef(e.clientX)) {
		this.pageX = e.clientX+xScrollLeft();
		this.pageY = e.clientY+xScrollTop();
	}
	if (xDef(e.offsetX)) {
		this.offsetX = e.offsetX;
		this.offsetY = e.offsetY;
	} else if (xDef(e.layerX)) {
		this.offsetX = e.layerX;
		this.offsetY = e.layerY;
	} else {
		this.offsetX = this.pageX-xPageX(this.target);
		this.offsetY = this.pageY-xPageY(this.target);
	}
	this.keyCode = e.keyCode || e.which || 0;
	this.shiftKey = e.shiftKey;
	this.ctrlKey = e.ctrlKey;
	this.altKey = e.altKey;
	if (typeof e.type == 'string') {
		if (e.type.indexOf('click') != -1) {
			this.button = 0;
		} else if (e.type.indexOf('mouse') != -1) {
			this.button = e.button;
			/*@cc_on if(e.button&1)this.button=0;else if(e.button&4)this.button=1;else if(e.button&2)this.button=2;@*/
		}
	}
}
function xCamelize(cssPropStr)
{
  var i, c, a = cssPropStr.split('-');
  var s = a[0];
  for (i=1; i<a.length; ++i) {
    c = a[i].charAt(0);
    s += a[i].replace(c, c.toUpperCase());
  }
  return s;
}

