var moveBlock = Class.create();
moveBlock.prototype = {
  initialize: function (options) {
    this.setOptions(options);
    var sortables = $A(document.getElementsByClassName(
      this.options.column, this.options.container
    ));
    sortables.each(function (sortable) {
      Sortable.create(sortable, { 
        containment: sortables,
        constraint: false,
        markDropZone:true,
        overlap:'vertical',
        tag: 'div',
        only: this.options.block,
        dropOnEmpty: true,
        handle: this.options.handle,
        starteffect: scrollStart,
  		endeffect: scrollEnd,
  		hoverclass: 'block-hover',
  		/*hoverclass: this.options.hoverclass,*/
  		onChange: function (movedBlock) {
  			//movedBlock.style.border="1px dashed red";
  			//movedBlock.className = 'block moveBlockTransparent';
  		},
        onUpdate: function (container) {
          if (!this.options.saveurl) {
            return;
          }
         
          var url = this.options.saveurl;
         
          //get all movable blocks by class name
          var blocksy = $A(container.getElementsByClassName(
            this.options.block));

	   /*  blocksy.collect(function(s) {
         	return s.className = "block";
		});   */
          var pars = "content.cid="+ container.id.substr(20) +
                    "&content.action=rebuildSubcontentOrder"+
                    "&content.eids="+ blocksy.pluck('id').invoke('substr',4).join('|');
          new Ajax.Request(url, {
              method: 'post',
              postBody: pars
            }
          );
        }.bind(this)
      });
    }.bind(this));
    
    var blocks = $A(document.getElementsByClassName(
      this.options.block, this.options.container
    ));
    
    var columns = $A(document.getElementsByClassName(
      this.options.column, this.options.container
    ));
    
    blocks.each(
      function (block) {
        var content = block.getElementsByClassName(this.options.content)[0];//Element.childrenWithClassName(block, this.options.content, true);
        
        var toggle = block.getElementsByClassName(this.options.toggle)[0];//Element.childrenWithClassName(block, this.options.toggle, true);

        /*Event.observe(
          toggle, 'click', 
          function (e) { Effect.toggle(content, 'Slide'); },
          false
        );*/
        
      /*  Event.observe(block,'mouseup',
        function (e) { alert(block.className);block.className="block"; }, false);
        */
                
        
      }.bind(this)
    );
    
   /* Event.observe(
      this.options.blocklistlink, 'click', 
      this.displayBlockList.bindAsEventListener(this), 
      false
    );*/

  /*  new Draggable(this.options.blocklist, {
        handle: this.options.blocklisthandle
      }
    );*/
    
  },

 /* displayBlockList: function (e) {
    Effect.toggle(this.options.blocklist);
    Event.stop(e);
  },*/

  setOptions: function (options) {
    this.options = {
      container: 'cmsContainer',
      column: 'cmsContainer-column',
      block: 'block',
      content: 'content',
      handle: 'handle',
      hoverclass: 'block-hover',
      toggle: 'block-toggle',
      /*blocklist: 'cmsContainer-column-block-list',*/
     /* blocklistlink: 'cmsContainer-block-list-link',*/
      blocklisthandle: 'block-list-handle',
      saveurl: absCorrect +'ajax.html'
    }
    Object.extend(this.options, options || {});
  },

  applySettings: function (settings) {
    for (var container in settings) {
      settings[container].each(function (block) {
        $(container).appendChild($(block));
      });
    }
  }
}

//sortable scrolling
var itemBeingDragged;
var scrollPoll;

function getWindowScroll() {
  var T, L, W, H;
  var w = window;
  with (w.document) {
    if (w.document.documentElement && documentElement.scrollTop) {
      T = documentElement.scrollTop;
      L = documentElement.scrollLeft;
    } else if (w.document.body) {
      T = body.scrollTop;
      L = body.scrollLeft;
    }
    if (w.innerWidth) {
      W = w.innerWidth;
      H = w.innerHeight;
    } else if (w.document.documentElement && documentElement.clientWidth) {
      W = documentElement.clientWidth;
      H = documentElement.clientHeight;
    } else {
      W = body.offsetWidth;
      H = body.offsetHeight
    }
  }
  return { top: T, left: L, width: W, height: H };
}

function findTopY(obj) {
  var curtop = 0;
  if (obj.offsetParent) {
    while (obj.offsetParent) {
      curtop += obj.offsetTop;
      obj = obj.offsetParent;
    }
  }
  else if (obj.y)
    curtop += obj.y;
  return curtop;
}

function findBottomY(obj) {
  return findTopY(obj) + obj.offsetHeight;
}

function scrollSome() {
  var scroller = getWindowScroll();
  var yTop = findTopY(itemBeingDragged);
  var yBottom = findBottomY(itemBeingDragged);

  if (yBottom > scroller.top + scroller.height - 20)
    window.scrollTo(0,scroller.top + 30);
    else if (yTop < scroller.top + 20)
    window.scrollTo(0,scroller.top - 30);
}

function scrollStart(e) {
  itemBeingDragged = e;
  scrollPoll = setInterval(scrollSome, 100);
}

function scrollEnd(e) {
  clearInterval(scrollPoll);
}
