/**
 * Interface Elements for jQuery
 * Sortables
 * 
 * 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.12 $
 * $Log: isortables.js,v $
 * Revision 1.12  2006/09/03 19:02:32  Stef
 * Added onStart and onStop callbacks for the dragged item
 *
 * Revision 1.11  2006/09/03 18:44:46  Stef
 * Fixed using reserved word 'float'
 *
 * Revision 1.10  2006/09/02 06:07:31  Stef
 * *** empty log message ***
 *
 * Revision 1.9  2006/08/31 18:40:36  Stef
 * Added support for floating elements
 *
 * Revision 1.8  2006/08/31 16:08:16  Stef
 * Added dual licencing
 *
 * Revision 1.7  2006/08/27 19:05:55  Stef
 * *** empty log message ***
 *
 * Revision 1.6  2006/08/26 07:53:53  Stef
 * *** empty log message ***
 *
 * Revision 1.5  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.4  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.3  2006/08/03 21:38:41  Stef
 * *** empty log message ***
 *
 * Revision 1.2  2006/08/02 17:59:25  Stef
 * *** empty log message ***
 *
 */


jQuery.iSort = {
	changed : [],
	collected : {},
	helper : false,
	inFrontOf: null,
	
	start : function ()
	{
		if (jQuery.iDrag.dragged == null) {
			return;
		}
		var i;
		
		jQuery.iSort.helper.addClass(jQuery.iDrag.dragged.dragCfg.hpc);
		shs = jQuery.iSort.helper.get(0).style;
		shs.display = 'block';
		jQuery.iSort.helper.oC = jQuery.iUtil.getPos(jQuery.iSort.helper.get(0));
		
		//shs.width = jQuery.iDrag.dragged.dragCfg.oC.wb + jQuery.iSort.helper.oC.w - jQuery.iSort.helper.oC.wb + 'px';
		//shs.height = jQuery.iDrag.dragged.dragCfg.oC.hb + jQuery.iSort.helper.oC.h - jQuery.iSort.helper.oC.hb + 'px';
		shs.width = jQuery.iDrag.dragged.dragCfg.oC.wb + 'px';
		shs.height = jQuery.iDrag.dragged.dragCfg.oC.hb + 'px';
		//shs.cssFloat = jQuery.iDrag.dragged.dragCfg.oF;
		shs.marginTop = jQuery.iDrag.dragged.dragCfg.oM.t;
		shs.marginRight = jQuery.iDrag.dragged.dragCfg.oM.r;
		shs.marginBottom = jQuery.iDrag.dragged.dragCfg.oM.b;
		shs.marginLeft = jQuery.iDrag.dragged.dragCfg.oM.l;
		if (jQuery.iDrag.dragged.dragCfg.ghosting == true) {
			c = jQuery.iDrag.dragged.cloneNode(true);
			cs = c.style;
			cs.marginTop = '0px';
			cs.marginRight = '0px';
			cs.marginBottom = '0px';
			cs.marginLeft = '0px';
			cs.display = 'block';
			jQuery.iSort.helper.empty().append(c);
		}
		jQuery(jQuery.iDrag.dragged).after(jQuery.iSort.helper.get(0));
		jQuery.iDrag.dragged.style.display = 'none';
	},
	
	check : function (e)
	{
		jQuery.iSort.helper.removeClass(e.dragCfg.hpc).html('&nbsp;');
		jQuery.iSort.inFrontOf = null;
		shs = jQuery.iSort.helper.get(0).style;
		shs.display = 'none';
		ts = [];
		fnc = false;
		for(i in jQuery.iSort.changed){
			iEL = jQuery.iDrop.zones[jQuery.iSort.changed[i]].get(0);
			id = jQuery.attr(iEL, 'id');
			ser = jQuery.iSort.serialize(id);
			if (iEL.dropCfg.os != ser.hash) {
				iEL.dropCfg.os = ser.hash;
				if (fnc == false && iEL.dropCfg.onchange) {
					fnc = iEL.dropCfg.onchange;
				}
				ser.id = id;
				ts[ts.length] = ser;
			}
		}
		if (fnc != false && ts.length > 0) {
			fnc(ts);
		}
		jQuery.iSort.changed = [];
	
	},
	
	checkhover : function(e,o)
	{
		if (!jQuery.iDrag.dragged)
			return;
		jQuery.iSort.helper.get(0).style.display = 'block';
		var cur = false;
		var i = 0;
		if ( e.dropCfg.el.size() > 0) {
			for (i = e.dropCfg.el.size(); i >0; i--) {
				if (e.dropCfg.el.get(i-1) != jQuery.iDrag.dragged) {
					if (!e.sortCfg.floats) {
						if ( 
						(e.dropCfg.el.get(i-1).pos.y + e.dropCfg.el.get(i-1).pos.hb/2) > jQuery.iDrag.dragged.dragCfg.ny  
						) {
							cur = e.dropCfg.el.get(i-1);
						} else {
							break;
						}
					} else {
						if (
						(e.dropCfg.el.get(i-1).pos.x + e.dropCfg.el.get(i-1).pos.wb/2) > jQuery.iDrag.dragged.dragCfg.nx && 
						(e.dropCfg.el.get(i-1).pos.y + e.dropCfg.el.get(i-1).pos.hb/2) > jQuery.iDrag.dragged.dragCfg.ny  
						) {
							cur = e.dropCfg.el.get(i-1);
						}
					}
				}
			}
		}
		//helpos = jQuery.iUtil.getPos(jQuery.iSort.helper.get(0));
		if (cur && jQuery.iSort.inFrontOf != cur) {
			jQuery.iSort.inFrontOf = cur;
			jQuery(cur).before(jQuery.iSort.helper.get(0));
		} else if(!cur && (jQuery.iSort.inFrontOf != null || jQuery.iSort.helper.get(0).parentNode != e) ) {
			jQuery.iSort.inFrontOf = null;
			jQuery(e).append(jQuery.iSort.helper.get(0));
		}
	},
	
	measure : function (e)
	{
		if (jQuery.iDrag.dragged == null) {
			return;
		}
		var i;
		e.dropCfg.el.each (
			function ()
			{
				this.pos = jQuery.extend(
					jQuery.iUtil.getSize(this),
					jQuery.iUtil.getPosition(this)
					/*{
						x: this.offsetLeft||0 - this.parentNode.scrollLeft||0, 
						y: this.offsetTop||0 - this.parentNode.scrollTop||0
					}*/
				);
			}
		);
	},
	
	serialize : function(s)
	{
		var i;
		var h = '';
		var o = {};
		if (s) {
			if (jQuery.iSort.collected[s] ) {
				o[s] = [];
				jQuery('#' + s + ' .' + jQuery.iSort.collected[s]).each(
					function ()
					{
						if (h.length > 0) {
							h += '&';
						}
						h += s + '[]=' + jQuery.attr(this,'id');
						o[s][o[s].length] = jQuery.attr(this,'id');
					}
				);
			} else {
				for ( a in s) {
					if (jQuery.iSort.collected[s[a]] ) {
						o[s[a]] = [];			
						jQuery('#' + s[a] + ' .' + jQuery.iSort.collected[s[a]]).each(
							function ()
							{
								if (h.length > 0) {
									h += '&';
								}
								h += s[a] + '[]=' + jQuery.attr(this,'id');
								o[s[a]][o[s[a]].length] = jQuery.attr(this,'id');
							}
						);
					}
				}
			}
		} else {
			for ( i in jQuery.iSort.collected){
				o[i] = [];
				jQuery('#' + i + ' .' + jQuery.iSort.collected[i]).each(
					function ()
					{
						if (h.length > 0) {
							h += '&';
						}
						h += i + '[]=' + jQuery.attr(this,'id');
						o[i][o[i].length] = jQuery.attr(this,'id');
					}
				);
			}
		}
		return {hash:h, o:o};
	},
	
	addItem : function (e)
	{
		if ( !e.childNodes ) {
			return;
		}
		return this.each(
			function ()
			{
				if(!jQuery.hasWord(e, this.sortCfg.accept))
					jQuery(e).addClass(this.sortCfg.accept);
				jQuery(e).Draggable(this.sortCfg);
			}
		);
	},
	
	build : function (o)
	{
		if (o.accept && jQuery.iUtil && jQuery.iDrag && jQuery.iDrop) {
			if (!jQuery.iSort.helper) {
				jQuery('body',document).append('<div id="sortHelper">&nbsp;</div>');
				jQuery.iSort.helper = jQuery('#sortHelper');
				jQuery.iSort.helper.get(0).style.display = 'none';
			}
			this.Droppable(
				{
					accept :  o.accept,
					activeclass : o.activeclass ? o.activeclass : false,
					hoverclass : o.hoverclass ? o.hoverclass : false,
					helperclass : o.helperclass ? o.helperclass : false,
					ondrop: function (drag, fx) 
							{
								jQuery.iSort.helper.after(drag);
								if (fx > 0) {
									jQuery(drag).fadeIn(fx);
								}
							},
					sortable : true,
					onchange : 	o.onchange ? o.onchange : false,
					fx : o.fx ? o.fx : false,
					ghosting : o.ghosting ? true : false,
					tolerance: o.tolerance ? o.tolerance : 'pointer'
				}
			);
			
			return this.each(
				function()
				{
					jQuery('.' + o.accept, this).Draggable(
						{
							revert : o.revert? true : false,
							zindex : 3000,
							opacity : o.opacity ? parseFloat(o.opacity) : false,
							hpc : o.helperclass ? o.helperclass : false,
							fx : o.fx ? o.fx : false,
							so : true,
							ghosting : o.ghosting ? true : false,
							handle: o.handle ? o.handle : null,
							containment: o.containment ? o.containment : null,
							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
						}
					);
					this.isSortable = true;
					this.sortCfg = {
						accept :  o.accept,
						revert : o.revert? true : false,
						zindex : 3000,
						opacity : o.opacity ? parseFloat(o.opacity) : false,
						hpc : o.helperclass ? o.helperclass : false,
						fx : o.fx ? o.fx : false,
						so : true,
						ghosting : o.ghosting ? true : false,
						handle: o.handle ? o.handle : null,
						containment: o.containment ? o.containment : null,
						floats: o.floats ? true : false
					}
				}
			);
		}
	}
};
jQuery.fn.extend(
	{
		Sortable : jQuery.iSort.build,
		SortableAddItem : jQuery.iSort.addItem
	}
);
jQuery.SortSerialize = jQuery.iSort.serialize;