//  All code by Gunni Rode | © netbureauet ARANEUM 2000 | http://www.na.dk

NA_Layer.document = new NA_Document();
NA_Layer.drag     = [];

NA_Layer.prototype.drag =
  function () {
    this.dragable = !this.dragable;
    this.relative = null;
    if (this.dragable) {
      NA_Layer.drag[this.name] = this;
      this.addHandler("mousedown", new Function("pEvent", this.name + ".dragStart(pEvent); if (NABrowser.ns) routeEvent(pEvent);"));
      this.addHandler("mouseup",   new Function("pEvent", this.name + ".dragStop(pEvent);  if (NABrowser.ns) routeEvent(pEvent);"));
			this.dragMode(false, true, true, false, 0);
      this.dragTargets = arguments;
			this.dragX      = 100;
      this.dragY      = 100;
      this.dragXRange = 250;
      this.dragYRange = 250;
		} else {
      delete NA_Layer.drag[this.name];
      this.removeHandler("mousedown");
      this.removeHandler("mouseup");
      this.dragTargets = null;
    }
  }

NA_Layer.prototype.dragMode =
  function (pGlue, pCheckX, pCheckY, pCheckZ, pZRange) {
    this.dragGlue   = (pGlue   != null) ? pGlue   : this.dragGlue;
    this.dragCheckX = (pCheckX != null) ? pCheckX : this.dragCheckX;
    this.dragCheckY = (pCheckY != null) ? pCheckY : this.dragCheckY;
    this.dragCheckZ = (pCheckZ != null) ? pCheckZ : this.dragCheckZ;
    this.depth      = (pZRange != null) ? pZRange : this.depth;
  }

NA_Layer.prototype.dragStart =
  function (pEvent) {
  	var lEvent = (NABrowser.ns) ? pEvent : NA_Layer.document.window.event;
		var lXY    = NA_Document.getXYFromEvent(lEvent, NA_Layer.document.document);
    this.dragOffsetX   = lXY[0] - this.x;
		this.dragOffsetY   = lXY[1] - this.y;
    this.dragOriginalZ = this.z;
    this.draging       = true;
		this.execureHandler && this.executeHandler("ondragstart");
		return true;
  }

NA_Layer.prototype.dragStop =
  function (pEvent) {
		this.executeHandler && this.executeHandler("ondragstop");
		for (var i = 0; i < this.dragTargets.length; i++) {
			if (this.collision(this.dragTargets[i], this.dragCheckX, this.dragCheckY, this.dragCheckZ)) {
        alert(this.dragTargets[i].name);
      }
    }
    this.draging = false;		
		return true;
  }

NA_Layer.prototype.dragMove =
  function (pX, pY, pZ) {
    this.position(pX, pY, pZ);
    if (this.dragGlue) {
      for (var i = 0; i < this.dragTargets.length; i++) {
        !this.dragTargets[i].frozen && this.collision(this.dragTargets[i], this.dragCheckX, this.dragCheckY, this.dragCheckZ) && this.dragTargets[i].position(pX + ((i+1) * this.dragOffsetX / 2), pY + ((i+1) * this.dragOffsetY / 2), pZ - 1 - i);
      }
    }
		this.executeHandler && this.executeHandler("ondrag");
	}

NA_Layer.prototype.collision =
  function (pNA_Layer, pCheckX, pCheckY, pCheckZ) {
    this.z = this.dragOriginalZ;
		return (((pCheckX) ? this.overlapX(pNA_Layer) : true) &&
            ((pCheckY) ? this.overlapY(pNA_Layer) : true) &&
            ((pCheckZ) ? this.overlapZ(pNA_Layer) : true));
  }

NA_Layer.prototype.overlapX =
  function (pNA_Layer) {
    var lClipA = this.clip();
    var lClipB = pNA_Layer.clip();
    return (this.x      + lClipA[3] <= pNA_Layer.x + lClipB[3] && this.x      + lClipA[1] >= pNA_Layer.x + lClipB[3] ||
            pNA_Layer.x + lClipB[3] <= this.x      + lClipA[3] && pNA_Layer.x + lClipB[1] >= this.x      + lClipA[3]);
  }

NA_Layer.prototype.overlapY =
  function (pNA_Layer) {
    var lClipA = this.clip();
    var lClipB = pNA_Layer.clip();
    return (this.y      + lClipA[0] <= pNA_Layer.y + lClipB[0] && this.y      + lClipA[2] >= pNA_Layer.y + lClipB[0] ||
            pNA_Layer.y + lClipB[0] <= this.y      + lClipA[0] && pNA_Layer.y + lClipB[2] >= this.y      + lClipA[0]);
  }

NA_Layer.prototype.overlapZ =
  function (pNA_Layer) {
    return (this.z >= pNA_Layer.z && this.z <= pNA_Layer.z + this.depth);
  }