/**
 * Interface Elements for jQuery
 * Draggable
 * 
 * http://interface.eyecon.ro
 * 
 * Copyright (c) 2006 Stefan Petre
 * Dual licensed under the MIT (MIT-LICENSE.txt) 
 * and GPL (GPL-LICENSE.txt) licenses.
 *   
 * $Revision: 1.1.1.1 $
 * $Log: interface_expanded.js,v $
 * Revision 1.1.1.1  2006/09/06 02:30:17  aya
 * first newsride
 *
 * Revision 1.20  2006/09/02 06:46:03  Stef
 * *** empty log message ***
 *
 * Revision 1.19  2006/09/02 06:07:18  Stef
 * *** empty log message ***
 *
 * Revision 1.18  2006/09/01 21:23:16  Stef
 * Added callbacks for onStart, onStop and onDrag
 *
 * Revision 1.17  2006/08/31 18:40:45  Stef
 * Added support for floating elements
 *
 * Revision 1.16  2006/08/31 16:08:15  Stef
 * Added dual licencing
 *
 * Revision 1.15  2006/08/28 17:02:48  Stef
 * Added support for restricted sliders
 *
 * Revision 1.14  2006/08/27 19:05:55  Stef
 * *** empty log message ***
 *
 * Revision 1.13  2006/08/26 09:23:37  Stef
 * *** empty log message ***
 *
 * Revision 1.12  2006/08/26 07:53:52  Stef
 * *** empty log message ***
 *
 * Revision 1.11  2006/08/08 04:34:49  Stef
 * Sortables: bug fixed - sortserilizer was defined as a plugin for jQuery, but is just a function.
 * Slider: added end/home key events to move the indicator to 0/100% position
 *
 * Revision 1.10  2006/08/08 04:06:39  Stef
 * Slider: key control
 *
 * Revision 1.9  2006/08/07 16:11:19  Stef
 * Sortables: fixed the accuracy overlaping the dragged item over the rest of the items in the sortable
 * General: fixed the grammar verticaly and horizontaly are now vertically and horizontally :)
 *
 * Revision 1.8  2006/08/06 17:03:15  Stef
 * Added to slider onchange callbak triggered if the indicator is moved by atleast one pixel
 *
 * Revision 1.7  2006/08/06 12:54:58  Stef
 * If the dragged element is indicator for a slider then on drag start centers the element to pointer.
 * Bug fixed: on Internet explorer if the dragged element has border and padding then the element was moved with extra pixels (borderWidthLeft + paddingLeft)
 *
 * Revision 1.6  2006/08/06 11:28:38  Stef
 * Bug fixed - when axis was defined the draggeble was reverted
 *
 * Revision 1.5  2006/08/06 11:18:35  Stef
 * Draggales
 * - new method that moves the draggable element by coordonates. The new values apply to draggable's rules (grid, container, axis)
 *
 * Slider
 * - New way of defining
 * - can start with predefined values
 * - can change the values
 *
 * Revision 1.4  2006/08/05 11:19:04  Stef
 * *** empty log message ***
 *
 * Revision 1.3  2006/08/03 21:38:41  Stef
 * *** empty log message ***
 *
 * Revision 1.2  2006/08/02 17:59:24  Stef
 * *** empty log message ***
 *
 */

jQuery.iDrag =  {
  eventsAttached : false,
  tabindex : 1000,
  helper : null,
  dragged: null,
  destroy : function()
  {
    return this.each(
      function ()
      {
        if (this.isDraggable) {
          this.dragElem = null;
          jQuery(this).unbind('mousedown', jQuery.iDrag.dragstart);
        }
      }
    );
  },
  dragstart : function(e)
  {
    if (!jQuery || jQuery.iDrag.dragged != null) {
      jQuery.iDrag.dragstop(e);
    }
    elm = this.dragElem;
    elm.dragCfg.oScr = jQuery.iUtil.getScroll();
    //this.focus();
    
    if (window.event) {
      window.event.cancelBubble = true;
      window.event.returnValue = false;
      elm.dragCfg.sx = window.event.clientX + document.documentElement.scrollLeft + document.body.scrollLeft;
      elm.dragCfg.sy = window.event.clientY + document.documentElement.scrollTop + document.body.scrollTop;
    } else {
      e.preventDefault();
      e.stopPropagation();
      elm.dragCfg.sx = e.pageX;
      elm.dragCfg.sy = e.pageY;
    }
    
    dEs = elm.style;
    elm.dragCfg.cursx = elm.dragCfg.sx;
    elm.dragCfg.cursy = elm.dragCfg.sy;
    elm.dragCfg.oD = $.css(elm,'display');
    
    elm.dragCfg.oP = $.css(elm,'position');
    elm.dragCfg.oC = jQuery.extend(
      jQuery.iUtil.getPosition(elm),
      jQuery.iUtil.getSize(elm)
    );
    elm.dragCfg.oR = {
      x : elm.offsetLeft||0,
      y : elm.offsetTop||0
    };
    /*elm.dragCfg.dX = elm.dragCfg.sx - elm.dragCfg.oC.x;
    elm.dragCfg.dY = elm.dragCfg.sy - elm.dragCfg.oC.y;*/
    elm.dragCfg.oM = jQuery.iUtil.getMargins(elm);
    
    elm.dragCfg.diffX = 0;
    elm.dragCfg.diffY = 0;
    if (jQuery.browser.msie) {
      var oldBorder = jQuery.iUtil.getBorder(elm);
      elm.dragCfg.diffX = (parseInt(oldBorder.l)||0);
      elm.dragCfg.diffY = (parseInt(oldBorder.t)||0);
    }
    
    if (elm.dragCfg.oP != 'relative' && elm.dragCfg.oP != 'absolute') {
      dEs.position = 'relative';
    }
    
    dEs.marginTop = '0px';
    dEs.marginRight = '0px';
    dEs.marginBottom = '0px';
    dEs.marginLeft = '0px';
    
    //elm.dragCfg.oF = elm.style.styleFloat||elm.style.cssFloat||jQuery.css(elm, 'float');
    
    jQuery.iDrag.helper.html('');
    
    c = elm.cloneNode(true);
  
    jQuery(c).css(
      {
        display:  'block',
        left:   '0px',
        top:    '0px'
      }
    );
    jQuery.iDrag.helper.append(c);
    
    dhs = jQuery.iDrag.helper.get(0).style;
    
    dhs.left = elm.dragCfg.oC.x - elm.dragCfg.diffX + 'px';
    dhs.top = elm.dragCfg.oC.y - elm.dragCfg.diffY + 'px';
    dhs.width = elm.dragCfg.oC.wb + 'px';
    dhs.height = elm.dragCfg.oC.hb + 'px';
    
    dhs.display = 'block';
    dhs.marginTop = '0px';
    dhs.marginRight = '0px';
    dhs.marginBottom = '0px';
    dhs.marginLeft = '0px';
    
    if (elm.dragCfg.ghosting == false) {
      dEs.display = 'none';
    }
    
    jQuery.iDrag.dragged = elm;
    jQuery.iDrag.dragged.dragCfg.prot = false;
    if (elm.dragCfg.containment) {
      if (elm.dragCfg.containment.constructor == String) {
        if (elm.dragCfg.containment == 'parent') {
          elm.dragCfg.cont = jQuery.extend(
            jQuery.iUtil.getPosition(elm.parentNode),
            jQuery.iUtil.getSize(elm.parentNode)
          );
          if (elm.dragCfg.si) {
            if (elm.SliderContainer.slideCfg.restricted ) {
              next = elm.SliderContainer.slideCfg.sliders.get(elm.SliderIteration+1);
              if (next) {
                elm.dragCfg.cont.w = parseInt($(next).css('left')) + elm.dragCfg.oC.wb;
                elm.dragCfg.cont.h = parseInt($(next).css('top')) + elm.dragCfg.oC.hb;
              }
              prev = elm.SliderContainer.slideCfg.sliders.get(elm.SliderIteration-1);
              if (prev) {
                elm.dragCfg.cont.x += parseInt($(prev).css('left'));
                elm.dragCfg.cont.y += parseInt($(prev).css('top'));
                elm.dragCfg.cont.w -= parseInt($(prev).css('left'));
                elm.dragCfg.cont.h -= parseInt($(prev).css('top'));
              }
            }
            elm.dragCfg.sx = elm.dragCfg.oC.x + elm.dragCfg.oC.wb/2;
            elm.dragCfg.sy = elm.dragCfg.oC.y + elm.dragCfg.oC.hb/2;
            elm.dragCfg.maxx = elm.dragCfg.cont.w - elm.dragCfg.oC.wb;
            elm.dragCfg.maxy = elm.dragCfg.cont.h - elm.dragCfg.oC.hb;
            if(elm.dragCfg.fractions) {
              elm.dragCfg.gx = ((elm.dragCfg.cont.w - elm.dragCfg.oC.wb)/elm.dragCfg.fractions) || 1;
              elm.dragCfg.gy = ((elm.dragCfg.cont.h - elm.dragCfg.oC.hb)/elm.dragCfg.fractions) || 1;
              elm.dragCfg.fracW = elm.dragCfg.maxx / elm.dragCfg.fractions;
              elm.dragCfg.fracH = elm.dragCfg.maxy / elm.dragCfg.fractions;
            }
            jQuery.iDrag.helper.css('cursor', 'default');
          }
        } else if (elm.dragCfg.containment == 'document') {
          clnt = jQuery.iUtil.getClient();
          elm.dragCfg.cont = {
            x : 0,
            y : 0,
            w : clnt.w,
            h : clnt.h
          };
        };
      } else if (elm.dragCfg.containment.constructor == Array && elm.dragCfg.containment.length == 4) {
        elm.dragCfg.cont = {
          x : parseInt(elm.dragCfg.containment[0]),
          y : parseInt(elm.dragCfg.containment[1]),
          w : parseInt(elm.dragCfg.containment[2]),
          h : parseInt(elm.dragCfg.containment[3])
        };
      }
      elm.dragCfg.cont.dx = elm.dragCfg.cont.x - elm.dragCfg.oC.x;
      elm.dragCfg.cont.dy = elm.dragCfg.cont.y - elm.dragCfg.oC.y;
      elm.dragCfg.onDrag.containment = jQuery.iDrag.fitToContainer;
    }
    
    if (elm.dragCfg.gx) {
      elm.dragCfg.onDrag.grid = jQuery.iDrag.snapToGrid;
    }
    if (jQuery.iDrop && jQuery.iDrop.count > 0 ){
      jQuery.iDrop.highlight();
    }
    if (elm.dragCfg.zIndex != false) {
      jQuery.iDrag.helper.css('zIndex', elm.dragCfg.zIndex);
    }
    if (elm.dragCfg.onStart)
      elm.dragCfg.onStart.apply(elm);
    if (elm.dragCfg.opacity) {
      jQuery.iDrag.helper.css('opacity', elm.dragCfg.opacity);
      if (window.ActiveXObject) {
        jQuery.iDrag.helper.css('filter', 'alpha(opacity=' + elm.dragCfg.opacity * 100 + ')');
      }
    }
    jQuery.iDrag.dragmove(e);
    return false;
  },
  
  hidehelper : function()
  {
    jQuery.iDrag.helper.empty().hide().css('opacity', 1);
    if (window.ActiveXObject) {
      jQuery.iDrag.helper.css('filter', 'alpha(opacity=100)');
    }
  },
  
  dragstop : function(e)
  {
    if (!jQuery || jQuery.iDrag.dragged == null) {
      return;
    }
    var dragged = jQuery.iDrag.dragged;
    jQuery.iDrag.dragged = null;
    if (dragged.dragCfg.so == true) {
      jQuery(dragged).css('position', dragged.dragCfg.oP);
    }
    dEs = dragged.style;
    //in dragstart the margins where reseted
    dEs.marginTop = dragged.dragCfg.oM.t;
    dEs.marginRight = dragged.dragCfg.oM.r;
    dEs.marginBottom = dragged.dragCfg.oM.b;
    dEs.marginLeft = dragged.dragCfg.oM.l;
    
    if (dragged.si) {
      jQuery.iDrag.helper.css('cursor', 'move');
    }
    
    if (dragged.dragCfg.revert == false) {
      nx = dragged.dragCfg.oR.x + ((!dragged.dragCfg.axis || dragged.dragCfg.axis == 'horizontally') ? (dragged.dragCfg.nx - dragged.dragCfg.oC.x  + dragged.dragCfg.diffX) : 0);
      ny = dragged.dragCfg.oR.y + ((!dragged.dragCfg.axis || dragged.dragCfg.axis == 'vertically') ? (dragged.dragCfg.ny - dragged.dragCfg.oC.y + dragged.dragCfg.diffY) : 0);
      if (dragged.dragCfg.fx > 0 && nx != dragged.dragCfg.oC.x && ny != dragged.dragCfg.oC.y) {
        x = new jQuery.fx(dragged,dragged.dragCfg.fx, 'left');
        y = new jQuery.fx(dragged,dragged.dragCfg.fx, 'top');
        x.custom(dragged.dragCfg.oC.x,nx);
        y.custom(dragged.dragCfg.oC.y,ny);
      } else {
        dragged.style.left = nx + 'px';
        dragged.style.top = ny + 'px';
      }
      jQuery.iDrag.hidehelper();
      if (dragged.dragCfg.ghosting == false) {
        jQuery(dragged).css('display', dragged.dragCfg.oD);
      }
    } else if (dragged.dragCfg.fx > 0) {
      dragged.dragCfg.prot = true;
      if(jQuery.iDrop && jQuery.iDrop.overzone && jQuery.iSort) {
        dh = jQuery.iUtil.getPosition(jQuery.iSort.helper.get(0));
      } else {
        dh = false;
      }
      jQuery.iDrag.helper.animate(
        {
          left : dh ? dh.x : dragged.dragCfg.oC.x,
          top : dh ? dh.y : dragged.dragCfg.oC.y
        },
        dragged.dragCfg.fx,
        function()
        {
          dragged.dragCfg.prot = false;
          if (dragged.dragCfg.ghosting == false) {
            dragged.style.display = dragged.dragCfg.oD;
          }
          jQuery.iDrag.hidehelper();
        }
      );
    } else {
      jQuery.iDrag.hidehelper();
      if (dragged.dragCfg.ghosting == false) {
        jQuery(dragged).css('display', dragged.dragCfg.oD);
      }
    }

    if (jQuery.iDrop && jQuery.iDrop.count > 0 ){
      jQuery.iDrop.checkdrop(dragged);
    }
    if (jQuery.iSort && dragged.dragCfg.so == true) {
      jQuery.iSort.check(dragged);
    }
    if (dragged.dragCfg.onChange && (nx != dragged.dragCfg.oR.x || ny != dragged.dragCfg.oR.y)){
      dragged.dragCfg.onChange.apply(dragged, dragged.dragCfg.lastSi);
    }
    if (dragged.dragCfg.onStart)
      dragged.dragCfg.onStart.apply(elm);
    
    /*if (dragged && dragged.dragCfg.prot == false) {
      if (dragged.dragCfg.ghosting == false) {
        jQuery(dragged).css('display', dragged.dragCfg.oD);
      }
      dragged = null;
    }*/
  },
  
  snapToGrid : function(x, y, dx, dy)
  {
    dx = dx != 0 ? parseInt((dx + (this.dragCfg.gx * dx/Math.abs(dx))/2)/this.dragCfg.gx) * this.dragCfg.gx : 0;
    dy = dy != 0 ? parseInt((dy + (this.dragCfg.gy * dy/Math.abs(dy))/2)/this.dragCfg.gy) * this.dragCfg.gy : 0;
    return {
      dx : dx,
      dy : dy,
      x: 0,
      y: 0
    };
  },
  
  fitToContainer : function(x, y, dx, dy)
  {
    dx = dx < this.dragCfg.cont.dx ? this.dragCfg.cont.dx : ((dx + this.dragCfg.oC.wb) > (this.dragCfg.cont.w + this.dragCfg.cont.dx) ? (this.dragCfg.cont.w + this.dragCfg.cont.dx - this.dragCfg.oC.wb) : dx );
    dy = dy < this.dragCfg.cont.dy ? this.dragCfg.cont.dy : ((dy + this.dragCfg.oC.hb) > (this.dragCfg.cont.h + this.dragCfg.cont.dy) ? (this.dragCfg.cont.h + this.dragCfg.cont.dy - this.dragCfg.oC.hb) : dy );
    return {
      dx : dx,
      dy : dy,
      x: 0,
      y: 0
    }
  },
  
  dragmove : function(e)
  {
    if (!jQuery || jQuery.iDrag.dragged == null || jQuery.iDrag.dragged.dragCfg.prot == true) {
      return;
    }
    var dragged = jQuery.iDrag.dragged;
    if (window.event) {
      dragged.dragCfg.cursx = window.event.clientX + document.documentElement.scrollLeft + document.body.scrollLeft;
      dragged.dragCfg.cursy = window.event.clientY + document.documentElement.scrollTop + document.body.scrollTop;
    } else {
      dragged.dragCfg.cursx = e.pageX;
      dragged.dragCfg.cursy = e.pageY;
    }
  
    dx = dragged.dragCfg.cursx - dragged.dragCfg.sx;
    dy = dragged.dragCfg.cursy - dragged.dragCfg.sy;
    
    
    /*if (dragged.dragCfg.onDrag) {
      newCoords = dragged.dragCfg.onDrag.apply(dragged, [nx, ny]);
      if (newCoords.constructor == Object) {
        dx = newCoords.x - dragged.dragCfg.oR.x;
        dy = newCoords.y - dragged.dragCfg.oR.y;
      }
    }
  
    if (dragged.dragCfg.gx) {
      dx = (parseInt((dx + (dragged.dragCfg.gx * dx/Math.abs(dx))/2)/dragged.dragCfg.gx) || 0) * dragged.dragCfg.gx;
      dy = (parseInt((dy + (dragged.dragCfg.gy * dy/Math.abs(dy))/2)/dragged.dragCfg.gy) || 0) * dragged.dragCfg.gy;
    }
    if (dragged.dragCfg.cont) {
      dx = dx < dragged.dragCfg.cont.dx ? dragged.dragCfg.cont.dx : ((dx + dragged.dragCfg.oC.wb) > (dragged.dragCfg.cont.w + dragged.dragCfg.cont.dx) ? (dragged.dragCfg.cont.w + dragged.dragCfg.cont.dx - dragged.dragCfg.oC.wb) : dx );
      dy = dy < dragged.dragCfg.cont.dy ? dragged.dragCfg.cont.dy : ((dy + dragged.dragCfg.oC.hb) > (dragged.dragCfg.cont.h + dragged.dragCfg.cont.dy) ? (dragged.dragCfg.cont.h + dragged.dragCfg.cont.dy - dragged.dragCfg.oC.hb) : dy );
    }*/
    
    for (i in dragged.dragCfg.onDrag) {
      nx = dragged.dragCfg.oR.x + dx;
      ny = dragged.dragCfg.oR.y + dy;
      newCoords = dragged.dragCfg.onDrag[i].apply(dragged, [nx, ny, dx, dy]);
      if (newCoords.constructor == Object) {
        dx = i != 'user' ? newCoords.dx : (newCoords.x - dragged.dragCfg.oR.x);
        dy = i != 'user' ? newCoords.dy : (newCoords.y - dragged.dragCfg.oR.y);
      }
    }
    
    dragged.dragCfg.nx = dragged.dragCfg.oC.x + dx - dragged.dragCfg.diffX;
    dragged.dragCfg.ny = dragged.dragCfg.oC.y + dy - dragged.dragCfg.diffY;
    
    if (dragged.dragCfg.si && (dragged.dragCfg.onSlide || dragged.dragCfg.onChange)) {
      x = dx - dragged.dragCfg.cont.dx;
      y = dy - dragged.dragCfg.cont.dy;
      if (dragged.dragCfg.fractions) {
          xfrac = parseInt(x/dragged.dragCfg.fracW);
          xproc = xfrac * 100 / dragged.dragCfg.fractions;
          yfrac = parseInt(y/dragged.dragCfg.fracH);
          yproc = yfrac * 100 / dragged.dragCfg.fractions;
      } else {
        xproc = parseInt(x * 100 / dragged.dragCfg.maxx);
        yproc = parseInt(y * 100 / dragged.dragCfg.maxy);
      }
      dragged.dragCfg.lastSi = [xproc||0, yproc||0, x||0, y||0];
      if (dragged.dragCfg.onSlide)
        dragged.dragCfg.onSlide.apply(dragged, dragged.dragCfg.lastSi);
    }
    
    if (!dragged.dragCfg.axis || dragged.dragCfg.axis == 'horizontally')
      jQuery.iDrag.helper.get(0).style.left = dragged.dragCfg.nx + 'px';
    if (!dragged.dragCfg.axis || dragged.dragCfg.axis == 'vertically')
      jQuery.iDrag.helper.get(0).style.top = dragged.dragCfg.ny + 'px';
    
    if (jQuery.iDrop && jQuery.iDrop.count > 0 ){
      jQuery.iDrop.checkhover();
    }
  },
  
  dragmoveByKey : function (e)
  {
    if (window.event) {
      window.event.cancelBubble = true;
      window.event.returnValue = false;
    } else {
      e.preventDefault();
      e.stopPropagation();
    }
    pressedKey = e.charCode || e.keyCode || -1;
    
    switch (pressedKey)
    {
      //end
      case 35:
        jQuery.iDrag.dragmoveBy(this.dragElem, [2000, 2000] );
      break;
      //home
      case 36:
        jQuery.iDrag.dragmoveBy(this.dragElem, [-2000, -2000] );
      break;
      //left
      case 37:
        jQuery.iDrag.dragmoveBy(this.dragElem, [-this.dragElem.dragCfg.gx||-1, 0] );
      break;
      //up
      case 38:
        jQuery.iDrag.dragmoveBy(this.dragElem, [0, -this.dragElem.dragCfg.gy||-1] );
      break;
      //right
      case 39:
        jQuery.iDrag.dragmoveBy(this.dragElem, [this.dragElem.dragCfg.gx||1, 0] );
      break;
      //down;
      case 40:
        jQuery.iDrag.dragmoveBy(this.dragElem, [0, this.dragElem.dragCfg.gy||1] );
      break;
    }
  },
  
  dragmoveBy : function (elm, position) 
  {
    if (!elm.dragCfg) {
      return;
    }
    //elm.dragCfg.oC = jQuery.iUtil.getPos(elm);
    elm.dragCfg.oC = jQuery.extend(
      jQuery.iUtil.getPosition(elm),
      jQuery.iUtil.getSize(elm)
    );
    elm.dragCfg.oR = {
      x : parseInt(jQuery.css(elm, 'left'))||0,
      y : parseInt(jQuery.css(elm, 'top'))||0
    };
    
    elm.dragCfg.oP = jQuery.css(elm, 'position');
    if (elm.dragCfg.oP != 'relative' && elm.dragCfg.oP != 'absolute') {
      elm.style.position = 'relative';
    }
    
    
    if (elm.dragCfg.containment) {
      if (elm.dragCfg.containment.constructor == String) {
        if (elm.dragCfg.containment == 'parent') {
          elm.dragCfg.cont = jQuery.extend(
            {x:0,y:-0},
            jQuery.iUtil.getSize(elm.parentNode)
          );
          if (elm.dragCfg.si) {
            elm.dragCfg.maxx = elm.dragCfg.cont.w - elm.dragCfg.oC.wb;
            elm.dragCfg.maxy = elm.dragCfg.cont.h - elm.dragCfg.oC.hb;
            if (elm.SliderContainer && elm.SliderContainer.slideCfg.restricted ) {
              next = elm.SliderContainer.slideCfg.sliders.get(elm.SliderIteration+1);
              if (next) {
                elm.dragCfg.cont.w = parseInt($(next).css('left')) + elm.dragCfg.oC.wb;
                elm.dragCfg.cont.h = parseInt($(next).css('top')) + elm.dragCfg.oC.hb;
              }
              prev = elm.SliderContainer.slideCfg.sliders.get(elm.SliderIteration-1);
              if (prev) {
                elm.dragCfg.cont.x += parseInt($(prev).css('left'));
                elm.dragCfg.cont.y += parseInt($(prev).css('top'));
                elm.dragCfg.cont.w -= parseInt($(prev).css('left'));
                elm.dragCfg.cont.h -= parseInt($(prev).css('top'));
              }
            }
            if(elm.dragCfg.fractions) {
              elm.dragCfg.gx = ((elm.dragCfg.cont.w - elm.dragCfg.oC.wb)/elm.dragCfg.fractions) || 1;
              elm.dragCfg.gy = ((elm.dragCfg.cont.h - elm.dragCfg.oC.hb)/elm.dragCfg.fractions) || 1;
              elm.dragCfg.fracW = elm.dragCfg.maxx / elm.dragCfg.fractions;
              elm.dragCfg.fracH = elm.dragCfg.maxy / elm.dragCfg.fractions;
            }
            jQuery.iDrag.helper.css('cursor', 'default');
          }
        } else if (elm.dragCfg.containment == 'document') {
          clnt = jQuery.iUtil.getClient();
          elm.dragCfg.cont = {
            x : 0,
            y : 0,
            w : clnt.w,
            h : clnt.h
          };
        };
      } else if (elm.dragCfg.containment.constructor == Array && elm.dragCfg.containment.length == 4) {
        elm.dragCfg.cont = {
          x : parseInt(elm.dragCfg.containment[0]),
          y : parseInt(elm.dragCfg.containment[1]),
          w : parseInt(elm.dragCfg.containment[2]),
          h : parseInt(elm.dragCfg.containment[3])
        };
      }
      elm.dragCfg.cont.dx = elm.dragCfg.cont.x - elm.dragCfg.oC.x;
      elm.dragCfg.cont.dy = elm.dragCfg.cont.y - elm.dragCfg.oC.y;
    }
    
    
    dx = parseInt(position[0]) || 0;
    dy = parseInt(position[1]) || 0;
    if (elm.dragCfg.gx) {
      dx = (parseInt((dx + (elm.dragCfg.gx * dx/Math.abs(dx))/2)/elm.dragCfg.gx) || 0) * elm.dragCfg.gx;
      dy = (parseInt((dy + (elm.dragCfg.gy * dy/Math.abs(dy))/2)/elm.dragCfg.gy) || 0) * elm.dragCfg.gy;
    }
    rx = elm.dragCfg.oR.x + dx;
    ry = elm.dragCfg.oR.y + dy;
    if (elm.dragCfg.cont) {
      rx = rx < elm.dragCfg.cont.x ? elm.dragCfg.cont.x : ((rx + elm.dragCfg.oC.wb) > elm.dragCfg.cont.w ? (elm.dragCfg.cont.w - elm.dragCfg.oC.wb) : rx );
      ry = ry < elm.dragCfg.cont.y ? elm.dragCfg.cont.y : ((ry + elm.dragCfg.oC.hb) > elm.dragCfg.cont.h ? (elm.dragCfg.cont.h - elm.dragCfg.oC.hb) : ry );
    }
        
    if (elm.dragCfg.si && (elm.dragCfg.onSlide || elm.dragCfg.onChange)) {
      x = rx;
      y = ry;
      if (elm.dragCfg.fractions) {
          xfrac = parseInt(x/elm.dragCfg.fracW);
          xproc = xfrac * 100 / elm.dragCfg.fractions;
          yfrac = parseInt(y/elm.dragCfg.fracH);
          yproc = yfrac * 100 / elm.dragCfg.fractions;
      } else {
        xproc = parseInt(x * 100 / elm.dragCfg.maxx);
        yproc = parseInt(y * 100 / elm.dragCfg.maxy);
      }
      elm.dragCfg.lastSi = [xproc||0, yproc||0, x||0, y||0];
      if (elm.dragCfg.onSlide)
        elm.dragCfg.onSlide.apply(jQuery.iDrag.dragged, elm.dragCfg.lastSi);
      
    }
    nx = !elm.dragCfg.axis || elm.dragCfg.axis == 'horizontally' ? rx : elm.dragCfg.oR.x;
    ny = !elm.dragCfg.axis || elm.dragCfg.axis == 'vertically' ? ry : elm.dragCfg.oR.y;
    elm.style.left = nx + 'px';
    elm.style.top = ny + 'px';
  },
  
  
  build : function(o)
  {
    if (!jQuery.iDrag.eventsAttached) {
      jQuery('body').bind('mousemove', jQuery.iDrag.dragmove).bind('mouseup', jQuery.iDrag.dragstop);
      jQuery.iDrag.eventsAttached = true;
    }
    if (!jQuery.iDrag.helper) {
      jQuery('body',document).append('<div id="dragHelper"></div>');
      jQuery.iDrag.helper = jQuery('#dragHelper');
      el = jQuery.iDrag.helper.get(0);
      els = el.style;
      els.position = 'absolute';
      els.display = 'none';
      els.cursor = 'move';
      els.listStyle = 'none';
      els.overflow = 'hidden';
      if (window.ActiveXObject) {
        el.onselectstart = function(){return false;};
        el.ondragstart = function(){return false;};
      }
    }
    if (!o) {
      o = {};
    }
    return this.each(
      function()
      {
        if (this.isDraggable && !jQuery.iUtil)
          return;
        if (window.ActiveXObject) {
          this.onselectstart = function(){return false;};
          this.ondragstart = function(){return false;};
        }
        var dhe = o.handle ? jQuery(this).find(o.handle) : jQuery(this);
        this.dragCfg = {
          revert : o.revert ? true : false,
          ghosting : o.ghosting ? true : false,
          so : o.so ? o.so : false,
          si : o.si ? o.si : false,
          zIndex : o.zIndex ? parseInt(o.zIndex)||0 : false,
          opacity : o.opacity ? parseFloat(o.opacity) : false,
          fx : parseInt(o.fx)||null,
          hpc : o.hpc ? o.hpc : false,
          onDrag : {},
          onStart : o.onStart && o.onStart.constructor == Function ? o.onStart : false,
          onStop : o.onStart && o.onStart.constructor == Function ? o.onStop : false,
          axis : /vertically|horizontally/.test(o.axis) ? o.axis : false
          
        };
        if (o.onDrag && o.onDrag.constructor == Function)
          this.dragCfg.onDrag.user = o.onDrag;
        if (o.containment && ((o.containment.constructor == String && (o.containment == 'parent' || o.containment == 'document')) || (o.containment.constructor == Array && o.containment.length == 4) )) {
          this.dragCfg.containment = o.containment;
        }
        if(o.fractions) {
          this.dragCfg.fractions = o.fractions;
        }
        if(o.grid){
          if(typeof o.grid == 'number'){
            this.dragCfg.gx = parseInt(o.grid)||1;
            this.dragCfg.gy = parseInt(o.grid)||1;
          } else if (o.grid.length == 2) {
            this.dragCfg.gx = parseInt(o.grid[0])||1;
            this.dragCfg.gy = parseInt(o.grid[1])||1;
          }
        }
        if (o.onSlide && o.onSlide.constructor == Function) {
          this.dragCfg.onSlide = o.onSlide;
        }
        if (o.onChange && o.onChange.constructor == Function) {
          this.dragCfg.onChange = o.onChange;
        }
        this.isDraggable = true;
        dhe.get(0).dragElem = this;
        dhe.bind('mousedown', jQuery.iDrag.dragstart);
        if (this.dragCfg.si != false) {
          dhe.keydown(jQuery.iDrag.dragmoveByKey);
          dhe.attr('tabindex',jQuery.iDrag.tabindex++);
            
        }   
      }
    )
  }
};

jQuery.fn.extend(
  {
    DraggableDestroy : jQuery.iDrag.destroy,
    Draggable : jQuery.iDrag.build
  }
);/**
 * Interface Elements for jQuery
 * Droppables
 * 
 * http://interface.eyecon.ro
 * 
 * Copyright (c) 2006 Stefan Petre
 * Dual licensed under the MIT (MIT-LICENSE.txt) 
 * and GPL (GPL-LICENSE.txt) licenses.
 *   
 * $Revision: 1.1.1.1 $
 * $Log: interface_expanded.js,v $
 * Revision 1.1.1.1  2006/09/06 02:30:17  aya
 * first newsride
 *
 * Revision 1.5  2006/08/31 16:08:15  Stef
 * Added dual licencing
 *
 * Revision 1.4  2006/08/27 19:05:55  Stef
 * *** empty log message ***
 *
 * Revision 1.3  2006/08/26 07:53:52  Stef
 * *** empty log message ***
 *
 * Revision 1.2  2006/08/02 17:59:24  Stef
 * *** empty log message ***
 *
 */

jQuery.iDrop = {
  fit : function (zonex, zoney, zonew, zoneh)
  {
    return  zonex <= jQuery.iDrag.dragged.dragCfg.nx && 
        (zonex + zonew) >= (jQuery.iDrag.dragged.dragCfg.nx + jQuery.iDrag.dragged.dragCfg.oC.w) &&
        zoney <= jQuery.iDrag.dragged.dragCfg.ny && 
        (zoney + zoneh) >= (jQuery.iDrag.dragged.dragCfg.ny + jQuery.iDrag.dragged.dragCfg.oC.h) ? true :false;
  },
  intersect : function (zonex, zoney, zonew, zoneh)
  {
    return  ! ( zonex > (jQuery.iDrag.dragged.dragCfg.nx + jQuery.iDrag.dragged.dragCfg.oC.w)
        || (zonex + zonew) < jQuery.iDrag.dragged.dragCfg.nx 
        || zoney > (jQuery.iDrag.dragged.dragCfg.ny + jQuery.iDrag.dragged.dragCfg.oC.h) 
        || (zoney + zoneh) < jQuery.iDrag.dragged.dragCfg.ny
        ) ? true :false;
  },
  pointer : function (zonex, zoney, zonew, zoneh)
  {
    return  zonex < jQuery.iDrag.dragged.dragCfg.cursx
        && (zonex + zonew) > jQuery.iDrag.dragged.dragCfg.cursx 
        && zoney < jQuery.iDrag.dragged.dragCfg.cursy 
        && (zoney + zoneh) > jQuery.iDrag.dragged.dragCfg.cursy
        ? true :false;
  },
  overzone : false,
  highlighted : {},
  count : 0,
  zones : {},
  
  highlight : function ()
  {
    if (jQuery.iDrag.dragged == null) {
      return;
    }
    var i;
    jQuery.iDrop.highlighted = {};
    for (i in jQuery.iDrop.zones) {
      if (jQuery.iDrop.zones[i] != null) {
        iEL = jQuery.iDrop.zones[i].get(0);
        if (jQuery.className.has(jQuery.iDrag.dragged,iEL.dropCfg.a)) {
          if (iEL.dropCfg.m == false) {
            iEL.dropCfg.p = jQuery.extend(
              jQuery.iUtil.getPosition(iEL),
              jQuery.iUtil.getSize(iEL)
            );//jQuery.iUtil.getPos(iEL);
            iEL.dropCfg.m = true;
          }
          if (iEL.dropCfg.ac) {
            jQuery.iDrop.zones[i].addClass(iEL.dropCfg.ac);
          }
          iEL.dropCfg.drug = true;
          jQuery.iDrop.highlighted[i] = jQuery.iDrop.zones[i];
          if (jQuery.iSort && jQuery.iDrag.dragged.dragCfg.so) {
            iEL.dropCfg.el = jQuery('.' + iEL.dropCfg.a, iEL);
            jQuery.iSort.measure(iEL);
          }
        }
      }
    }
    if (jQuery.iSort && jQuery.iDrag.dragged.dragCfg.so) {
      jQuery.iSort.start();
    }
  },
  
  checkhover : function ()
  {
    if (jQuery.iDrag.dragged == null) {
      return;
    }
    jQuery.iDrop.overzone = false;
    var i;
    for (i in jQuery.iDrop.highlighted)
    {
      iEL = jQuery.iDrop.highlighted[i].get(0);
      if ( 
          jQuery.iDrop.overzone == false
           && 
           jQuery.iDrop[iEL.dropCfg.t](
            iEL.dropCfg.p.x, 
            iEL.dropCfg.p.y, 
            iEL.dropCfg.p.wb, 
            iEL.dropCfg.p.hb
          ) 
        ) {
        if (iEL.dropCfg.hc) {
          jQuery.iDrop.highlighted[i].addClass(iEL.dropCfg.hc);
          jQuery.iDrop.highlighted[i].removeClass(iEL.dropCfg.ac);
        }
        iEL.dropCfg.h = true;
        jQuery.iDrop.overzone = iEL;
        if(jQuery.iSort && jQuery.iDrag.dragged.dragCfg.so) {
          jQuery.iSort.checkhover(iEL);
        }
      } else {
        if (iEL.dropCfg.hc) {
          jQuery.iDrop.highlighted[i].removeClass(iEL.dropCfg.hc);
          jQuery.iDrop.highlighted[i].addClass(iEL.dropCfg.ac);
        }
        iEL.dropCfg.h = false;
      }
    }
    if (jQuery.iSort && jQuery.iDrop.overzone == false) {
      jQuery.iSort.helper.get(0).style.display = 'none';
      jQuery('body').append(jQuery.iSort.helper.get(0));
    }
  },
  checkdrop : function (e)
  {
    var i;
    for (i in jQuery.iDrop.highlighted) {
      iEL = jQuery.iDrop.highlighted[i].get(0);
      if (iEL.dropCfg.ac) {
        jQuery.iDrop.highlighted[i].removeClass(iEL.dropCfg.ac);
      }
      if (iEL.dropCfg.hc) {
        jQuery.iDrop.highlighted[i].removeClass(iEL.dropCfg.hc);
      }
      if(iEL.dropCfg.s) {
        jQuery.iSort.changed[jQuery.iSort.changed.length] = i;
      }
      if (iEL.dropCfg.ondrop && iEL.dropCfg.h == true) {
        iEL.dropCfg.ondrop.apply(iEL, [e, iEL.dropCfg.fx]);
      }
      iEL.dropCfg.drug = false;
      iEL.dropCfg.m = false;
      iEL.dropCfg.h  = false;
    }
    jQuery.iDrop.highlighted = {};
  },
  destroy : function()
  {
    return this.each(
      function()
      {
        if (this.isDroppable) {
          if (this.dropCfg.s) {
            id = jQuery.attr(this,'id');
            jQuery.iSort.collected[id] = null;
            jQuery('.' + this.dropCfg.a, this).DraggableDestroy();
          }
          jQuery.iDrop.zones['d' + this.idsa] = null;
          this.isDroppable = false;
          this.f = null;
        }
      }
    );
  },
  build : function (o)
  {
    return this.each(
      function()
      {
        if (this.isDroppable == true || !o.accept || !jQuery.iUtil || !jQuery.iDrag){
          return;
        }
        this.dropCfg = {
          a : o.accept,
          ac: o.activeclass, 
          hc: o.hoverclass,
          ondrop: o.ondrop,
          t: o.tolerance && ( o.tolerance == 'fit' || o.tolerance == 'intersect') ? o.tolerance : 'pointer',
          fx: o.fx ? o.fx : false,
          m: false,
          h: false
        };
        if (o.sortable == true && jQuery.iSort) {
          id = jQuery.attr(this,'id');
          jQuery.iSort.collected[id] = this.dropCfg.a;
          this.dropCfg.s = true;
          if(o.onchange) {
            this.dropCfg.onchange = o.onchange;
            this.dropCfg.os = jQuery.iSort.serialize(id).hash;
          }
        }
        this.isDroppable = true;
        this.idsa = parseInt(Math.random() * 10000);
        jQuery.iDrop.zones['d' + this.idsa] = jQuery(this);
        jQuery.iDrop.count ++;
      }
    );
  }
};

jQuery.fn.extend(
  {
    DroppableDestroy : jQuery.iDrop.destroy,
    Droppable : jQuery.iDrop.build
  }
);/**
 * Interface Elements for jQuery
 * FX
 * 
 * http://interface.eyecon.ro
 * 
 * Copyright (c) 2006 Stefan Petre
 * Dual licensed under the MIT (MIT-LICENSE.txt) 
 * and GPL (GPL-LICENSE.txt) licenses.
 *   
 * $Revision: 1.1.1.1 $
 * $Log: interface_expanded.js,v $
 * Revision 1.1.1.1  2006/09/06 02:30:17  aya
 * first newsride
 *
 * Revision 1.10  2006/09/01 21:23:51  Stef
 * Fixed geting the sizes of the lement to wrap
 *
 * Revision 1.9  2006/08/31 16:08:15  Stef
 * Added dual licencing
 *
 * Revision 1.8  2006/08/29 18:46:32  Stef
 * Changed the way fx wrapper is destoyed. first apply old style, then move element
 *
 * Revision 1.7  2006/08/27 19:05:55  Stef
 * *** empty log message ***
 *
 * Revision 1.6  2006/08/26 09:34:47  Stef
 * *** empty log message ***
 *
 * Revision 1.5  2006/08/26 09:31:11  Stef
 * *** empty log message ***
 *
 * Revision 1.4  2006/08/26 09:02:56  Stef
 * Added modified fx function from jQuery 1.0
 *
 * Revision 1.3  2006/08/03 21:38:41  Stef
 * *** empty log message ***
 *
 * Revision 1.2  2006/08/02 17:59:24  Stef
 * *** empty log message ***
 *
 */

//overwrite jQuery's default fx function with the new one to support diferent transitions
jQuery.fx = function( elem, options, prop, transition ){

  var z = this;

  z.transition = /easein|easeout|easeboth|bouncein|bounceout|bounceboth|elasticin|elasticout|elasticboth/.test(transition) ? transition : 'original';
  // The users options
  z.o = {
    duration: options.duration || 400,
    complete: options.complete,
    step: options.step
  };

  // The element
  z.el = elem;

  // The styles
  var y = z.el.style;

  // Simple function for setting a style value
  z.a = function(){
    if ( options.step )
      options.step.apply( elem, [ z.now ] );

    if ( prop == "opacity" ) {
      if (z.now == 1) z.now = 0.9999;
      if (window.ActiveXObject)
        y.filter = "alpha(opacity=" + z.now*100 + ")";
      else
        y.opacity = z.now;

    // My hate for IE will never die
    } else if ( parseInt(z.now) )
      y[prop] = parseInt(z.now) + "px";
      
    y.display = "block";
  };

  // Figure out the maximum number to run to
  z.max = function(){
    return parseFloat( jQuery.css(z.el,prop) );
  };

  // Get the current size
  z.cur = function(){
    var r = parseFloat( jQuery.curCSS(z.el, prop) );
    return r && r > -10000 ? r : z.max();
  };

  // Start an animation from one number to another
  z.custom = function(from,to){
    z.startTime = (new Date()).getTime();
    z.now = from;
    z.a();

    z.timer = setInterval(function(){
      z.step(from, to);
    }, 13);
  };

  // Simple 'show' function
  z.show = function( p ){
    if ( !z.el.orig ) z.el.orig = {};

    // Remember where we started, so that we can go back to it later
    z.el.orig[prop] = this.cur();

    z.custom( 0, z.el.orig[prop] );

    // Stupid IE, look what you made me do
    if ( prop != "opacity" )
      y[prop] = "1px";
  };

  // Simple 'hide' function
  z.hide = function(){
    if ( !z.el.orig ) z.el.orig = {};

    // Remember where we started, so that we can go back to it later
    z.el.orig[prop] = this.cur();

    z.o.hide = true;

    // Begin the animation
    z.custom(z.el.orig[prop], 0);
  };

  // IE has trouble with opacity if it does not have layout
  if ( jQuery.browser.msie && !z.el.currentStyle.hasLayout )
    y.zoom = "1";

  // Remember  the overflow of the element
  if ( !z.el.oldOverlay )
    z.el.oldOverflow = jQuery.css( z.el, "overflow" );

  // Make sure that nothing sneaks out
  y.overflow = "hidden";

  // Each step of an animation
  z.step = function(firstNum, lastNum){
    var t = (new Date()).getTime();

    if (t > z.o.duration + z.startTime) {
      // Stop the timer
      clearInterval(z.timer);
      z.timer = null;

      z.now = lastNum;
      z.a();
      if (z.el.curAnim)
        z.el.curAnim[ prop ] = true;
      
      var done = true;
      for ( var i in z.el.curAnim ) {
        if ( z.el.curAnim[i] !== true )
          done = false;
      }
          
      if ( done ) {
        // Reset the overflow
        y.overflow = z.el.oldOverflow;
      
        // Hide the element if the "hide" operation was done
        if ( z.o.hide ) 
          y.display = 'none';
        
        // Reset the property, if the item has been hidden
        if ( z.o.hide ) {
          for ( var p in z.el.curAnim ) {
            y[ p ] = z.el.orig[p] + ( p == "opacity" ? "" : "px" );

            // set its height and/or width to auto
            if ( p == 'height' || p == 'width' )
              jQuery.setAuto( z.el, p );
          }
        }
      }
      
      // If a callback was provided, execute it
      if( done && z.o.complete && z.o.complete.constructor == Function )
        // Execute the complete function
        z.o.complete.apply( z.el );
    } else {
      var n = t - this.startTime;
      // Figure out where in the animation we are and set the number
      //var p = (t - this.startTime) / z.o.duration;
      var p = n / z.o.duration;
      //z.now = ((-Math.cos(p*Math.PI)/2) + 0.5) * (lastNum-firstNum) + firstNum;
      z.now = jQuery.fx.transitions(p, n, firstNum, (lastNum-firstNum), z.o.duration, z.transition);

      // Perform the next step of the animation
      z.a();
    }
  };  
};

jQuery.fxCheckTag = function(e)
{
  if (/tr|td|tbody|caption|thead|tfoot|col|colgroup|th|body|header|script|frame|frameset|option|optgroup|meta/i.test(e.nodeName) )
    return false;
  else 
    return true;
};
jQuery.fx.destroyWrapper = function(e, old)
{
  c = e.firstChild;
  cs = c.style;
  cs.position = old.position;
  cs.marginTop = old.margins.t;
  cs.marginLeft = old.margins.l;
  cs.marginBottom = old.margins.b;
  cs.marginRight = old.margins.r;
  cs.top = old.top + 'px';
  cs.left = old.left + 'px';
  e.parentNode.insertBefore(c, e);
  e.parentNode.removeChild(e);
};
jQuery.fx.buildWrapper = function(e)
{
  if (!jQuery.fxCheckTag(e))
    return false;
  var t = jQuery(e);
  var es = e.style;
  var restoreStyle = false;
  oldStyle = {};
  oldStyle.position = t.css('position');
  oldStyle.sizes = jQuery.iUtil.getSize(e);
  oldStyle.margins = jQuery.iUtil.getMargins(e);
  if (t.css('display') == 'none') {
    oldVisibility = t.css('visibility');
    t.show();
    restoreStyle = true;
  }
  oldStyle.top = parseInt(t.css('top'))||0;
  oldStyle.left = parseInt(t.css('left'))||0;
  if (restoreStyle) {
    t.hide();
    es.visibility = oldVisibility;
  }
  var wid = 'w_' + parseInt(Math.random() * 10000);
  var wr = document.createElement(/img|br|input|hr|select|textarea|object|iframe|button|form|table|ul|dl|ol/i.test(e.nodeName) ? 'div' : e.nodeName);
  jQuery.attr(wr,'id', wid);
  jQuery(wr).addClass('fxWrapper');
  var wrs = wr.style;
  var top = 0;
  var left = 0;
  if (oldStyle.position == 'relative' || oldStyle.position == 'absolute'){
    top = oldStyle.top;
    left = oldStyle.left;
  }
  
  wrs.top = top + 'px';
  wrs.left = left + 'px';
  wrs.position = oldStyle.position != 'relative' && oldStyle.position != 'absolute' ? 'relative' : oldStyle.position;
  wrs.height = oldStyle.sizes.hb + 'px';
  wrs.width = oldStyle.sizes.wb + 'px';
  wrs.marginTop = oldStyle.margins.t;
  wrs.marginRight = oldStyle.margins.r;
  wrs.marginBottom = oldStyle.margins.b;
  wrs.marginLeft = oldStyle.margins.l;
  wrs.overflow = 'hidden';
  if (jQuery.browser == "msie") {
    es.filter = "alpha(opacity=" + 0.999*100 + ")";
  }
  es.opacity = 0.999;
  //t.wrap(wr);
  e.parentNode.insertBefore(wr, e);
  wr.appendChild(e);
  es.marginTop = '0px';
  es.marginRight = '0px';
  es.marginBottom = '0px';
  es.marginLeft = '0px';
  es.position = 'absolute';
  es.listStyle = 'none';
  es.top = '0px';
  es.left = '0px';
  return {oldStyle:oldStyle, wrapper:jQuery(wr)};
};
jQuery.fx.transitions = function(p, n, firstNum, delta, duration, type)
{
  if (type == 'original') {
    return ((-Math.cos(p*Math.PI)/2) + 0.5) * delta + firstNum;
  }
  if (type == 'easein') {
    return delta*(n/=duration)*n*n + firstNum;
  }
  if (type == 'easeout') {
    return -delta * ((n=n/duration-1)*n*n*n - 1) + firstNum;
  }
  if (type == 'easeboth') {
    if ((n/=duration/2) < 1)
      return delta/2*n*n*n*n + firstNum;
      return -delta/2 * ((n-=2)*n*n*n - 2) + firstNum;
  }
  if (type == 'bounceout') {
    if ((n/=duration) < (1/2.75)) {
      return delta*(7.5625*n*n) + firstNum;
    } else if (n < (2/2.75)) {
      return delta*(7.5625*(n-=(1.5/2.75))*n + .75) + firstNum;
    } else if (n < (2.5/2.75)) {
      return delta*(7.5625*(n-=(2.25/2.75))*n + .9375) + firstNum;
    } else {
      return delta*(7.5625*(n-=(2.625/2.75))*n + .984375) + firstNum;
    }
  }
  if (type == 'bouncein') {
    nm = duration - n;
    if ((nm/=duration) < (1/2.75)) {
      m = delta*(7.5625*nm*nm);
    } else if (nm < (2/2.75)) {
      m = delta*(7.5625*(nm-=(1.5/2.75))*nm + .75);
    } else if (nm < (2.5/2.75)) {
      m = delta*(7.5625*(nm-=(2.25/2.75))*nm + .9375);
    } else {
      m = delta*(7.5625*(nm-=(2.625/2.75))*nm + .984375);
    }
    return delta - m + firstNum;
  }
  
  if (type == 'bounceboth') {
    if (n < duration/2) {
      nm = n * 2;
      if ((nm/=duration) < (1/2.75)) {
        m = delta*(7.5625*nm*nm);
      } else if (nm < (2/2.75)) {
        m = delta*(7.5625*(nm-=(1.5/2.75))*nm + .75);
      } else if (nm < (2.5/2.75)) {
        m = delta*(7.5625*(nm-=(2.25/2.75))*nm + .9375);
      } else {
        m = delta*(7.5625*(nm-=(2.625/2.75))*nm + .984375);
      }
      return (delta - m + firstNum) * .5 + firstNum;
    } else {
      n = n * 2 - duration;
      if ((n/=duration) < (1/2.75)) {
        m = delta*(7.5625*n*n) + firstNum;
      } else if (n < (2/2.75)) {
        m = delta*(7.5625*(n-=(1.5/2.75))*n + .75) + firstNum;
      } else if (n < (2.5/2.75)) {
        m = delta*(7.5625*(n-=(2.25/2.75))*n + .9375) + firstNum;
      } else {
        m = delta*(7.5625*(n-=(2.625/2.75))*n + .984375) + firstNum;
      }
      return m * .5 + delta*.5 + firstNum;
    }
  }
  if (type == 'elasticout') {
    if ((n/=duration)==1)
      return firstNum+delta;
    return delta*Math.pow(2,-10*n) * Math.sin( (n*duration-(duration*.3)/4)*(2*Math.PI)/(duration*.3) ) + delta + firstNum;
  }
  if (type == 'elasticin') {
    if (n==0)
      return b;  
    if ((n/=duration)==1) 
      return firstNum+delta;
    return -(delta*Math.pow(2,10*(n-=1)) * Math.sin( (n*duration-(duration*.3)/4)*(2*Math.PI)/(duration*.3) )) + firstNum;
  }
  if (type == 'elasticboth') {
    if (n==0)
      return firstNum;
    if ((n/=duration)==1) 
      return firstNum+delta;
    $('#test').html(p +'<br />'+n);
    if (p < 1)
      return -.5*(delta*Math.pow(2,10*(n-=1)) * Math.sin( (n*duration-(duration*.45)/4)*(2*Math.PI)/(duration*.45) )) + firstNum;
    return delta*Math.pow(2,-10*(n-=1)) * Math.sin( (n*duration-(duration*.45)/4)*(2*Math.PI)/(duration*.45) )*.5 + delta + firstNum;
  }
      
};/**
 * Interface Elements for jQuery
 * FX - scroll to
 * 
 * http://interface.eyecon.ro
 * 
 * Copyright (c) 2006 Stefan Petre
 * Dual licensed under the MIT (MIT-LICENSE.txt) 
 * and GPL (GPL-LICENSE.txt) licenses.
 *   
 * $Revision: 1.1.1.1 $
 * $Log: interface_expanded.js,v $
 * Revision 1.1.1.1  2006/09/06 02:30:17  aya
 * first newsride
 *
 * Revision 1.4  2006/08/31 16:08:16  Stef
 * Added dual licencing
 *
 * Revision 1.3  2006/08/27 19:05:55  Stef
 * *** empty log message ***
 *
 * Revision 1.2  2006/08/02 17:59:24  Stef
 * *** empty log message ***
 *
 */

jQuery.fn.ScrollTo = function(s, transition) {
  o = jQuery.speed(s);
  return this.queue('interfaceFX',function(){
    new jQuery.fx.ScrollTo(this, o, transition);
  });
};

jQuery.fx.ScrollTo = function (e, o, transition)
{
  var z = this;
  z.o = o;
  z.e = e;
  z.transition = transition||'original';
  p = jQuery.iUtil.getPosition(e);
  s = jQuery.iUtil.getScroll();
  z.clear = function(){clearInterval(z.timer);z.timer=null;jQuery.dequeue(z.e, 'interfaceFX');};
  z.t=(new Date).getTime();
  s.h = s.h > s.ih ? (s.h - s.ih) : s.h;
  s.w = s.w > s.iw ? (s.w - s.iw) : s.w;
  z.endTop = p.y > s.h ? s.h : p.y;
  z.endLeft = p.x > s.w ? s.w : p.x;
  z.startTop = s.t;
  z.startLeft = s.l;
  z.step = function(){
    var t = (new Date).getTime();
    var n = t - z.t;
    var p = n / z.o.duration;
    if (t >= z.o.duration+z.t) {
      z.clear();
      setTimeout(function(){z.scroll(z.endTop, z.endLeft)},13);
    } else {
      st = jQuery.fx.transitions(p, n, z.startTop, (z.endTop - z.startTop), z.o.duration, z.transition);//((-Math.cos(p*Math.PI)/2) + 0.5) * (z.p.y-z.s.t) + z.s.t;
      sl = jQuery.fx.transitions(p, n, z.startLeft, (z.endLeft - z.startLeft), z.o.duration, z.transition);//((-Math.cos(p*Math.PI)/2) + 0.5) * (z.p.x-z.s.l) + z.s.l;
      z.scroll(st, sl);
    }
  };
  z.scroll = function (t, l){window.scrollTo(l, t)};
  z.timer=setInterval(function(){z.step();},13);
};/**
 * Interface Elements for jQuery
 * FX - slide
 * 
 * http://interface.eyecon.ro
 * 
 * Copyright (c) 2006 Stefan Petre
 * Dual licensed under the MIT (MIT-LICENSE.txt) 
 * and GPL (GPL-LICENSE.txt) licenses.
 *   
 * $Revision: 1.1.1.1 $
 * $Log: interface_expanded.js,v $
 * Revision 1.1.1.1  2006/09/06 02:30:17  aya
 * first newsride
 *
 * Revision 1.7  2006/08/31 16:08:16  Stef
 * Added dual licencing
 *
 * Revision 1.6  2006/08/29 15:03:52  Stef
 * *** empty log message ***
 *
 * Revision 1.5  2006/08/27 19:05:55  Stef
 * *** empty log message ***
 *
 * Revision 1.4  2006/08/26 09:20:02  Stef
 * *** empty log message ***
 *
 * Revision 1.3  2006/08/26 07:53:53  Stef
 * *** empty log message ***
 *
 * Revision 1.2  2006/08/02 17:59:24  Stef
 * *** empty log message ***
 *
 */

jQuery.fn.extend(
  {
    SlideInUp : function (speed,callback, transition)
    {
      return this.queue('interfaceFX', function(){
        new jQuery.fx.slide(this, speed, callback, 'up', 'in', transition);
      });
    },
    
    SlideOutUp : function (speed,callback, transition)
    {
      return this.queue('interfaceFX', function(){
        new jQuery.fx.slide(this, speed, callback, 'up', 'out', transition);
      });
    },
    
    SlideToggleUp : function (speed,callback, transition)
    {
      return this.queue('interfaceFX', function(){
        new jQuery.fx.slide(this, speed, callback, 'up', 'toggle', transition);
      });
    },
    
    SlideInDown : function (speed,callback, transition)
    {
      return this.queue('interfaceFX', function(){
        new jQuery.fx.slide(this, speed, callback, 'down', 'in', transition);
      });
    },
    
    SlideOutDown : function (speed,callback, transition)
    {
      return this.queue('interfaceFX', function(){
        new jQuery.fx.slide(this, speed, callback, 'down', 'out', transition);
      });
    },
    
    SlideToggleDown : function (speed,callback, transition)
    {
      return this.queue('interfaceFX', function(){
        new jQuery.fx.slide(this, speed, callback, 'down', 'toggle', transition);
      });
    },
    
    SlideInLeft : function (speed,callback, transition)
    {
      return this.queue('interfaceFX', function(){
        new jQuery.fx.slide(this, speed, callback, 'left', 'in', transition);
      });
    },
    
    SlideOutLeft :  function (speed,callback, transition)
    {
      return this.queue('interfaceFX', function(){
        new jQuery.fx.slide(this, speed, callback, 'left', 'out', transition);
      });
    },
    
    SlideToggleLeft : function (speed,callback, transition)
    {
      return this.queue('interfaceFX', function(){
        new jQuery.fx.slide(this, speed, callback, 'left', 'toggle', transition);
      });
    },
    
    SlideInRight : function (speed,callback, transition)
    {
      return this.queue('interfaceFX', function(){
        new jQuery.fx.slide(this, speed, callback, 'right', 'in', transition);
      });
    },
    
    SlideOutRight : function (speed,callback, transition)
    {
      return this.queue('interfaceFX', function(){
        new jQuery.fx.slide(this, speed, callback, 'right', 'out', transition);
      });
    },
    
    SlideToggleRight : function (speed,callback, transition)
    {
      return this.queue('interfaceFX', function(){
        new jQuery.fx.slide(this, speed, callback, 'right', 'toggle', transition);
      });
    }
  }
);

jQuery.fx.slide = function(e, speed, callback, direction, type, transition)
{
  if (!jQuery.fxCheckTag(e)) {
    jQuery.dequeue(e, 'interfaceFX');
    return false;
  }
  var z = this;
  z.el = jQuery(e);
  z.transition = transition||'original';
  if ( type == 'toggle') {
    type = z.el.css('display') == 'none' ? 'in' : 'out';
  }
  if (!e.ifxFirstDisplay)
    e.ifxFirstDisplay = z.el.css('display');
  z.el.show();
  
  z.speed = speed;
  z.callback = callback;
  z.fx = jQuery.fx.buildWrapper(e);
  
  z.type = type;
  z.direction = direction;
  z.complete = function()
  {
    z.el.hide();
    jQuery.fx.destroyWrapper(z.fx.wrapper.get(0), z.fx.oldStyle);
    if(z.type == 'in'){
      z.el.css('display', z.el.get(0).ifxFirstDisplay == 'none' ? 'block' : z.el.get(0).ifxFirstDisplay);
    } else {
      z.el.css('display', 'none');
    }
    if (z.callback && z.callback.constructor == Function) {
      z.callback.apply(z.el.get(0));
    }
    jQuery.dequeue(z.el.get(0), 'interfaceFX');
  };
  switch (z.direction) {
    case 'up':
      z.ef = new jQuery.fx(
        z.el.get(0), 
        jQuery.speed(
          z.speed,
          z.complete
        ),
        'top',
        z.transition
      );
      if (z.type == 'in') {
        z.ef.custom (-z.fx.oldStyle.sizes.hb, 0);
      } else {
        z.ef.custom (0, -z.fx.oldStyle.sizes.hb);
      }
    break;
    case 'down':
      z.ef = new jQuery.fx(
        z.el.get(0), 
        jQuery.speed(
          z.speed,
          z.complete
        ),
        'top',
        z.transition
      );
      if (z.type == 'in') {
        z.ef.custom (z.fx.oldStyle.sizes.hb, 0);
      } else {
        z.ef.custom (0, z.fx.oldStyle.sizes.hb);
      }
    break;
    case 'left':
      z.ef = new jQuery.fx(
        z.el.get(0), 
        jQuery.speed(
          z.speed,
          z.complete
        ),
        'left',
        z.transition
      );
      if (z.type == 'in') {
        z.ef.custom (-z.fx.oldStyle.sizes.wb, 0);
      } else {
        z.ef.custom (0, -z.fx.oldStyle.sizes.wb);
      }
    break;
    case 'right':
      z.ef = new jQuery.fx(
        z.el.get(0), 
        jQuery.speed(
          z.speed,
          z.complete
        ),
        'left',
        z.transition
      );
      if (z.type == 'in') {
        z.ef.custom (z.fx.oldStyle.sizes.wb, 0);
      } else {
        z.ef.custom (0, z.fx.oldStyle.sizes.wb);
      }
    break;
  }
};
/**
 * Interface Elements for jQuery
 * Tooltip
 * 
 * http://interface.eyecon.ro
 * 
 * Copyright (c) 2006 Stefan Petre
 * Dual licensed under the MIT (MIT-LICENSE.txt) 
 * and GPL (GPL-LICENSE.txt) licenses.
 *   
 * $Revision: 1.1.1.1 $
 * $Log: interface_expanded.js,v $
 * Revision 1.1.1.1  2006/09/06 02:30:17  aya
 * first newsride
 *
 * Revision 1.5  2006/08/31 16:08:16  Stef
 * Added dual licencing
 *
 * Revision 1.4  2006/08/27 19:27:33  Stef
 * *** empty log message ***
 *
 * Revision 1.3  2006/08/27 19:05:55  Stef
 * *** empty log message ***
 *
 * Revision 1.2  2006/08/02 17:59:25  Stef
 * *** empty log message ***
 *
 */

jQuery.iTooltip = {
  helper : null,
  current : null,
  focused : false,
  oldTitle : null,
  focus : function(e)
  {
    jQuery.iTooltip.focused = true;
    jQuery.iTooltip.show(e, this);
  },
  hidefocused : function(e)
  {
    if (jQuery.iTooltip.current != this)
      return ;
    jQuery.iTooltip.focused = false;
    jQuery.iTooltip.hide(e, this);
  },
  show : function(e, el)
  {
    if (!el) {
      el = this;
    }
    if (jQuery.iTooltip.current != null)
      return ;
    
    jQuery.iTooltip.current = el;
    pos = jQuery.extend(
      jQuery.iUtil.getPosition(el),
      jQuery.iUtil.getSize(el)
    );
    jEl = jQuery(el);
    title = jEl.attr('title');
    href = jEl.attr('href');
    if (title) {
      jQuery.iTooltip.oldTitle = title;
      jEl.attr('title',' ');
      jQuery.iTooltip.helper.empty()
        .append('<strong>' + title + '</strong>' + (href ? '<div>' + href + '</div>' : ''))
        .css(
          {
            top:  pos.y + pos.h + 10 + 'px',
            left: pos.x + 'px',
            display: 'block'
          }
        );
      if(el.tE.ttClass){
        jQuery.iTooltip.helper.addClass(el.tE.ttClass);
      }
    }
  },
  hide : function(e, el)
  {
    if (!el) {
      el = this;
    }
    if (jQuery.iTooltip.focused != true && jQuery.iTooltip.current == el) {
      jQuery.iTooltip.current = null;
      jQuery.iTooltip.helper.css('display','none');
      if(el.tE.ttClass){
        jQuery.iTooltip.helper.removeClass(el.tE.ttClass);
      }
      jQuery(el).attr('title',jQuery.iTooltip.oldTitle);
      jQuery.iTooltip.oldTitle = null;
    }
  },
  build : function(c, o)
  {
    if (!jQuery.iTooltip.helper)
    {
      jQuery('body').append('<div id="tooltipHelper"></div>');
      jQuery.iTooltip.helper = jQuery('#tooltipHelper');
      jQuery.iTooltip.helper.css(
        {
          position: 'absolute',
          zIndex:   3000,
          display:  'none'
        }
      );
    }
    return this.each(
      function(){
        if(jQuery.attr(this,'title')) {
          var el = jQuery(this);
          if (c && c.constructor == String) {
            this.ttClass = c;
          }
          el.bind(
            'mouseover',
            jQuery.iTooltip.show
          );
          el.bind(
            'focus',
            jQuery.iTooltip.focus
          );
          el.bind(
            'mouseout',
            jQuery.iTooltip.hide
          );
          el.bind(
            'blur',
            jQuery.iTooltip.hidefocused
          );
          el.get(0).tE = this;
        }
      }
    );
  }
};
jQuery.fn.ToolTip = jQuery.iTooltip.build;
/**
 * Interface Elements for jQuery
 * utility function
 * 
 * http://interface.eyecon.ro
 * 
 * Copyright (c) 2006 Stefan Petre
 * Dual licensed under the MIT (MIT-LICENSE.txt) 
 * and GPL (GPL-LICENSE.txt) licenses.
 *   
 * $Revision: 1.1.1.1 $
 * $Log: interface_expanded.js,v $
 * Revision 1.1.1.1  2006/09/06 02:30:17  aya
 * first newsride
 *
 * Revision 1.11  2006/09/02 06:46:03  Stef
 * *** empty log message ***
 *
 * Revision 1.10  2006/09/02 06:07:38  Stef
 * *** empty log message ***
 *
 * Revision 1.9  2006/09/01 21:25:07  Stef
 * Fixed  bug finding the elemnt position on screen when element has display: none;
 *
 * Revision 1.8  2006/08/31 16:08:16  Stef
 * Added dual licencing
 *
 * Revision 1.7  2006/08/31 15:45:54  Stef
 * Fixed element position on page not to include BODY scrollTop and scrollLeft
 *
 * Revision 1.6  2006/08/29 18:46:41  Stef
 * *** empty log message ***
 *
 * Revision 1.5  2006/08/27 19:05:55  Stef
 * *** empty log message ***
 *
 * Revision 1.4  2006/08/26 07:53:53  Stef
 * *** empty log message ***
 *
 * Revision 1.3  2006/08/02 17:59:25  Stef
 * *** empty log message ***
 *
 */

jQuery.iUtil = {
  getPos : function (e, s)
  {
    var l = 0;
    var t  = 0;
    var sl = 0;
    var st  = 0;
    var w = jQuery.css(e,'width');
    var h = jQuery.css(e,'height');
    var wb = e.offsetWidth;
    var hb = e.offsetHeight;
    while (e.offsetParent){
      l += e.offsetLeft + (e.currentStyle?parseInt(e.currentStyle.borderLeftWidth)||0:0);
      t += e.offsetTop  + (e.currentStyle?parseInt(e.currentStyle.borderTopWidth)||0:0);
      if (s) {
        sl += e.parentNode.scrollLeft||0;
        st += e.parentNode.scrollTop||0;
      }
      e = e.offsetParent;
    }
    l += e.offsetLeft + (e.currentStyle?parseInt(e.currentStyle.borderLeftWidth)||0:0);
    t += e.offsetTop  + (e.currentStyle?parseInt(e.currentStyle.borderTopWidth)||0:0);
    st = t - st;
    sl = l - sl;
    return {x:l, y:t, sx:sl, sy:st, w:w, h:h, wb:wb, hb:hb};
  },
  getPosition : function(e)
  {
    var x = 0;
    var y = 0;
    var restoreStyle = false;
    es = e.style;
    if (jQuery(e).css('display') == 'none') {
      oldVisibility = es.visibility;
      oldPosition = es.position;
      es.visibility = 'hidden';
      es.display = 'block';
      es.position = 'absolute';
      restoreStyle = true;
    }
    el = e;
    while (el){
      x += el.offsetLeft + (el.currentStyle?parseInt(el.currentStyle.borderLeftWidth)||0:0);
      y += el.offsetTop  + (el.currentStyle?parseInt(el.currentStyle.borderTopWidth)||0:0);
      el = el.offsetParent;
    }
    el = e;
    while (el.tagName != 'BODY' && el.parentNode)
    {
      x -= el.scrollLeft||0;
      y -= el.scrollTop||0;
      el = el.parentNode;
    }
    if (restoreStyle) {
      es.display = 'none';
      es.position = oldPosition;
      es.visibility = oldVisibility;
    }
    return {x:x, y:y};
  },
  getSize : function(e)
  {
    var w = jQuery.css(e,'width');
    var h = jQuery.css(e,'height');
    var wb = 0;
    var hb = 0;
    es = e.style;
    if (jQuery(e).css('display') != 'none') {
      wb = e.offsetWidth;
      hb = e.offsetHeight;
    } else {
      oldVisibility = es.visibility;
      oldPosition = es.position;
      es.visibility = 'hidden';
      es.display = 'block';
      es.position = 'absolute';
      wb = e.offsetWidth;
      hb = e.offsetHeight;
      es.display = 'none';
      es.position = oldPosition;
      es.visibility = oldVisibility;
    }
    return {w:w, h:h, wb:wb, hb:hb};
  },
  getClient : function(e)
  {
    if (e) {
      w = e.clientWidth;
      h = e.clientHeight;
    } else {
      w = window.innerWidth || document.documentElement.clientWidth || document.body.offsetWidth;
      h = window.innerHeight || document.documentElement.clientHeight || document.body.offsetHeight;
    }
    return {w:w,h:h};
  },
  getScroll : function (e) 
  {
    if (e) {
      t = e.scrollTop;
      l = e.scrollLeft;
      w = e.scrollWidth;
      h = e.scrollHeight;
      iw = 0;
      ih = 0;
    } else  {
      if (document.documentElement && document.documentElement.scrollTop) {
        t = document.documentElement.scrollTop;
        l = document.documentElement.scrollLeft;
        w = document.documentElement.scrollWidth;
        h = document.documentElement.scrollHeight;
      } else if (document.body) {
        t = document.body.scrollTop;
        l = document.body.scrollLeft;
        w = document.body.scrollWidth;
        h = document.body.scrollHeight;
      }
      iw = self.innerWidth||document.documentElement.clientWidth||document.body.clientWidth||0;
      ih = self.innerHeight||document.documentElement.clientHeight||document.body.clientHeight||0;
    }
    return { t: t, l: l, w: w, h: h, iw: iw, ih: ih };
  },
  getMargins : function(e)
  {
    el = $(e);
    t = el.css('marginTop') || '';
    r = el.css('marginRight') || '';
    b = el.css('marginBottom') || '';
    l = el.css('marginLeft') || '';
    return {t: t, r: r, b: b, l: l};
  },
  getPadding : function(e)
  {
    el = $(e);
    t = el.css('paddingTop') || '';
    r = el.css('paddingRight') || '';
    b = el.css('paddingBottom') || '';
    l = el.css('paddingLeft') || '';
    return {t: t, r: r, b: b, l: l};
  },
  getBorder : function(e)
  {
    el = $(e);
    t = el.css('borderTopWidth') || '';
    r = el.css('borderRightWidth') || '';
    b = el.css('borderBottomWidth') || '';
    l = el.css('borderLeftWidth') || '';
    return {t: t, r: r, b: b, l: l};
  }
};