function TwitterImageDownloader(domElement) 
{
	var imageContainer = domElement;
	
	var maxRequestsPerPage = 100;
	var expectedImages = 0;
	var imagesLoaded = 0;
	
	var progressCallback = null;
	var completeCallback = null;
	var levelCompleteCallback = null;
	
	var playerName = null;
	var selectedLevel = null;
	
	var levels = [
					{size:'50px', images:50}, 
					{size:'50px', images:75}, 
					{size:'50px', images:150},
					{size:'40px', images:250},
					{size:'30px', images:350},
					{size:'30px', images:500},
					{size:'25px', images:750},
					{size:'20px', images:950},
					{size:'20px', images:1200},
					{size:'15px', images:1500}
				 ]

	this.DownloadImages = function(player, level, progress, complete, levelcomplete) 
	{	
		progressCallback = progress;
		completeCallback = complete;
		levelCompleteCallback = levelcomplete;
		
		selectedLevel = levels[level - 1];
		playerName = player;
		
		var totalToDownload = selectedLevel.images;
		
		while (totalToDownload != 0)
		{
			if (totalToDownload >= maxRequestsPerPage)
			{
				downloadImages(maxRequestsPerPage);
				totalToDownload -= maxRequestsPerPage;
			}
			else
			{
				downloadImages(totalToDownload);
				totalToDownload -= totalToDownload;
			}					
		}		
	}
	
	var downloadImages = function(total)
	{
		$.getJSON("http://search.twitter.com/search.json?q=" + getRandomWord() + "&rpp=" + total + "&callback=?", function(search)
		{
			expectedImages += search.results.length;
		
			for (var i=0; i<search.results.length; i++)
			{
				if (search.results[i].profile_image_url.match('http://static.twitter.com/images/default_profile_normal.png') == null)
				{
					var image = document.createElement("img");
					
					image.onload = singleImageLoaded;
					image.onerror = singleImageLoaded;
					
					image.src = unescape(search.results[i].profile_image_url);
					image.style.width = selectedLevel.size;
					image.style.height = selectedLevel.size;
					image.className = "no";
					
					$("#" + imageContainer).append(image);
				}
				else
				{
					imagesLoaded++;
				}
			}
		});
	}
	
	var downloadPlayerImage = function(playerName)
	{
		$.getJSON("http://twitter.com/users/" + playerName + ".json?callback=?", function(data)
		{
			var image = document.createElement("img");

			image.onload = playerImageLoaded;
			image.onerror = playerImageLoaded;
			
			image.src = unescape(data.profile_image_url);
			image.style.width = selectedLevel.size;
			image.style.height = selectedLevel.size;
			image.className = "yes";
			
			var index = Math.floor(Math.random() * $("#" + imageContainer).children().length)
			$($("#" + imageContainer).children()[index]).after(image);
		});
	}
	
	var singleImageLoaded = function()
	{
		imagesLoaded++;
		
		if (progressCallback != null)
		{
			progressCallback(Math.round((imagesLoaded / expectedImages) * 100));
		}	
		
		if (imagesLoaded == expectedImages)
		{		
			downloadPlayerImage(playerName);
		}
	}
	
	var playerImageLoaded = function()
	{
		if (completeCallback != null)
		{
			setTimeout(associateLogicWithImages, 1000);		
			completeCallback(imagesLoaded);
		}
	}
	
	var associateLogicWithImages = function() 
	{ 
		$("#" + imageContainer + " img").click(function() 
		{ 
			if ($(this).attr("class") == "yes")
			{
				levelCompleteCallback();
			}
		});
	}
	
	var getRandomWord = function()
	{
		var commonWords = ["the", "be", "to", "of", "and", "in", "that", "have", "for", "not", "on", "with", "you", "this", "but", "his", "from", "they", "say"];
		return commonWords[Math.ceil((commonWords.length - 1) * Math.random())];
	}
}
