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 = Elem.getAttribute( tag, attr );
		if( debugforall == true ) alert( 'attribute: ' + attr + ' = ' + chk );
		
		if( pattern.exec( chk ) )
		{
			if( debugforall == true ) alert( 'tag ok' );
			iterator( chk, tag );
		} 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 ) {
//		trace( [ tag.getAttribute( 'name' ), "megoldas\\[" + feladatid + "\\]" ] );
		if( ctrlpattern.exec( tag.getAttribute( 'name' ) ) )
		{
			if( tag.value == value )
			{
				trace( tag.getAttribute( 'name' ) );
				fields.push( tag.getAttribute( 'name' ) );
				tag.value = '';
			}
		}
	});
//	trace( "return " + fields.length );
	return fields;
}

function clearLtBackround( fields )
{
	fields.each( function( name ) {
		var id = name.replace( /megoldas/, "droplt" );
		Stye.removeAttribute( $(id), 'backgroundColor' );
	});
}

function unsetMegoldas( elem, drop )
{
	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, drop )
	} 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;
}

var MOVE_INTO = 1;
var MOVE_LEFT = 2;

function moveItem( drag, drop, pos )
{
	var dpwidth = drop.offsetWidth;
	var dpheight = drop.offsetHeight;

	var dgwidth = drag.offsetWidth;
	var dgheight = drag.offsetHeight;
	
    var offsetsbox = Position.cumulativeOffset( drop );
	switch( pos )
	{
		case MOVE_INTO:
			var dgx = offsetsbox[0] + ( ( dpwidth - dgwidth ) / 2 );
			var dgy = offsetsbox[1] + ( ( dpheight - dgheight ) / 2 );
			break;
		case MOVE_LEFT:
			var dgx = offsetsbox[0] + dpwidth;
			var dgy = offsetsbox[1];
			break;
		default:
			alert( "ismeretlen pozíció" );
	}
	trace( offsetsbox );
	trace( dpwidth + ' ' + dgx + ' ' + dgy );
	Style.setAttribute( drag, "top", dgy + "px" );
	Style.setAttribute( drag, "left", dgx + "px" );
}



/***************************************************
* 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 placeORdrag( feladatid, content )
{
	var inserted = false;
	var dropout = $('dropout['+feladatid+']');
	var dragtable = Elem.firstSibling( dropout.firstChild, "class", "paros_top" );
	var tr = Elem.findChild( dragtable, "nodeName", "TR" );
	while( tr )
	{
		var unlinked = Elem.findChild( tr, "nodeName", "DIV" );
		if( ! unlinked )
		{
			var td = Elem.firstSibling( tr.firstChild, "nodeName", "TD" );
			td.appendChild( content );
			Style.setAttribute( content, "top", 0 + "px" );
			Style.setAttribute( content, "left", 0 + "px" );
			inserted = true;
			break;
		}
		var tr = Elem.nextSibling( tr, "nodeName", "TR" );
	}
	if( inserted == false )
	{
		var tbody = Elem.findChild( dragtable, "nodeName", "TBODY" );
		if( ! tbody )
		{
			tbody = Elem.create( "tbody" );
			dragtable.appendChild( tbody );
		}
		var td;
		var tr = 
			Elem.create( "tr", null,
				td = Elem.create( "td" ) );
		tbody.appendChild( tr );
		td.appendChild( content );
		Style.setAttribute( content, "top", 0 + "px" );
		Style.setAttribute( content, "left", 0 + "px" );
		
	}
}

function linkMegoldas( elem, drop )
{
	var aE = document.forms[ megoldasFormName ].elements;

	dragIdPattern.exec( elem.id );
	var feladatid = RegExp.$1;
	var o2 = RegExp.$2;
	dropIdPattern.exec( drop.id );
	var o1 = RegExp.$2;
	
	var mo = document.forms[ megoldasFormName ].elements['megoldas['+feladatid+']['+o1+']'];
	var valasz = document.forms[ megoldasFormName ].elements['valasz['+feladatid+']['+o2+']'];
	var id = drop.id.replace( /drop/, "dropplace" );
	var dropplace = $(id);
	if( valasz )
	{
//	alert( value );
		var fields = clearValueOf( elem, dragIdPattern, valasz.value );
		for( var i = 0; i < fields.length; i++ )
		{
			var p = Elem.getParent( aE[ fields[i] ] );
			Style.removeAttribute( p, 'backgroundColor' );
			// pozícionálni kell
		}
		mo.value = valasz.value;
	} else
	{
		alert( "hibás feladat ( megoldassetup: 264 )" );
	}
	var c1 = Elem.firstSibling( drop.firstChild, "nodeName", "DIV" );
	if( ! c1 ) alert( "Hiba, az első oszlop divjét nem találom" );
	else {
		var content = Elem.firstSibling( dropplace.firstChild, "nodeName", "DIV" );

		/**
		* ha az adott helyre már van behúzva pár, akkor megkeresi a drag elemek táblázatát
		* keres egy üres sort az elemnek és áthelyezi a már behúzott párt a kiindúló helyre
		*/
		if( content )
		{
			placeORdrag( feladatid, content );
		}
		Style.setAttribute( drop, 'backgroundColor', '#ffffaa' );
		Elem.setContent( dropplace, elem );
		Style.setAttribute( elem, "top", 0 + "px" );
		Style.setAttribute( elem, "left", 0 + "px" );
/*		Position.absolutize( elem );
		moveItem( elem, c1, MOVE_LEFT );
		Position.relativize( elem );
*/	}
	trace( mo.value );
}

function unlinkMegoldas( elem )
{
	trace( 'unlink' );
	var aE = document.forms[ megoldasFormName ].elements;
	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;
*/
	var fields = clearValueOf( elem, dragIdPattern, valasz.value );
	var parents = [];
	for( var i = 0; i < fields.length; i++ )
	{
		var p = Elem.getParent( aE[ fields[i] ] );
		Style.removeAttribute( p, 'backgroundColor' );
		parents[ parents.length ] = p;
//		alert( p.innerHTML );
		// pozícionálni kell
	}
	placeORdrag( feladatid, elem );
	for( var i = 0; i < parents.length; i++ )
	{
		Elem.setContent( Elem.findChild( parents[i], 'id', /dropplace/ ), Elem.create( 'span', null, '' ) );
	}
}

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);
		var filled = Elem.findChild( S, "className", acceptclass );
		if( filled )
		{
			Style.setAttribute( S, 'backgroundColor', '#ffffaa' );
		}
		if( aBrowser['MSIE'] == true )
		{
			Style.setAttribute( S, 'position', 'static' );
		}
	});

}

/***************************************************
* Aláhúzott beállítása
*****************************************************/
var dragahIdPattern = /^dragah\[(\d+)\]\[t?(\d+)\]$/;
var dragahpIdPattern = /^dragah\[(\d+)\]\[(\d+)\]\[p\]$/;
var dropahIdPattern = /^dropah\[(\d+)\]\[(\d+)\]$/;
var dropoutahIdPattern = /^dropoutah\[(\d+)\]$/;

function setAHMegoldas( elem, drop )
{
	var aE = document.forms[ megoldasFormName ].elements;
	var muctrlname = /dragah/;
	
	var ctrlname = drop.id.replace( /dropah/, 'megoldas');
	var mo = document.forms[ megoldasFormName ].elements[ctrlname];

	var id = drop.id.replace( /dropah/, "dropplace" );
	var dropplace = $(id);
	
	/**
	* előző értékének törlése
	*/
	unsetAHMegoldas( elem, drop );	// az elem-en kívül a többi példány törlése
	/*
	var fields = clearValueOf( elem, dragahIdPattern );
	for( var i = 0; i < fields.length; i++ )
	{
		var p = Elem.getParent( aE[ fields[i] ] );
		Style.removeAttribute( p, 'backgroundColor' );
	}
	*/
	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});
	}
	if( dropplace.firstChild )
	{
		var content = Elem.firstSibling( dropplace.firstChild, 'className', /dragah/ );
		trace( "removeAHMegoldas" );
		if( content && content != elem )
			deleteDraggable( content );
	}
	Elem.setContent( dropplace, elem );
	Style.setAttribute( elem, "top", 0 + "px" );
	Style.setAttribute( elem, "left", 0 + "px" );
	Style.setAttribute( drop, 'backgroundColor', '#ffffaa' );
	Style.setAttribute( drop, 'zoom', '1' );
}

function unsetAHMegoldas( elem, drop )
{
	var te;
	var aE = document.forms[ megoldasFormName ].elements;
	
	trace( "unsetAHMegoldas1" );
	
	// Kitörli azon megoldas[feladatid] hidden mezők értéket, melyek ezt az elemet tartalmazzák
	// és visszaadja az hiden mezők neveit, melyeket kitörölt.
//	alert( Elem.getAttribute( elem.parentNode, "id" ) );
	if( /dropplace/.exec( Elem.getAttribute( elem.parentNode, "id" ) ) ||
		Elem.getAttribute( drop, "id" ) != "mdropout" )
	{
		var fields = clearValueOf( elem, dragahIdPattern );
		trace( 'fields.length ' + fields.length );
		// végigmegy a mezőkön és a szülő id háttérszínét törli, majd a húzható elemet tároló div
		// tartalmát törli
		for( var i = 0; i < fields.length; i++ )
		{
			var p = Elem.getParent( aE[ fields[i] ] );
			Style.removeAttribute( p, 'backgroundColor' );
			var c = Elem.nextSibling( aE[ fields[i] ], "nodeName", "DIV" );
			// a már behúzott elem
			te = Elem.findChild( c, 'nodeName', "SPAN" )
			deleteDraggable( te );
			Elem.setContent( c );
		}
		
		// az előző törlési folyamat, csak a szerver oldalon behúzott elemekre
		trace( "unsetAHMegoldas2" );
		var fields = clearValueOf( elem, dragahpIdPattern );
		for( var i = 0; i < fields.length; i++ )
		{
			var p = Elem.getParent( aE[ fields[i] ] );
			Style.removeAttribute( p, 'backgroundColor' );
			var c = Elem.nextSibling( aE[ fields[i] ], "nodeName", "DIV" );
			te = Elem.findChild( c, 'nodeName', "SPAN" );
			Elem.setContent( c );
		}
	}

	if( drop && Elem.getAttribute( drop, "id" ) == "mdropout" && elem.parentNode )
	{
		var muctrlname = /dragah/;
		if( muctrlname.exec( elem.getAttribute( "id" ) ) )
		{
			deleteDraggable( elem );
		}
	}

}


function setupAlahuzottDrag( 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+\])/, 
		setupAlahuzottDrag 
	) );		
}


function setupOsszerendelesAH()
{
	/**
	* Húzható elemek beállítása
	* TODO: A droput div kell legyen a határa
	*/
	forall( 'span', dragahIdPattern, 'id', function( id ) {
		setupAlahuzottDrag( 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);
		var filled = Elem.findChild( S, "className", acceptclass );
		if( filled )
		{
			Style.setAttribute( S, 'backgroundColor', '#ffffaa' );
		}
		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];

	/*
	* Előző értékek/megoldások kitörlése
	*/
	var currentVal = Elem.findChild( drop, "class", /drag/ );
	if( currentVal && currentVal != elem )
	{
		if( ! backToWordbank( currentVal ) )
			unsetLTMegoldas( currentVal );
		currentVal._droppos = null;
	}
	var elemParent = Elem.findParent( elem, "id", /droplt/ );
	if( elemParent && elemParent != drop )
	{
		trace( "clearLT" );
		clearLtMegoldas( elem );
	}

	/*
	* Új megoldás beállítása
	*/
	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' );
	drop.appendChild( elem );
	/* IE alatt így lehet normálisan beállítani a pozíciót és FF alatt is működik */

	Position.relativize( elem );
//	alert( elem.style.left + ' ' + elem.style.top );
/* 
	Style.setAttribute( elem, "top", -5 + "px" );
	Style.setAttribute( elem, "left", -100 + "px" );
	Position.absolutize( elem );
*/
	Style.removeAttribute( elem, "top" );
	Style.removeAttribute( elem, "left" );

/*
	var pos = Position.cumulativeOffset( drop );
	trace( pos[0] + ' ' + pos[1] );
	var pos = Position.cumulativeOffset( elem );
	trace( pos[0] + ' ' + pos[1] );

	Position.relativize( drop );
//	alert( drop.style.left + ' ' + drop.style.top );
	Position.absolutize( drop );
*/

	elem.style.width = elem._staticWidth + "px";
	elem.style.height = elem._staticHeight + "px";
	Style.setAttribute( elem, "zoom", "1" );
	elem._droppos = drop.id;
}

function backToWordbank( elem )
{
	if( ! dragltIdPattern.exec( elem.getAttribute( "id" ) ) )
		return false;
	var dropout = $('dropoutlt['+RegExp.$1+']['+RegExp.$2+']');
	if( ! dropout ) alert( 'not found: dropoutlt['+RegExp.$1+']['+RegExp.$2+']' );
	var wb = Elem.findChild( dropout, "class", "wb_content" );
	wb.appendChild( elem );
	Position.relativize( elem );
	Style.setAttribute( elem, "top", 0 + "px" );
	Style.setAttribute( elem, "left", 0 + "px" );
}

function unsetLTMegoldas( elem )
{
	var muctrlname = /dragltmus?/;
	clearLtMegoldas( elem );
	if( muctrlname.exec( elem.getAttribute( "id" ) ) )
	{
		deleteDraggable( elem );
	} else
	{
		backToWordbank( 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 setupInfoicon()
{
	/**
	* Lückentext behúzós szavak beállítása
	*/
	var body = document.getElementsByTagName('body')[0]; 
	forall( 'span', /info_\d+/, 'id', function( id ) {
		var obj = $(id);
		var exp = id.replace( /info/, "explain" );
		var oExp = $(exp);
		body.appendChild( oExp );
		var w = oExp.style.width;
		var h = oExp.style.height;
		Position.absolutize( oExp );
		oExp.style.width = w;
		oExp.style.height = h;
		Style.setAttribute( oExp, "zIndex", 1000 );
		
//		Style.setAttribute( oExp, "top", ( offsetsbox[1] - 10 ) + "px" );
//		Style.setAttribute( oExp, "left", ( offsetsbox[0] + 10 ) + "px" );

		Elem.setAttribute( obj, "onclick", "showExplain( '"+exp+"', true, event )" );
		Elem.setAttribute( obj, "onmouseout", "showExplain( '"+exp+"', false, event )" );
	});
}

function showExplain( id, show, e )
{
	var exp = $( id );
	if( show == true )
	{
	    var ob = Position.realOffset(exp);
//		alert( ob[0] + ' ' + ob[1] );
//		alert( Mouse.Y( e ) + ' ' + Mouse.X( e ) );
		Style.setAttribute( exp, "top", Mouse.Y( e ) + 10 + "px" );
		Style.setAttribute( exp, "left", Mouse.X( e ) + 10 + "px" );
		Style.setAttribute( exp, "zIndex", 100 );
		Element.setOpacity( exp, 1.0 );
		Style.removeAttribute( exp, "display" );

//		Effect.Appear( exp );

	} else
	{
		var op = Element.getOpacity( exp );
		op = op != null ? parseFloat( op ) : 0.0;
		op = Style.getAttribute( exp, "display" ) == "none" ? 0.0 : op;

		if( op > 0 )
		{
//			Effect.Appear( exp, { from: op, to: 0.0 } );
			Style.setAttribute( exp, "zIndex", -100 );
			Style.setAttribute( exp, "display", "none" );
		}
	}
}
function setupMiniamp()
{
	/**
	* Lückentext behúzós szavak beállítása
	*/
//			Elem.create( "param", {name: "flashvars", value: "fp="+obj.href+"&amp;fg=9BAFC5&amp;bg=FFFFFF"} ),
/*

*/	forall( 'a', /miniamp/, 'className', function( className, obj ) {
		var ply = Elem.create( "object", {type: "application/x-shockwave-flash", data: "jsext/miniamp/miniamp.swf", width: "150", height: "29"},
			Elem.create( "param", {name: "movie", value: "jsext/miniamp/miniamp.swf"} ),
			Elem.create( "param", {name: "flashvars", value: "fp=upload%2Ffile%2Ftest%2Fmephisto%2Emp3&amp;fg=9BAFC5&amp;bg=FFFFFF"} ),
			Elem.create( "param", {name: "menu", value: "false"} ),
			Elem.create( "a", {className: "miniamp", href: "http://www.macromedia.com/go/getflashplayer", title: "Flash lejátszó letöltése"},
				"Nincs flash lejátszód, vagy nincs engedélyezve." )
		);
//		var src = document.createTextNode( ply.innerHTML );
//		obj.parentNode.appendChild( src );

		obj.parentNode.replaceChild( ply, obj );
//		ply.LoadMovie(0, "jsext/miniamp/miniamp.swf");
	});
	
	tt=document.getElementById('interactive');
	tt.LoadMovie(0, "jsext/miniamp/miniamp.swf");
	var p1 = Elem.create( "param", {name: "movie", value: "jsext/miniamp/miniamp.swf"} );
}

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 = S._staticWidth + "px";
		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();
	setupDroparea();
	setupInfoicon();
//	setupMiniamp();

	addEvent(document.forms[ megoldasFormName ], 'submit', onSubmit );
}

function onPrint( msg )
{
	if( confirm( msg ) )
	{
		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 );

