var inputArray = new Array();
var coverArray = new Array();
var keepCoverNum = 0;
var editRecentlyUsedPopupObj;
var workAreaObj;

var numRecentlyUsedToEdit = 0;

function initMemHelper()
{
	var theBody = document.body;
	workAreaObj = document.getElementById('workArea');
	
	setCookieVal('main', 'needAgeScreen', 'true', -1);

	//testThings(); //rjfrjfrjf
	scrubCookies();
	popRecentlyUsed();
	coverByPercen(-1);
	popup_js_1234_init_95371();
	editRecentlyUsedPopupObj = createPopup(document.getElementById('editRecentlyUsedPopup'));
}


function updateRecentlyUsed()
{
	var isChangeMade = false;
	
	for (i = 0; i < numRecentlyUsedToEdit; i++)
	{
		var tmpNewRef = cleanRef(document.getElementById('renRef' + i).value);

		if ('' != tmpNewRef)
		{
			replaceRef(i, tmpNewRef);
			isChangeMade = true
		}
	}
	
	for (i = numRecentlyUsedToEdit - 1; i >= 0; i--)
	{
		var tmpCb = document.getElementById('delRef' + i);
		
		if (tmpCb.checked)
		{
			entryDelete(i);
			isChangeMade = true;
		}
	}
	
	if (isChangeMade)
	{
		clearOut();
	}

	popRecentlyUsed();
	
	editRecentlyUsedPopupObj.xxClose();
}

function clearOut()
{
		document.getElementById('inputArea').value = '';
		document.getElementById('inputRef').value = '';
		workAreaObj.innerHTML = '(work area)';
		inputArray = new Array();
		coverArray = new Array();
		workAreaObj.innerHTML = '(work area)';
		choosePercenList(0);
}

function copyBGRefBox()
{
	document.getElementById('inputRef').value = cleanRef(document.getElementById('BGRefBox').value);
}


function editRecentlyUsed()
{
	var obj = document.getElementById('editRecentyUsedTable');
	
	var inner = '	<table style="margin-left: auto; margin-right: auto;">\
	<tr>\
	<td><b>Reference</b></td><td width="60"><b>Delete</b></td><td><b>Rename To</b></td>\
	</tr>\
	';
	
	var i;
	var holdArr = new Array();
	
	numRecentlyUsedToEdit = 0;
	
	for (i = 0; i < maxNumToSave; i++)
	{
		var tmpArr = getCookieArr('bsbmeta' + i);
		
		if (0 == tmpArr.length)
		{
			break;
		}
		
		holdArr[i] = tmpArr[0];
		
		numRecentlyUsedToEdit++;
		
		inner += '	<tr>\
		<td><input id=refName' + i + ' type=textbox readonly size=30 /></td><td>&nbsp;&nbsp;<input id=delRef' + i + ' type=checkbox id="delCheck" /></td><td><input id=renRef' + i + ' type=textbox size=30 maxlength=50 /></td>\
		</tr>\
		';
	}
	
	inner += '	</table>\
	';
	
	obj.innerHTML = inner;
	
	for (i = 0; i < numRecentlyUsedToEdit; i++)
	{
		document.getElementById('refName' + i).value = holdArr[i];
	}

	showPopup(true, false, 100, 300);
}

function popRecentlyUsed()
{
	var recentlyUsedObj = document.getElementById('recentlyUsed');
	
	var firstpart = '<b>Recently Used</b> ';
	
	inner = '';

	if (!isCookiesEnabled())
	{
		inner = firstpart + ": (Feature not available, because cookies are disabled.)";
		recentlyUsedObj.innerHTML = inner;
		return;
	}
	
	var found = false;

	for (i = 0; i < maxNumToSave; i++)
	{
		tmpMeta = getCookieArr('bsbmeta' + i);
		
		if (0 == tmpMeta.length)
		{
			break;
		}
		
		found = true;
		
		if (i > 0)
		{
			inner += ', ';
		}
		
		inner += '<a href="javascript:void(0)" onclick="prepExisting(' + i + ');">' + tmpMeta[0].replace(/ +/g, '&nbsp;') + '</a>';
	}
	
	if (found)
	{
		firstpart += '(<a href="javascript:void(0)" onclick="editRecentlyUsed();">edit list</a>): ';
		recentlyUsedObj.innerHTML = firstpart + inner;
	}
	else
	{
		recentlyUsedObj.innerHTML = firstpart + ': (none)';
	}
}

function prepExisting(which)
{
	if (0 != which)
	{
		cookiePromoteToTop(which);
	}
	
	dontUseCookies = false;
	
	if (!isCookiesEnabled())
	{
		dontUseCookies = true;
	}
	
	popRecentlyUsed();
	
	var vArr = getCookieArr('bsbverse0');
	var mArr = getCookieArr('bsbmeta0');

	inputAreaObj = document.getElementById('inputArea');
	inputAreaObj.value = vArr.join(' ');
	
	inputRefObj = document.getElementById('inputRef');
	inputRefObj.value = mArr[0];
	
	setupWords();

	coverArray = mArr.slice(1);
	
	if (coverArray.length != inputArray.length)
	{
		genCoverArray();
		replaceMeta(0, coverArray);
	}
}

function replaceRef(which, newRef)
{
	mArr = getCookieArr('bsbmeta' + which);
	if (mArr.length > 0)
	{
		setCookieArr('bsbmeta' + which, [newRef].concat(mArr.slice(1)));
	}
}

function replaceMeta(which, newMeta)
{
	mArr = getCookieArr('bsbmeta' + which);
	
	if (mArr.length > 0)
	{
		setCookieArr('bsbmeta' + which, [mArr[0]].concat(newMeta));
	}
}

function cleanRef(val)
{
	var regExTrimStart = /^ +/;
	var regExTrimEnd = / +$/;
	var regExSpaces = / +/g;
	
	var tmpRef = val.replace(regExTrimStart, '').replace(regExTrimEnd, '').replace(regExSpaces, ' ');
	
	if (' ' == tmpRef)
	{
		tmpRef = '';
	}
	
	return tmpRef;
}

function prepare()
{
	inputRefObj = document.getElementById('inputRef');
	inputRefVal = cleanRef(inputRefObj.value);
	
	if ('' == inputRefVal)
	{
		inputRefVal = '(unknown reference)';
	}

	inputRefObj.value = inputRefVal;

	setupWords();
	
	if (0 == inputArray.length)
	{
		return;
	}
	
	var tmpCookie = makeRawCookieArr(inputArray.slice(0, inputArray.length - 1));
	
	dontUseCookies = false;

	if (!isCookiesEnabled())
	{
		dontUseCookies = true;
	}
	
	if (tmpCookie.length > maxCookieSize)
	{
		genCoverArray();
		dontUseCookies = true;
		alert('WARNING: Your material to memorize is large and it cannot be saved in your "recently used list." However, all other functionality should work properly.');
		return;
	}
	
	var existing = -1;
	
	if ('(unknown reference)' != inputRefVal)
	{
		existing = findMeta(inputRefVal);
	}
	
	if (existing >= 0)
	{
		cookiePromoteToTop(existing);
		setCookieRaw('bsbverse0', tmpCookie);
	}
	else
	{
		genCoverArray();
		cookieAddToTop(tmpCookie, [inputRefVal].concat(coverArray));
	}
	
	var tmpMeta = getCookieArr('bsbmeta0');
	
	if (tmpMeta.length - 1 != inputArray.length)
	{
		genCoverArray();
		replaceMeta(0, coverArray);
	}
	else
	{
		coverArray = tmpMeta.slice(1);
	}

	popRecentlyUsed();
}

function setupWords()
{
	inputAreaObj = document.getElementById('inputArea');
	inputRefObj = document.getElementById('inputRef');
	
	startWsRegEx = /^[ 	\r\n]+/;
	endWsRegEx = /[ 	\r\n]+$/;
	wsRegEx = /[ 	\r\n]+/g;
	
	inputString = inputAreaObj.value;
	inputString = inputString.replace(startWsRegEx, '').replace(endWsRegEx, '');

	if ('' == inputString)
	{
		clearOut();
		return;
	}
	
	inputArray = inputString.split(wsRegEx);
	inputArray[inputArray.length] = inputRefObj.value
	
	workString = '';
	
	commonStr = 'onmouseover="lighten(this);" onmouseout="darken(this);" onclick="toggleCover(this);"';
	
	for (i = 0; i < inputArray.length - 1; i++)
	{
		if (i > 0)
		{
			workString += ' &nbsp;&nbsp; ';
		}
		workString += '<span>&nbsp</span><span id="wordToMem-' + i + '" ' + commonStr + '>' + inputArray[i] + '</span>';
	}

	workString += '<div style="text-align: right"><span>&nbsp</span><span id="wordToMem-' + i + '" ' + commonStr + '>' + inputArray[inputArray.length - 1] + '</span></div>';

	workAreaObj.innerHTML = workString;

	keepCoverNum = 0;
	choosePercenList(0);
}

function mixup()
{
	genCoverArray();
	coverByNum(keepCoverNum, true);

	if (!dontUseCookies)
	{
		replaceMeta(0, coverArray);
	}
}

function coverByPercen(which)
{
	percenToCov = which * 5;

	numToCov = Math.floor((percenToCov * inputArray.length) / 100);
	
	coverByNum(numToCov);
	
	choosePercenList(which);
}

function coverByNum(num, doRefresh)
{
	if (0 == inputArray.length)
	{
		return;
	}
	
	if (doRefresh)
	{
		var inc = 1;
		var start = 0;
		var end = inputArray.length;
	}
	else if (num > keepCoverNum)
	{
		var inc = 1;
		var start = keepCoverNum;
		var end = num;
	}
	else
	{
		var inc = -1;
		var start = keepCoverNum - 1;
		var end = num - 1;
	}

	keepCoverNum = num;
	
	for (i = start; i != end; i += inc)
	{
		cur = coverArray[i];
		
		cspan = document.getElementById('wordToMem-' + cur);

		if (i < num)
		{
			cspan.style.backgroundColor = 'yellow';
			cspan.style.color = 'yellow';
		}
		else
		{
			cspan.style.backgroundColor = '#ffffff';
			cspan.style.color = 'black';
		}
	}
	
	choosePercenList(calcPercen(keepCoverNum));
}

function choosePercenList(which)
{
	if (0 == inputArray.length)
	{
		which = -1;
	}

	for (i = 0; i < 21; i++)
	{
		span = document.getElementById("p" + i);

		if (i == which)
		{
			span.style.backgroundColor = 'red';
		}
		else
		{
			span.style.backgroundColor = 'yellow';
		}
	}
	
	span = document.getElementById("less");
	span.style.backgroundColor = 'yellow';
	span = document.getElementById("more");
	span.style.backgroundColor = 'yellow';
}


function less()
{
	if (keepCoverNum > 0)
	{
		coverByNum(keepCoverNum - 1);
	}
}

function more()
{
	if (keepCoverNum < inputArray.length)
	{
		coverByNum(keepCoverNum + 1);
	}
}

function calcPercen(num)
{
	if (0 == inputArray.length)
	{
		return 0;
	}

	calc = Math.ceil(((num * 100) / inputArray.length) / 5);
	
	if ((20 == calc) && (num < inputArray.length))
	{
		calc = 19;
	}

	return (calc);
}


function genCoverArray()
{
	var i;
	coverArray = new Array();

	size = inputArray.length;
	tempCovArray = new Array();

	for (i = 0; i < size; i++)
	{
		tempCovArray[i] = i;
	}

	var down = size - 1;

	for (i = 0; i < size; i++)
	{
		var rnum = Math.floor(Math.random() * (down--));

		coverArray[i] = tempCovArray[rnum];
		
		tempCovArray.splice(rnum, 1);
	}
}

function lighten(obj)
{
	if (obj.style.backgroundColor != 'yellow')
	{
		return;
	}
	
	obj.style.color = 'gray';
}

function darken(obj)
{
	if (obj.style.backgroundColor != 'yellow')
	{
		return;
	}
	
	obj.style.color = 'yellow';
}

function findInCoverArr(which)
{
	for (i = 0; i < inputArray.length; i++)
	{
		if (which == coverArray[i])
		{
			return i;
		}
	}
}

function toggleCover(obj)
{
	if ('yellow' == obj.style.backgroundColor)
	{
		unCoverThis(obj);
	}
	else
	{
		coverThis(obj);
	}
}

function coverThis(obj)
{
	whichClick = extractIndex(obj);
	whereInCoverArr = findInCoverArr(whichClick);
	
	for (i = whereInCoverArr; i > keepCoverNum - 1; i--)
	{
		coverArray[i] = coverArray[i - 1];
	}
	
	coverArray[keepCoverNum] = whichClick;
	
	coverByNum(keepCoverNum + 1);
	
	if (!dontUseCookies)
	{
		replaceMeta(0, coverArray);
	}
}

function unCoverThis(obj)
{
	whichClick = extractIndex(obj);
	whereInCoverArr = findInCoverArr(whichClick);
	
	for (i = whereInCoverArr; i < keepCoverNum - 1; i++)
	{
		coverArray[i] = coverArray[i + 1];
	}

	coverArray[keepCoverNum - 1] = whichClick;
	
	coverByNum(keepCoverNum - 1);

	if (!dontUseCookies)
	{
		replaceMeta(0, coverArray);
	}
}

function extractIndex(obj)
{
	objId = obj.id;

	arr = objId.split('-');
	
	return(arr[1]);
}

