Memory = function( name, max, directory ) {
	var cardDir    	= directory;
	var cardMax	= max;
	var myname	= name;
	var cardImages 	= new Array();
	var openList	= new Array();
	var allOpenList	= new Array();
	var shuffle	= new Array();
	var imgsToLoad  = max + 1;

	var open;
	var score;
	var tries;

	var getImageURL = function( name ) {
		return "" + cardDir + "/" + name + ".gif";
	}

	var getImage = function( name ) {
		var newImage = new Image();
		newImage.src = getImageURL( name );
		newImage.onload = function() {
			if( --imgsToLoad == 0 )
			
				addWindowOnload = start();
	       	}

		return newImage;
	}

	var getShuffleList = function() {
		var shuffle = new Array();

		// Liste ( 0, 0, 1, 1, 2, 2 ...)
		for( var i = 0; i < cardMax; i ++ ) {
			shuffle[ i * 2 + 0 ] = i;
			shuffle[ i * 2 + 1 ] = i;
		}

		// Mischen
		for( var i = 0; i < cardMax * 2; i ++ ) {
			var j = Math.floor( Math.random() * cardMax * 2 );
			var t = shuffle[i];
			shuffle[i] = shuffle[j];
			shuffle[j] = t;
		}

		return shuffle;
	}

	var setCardImage = function( id, image ) {
		document.getElementById( myname + id ).src = image.src;
	}

	var setTitle = function() {
		document.title = "Memory: " + score + " Paar" + ( ( score != 1 ) ? "e" : "" ) + " in " + tries + " Versuch" + ( ( tries != 1 ) ? "en" : "" );
	}

	// Feld ausgeben
	var output = function() {
		var output = "";

		for( var id = 0; id < cardMax * 2; id ++ )
			output += '<a href="#" onclick="' + name + '.click(' + id + ')">' +
				  '<span>' +
				  '<img id="' + myname + id + '" src="' + getImageURL("back") +'" alt="..." />' +
				  '</span>' +
				  '</a>';

		return output;
	}

	var init = function() {
		for( var i = 0; i < cardMax * 2 ; i++ ) {
			allOpenList[i] = -1;
			setCardImage( i, backImage );
		}

		shuffle = getShuffleList();
		open  = 0;
		score = 0;
		tries = 0;
	}


	// Initialisierung der Bilder:
	var backImage = getImage( "back" );

	for( var id = 0; id < cardMax; id ++ )
		cardImages[id] = getImage(id);


	// Starten bei Onload
	var start = function() {
		document.getElementById( name ).innerHTML = output();
		init();
	}


	// Methoden
	this.click = function( id ) {

		// Karte noch zu?
		if( allOpenList[id] == -1 ) {

			// dritte Karte ?
			if( open == 2 ) {
				setCardImage( openList[0], backImage );
				setCardImage( openList[1], backImage );
				allOpenList[ openList[0] ] = -1;
				allOpenList[ openList[1] ] = -1;
				open = 0;
			}

			// Karte oefnen und merken
			openList[open] = id;
			allOpenList[id] = 1;
			setCardImage( id, cardImages[ shuffle[id] ] );

			// zweite Karte???
			if( open == 1 ) {
				tries++;

				if( shuffle[ openList[0] ] == shuffle[ openList[1] ] ) {
					score++;
					open = -1;
				}
			}

			open++
			setTitle();

			if( score == cardMax ) {
				alert( "G E W O N N E N !");
				init();
			}
		}
	}
}

