/**
 * drag and drop object with jquery 1.4.2
 * @author Ho-Teng Chang / htcmix@gmail.com / http://whypluseight.com/
 */

(function() {

/**
 * namespace
 */
var ns = 'y8dnd';

var dnd = window[ns] = function( handler, root, options ) {
  this.document = $(document);
  
  this.handler = $(handler);
  
  try{
    if ( typeof root == 'string' ) {
      this.root = $(root);
    }
    else if ( typeof ( root.jquery ) == 'string' ) {
      this.root = root;
    }
    else {
      options = root;
      this.root = this.handler;
    }
  }
  catch(err){
    this.root = this.handler;
  }
  if ( this.root.length === 0 ) return false;
  
  $.extend(this.options = {}, {dragMode: 'default'}, options || {});
  this.dragMode = this.options.dragMode;

  if ( this.root.css('position') != 'absolute' ) {
//    var offset = this.root.position();
    this.root.css( {
/*
      left:     offset.left + 'px',
      top:      offset.top  + 'px',
*/
      position: 'absolute'
    } );
  }
  
  this.dragger        = $.proxy( this.startDragging, this);
  this.listenDragging = $.proxy( this.doDragging, this);
  this.listenDropping = $.proxy( this.endDragging, this);
  
/*
  this.root.css({
    left: this.root.css('left'),
    top:  this.root.css('top')
  });
*/

  this.root.zIndex = parseInt(this.root.css('zIndex'));
  this.activate();
  

};
  
dnd.prototype = {
  fixType: {
    'default' : [true,true],
    fix       : [false,false],
    fixX      : [false,true],
    fixY      : [true,false]
  },
  activate: function() {
    this.draggable = true;
    this.handler.bind('mousedown', this.dragger);
  },
  deactivate: function() {
    this.draggable = false;
    this.handler.unbind('mousedown', this.dragger);
  },
  getTransport: function( event ) {
    return {
      element: this.root,
      x:    event.pageX,
      y:    event.pageY,
      left: parseInt(this.root.css('left')),
      top:  parseInt(this.root.css('top'))
    };
  },
  startDragging:function( event ) {
    var transport = this.getTransport( event );
    this.dx = transport.x - transport.left;
    this.dy = transport.y - transport.top;
    
    this.document.bind('mousemove', this.listenDragging);
    this.document.bind('mouseup'  , this.listenDropping);

    try { ( this.options.onDragStart || $.noop )( transport ); }
    catch(err){}
    event.preventDefault();
  },
  doDragging: function( event ) {
    if ( this.fixType[ this.dragMode ][0] ) {
      this.root.css({ left: event.pageX - this.dx + 'px' });
    }
    if ( this.fixType[ this.dragMode ][1]) {
      this.root.css({ top:  event.pageY - this.dy + 'px' });
    }
    
    var transport = this.getTransport( event );
    try { ( this.options.onDragging || $.noop )( transport );}
    catch(err){}
    event.preventDefault();
  },
  endDragging: function( event ) {
    
    this.document.unbind('mousemove', this.listenDragging);
    this.document.unbind('mouseup'  , this.listenDropping);

    var transport = this.getTransport( event );
    try{ ( this.options.onDragEnd || $.noop )( transport ); }
    catch(err){}
  }
};
  
})();


var x=function(t){console.log(t);};