/**
* JS layer advanced library
*
* This library provides advanced layer handling such as clipping and moving layers.
* NOTE: You must have the basic layer class (layer.lib.js) included first.
*
* @author       Alexander Rinass
* @copyright    triple-i new media system design gmbh
* @version      2.0.1
* @package      triple-i
*/

/**
* Get layer style.top attribute.
*
* @param  string  layer name
* @param  object  document of layer (optional, default is current document)
* @return mixed   top value as number (without 'px'!) or empty string
*/
function _getLayerX(name,doc) {
  if(typeof(doc)=='undefined') { var doc=document; }
  var l=_getLayer(name,doc);
  var x='';
  if(l!=null) {
    if(l.style&&(l.style.left!=null)) { x=parseInt(l.style.left); }
    else if(l.left!=null) { x=l.left; }
  }
  if(isNaN(x)) { x=''; }
  return x;
}

/**
* Get layer style.left attribute.
*
* @param  string  layer name
* @param  object  document of layer (optional, default is current document)
* @return mixed   style.left value as number (without 'px'!) or empty string
*/
function _getLayerY(name,doc) {
  if(typeof(doc)=='undefined') { var doc=document; }
  var l=_getLayer(name,doc);
  var y='';
  if(l!=null) {
    if(l.style&&(l.style.top!=null)) { y=parseInt(l.style.top); }
    else if(l.top!=null) { y=l.top; }
  }
  if(isNaN(y)) { y=''; }
  return y;
}

/**
* Get z-index of layer.
*
* @param  string  layer name
* @param  object  document of layer (optional, default is current document)
* @return mixed   z-index value as number or empty string
*/
function _getLayerZ(name,doc) {
  if(typeof(doc)=='undefined') { var doc=document; }
  var l=_getLayer(name,doc);
  var z='';
  if(l!=null) {
    if(l.style&&(l.style.zIndex!=null)) { z=l.style.zIndex; }
    else if(l.zIndex!=null) { z=l.zIndex; }
  }
  return z;
}

/**
* Get absolute horizontal position of layer.
*
* @param  string  layer name
* @param  object  document of layer (optional, default is current document)
* @return integer absolute x position or 0
*/
function _getLayerAbsX(name,doc) {
  if(typeof(doc)=='undefined') { var doc=document; }
  var l=_getLayer(name,doc);
  var x=0;
  if(l!=null) {
    if(l.offsetLeft!=null) {
      x=l.offsetLeft;
      while((l=l.offsetParent)!=null) { x+=l.offsetLeft; }
    }
    else if(l.pageX!=null) { x=l.pageX; }
  }
  return x;
}

/**
* Get absolute vertical position of layer.
*
* @param  string  layer name
* @param  object  document of layer (optional, default is current document)
* @return integer absolute y position or 0
*/
function _getLayerAbsY(name,doc) {
  if(typeof(doc)=='undefined') { var doc=document; }
  var l=_getLayer(name,doc);
  var y=0;
  if(l!=null) {
    if(l.offsetTop!=null) {
      y=l.offsetTop;
      while((l=l.offsetParent)!=null) { y+=l.offsetTop; }
    }
    else if(l.pageY!=null) y=l.pageY;
  }
  return y;
}

/**
* Set layer style.top attribute.
*
* @param  string  layer name
* @param  integer new style.top value
* @param  object  document of layer (optional, default is current document)
*/
function _setLayerX(name,x,doc) {
  if(typeof(doc)=='undefined') { var doc=document; }
  var l=_getLayer(name,doc);
  if(l!=null) {
    if(l.style&&(l.style.left!=null)) { l.style.left=x+'px'; }
    else if(l.left!=null) { l.left=x; }
  }
}

/**
* Set layer style.left attribute.
*
* @param  string  layer name
* @param  integer new style.left value
* @param  object  document of layer (optional, default is current document)
*/
function _setLayerY(name,y,doc) {
  if(typeof(doc)=='undefined') { var doc=document; }
  var l=_getLayer(name);
  if(l!=null) {
    if(l.style&&(l.style.top!=null)) { l.style.top=y+'px'; }
    else if(l.top!=null) { l.top=y; }
  }
}

/**
* Set z-index attribute.
*
* @param  string  layer name
* @param  integer new z-index value
* @param  object  document of layer (optional, default is current document)
*/
function _setLayerZ(name,z,doc) {
  if(typeof(doc)=='undefined') { var doc=document; }
  var l=_getLayer(name);
  if(l!=null) {
    if(l.style&&(l.style.zIndex!=null)) { l.style.zIndex=z; }
    else if(l.zIndex!=null) { l.zIndex=z; }
  }
}

/**
* Move layer to x,y position.
*
* @param  string  layer name
* @param  integer x-coordinate
* @param  integer y-coordinate
* @param  object  document of layer (optional, default is current document)
*/
function _moveLayerTo(name,x,y,doc) {
  if(typeof(doc)=="undefined") { var doc=document; }
  var l=_getLayer(name,doc);
  if(l!=null) {
    if(l.style&&(l.style.left!=null)) { l.style.left=x+"px"; }
    else if(l.left!=null) { l.left=x; }
    if(l.style&&(l.style.top!=null)) { l.style.top=y+"px"; }
    else if(l.top!=null) { l.top=y; }
  }
}

/**
* Move layer vertically by x px.
*
* @param  string  layer name
* @param  integer x-value
* @param  object  document of layer (optional, default is current document)
*/
function _moveLayerByX(name,x,doc) {
  if(typeof(doc)=='undefined') { var doc=document; }
  var l=_getLayer(name,doc);
  if(l!=null) {
    var lx=_getLayerX(name,doc);
    if(lx=='') { lx=0; }
    lx+=x;
    _setLayerX(name,lx,doc);
  }
}

/**
* Move layer horizontally by y px.
*
* @param  string  layer name
* @param  integer y-value
* @param  object  document of layer (optional, default is current document)
*/
function _moveLayerByY(name,y,doc) {
  if(typeof(doc)=='undefined') { var doc=document; }
  var l=_getLayer(name,doc);
  if(l!=null) {
    var ly=_getLayerY(name,doc);
    if(ly=='') { ly=0; }
    ly+=y;
    _setLayerY(name,ly,doc);
  }
}

/**
* Get layer width.
*
* @param  string  layer name
* @param  object  document of layer (optional, default is current document)
* @return integer layer width or 0
*/
function _getLayerWidth(name,doc) {
  if(typeof(doc)=='undefined') { var doc=document; }
  var l=_getLayer(name,doc);
  var w=0;
  if(l!=null) {
    if(l.style.width!=null) {
      if(l.style.width!='auto') { l.sytle.width='auto'; }
      w=l.offsetWidth;
    }
  }
  return w;
}

/**
* Get layer height.
*
* @param  string  layer name
* @param  object  document of layer (optional, default is current document)
* @return integer layer height or 0
*/
function _getLayerHeight(name,doc) {
  if(typeof(doc)=='undefined') { var doc=document; }
  var l=_getLayer(name,doc);
  var h=0;
  if(l!=null) {
        _hideLayer(name)
    if(l.style.height!=null) {
      if(l.style.height!='auto') { l.style.height='auto'; }
      h=l.offsetHeight;
    }
  }
  return h;
}

/**
* Get clipping area of layer.
*
* @param  string  layer name
* @param  object  document of layer (optional, default is current document)
* @return array   clipping rect
*/
function _getClippingArea(name,doc) {
  if(typeof(doc)=='undefined') { var doc=document; }
  var l=_getLayer(name,doc);
  var rect=new Array();
  if(l!=null) {
    if(l.style&&(l.style.clip!=null)) {
      var c=l.style.clip;
      c=c.slice(c.indexOf('(')+1,c.lastIndexOf(')'));
      c=c.split(' ');
      for(var i=0;i<c.length;i++) { rect[i]=parseInt(c[i]); }
    } else if(l.clip!=null) {
      rect[0]=l.clip.top;
      rect[1]=l.clip.right;
      rect[2]=l.clip.bottom;
      rect[3]=l.clip.left;
    }
  }
  if(isNaN(rect[0])) { rect[0]=''; }
  if(isNaN(rect[1])) { rect[1]=''; }
  if(isNaN(rect[2])) { rect[2]=''; }
  if(isNaN(rect[3])) { rect[3]=''; }
  if(rect.length==4) {
    rect['top']=rect[0];
    rect['right']=rect[1];
    rect['bottom']=rect[2];
    rect['left']=rect[3];
  } else { rect=null; }
  return rect;
}

/**
* Set clipping area of layer.
*
* @param  string  layer name
* @param  integer new clipping top value
* @param  integer new clipping right value
* @param  integer new clipping bottom value
* @param  integer new clipping left value
* @param  object  document of layer (optional, default is current document)
*/
function _setClippingArea(name,top,right,bottom,left,doc) {
  if(typeof(doc)=='undefined') { var doc=document; }
  var l=_getLayer(name,doc);
  if(l!=null) {
    if(l.style&&(l.style.clip!=null)) { l.style.clip='rect('+top+'px '+right+'px '+bottom+'px '+left+'px)'; }
    else if(l.clip!=null) {
      l.clip.top=top;
      l.clip.right=right;
      l.clip.bottom=bottom;
      l.clip.left=left;
    }
  }
}

/**
* Move clipping area vertically by x px.
*
* @param  string  layer name
* @param  integer x-value
* @param  object  document of layer (optional, default is current document)
*/
function _moveClippingAreaByX(name,x,doc) {
  if(typeof(doc)=='undefined') { var doc=document; }
  var l=_getLayer(name,doc);
  if(l!=null) {
    var cr=_getClippingArea(name);
    var top=cr['top'];
    var right=cr['right'];
    var bottom=cr['bottom'];
    var left=cr['left'];
    if(top=='') { top=0; }
    if(right=='') { right=0; }
    if(bottom=='') { bottom=0; }
    if(left=='') { left=0; }
    right+=x;
    left+=x;
    _setClippingArea(name,top,right,bottom,left);
  }
}

/**
* Move clipping area horizontally by y px.
*
* @param  string  layer name
* @param  integer y-value
* @param  object  document of layer (optional, default is current document)
*/
function _moveClippingAreaByY(name,y,doc) {
  if(typeof(doc)=='undefined') { var doc=document; }
  var l=_getLayer(name,doc);
  if(l!=null) {
    var cr=_getClippingArea(name);
    var top=cr['top'];
    var right=cr['right'];
    var bottom=cr['bottom'];
    var left=cr['left'];
    if(top=='') { top=0; }
    if(right=='') { right=0; }
    if(bottom=='') { bottom=0; }
    if(left=='') { left=0; }
    top+=y;
    bottom+=y;
    _setClippingArea(name,top,right,bottom,left);
  }
}
//eof
