
var gpDropdowns = {

	presets: {
		parentIDPrefix: 'parent',
		childIDPrefix: 'child',
		openDelay: 300,
		closeDelay: 1000,
		openFunc: {},
		closeFunc: {},
		isOpen: {},
		childHeight: {},
		currentZ: 1,
		inSpeed: 500,
		inTrans: Fx.Transitions.Back.easeOut,
		outSpeed: 500,
		outTrans: Fx.Transitions.Back.easeIn,
		closeOpacity: 0,
		openOpacity:	1,
		fixIE6width: '240px',
		fixIE7width: '240px'
	},

	initialize: function(presets) {
		this.presets = $merge(this.presets, presets);
	},

	assign: function(to, options) {
		var IE6 = (navigator.userAgent.toLowerCase().indexOf('msie 6') != -1)  && (navigator.userAgent.toLowerCase().indexOf('msie 7') == -1);  
		var IE7 = (navigator.userAgent.toLowerCase().indexOf('msie 6') == -1)  && (navigator.userAgent.toLowerCase().indexOf('msie 7') != -1);  
		$each(to, function(thisParent) {
			var thisChild = $(gpDropdowns.presets.childIDPrefix+thisParent.id.slice(gpDropdowns.presets.parentIDPrefix.length));
			if ($(thisChild)) {
				thisChild.setStyle('display','block');
				var thisChildWidth = thisChild.getStyle('width');
				if (IE6)
				{
					thisChild.setStyle('width',gpDropdowns.presets.fixIE6width);
				} else if (IE7) {
					thisChild.setStyle('width',gpDropdowns.presets.fixIE7width);
				} else {
					thisChild.setStyle('width',thisChildWidth);
				}
				var thisChildHeight = thisChild.getStyle('height').toInt();
				thisChild.setStyle('height','0px');
				thisChild.setStyle('overflow','hidden');
				if (IE6) thisChild.setStyle('visibility','hidden');
				gpDropdowns.presets.isOpen[thisParent.id] = false;
				gpDropdowns.presets.childHeight[thisChild.id] = thisChildHeight;
				var inFx = new Fx.Morph(thisChild, { duration: gpDropdowns.presets.inSpeed, transition: gpDropdowns.presets.inTrans});
				var outFx = new Fx.Morph(thisChild, { duration: gpDropdowns.presets.outSpeed, transition: gpDropdowns.presets.outTrans});
				$(thisParent).addEvents({
					'mouseenter': function() {
						var presets = gpDropdowns.presets;
						gpDropdowns.presets.currentZ++;
						$(thisChild).setStyle('z-index',gpDropdowns.presets.currentZ);
						var slideInFunc = function() {
							if ((gpDropdowns.presets.closeFunc[thisParent.id] < gpDropdowns.presets.openFunc[thisParent.id]) && (!gpDropdowns.presets.isOpen[thisParent.id] ))
							{
								inFx.cancel();
								if (gpDropdowns.presets.openOpacity != gpDropdowns.presets.closeOpacity)
								{
									inFx.start({'height': [0,gpDropdowns.presets.childHeight[thisChild.id]],'opacity': [gpDropdowns.presets.closeOpacity,gpDropdowns.presets.openOpacity]});
								} else {
									inFx.start({'height': [0,gpDropdowns.presets.childHeight[thisChild.id]]});
								}
								gpDropdowns.presets.isOpen[thisParent.id] = true;
							}
						}
						slideInFunc.delay(gpDropdowns.presets.openDelay);
						if (!gpDropdowns.presets.openFunc[thisParent.id]) gpDropdowns.presets.openFunc[thisParent.id] = 0;
						if (!gpDropdowns.presets.closeFunc[thisParent.id]) gpDropdowns.presets.closeFunc[thisParent.id] = 0;
						gpDropdowns.presets.openFunc[thisParent.id]++;
					},
					'mouseleave': function() {
						var presets = gpDropdowns.presets;
						var slideOutFunc = function() {
							if ((gpDropdowns.presets.closeFunc[thisParent.id] >= gpDropdowns.presets.openFunc[thisParent.id]) && (gpDropdowns.presets.isOpen[thisParent.id] ))
							{
								outFx.cancel();
								if (gpDropdowns.presets.openOpacity != gpDropdowns.presets.closeOpacity)
								{
									outFx.start({'height': [gpDropdowns.presets.childHeight[thisChild.id],0],'opacity': [gpDropdowns.presets.openOpacity,gpDropdowns.presets.closeOpacity]});
								} else {
									outFx.start({'height': [gpDropdowns.presets.childHeight[thisChild.id],0]});
								}
								gpDropdowns.presets.isOpen[thisParent.id] = false;
							}
						}
						if (!gpDropdowns.presets.openFunc[thisParent.id]) gpDropdowns.presets.openFunc[thisParent.id] = 1;
						if (!gpDropdowns.presets.closeFunc[thisParent.id]) gpDropdowns.presets.closeFunc[thisParent.id] = 0;
						gpDropdowns.presets.closeFunc[thisParent.id]++;
						slideOutFunc.delay(gpDropdowns.presets.closeDelay);
					}
				})
			}
		})
	}
	
};

