/*
 * interface dropzones - http://www.eyecon.ro/interface/
 *
 * Copyright (c) 2006 Stefan Petre
 * Licensed under the MIT License:
 *   http://www.opensource.org/licenses/mit-license.php
 */

$.droppables = [];

$.drophighlight = function ()
{
    if ($.drug == null) {
		return;
    }
	var i;
	for (i = 0; i < $.droppables.length; i++) {
		if ($.hasWord($.drug,$.droppables[i].f.a)) {
			if ($.droppables[i].f.m == false) {
				$.droppables[i].f.p = $.getPos($.droppables[i]);
				$.droppables[i].f.m = true;
			}
			if ($.droppables[i].f.ac) {
				$($.droppables[i]).addClass($.droppables[i].f.ac);
			}
			$.droppables[i].f.drug = true;
			if ($.sortables) {
				$.droppables[i].f.el = $('.' + $.droppables[i].f.a, $.droppables[i]);
				$.sortremeasure($.droppables[i]);
			}
		}
	}
	if ($.sortables && $.drug.d.so) {
		$.sortstart();
	}
};

$.dropcheck = function (e)
{
    if ($.drug == null) {
		return;
    }
	var i;
	for (i = 0; i < $.droppables.length; i++) {
		if ($.droppables[i].f.drug == true) {
			if ($.droppables[i].f.ac) {
				$($.droppables[i]).removeClass($.droppables[i].f.ac);
			}
			if ($.droppables[i].f.hc) {
				$($.droppables[i]).removeClass($.droppables[i].f.hc);
			}
			if($.droppables[i].f.s) {
				$.sortchanged[$.sortchanged.length] = i;
			}
			
			if ($.droppables[i].f.ondrop && $.droppables[i].f.h == true) {
				$.droppables[i].f.ondrop($.droppables[i], e, $.droppables[i].f.fx);
			}
			$.droppables[i].f.drug = false;
			$.droppables[i].f.m = false;
			$.droppables[i].f.h  = false;
		}
	}
};

$.dropcheckhover = function ( x, y, ex, ey)
{
    if ($.drug == null) {
		return;
    }
	$.overzone = false;
	for (i = 0; i < $.droppables.length; i++) {
		if ($.droppables[i].f.drug == true) {
			if (
				$.overzone == false 
				&& (
					(
						$.droppables[i].f.t == 'fit' &&
						$.droppables[i].f.p.x <= ex && 
						($.droppables[i].f.p.x + $.droppables[i].f.p.w) >= (ex + $.drug.d.oC.w) &&
						$.droppables[i].f.p.y <= ey && 
						($.droppables[i].f.p.y + $.droppables[i].f.p.h) >= (ey + $.drug.d.oC.h) 
					)
					||
					(
						$.droppables[i].f.t == 'intersect' &&
						! ( $.droppables[i].f.p.x > (ex + $.drug.d.oC.w)
						|| ($.droppables[i].f.p.x + $.droppables[i].f.p.w) < ex 
						|| $.droppables[i].f.p.y > (ey + $.drug.d.oC.h) 
						|| ($.droppables[i].f.p.y + $.droppables[i].f.p.h) < ey
						)
					) 
					|| 
					(
					 	$.droppables[i].f.t == 'pointer' &&
						( $.droppables[i].f.p.x < x
						&& ($.droppables[i].f.p.x + $.droppables[i].f.p.w) > x 
						&& $.droppables[i].f.p.y < y 
						&& ($.droppables[i].f.p.y + $.droppables[i].f.p.h) > y
						)
					)
				)
			) {
				if ($.droppables[i].f.hc) {
					$($.droppables[i]).addClass($.droppables[i].f.hc);
					$($.droppables[i]).removeClass($.droppables[i].f.ac);
				}
				$.droppables[i].f.h = true;
				$.overzone = $.droppables[i];
				if($.sortables && $.drug.d.so) {
					$.sortcheckhover(
						 $.droppables[i],
						{
							x : x,
							y : y,
							ex : ex,
							ey : ey
						}
					);
				}
			} else {
				if ($.droppables[i].f.hc) {
					$($.droppables[i]).removeClass($.droppables[i].f.hc);
					$($.droppables[i]).addClass($.droppables[i].f.ac);
				}
				$.droppables[i].f.h = false;
			}
		}
	}
	if ($.sortables && $.overzone == false) {
		$.sortHelper.css('display', 'none');
		$('body').append($.sortHelper.cur[0]);
	}
};

$.fn.Droppable = function (o)
{
	if (o.accept) {
		return this.each(
			function()
			{
				if (this.isDroppable == true){
					return;
				}
				this.f = {
					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) {
					id = $.attr(this,'id');
					if (!$.sortables){
						$.sortables = [];
					}
					$.sortables[id] = this.f.a;
					this.f.s = true;
					if(o.onchange) {
						this.f.onchange = o.onchange;
						this.f.os = $.Sortserialize(id).hash;
					}
				}
				this.isDroppable = true;
				$.droppables[$.droppables.length] = this;
			}
		);
	}
};
