var ltfieldlast = 1;

Draggables.find = function( id )
{
	var drag = this.drags.find( function( e, i ) { return e.element.id == id });
		
	return drag;
}


/**
* Lückentext többször használható
*/
var NyoDragingObserver = Class.create();
NyoDragingObserver.prototype = {
  initialize: function(element, observer, regexp, init ) {
    this.element	= $(element);
    this.observer	= observer;
	this.pattern	= regexp;
	this.init		= init;
  },
  
  onStart: function( eventname, obj, event ) {
	if( obj.dragging == true && obj.element.id == this.element.id )
	{
		var E = obj.element;
		
		// draggable megszüntetése
		var drag = Draggables.find( obj.element.id );
		drag.destroy();
		
		// clone
		this._clone = E.cloneNode( true )
		Position.absolutize( obj.element);
//		Position.absolutize( this._clone );
		this._clone.style.zIndex = 50;
		E.parentNode.insertBefore(this._clone, E);
		
		// new id
		this.pattern.exec( this._clone.id );
		var newid = RegExp.$1 + "[t" + ( ltfieldlast + 1 ) + "]";
		ltfieldlast++;
		this._clone.id = newid;

		this._clone = null;
		
		// create draggable
		new Draggable( obj.element );
		obj.element.style.width = "160px";
		trace( obj.element._staticWidth );
//		obj.element.style.width = obj.element._staticWidth + "px";
		obj.element.style.height = obj.element._staticHeight + "px";
		this.init( newid );
	}
  },
  onEnd: function( elem, event ) {}
	  

}

function _showdraggables()
{
	var msg = '';
	Draggables.drags.each( function( e, i ) { msg += i + ': [' + e.element.offsetTop + ' ' + e.element.offsetHeight + ']\n'});
	trace( msg );
}

var debugforall = false;
function forall( tag, pattern, attr, iterator )
{
	var tags = document.getElementsByTagName( tag );
	tags = $A( tags );
	if( debugforall == true ) alert( 'tag found: ' + tags.length );
	tags.each( function( tag, i )
	{
		var chk = tag.getAttribute( attr );
		if( debugforall == true ) alert( 'attribute: ' + attr + ' = ' + chk );
		
		if( pattern.exec( chk ) )
		{
			if( debugforall == true ) alert( 'tag ok' );
			iterator( chk );
		} else
		{
			if( debugforall == true ) alert( 'tag bad' );
		}
	});
}

/***************************************************
* segédek
*****************************************************/
var allDragClasses = new Array();
function addDragClass( elem )
{
	var cl = elem.getAttribute( 'className' ) || elem.getAttribute( 'class' );
	var idx = allDragClasses.find( function( ic ){ cl == ic } );
	if( ! idx )
	{
		allDragClasses[ allDragClasses.length ] = cl;
	}
}

function clearValueOf( elem, pattern, v )
{
	var value = v || elem.firstChild.data;
	pattern.exec( elem.id );
	var feladatid = RegExp.$1;

	var aE = $A( document.forms[ megoldasFormName ].elements );
	ctrlpattern = new RegExp( "megoldas\\[" + feladatid + "\\]" );
	var fields = new Array();
	
	aE.each( function( tag ) {
			if( ctrlpattern.exec( tag.getAttribute( 'name' ) ) )
			{
				if( tag.value == value )
				{
					fields.push( tag.getAttribute( 'name' ) );
					tag.value = '';
				}
			}
		});
	return fields;
}

function clearLtBackround( fields )
{
	fields.each( function( name ) {
		var id = name.replace( /megoldas/, "droplt" );
		Stye.removeAttribute( $(id), 'backgroundColor' );
	});
}

function unsetMegoldas( elem )
{
	var dragor = /drag\[/;
	var dragah = /dragah\[/;
	var draglt = /draglt(mus?)?\[/;

	var id = elem.getAttribute("id");

	// összerendelés drag
	if( dragor.exec( id ) )
	{
		trace( 'unsetor' );
		unlinkMegoldas( elem )
	} else if( dragah.exec( id ) )
	{
		trace( 'unsetah' );
		unsetAHMegoldas( elem )
	} else if( draglt.exec( id ) )
	{
		trace( 'unsetlt' );
		unsetLTMegoldas( elem )
	} else	trace( id );
}

function deleteDraggable( elem )
{
	var drag = Draggables.find( elem.id );
	Draggables.removeObserver( elem );
	if( drag )
		drag.destroy();
	Element.remove( elem );
}

function checkBoundingbox( x, y, box, drag )
{
	return [ x, y ];
//	display_arraykeys( drag ); 
	var box = $(box);
	var elem = $(drag);
//	trace( "start: " + x + ", " + y );

    var offsetsbox = Position.cumulativeOffset(box);
    var offsetselem = Position.cumulativeOffset(elem);
//    var offsetsbox = Position.realOffset(box);
//    var offsetselem = Position.realOffset(elem);
	
	if( ! elem.startx ) elem.startx = offsetselem[0];
	if( ! elem.starty ) elem.starty = offsetselem[1];

	var elempbx = [ offsetselem[1], offsetselem[0], offsetselem[1] + elem._staticHeight, offsetselem[0] + elem._staticWidth ];
	var elembx = [ elem.starty + y, elem.startx + x, elem.starty + y + elem._staticHeight, elem.startx + x + elem._staticWidth ];
	var boxbx = [ offsetsbox[1], offsetsbox[0], offsetsbox[1] + box.offsetHeight, offsetsbox[0] + box.offsetWidth ];
	
	var snap = [
		elembx[1] < boxbx[1] ? boxbx[1] - elem.startx : ( elembx[3] > boxbx[3] ? boxbx[3] - elem.startx - elem._staticWidth : x ),
		elembx[0] < boxbx[0] ? boxbx[0] - elem.starty : ( elembx[2] > boxbx[2] ? boxbx[2] - elem.starty - elem._staticHeight : y ) 
		];
	return snap;
}
/***************************************************
* Rendezés beállítása
*****************************************************/
var rendezesIdPattern = /^(\d+)rendezes$/;
var megoldasFormName = 'form1';

/***************************************************
* Összerendelés beállítása
*****************************************************/
var dragIdPattern = /^drag\[(\d+)\]\[(\d+)\]$/;
var dropIdPattern = /^drop\[(\d+)\]\[(\d+)\]$/;


function linkMegoldas( elem, drop )
{
	dragIdPattern.exec( elem.id );
	var feladatid = RegExp.$1;
	var o1 = RegExp.$2;
	dropIdPattern.exec( drop.id );
	var o2 = RegExp.$2;
	
	var mo = document.forms[ megoldasFormName ].elements['megoldas['+feladatid+']['+o2+']'];
	var valasz = document.forms[ megoldasFormName ].elements['valasz['+feladatid+']['+o1+']'];
	if( valasz )
	{
//	alert( value );
		clearValueOf( elem, dragIdPattern, valasz.value );
		mo.value = valasz.value;
	} else
	{
		alert( "hibás feladat ( megoldassetup: 221 )" );
	}
}

function unlinkMegoldas( elem )
{
	trace( 'unlink' );
	dragIdPattern.exec( elem.id );
	var feladatid = RegExp.$1;
	var o1 = RegExp.$2;
	var valasz = document.forms[ megoldasFormName ].elements['valasz['+feladatid+']['+o1+']'];
	if( ! valasz ) alert( "Hibás feladat: megoldassetup 235 " + 'valasz['+feladatid+']['+o1+']' );
/*
	if( elem.firstChild.nodeName && elem.firstChild.nodeName.toLowerCase() == "img" )
		var value = elem.firstChild.getAttribute( "alt" );
	else
		var value = elem.firstChild.data;
*/
	clearValueOf( elem, dragIdPattern, valasz.value );
}

function setupOsszerendeles()
{
	/**
	* Húzható elemek beállítása
	* TODO: A droput div kell legyen a határa
	*/
	forall( 'div', dragIdPattern, 'id', function( id ) {
		dragIdPattern.exec( id );
		var fid = RegExp.$1;
		var dropoutid = "dropout["+fid+"]";
		var S = $( id );
		addDragClass( S );
		S._staticWidth = S.offsetWidth;
		S._staticHeight = S.offsetHeight;
		S.style.zIndex = 50;
		
		func = new Function( "x", "y", "return checkBoundingbox( x, y, '"+dropoutid+"', '"+id+"' )" );
		new Draggable( id, {
			revert: false,
			snap: func
		});
	});
	
	/**
	* Ejtő helyek beállítása
	*/
	forall( 'div', dropIdPattern, 'id', function( id ) {
		var acceptregexp = /^drop(\[\d+\])/;
		acceptregexp.exec( id );
		var acceptclass = "drag" + RegExp.$1;
		trace( acceptclass );
		Droppables.add( id, {
			accept:acceptclass,
			hoverclass:'onaffect',
			onDrop:function( elem, drop )
				{
					linkMegoldas( elem, drop );
				}
		});
		var S = $(id);
		if( aBrowser['MSIE'] == true )
		{
			Style.setAttribute( S, 'position', 'static' );
		}
	});

}

/***************************************************
* Aláhúzott beállítása
*****************************************************/
var dragahIdPattern = /^dragah\[(\d+)\]\[(\d+)\]$/;
var dragahpIdPattern = /^dragah\[(\d+)\]\[(\d+)\]\[p\]$/;
var dropahIdPattern = /^dropah\[(\d+)\]\[(\d+)\]$/;
var dropoutahIdPattern = /^dropoutah\[(\d+)\]$/;

function setAHMegoldas( elem, drop )
{
	var muctrlname = /dragah/;
	
	var ctrlname = drop.id.replace( /dropah/, 'megoldas');
	var mo = document.forms[ megoldasFormName ].elements[ctrlname];
	clearValueOf( elem, dragahIdPattern );
	mo.value = elem.firstChild.data;
	
	if( muctrlname.exec( elem.getAttribute( "id" ) ) )
	{
		/**
		* Másolatkészítés kiszedése
		*/
		var drag = Draggables.drags.find( function( e, i ) { return e.element.id == elem.id });
		Draggables.removeObserver( elem );
		if( drag )
			drag.destroy();
		new Draggable( elem, {revert: false});
	}
}

function unsetAHMegoldas( elem )
{
	clearValueOf( elem, dragahIdPattern );
	clearValueOf( elem, dragahpIdPattern );
	var muctrlname = /dragah/;
	if( muctrlname.exec( elem.getAttribute( "id" ) ) )
	{
		deleteDraggable( elem );
	}
}


function setupAláhuzottDrag( id )
{
	dragahIdPattern.exec( id );
	var fid = RegExp.$1;
	var dropoutid = "dropoutah["+fid+"]";
	var S = $( id );
	addDragClass( S );
	S._staticWidth = S.offsetWidth;
	S._staticHeight = S.offsetHeight;
	S.style.zIndex = 50;
	
	func = new Function( "x", "y", "return checkBoundingbox( x, y, '"+dropoutid+"', '"+id+"' )" );
	
	new Draggable( id, {
		revert: false,
		snap: func
	});
	Draggables.addObserver(new NyoDragingObserver( 
		$( id ), 
		Prototype.emptyFunction, 
		/(dragah\[\d+\])/, 
		setupAláhuzottDrag 
	) );		
}


function setupOsszerendelesAH()
{
	/**
	* Húzható elemek beállítása
	* TODO: A droput div kell legyen a határa
	*/
	forall( 'span', dragahIdPattern, 'id', function( id ) {
		setupAláhuzottDrag( id );
	});

	forall( 'span', dragahpIdPattern, 'id', function( id ) {
		dragahpIdPattern.exec( id );
		var fid = RegExp.$1;
		var dropoutid = "dropoutah["+fid+"]";
		var S = $( id );
		addDragClass( S );
		S._staticWidth = S.offsetWidth;
		S._staticHeight = S.offsetHeight;
		S.style.zIndex = 50;
		
		func = new Function( "x", "y", "return checkBoundingbox( x, y, '"+dropoutid+"', '"+id+"' )" );
		new Draggable( id, {
			revert: false,
			snap: func
		});
	});
	
	/**
	* Ejtő helyek beállítása
	*/
	forall( 'div', dropahIdPattern, 'id', function( id ) {
		var acceptregexp = /^dropah(\[\d+\])/;
		acceptregexp.exec( id );
		var acceptclass = "dragah" + RegExp.$1;
		Droppables.add( id, {
			accept:acceptclass,
			hoverclass:'onaffect',
			onDrop:function( elem, drop )
				{
					clearValueOf( elem, /^dragah\[(\d+)\]/ );
					setAHMegoldas( elem, drop );
				}
		});
		var S = $(id);
		if( aBrowser['MSIE'] == true )
		{
			Style.setAttribute( S, 'position', 'static' );
		}
	});
	

}



/***************************************************
* Lückentext beállítása
*****************************************************/
var dragltIdPattern = /^draglt\[(\d+)\]\[(\d+)\]\[t?(\d+)\]$/;
var dragltmusIdPattern = /^dragltmus\[(\d+)\]\[(\d+)\]\[(\d+)\]$/;
var dragltmuIdPattern = /^dragltmu\[(\d+)\]\[(\d+)\]\[t?(\d+)\]$/;
var dropltIdPattern = /^droplt\[(\d+)\]\[(\d+)\]\[(\d+)\]$/;
var dropoutltIdPattern = /^dropoutlt\[(\d+)\]\[(\d+)\]$/;

function clearLtMegoldas( elem )
{
	if( elem._droppos && elem._droppos != null )
	{
		var ctrlname = elem._droppos.replace( /droplt/, 'megoldas' );
		var mo = document.forms[ megoldasFormName ].elements[ctrlname];
		mo.value = '';
		Style.removeAttribute( $(elem._droppos), 'backgroundColor' );

		elem._droppos = null;
	}
}

function setLTMegoldas( elem, drop )
{
	var muctrlname = /dragltmus?/;
	if( elem._droppos == drop.id ) return;
	
	var ctrlname = drop.id.replace( /droplt/, 'megoldas');
	var mo = document.forms[ megoldasFormName ].elements[ctrlname];
	if( muctrlname.exec( elem.getAttribute( "id" ) ) )
	{
		mo.value = elem.firstChild.data;
		
		/**
		* Másolatkészítés kiszedése
		*/
		var drag = Draggables.drags.find( function( e, i ) { return e.element.id == elem.id });
		Draggables.removeObserver( elem );
		if( drag )
			drag.destroy();
		new Draggable( elem.id, {revert: false});
	} else
	{
		mo.value = elem.firstChild.data;
	}
	Style.setAttribute( drop, 'backgroundColor', '#ffffaa' );
	clearLtMegoldas( elem );
	elem._droppos = drop.id;
}

function unsetLTMegoldas( elem )
{
	var muctrlname = /dragltmus?/;
	clearLtMegoldas( elem );
	if( muctrlname.exec( elem.getAttribute( "id" ) ) )
	{
		deleteDraggable( elem );
	}
}


function setupLuckentextMultiuse( id )
{
	if( ! dragltmuIdPattern.exec( id ) )
		trace( id );
	var fid = RegExp.$1;
	var afid = RegExp.$2;
	var dropoutid = "dropoutlt["+fid+"]["+afid+"]";
	
	var S = $( id );
	S._staticWidth = S.offsetWidth;
	S._staticHeight = S.offsetHeight;

	addDragClass( S );
	S.style.zIndex = 50;
	
	func = new Function( "x", "y", "return checkBoundingbox( x, y, '"+dropoutid+"', '"+id+"' )" );
	new Draggable( id, {
		revert: false,
		snap: func
	});
	S.style.zIndex = 50;
	Draggables.addObserver(new NyoDragingObserver( 
		$( id ), 
		Prototype.emptyFunction, 
		/(dragltmu\[\d+\]\[\d+\])/, 
		setupLuckentextMultiuse 
	) );
}

function setupLuckentext()
{
	/**
	* Lückentext behúzós szavak beállítása
	*/
	forall( 'span', dragltIdPattern, 'id', function( id ) {
		var S = $( id );
		S._staticWidth = S.offsetWidth;
		S._staticHeight = S.offsetHeight;

		addDragClass( S );

		var parentId = S.id.replace( /draglt/, 'droplt' );
		var parent = Elem.findParent( S, 'id', parentId );
		if( parent )
		{
			S._droppos = parentId;
			Position.absolutize( S );
		}
		
		new Draggable( id, {
			revert: false
		});
		S.style.zIndex = 50;
	});
	
	/**
	* Lückentext behúzós szavak beállítása
	*/
	forall( 'span', dragltmuIdPattern, 'id', function( id ) {
		setupLuckentextMultiuse( id );
	});
	
	/**
	* Lückentext mentett multiuse szavak behúzós szavak beállítása
	*/
	forall( 'span', dragltmusIdPattern, 'id', function( id ) {
		var S = $( id );
		S._staticWidth = S.offsetWidth;
		S._staticHeight = S.offsetHeight;

		var wb = $( 'wordbank' );
		addDragClass( S );

		var e = S;
		Position.absolutize( S );
//		Style.setAttribute( S, 'position', 'absolute' );
		var drg = new Draggable( id, {
			revert: false
		});
	});
	
	/**
	* Lückentext behúzós helyek beállítása
	*/
	forall( 'span', dropltIdPattern, 'id', function( id ) {
		var acceptregexp = /^droplt(\[\d+\]\[\d+\])/;
		acceptregexp.exec( id );
		var acceptclass = [ "draglt" + RegExp.$1, "dragltmu" + RegExp.$1 ];

		var S = $( id );

		Droppables.add( id, {
			accept:acceptclass,
			hoverclass:'onaffect',
			onDrop:function( elem, drop )
				{
					setLTMegoldas( elem, drop );
				}
		});
		/* nem explorer alatt */
		if( aBrowser['MSIE'] == true )
		{
			Style.setAttribute( S, 'position', 'static' );
			Style.setAttribute( S, 'zoom', 		'1' );
		}
//		debugwin.show( S );
	});
//	self.setTimeout('alignluckentext()', 5000);
	alignluckentext();
}

function alignluckentext()
{
	forall( 'span', dragltmusIdPattern, 'id', function( id ) {
		var S = $( id );
		var parentId = S.id.replace( /dragltmus/, 'droplt' );
		var parent = Elem.findParent( S, 'id', parentId );
		var realparent = S.parentNode;

		S._droppos = parentId;

		if( parent  )
		{
 			Style.setAttribute( parent, 'backgroundColor', '#ffffaa' );
		
			/* explorer alatt */
			if( aBrowser['MSIE'] == true )
			{
				var parentpos = Position.cumulativeOffset(parent)
				S.style.left = parentpos[0] + "px";
				S.style.top = parentpos[1] + "px";
			} else
			{
				S.style.left = "0px";
				S.style.top = "-3px";
			}
		}
		S.style.zIndex = 50;

		S.style.width = "160px";
		S.style.height = S._staticHeight + "px";
		Style.setAttribute( S, 'zoom', 		'1' );
	});

	forall( 'span', dragltIdPattern, 'id', function( id ) {
		var S = $( id );
		var parentId = S.id.replace( /draglt/, 'droplt' );
		var parent = Elem.findParent( S, 'id', parentId );
		var realparent = S.parentNode;

		if( parent )
		{
			S._droppos = parentId;
//			Position.absolutize( S );
			Style.setAttribute( $(S._droppos), 'backgroundColor', '#ffffaa' );

//			debugwin.show( parent );
			/* explorer alatt */
			if( aBrowser['MSIE'] == true )
			{
				var parentpos = Position.cumulativeOffset(realparent)
				S.style.left = parentpos[0] + "px";
				S.style.top = parentpos[1] + "px";
			} else {
				S.style.left = "0px";
				S.style.top = "-3px";
			}
		}
	});
	
	
}

function setupDroparea()
{
	/**
	* kivételi helyek beállítása
	*/
	Droppables.add( 'mdropout', {
		accept: $A(allDragClasses),
		onDrop:function( elem, drop )
			{
				unsetMegoldas( elem, drop );
			}
	});
}

function setupMegoldas()
{
	forall( 'ul', rendezesIdPattern, 'id', function( id ) { 
		Sortable.create( id ); 
	});
	var aE = document.forms[ megoldasFormName ].elements;

	setupOsszerendeles();
	setupOsszerendelesAH();
	setupLuckentext();
//	setupLuckentext();
	setupDroparea();
	
	addEvent(document.forms[ megoldasFormName ], 'submit', onSubmit );
	addEvent(aE['sbmt_print'], 'click', onPrint );
}

function onPrint()
{
	newwin_submit( megoldasFormName, 'print' );
}

function onSubmit()
{
	forall( 'ul', rendezesIdPattern, 'id', function( id ) 
	{
		var seq = Sortable.sequence( id );
		rendezesIdPattern.exec( id );
		var feladatid = RegExp.$1;
		document.forms[ megoldasFormName ].elements['megoldas['+feladatid+'][megoldas]'].value = seq;
	});

	if( typeof( rule ) != 'undefined' )
	{
//		display_arraykeys( rule );
		for( fid in rule )
		{
			if( typeof( rule[ fid ] ) == "function" ) continue;
			oDiv = document.getElementById( "rejtveny_megoldas_" + fid );
//			if( ! oDiv ) alert( "Nincs ilyen: " + "rejtveny_megoldas_" + fid );
//			else alert( "Van ilyen: " + "rejtveny_megoldas_" + fid );
			oDiv.innerHTML = "";
			ArraytoPhpArray( rule[ fid ], oDiv, "megoldas["+fid+"]" );
		}
	}
}

addEvent(window, 'load', setupMegoldas );

