var FULL_ROW_LENGTH = 16;
var PATTERN_ROW_LENGTH = 11;
 var audionom = new Array(187);
 var currentPattern = new Array(187);
 var currentPatternPos = 0;
 var rowCount = 0;
 var nextPause = 40;
 var activeReturnClass = 'front';
 
 var FRONT = "front";
 var BACK = "back";
 var ACTIVE = "active";
 
 var playlist = null;
 
 var currentSongIndex = 0;
 var isPlayingMusic = false;
 var isPlayingPattern = true;
 var inverted = false;
 var theTimeout = null;
 
 function initApp()
 {	 
	 initShortPatterns();
	 playPattern();
	 initMusicPlayer();
 }
 
 function initMusicPlayer()
 {
	 playlist = new Array();
	 playlist.push(new Track('http://www.audionom.org/res/mp3/runintosun.mp3', 'Kite', 'Run into sun'));
	 playlist.push(new Track('http://www.audionom.org/res/mp3/deadcandance.mp3', 'Ectoplasm Girls', 'Dead can dance'));
	 playlist.push(new Track('http://www.audionom.org/res/mp3/showmeyourhands.mp3', 'Martin Kraepelien', 'Show me your hands'));
	 playlist.push(new Track('http://www.audionom.org/res/mp3/girlsandboys.mp3', 'Parda Flora', 'Girls and boys'));
	 playlist.push(new Track('http://www.audionom.org/res/mp3/impostor.mp3', 'Daniel Savio', 'Impostor'));
	 playlist.push(new Track('http://www.audionom.org/res/mp3/soweak.mp3', 'Wonderland Gang', 'So weak'));
	 playlist.push(new Track('http://www.audionom.org/res/mp3/inside.mp3', 'Pluto', 'Inside'));
	 playlist.push(new Track('http://www.audionom.org/res/mp3/audionom.mp3', 'Wonderland Gang', 'Audionom'));
	 playlist.push(new Track('http://www.audionom.org/res/mp3/showmeyourhands18.mp3', '18 Sekunder', 'Show me your hands'));
	 
	 
	jQuery("#playButton").click(function(){
		//http://www.varal.org/media/niftyplayer/
		togglePlay();		
	});
	
	jQuery("#playButton img").mouseover(function(){
		jQuery(this).attr('src', 'res/img/play_on.png');						 
	}).mouseout(function(){
		jQuery(this).attr('src', 'res/img/play.png');	
	});
	
	jQuery("#nextButton").click(function(){
		nextSong();									 
	});
	
	jQuery("#nextButton img").mouseover(function(){
		jQuery(this).attr('src', 'res/img/next_on.png');						 
	}).mouseout(function(){
		jQuery(this).attr('src', 'res/img/next.png');
	});
	
	jQuery("#previousButton").click(function(){
		previousSong();									 
	});
	
	jQuery("#previousButton img").mouseover(function(){
		jQuery(this).attr('src', 'res/img/previous_on.png');					 
	}).mouseout(function(){
		jQuery(this).attr('src', 'res/img/previous.png');
	});
	
	jQuery(".brick").click(function(){
		isPlayingPattern = !isPlayingPattern;
	});
 }
 
 function logInfo(stringToLog)
{
	if ( this.console && typeof(console.log) != 'undefined' ) 
	{ 
		// IE8, Firebug, Safari, etc. 
		console.log(stringToLog); 
	}
}

 function nextSong()
 {
 	currentSongIndex++;
 	
 	if(currentSongIndex == playlist.length)
 	{
 		currentSongIndex = 0;	
 	}
 	
 	niftyplayer('mp3player').loadAndPlay(playlist[currentSongIndex].filePath);
	
	jQuery("#title").html(playlist[currentSongIndex].title + '<br />' + playlist[currentSongIndex].remixer);
 }
 
 function previousSong()
 {
 	currentSongIndex--;
 	
 	if(currentSongIndex < 0)
 	{
 		currentSongIndex = (playlist.length - 1);	
 	}
 	
 	niftyplayer('mp3player').loadAndPlay(playlist[currentSongIndex].filePath);
	
	jQuery("#title").html(playlist[currentSongIndex].title + '<br />' + playlist[currentSongIndex].remixer);

 }
 
 function togglePlay()
 {
	if(!isPlayingMusic)
	{
		niftyplayer('mp3player').loadAndPlay(playlist[currentSongIndex].filePath);
	
		jQuery("#title").html(playlist[currentSongIndex].title + '<br />' + playlist[currentSongIndex].remixer);
		
		isPlayingMusic = true;

	}
	else
	{
		niftyplayer('mp3player').stop();
		
		jQuery("#title").html('');
				
		isPlayingMusic = false;
	}
 	
 }
 
function playPattern()
{
	if(isPlayingPattern)
	{
		$(".active").removeClass('active');
		
		if(currentPatternPos < audionom.length)
		{
			if(rowCount >= PATTERN_ROW_LENGTH)
			{
				rowCount++;
				
				if(rowCount == FULL_ROW_LENGTH)
				{
					rowCount = 0;
				}
			}
			else
			{
				var count = 0;
				
				jQuery('.brick').each(function()
				{
					var theClass = audionom[currentPatternPos] ? FRONT : BACK;
					
					if(count == currentPatternPos)
					{
						$(this).removeClass(BACK).removeClass(FRONT).addClass(theClass).addClass(ACTIVE);
					}
					
					count++;
				});
				
				currentPatternPos++;
				rowCount++;
			}
		}
	}
	
	if(currentPatternPos < audionom.length)
	{
		theTimeout = setTimeout(playPattern, nextPause);
	}
	else
	{
		currentPatternPos = 0;
		var temp = FRONT;
		FRONT = BACK;
 		BACK = temp;
		$(".active").removeClass('active');
		theTimeout = setTimeout(playPattern, (nextPause * 35));
	}
}


function flickr()
{
	if(count > nextPause)
	{
		count = 0;
		
		nextPause = setNextPause();
		
		var pause = getPauseLength();
		
		var pausePattern = getPauseImage();
		
		paint(pausePattern);
		
		setTimeout(flickr,pause);
	}
	else
	{
		paint(audionom);
		
		curPattern++;
		
		if(curPattern > 29)
		{
			curPattern = 0;
		}
		
		count++;
		
		setTimeout(flickr,100);
	}
}

function paint(pattern)
{
	var patternObj;
	
	if (isArray(pattern)) 
	{
		patternObj = pattern;
	}
	else 
	{		
		if (pattern == SUPERIOR_PATTERN) 
		{
			patternObj = superior;
		}
		else if (pattern == AUDIONOM_PATTERN) 
		{
			patternObj = audionom;
		}
		else if (pattern == BOTH_PATTERNS) {
			patternObj = both;
		}
		else if (pattern == RANDOM_PATTERNS) {
			patternObj = generateRandomPattern();
		}
	}
	
	$(".brick").each(
		function(intIndex)
		{
			if(patternObj[intIndex])
			{
				if(!$(this).hasClass("front"))
				{
					if($(this).hasClass("back"))
					{
						$(this).removeClass("back");
					}
					$(this).addClass("front");
				}
			}
			else
			{
				if(!$(this).hasClass("back"))
				{
					if($(this).hasClass("front"))
					{
						$(this).removeClass("front");
					}
					$(this).addClass("back");
				}
			}
		});
	
}

function rand(min, max)
{
 return max ? min + rand(max - min) : Math.random() * ++min << .5;
}

function isArray(obj)
{
	if ( obj instanceof Array )
	{
		return true;
	}
	else
	{
		return false;
	}
}

function initShortPatterns()
{
	audionom[0] = true;
	audionom[1] =  true;
	audionom[2] =  true;
	audionom[3] =  false;
	audionom[4] =  false;
	audionom[5] =  false;
	audionom[6] =  false;
	audionom[7] =  false;
	audionom[8] =  false;
	audionom[9] =  false;
	audionom[10] =  true;
	
	audionom[11] =  true;
	audionom[12] =  false;
	audionom[13] =  true;
	audionom[14] =  false;
	audionom[15] =  false;
	audionom[16] =  false;
	audionom[17] =  false;
	audionom[18] =  false;
	audionom[19] =  false;
	audionom[20] =  false;
	audionom[21] =  true;
	
	audionom[22] =  true;
	audionom[23] =  true;
	audionom[24] =  true;
	audionom[25] =  false;
	audionom[26] =  true;
	audionom[27] =  false;
	audionom[28] =  true;
	audionom[29] =  false;
	audionom[30] =  true;
	audionom[31] =  true;
	audionom[32] =  true;
	
	audionom[33] =  true;
	audionom[34] =  false;
	audionom[35] =  true;
	audionom[36] =  false;
	audionom[37] =  true;
	audionom[38] =  false;
	audionom[39] =  true;
	audionom[40] =  false;
	audionom[41] =  true;
	audionom[42] =  false;
	audionom[43] =  true;
	
	audionom[44] =  true;
	audionom[45] =  false;
	audionom[46] =  true;
	audionom[47] =  true;
	audionom[48] =  true;
	audionom[49] =  true;
	audionom[50] =  true;
	audionom[51] =  true;
	audionom[52] =  true;
	audionom[53] =  true;
	audionom[54] =  true;
	
	audionom[55] =  false;
	audionom[56] =  false;
	audionom[57] =  false;
	audionom[58] =  false;
	audionom[59] =  false;
	audionom[60] =  false;
	audionom[61] =  false;
	audionom[62] =  false;
	audionom[63] =  false;
	audionom[64] =  false;
	audionom[65] =  true;
	
	audionom[66] =  true;
	audionom[67] =  true;
	audionom[68] =  true;
	audionom[69] =  true;
	audionom[70] =  true;
	audionom[71] =  true;
	audionom[72] =  true;
	audionom[73] =  true;
	audionom[74] =  true;
	audionom[75] =  true;
	audionom[76] =  true;
	
	audionom[77] =  true;
	audionom[78] =  false;
	audionom[79] =  false;
	audionom[80] =  false;
	audionom[81] =  false;
	audionom[82] =  false;
	audionom[83] =  false;
	audionom[84] =  false;
	audionom[85] =  false;
	audionom[86] =  false;
	audionom[87] =  false;
	
	audionom[88] =  true;
	audionom[89] =  false;
	audionom[90] =  true;
	audionom[91] =  false;
	audionom[92] =  true;
	audionom[93] = true;
	audionom[94] =  true;
	audionom[95] =  false;
	audionom[96] =  true;
	audionom[97] =  true;
	audionom[98] =  true;
	
	audionom[99] =  true;
	audionom[100] =  false;
	audionom[101] =  true;
	audionom[102] =  false;
	audionom[103] =  true;
	audionom[104] =  false;
	audionom[105] =  true;
	audionom[106] =  false;
	audionom[107] =  true;
	audionom[108] =  false;
	audionom[109] = true;
	
	audionom[110] =  true;
	audionom[111] =  true;
	audionom[112] =  true;
	audionom[113] =  true;
	audionom[114] =  true;
	audionom[115] =  true;
	audionom[116] =  true;
	audionom[117] =  true;
	audionom[118] =  true;
	audionom[119] =  false;
	audionom[120] =  true;
	
	audionom[121] =  false;
	audionom[122] =  false;
	audionom[123] =  false;
	audionom[124] = false;
	audionom[125] =  false;
	audionom[126] =  false;
	audionom[127] =  false;
	audionom[128] =  false;
	audionom[129] =  false;
	audionom[130] =  false;
	audionom[131] =  true;
	
	audionom[132] =  true;
	audionom[133] =  true;
	audionom[134] =  true;
	audionom[135] =  true;
	audionom[136] =  true;
	audionom[137] =  true;
	audionom[138] =  true;
	audionom[139] =  true;
	audionom[140] =  true;
	audionom[141] =  true;
	audionom[142] =  true;
	
	audionom[143] =  true;
	audionom[144] =  false;
	audionom[145] =  false;
	audionom[146] =  false;
	audionom[147] =  false;
	audionom[148] =  false;
	audionom[149] =  false;
	audionom[150] =  false;
	audionom[151] =  false;
	audionom[152] =  false;
	audionom[153] =  false;
	
	audionom[154] =  true;
	audionom[155] = false;
	audionom[156] =  true;
	audionom[157] =  true;
	audionom[158] =  true;
	audionom[159] =  false;
	audionom[160] =  true;
	audionom[161] =  true;
	audionom[162] =  true;
	audionom[163] =  true;
	audionom[164] =  true;
	
	audionom[165] =  true;
	audionom[166] =  false;
	audionom[167] =  true;
	audionom[168] =  false;
	audionom[169] =  true;
	audionom[170] =  false;
	audionom[171] =  true;
	audionom[172] =  false;
	audionom[173] =  true;
	audionom[174] =  false;
	audionom[175] =  true;
	
	audionom[176] =  true;
	audionom[177] =  true;
	audionom[178] =  true;
	audionom[179] =  true;
	audionom[180] =  true;
	audionom[181] =  true;
	audionom[182] =  true;
	audionom[183] =  false;
	audionom[184] =  true;
	audionom[185] =  false;
	audionom[186] = true;

}

function initPatterns()
{		
	//audionom1
	audionom[0] = true;
	audionom[1] =  true;
	audionom[2] =  true;
	audionom[3] =  false;
	audionom[4] =  false;
	audionom[5] =  false;
	audionom[6] =  false;
	audionom[7] =  false;
	audionom[8] =  false;
	audionom[9] =  false;
	audionom[10] =  true;
	audionom[11] = false;
	audionom[12] = false;
	audionom[13] = false;
	audionom[14] = false;
	audionom[15] = false;
	
	audionom[16] =  true;
	audionom[17] =  false;
	audionom[18] =  true;
	audionom[19] =  false;
	audionom[20] =  false;
	audionom[21] =  false;
	audionom[22] =  false;
	audionom[23] =  false;
	audionom[24] =  false;
	audionom[25] =  false;
	audionom[26] =  true;
	audionom[27] = false;
	audionom[28] = false;
	audionom[29] = false;
	audionom[30] = false;
	audionom[31] = false;
	
	audionom[32] =  true;
	audionom[33] =  true;
	audionom[34] =  true;
	audionom[35] =  false;
	audionom[36] =  true;
	audionom[37] =  false;
	audionom[38] =  true;
	audionom[39] =  false;
	audionom[40] =  true;
	audionom[41] =  true;
	audionom[42] =  true;
	audionom[43] = false;
	audionom[44] = false;
	audionom[45] = false;
	audionom[46] = false;
	audionom[47] = false;
	
	audionom[48] =  true;
	audionom[49] =  false;
	audionom[50] =  true;
	audionom[51] =  false;
	audionom[52] =  true;
	audionom[53] =  false;
	audionom[54] =  true;
	audionom[55] =  false;
	audionom[56] =  true;
	audionom[57] =  false;
	audionom[58] =  true;
	audionom[59] = false;
	audionom[60] = false;
	audionom[61] = false;
	audionom[62] = false;
	audionom[63] = false;
	
	audionom[64] =  true;
	audionom[65] =  false;
	audionom[66] =  true;
	audionom[67] =  true;
	audionom[68] =  true;
	audionom[69] =  true;
	audionom[70] =  true;
	audionom[71] =  true;
	audionom[72] =  true;
	audionom[73] =  true;
	audionom[74] =  true;
	audionom[75] = false;
	audionom[76] = false;
	audionom[77] = false;
	audionom[78] = false;
	audionom[79] = false;
	
	audionom[80] =  false;
	audionom[81] =  false;
	audionom[82] =  false;
	audionom[83] =  false;
	audionom[84] =  false;
	audionom[85] =  false;
	audionom[86] =  false;
	audionom[87] =  false;
	audionom[88] =  false;
	audionom[89] =  false;
	audionom[90] =  true;
	audionom[91] = false;
	audionom[92] = false;
	audionom[93] = false;
	audionom[94] = false;
	audionom[95] = false;
	
	audionom[96] =  true;
	audionom[97] =  true;
	audionom[98] =  true;
	audionom[99] =  true;
	audionom[100] =  true;
	audionom[101] =  true;
	audionom[102] =  true;
	audionom[103] =  true;
	audionom[104] =  true;
	audionom[105] =  true;
	audionom[106] =  true;
	audionom[107] = false;
	audionom[108] = false;
	audionom[109] = false;
	audionom[110] = false;
	audionom[111] = false;
	
	audionom[112] =  true;
	audionom[113] =  false;
	audionom[114] =  false;
	audionom[115] =  false;
	audionom[116] =  false;
	audionom[117] =  false;
	audionom[118] =  false;
	audionom[119] =  false;
	audionom[120] =  false;
	audionom[121] =  false;
	audionom[122] =  false;
	audionom[123] = false;
	audionom[124] = false;
	audionom[125] = false;
	audionom[126] = false;
	audionom[127] = false;
	
	audionom[128] =  true;
	audionom[129] =  false;
	audionom[130] =  true;
	audionom[131] =  false;
	audionom[132] =  true;
	audionom[133] = true;
	audionom[134] =  true;
	audionom[135] =  false;
	audionom[136] =  true;
	audionom[137] =  true;
	audionom[138] =  true;
	audionom[139] = false;
	audionom[140] = false;
	audionom[141] = false;
	audionom[142] = false;
	audionom[143] = false;
	
	audionom[144] =  true;
	audionom[145] =  false;
	audionom[146] =  true;
	audionom[147] =  false;
	audionom[148] =  true;
	audionom[149] =  false;
	audionom[150] =  true;
	audionom[151] =  false;
	audionom[152] =  true;
	audionom[153] =  false;
	audionom[154] = true;
	audionom[155] = false;
	audionom[156] = false;
	audionom[157] = false;
	audionom[158] = false;
	audionom[159] = false;
	
	audionom[160] =  true;
	audionom[161] =  true;
	audionom[162] =  true;
	audionom[163] =  true;
	audionom[164] =  true;
	audionom[165] =  true;
	audionom[166] =  true;
	audionom[167] =  true;
	audionom[168] =  true;
	audionom[169] =  false;
	audionom[170] =  true;
	audionom[171] = false;
	audionom[172] = false;
	audionom[173] = false;
	audionom[174] = false;
	audionom[175] = false;
	
	audionom[176] =  false;
	audionom[177] =  false;
	audionom[178] =  false;
	audionom[179] = false;
	audionom[180] =  false;
	audionom[181] =  false;
	audionom[182] =  false;
	audionom[183] =  false;
	audionom[184] =  false;
	audionom[185] =  false;
	audionom[186] =  true;
	audionom[187] = false;
	audionom[188] = false;
	audionom[189] = false;
	audionom[190] = false;
	audionom[191] = false;
	
	audionom[192] =  true;
	audionom[193] =  true;
	audionom[194] =  true;
	audionom[195] =  true;
	audionom[196] =  true;
	audionom[197] =  true;
	audionom[198] =  true;
	audionom[199] =  true;
	audionom[200] =  true;
	audionom[201] =  true;
	audionom[202] =  true;
	audionom[203] = false;
	audionom[204] = false;
	audionom[205] = false;
	audionom[206] = false;
	audionom[207] = false;
	
	audionom[208] =  true;
	audionom[209] =  false;
	audionom[210] =  false;
	audionom[211] =  false;
	audionom[212] =  false;
	audionom[213] =  false;
	audionom[214] =  false;
	audionom[215] =  false;
	audionom[216] =  false;
	audionom[217] =  false;
	audionom[218] =  false;
	audionom[219] = false;
	audionom[220] = false;
	audionom[221] = false;
	audionom[222] = false;
	audionom[223] = false;
	
	audionom[224] =  true;
	audionom[225] = false;
	audionom[226] =  true;
	audionom[227] =  true;
	audionom[228] =  true;
	audionom[229] =  false;
	audionom[230] =  true;
	audionom[231] =  true;
	audionom[232] =  true;
	audionom[233] =  true;
	audionom[234] =  true;
	audionom[235] = false;
	audionom[236] = false;
	audionom[237] = false;
	audionom[238] = false;
	audionom[239] = false;
	
	audionom[240] =  true;
	audionom[241] =  false;
	audionom[242] =  true;
	audionom[243] =  false;
	audionom[244] =  true;
	audionom[245] =  false;
	audionom[246] =  true;
	audionom[247] =  false;
	audionom[248] =  true;
	audionom[249] =  false;
	audionom[250] =  true;
	audionom[251] = false;
	audionom[252] = false;
	audionom[253] = false;
	audionom[254] = false;
	audionom[255] = false;
	
	audionom[266] =  true;
	audionom[267] =  true;
	audionom[268] =  true;
	audionom[269] =  true;
	audionom[270] =  true;
	audionom[271] =  true;
	audionom[272] =  true;
	audionom[273] =  false;
	audionom[274] =  true;
	audionom[275] =  false;
	audionom[276] = true;
	audionom[277] = false;
	audionom[278] = false;
	audionom[279] = false;
	audionom[280] = false;
	audionom[281] = false;
}

function Track(filePath, remixer, title)
{
	this.filePath = filePath;
	this.remixer = remixer;
	this.title = title;
}

Track.prototype.filePath = function(filePath) 
{
	this.filePath = filePath;
}
Track.prototype.getFilePath = function()
{
	return this.filePath;
}
Track.prototype.remixer = function(remixer) 
{
	this.remixer = remixer;
}
Track.prototype.getRemixer = function()
{
	return this.remixer;
}
Track.prototype.title = function(title) 
{
	this.title = title;
}
Track.prototype.getTitle = function()
{
	return this.title;
}
Track.prototype.toString = function()
{
	return 'Track (Filepath: ' + this.filePath + ', Remixer: ' + this.remixer + ', Title: ' + this.title + ').';
}
// JavaScript Document
