// validateRangeAndCreatePDF() launches either the simple range validation
// or the advanced one... it will then open the location...
function validateRangeAndCreatePDF(backUrl)
{
	var url = document.Range.url.value;
	var header = document.Range.header.value;
	var pageParam = "";

    pageParam = validateAdvancedRange(pageParam);
    if (pageParam.toString() != 0) {
		pageParam = pageParam.substring(0, pageParam.length - 1);
		pageParam = compactParam(pageParam);

		url += pageParam.replace(/_/g, ",");
		url += "&pdfHeader=";
		url += encodeURIComponent(header);

		openPDFWindow(url);
		document.location = backUrl;
	}
}

// Opens the PDF popup window in the center on the screen.
function openPDFWindow(url)
{
	var width = 800;
	var height = 800;
	var x = (self.screen.width - width) / 2;
	var y = (self.screen.height - height) / 2;
	var win = window.open(url, "PDF", "left=" + x + ",top=" + y + ",width=" + width + ",height=" + height + ",resizable=yes");
	if (window.focus) {
		win.focus()
	}
}

// validateSimpleRange() will validate a range of the type "x-y"
function validateSimpleRange(pageParam)
{
	var numPages = parseInt(document.Range.numPages.value, 10);
	var pageFrom = parseInt(document.Range.pageFrom.value, 10);
	var pageTo = parseInt(document.Range.pageTo.value, 10);

	if((document.Range.pageFrom.value.length == 0) || (document.Range.pageTo.value.length == 0))
	{
	    // one of the values passed through is null
		var message = "You have not entered a range!";
		alert(message);
		document.Range.pageFrom.value = "1";
		document.Range.pageTo.value = numPages;
		if(document.Range.pageFrom.value.length == 0)
			document.Range.pageFrom.focus();
		else document.Range.pageTo.focus();
		return 0;
	}
	pageParam = pageFrom;
	if((pageFrom < 1) || (pageTo > numPages))
	{
	    // bounds check failed
		var message = "The range you have chosen does not fall within the pages available.\n\nPlease enter a number between 1 and " + numPages;
		alert(message);
		if(pageFrom < 1)
		{
			document.Range.pageFrom.value = "1";
			document.Range.pageFrom.focus();
		}
		else
		{
			document.Range.pageTo.value = numPages;
			document.Range.pageTo.focus();
		}
		return 0;
	}
	else if(pageFrom > pageTo)
	{
	    // pageFrom must be less than pageTo
		var message = "You have made an impossible request. Please alter the range you have chosen.";
		alert(message);
		document.Range.pageFrom.value = "1";
		document.Range.pageTo.value = numPages;
		document.Range.pageFrom.focus();
		return 0;
	}
	else
	{
	    // woopee it's valid... that wasn't so hard
		if(pageFrom != pageTo)
			pageParam += "-" + pageTo;
	}
	return pageParam;
}


// validateAdvancedRange() validates an advanced string of the form
// "x, y-z" and any combinations thereof
function validateAdvancedRange(pageParam)
{
	var numPages = parseInt(document.Range.numPages.value, 10);
	var pageFrom = document.Range.pageFrom.value;
	if(pageFrom.length == 0)
	{
	    // the value passed through is null
		var message = "You have not entered a range!";
		alert(message);
		document.Range.pageFrom.value = "1-" + numPages;
		document.Range.pageFrom.focus();
		return 0;
	}

	var currentChar = "";
	var currentNum = "";
	var length = pageFrom.length, pos = 0;
	// replace all spaces with ""
	while(pos < length)
	{
		currentChar = pageFrom.charAt(pos++);
		if(currentChar == ",")
			currentNum += "_";
		else if((currentChar == "-") || (currentChar == "_") || isPosInteger(currentChar))
			currentNum += currentChar;
	}
	pageFrom = currentNum;
	currentNum = "";
	length = pageFrom.length;
	pos = 0;
	while(pos < length)
	{
		currentChar = pageFrom.charAt(pos);
		while((currentChar != "_") && (currentChar != "-") && (pos < length))
		{
			if(isPosInteger(currentChar))
			{
				currentNum += currentChar;
				if(pos == (length - 1))
				{
					currentChar = "_";
					pos++;
				}
				else
					currentChar = pageFrom.charAt(++pos);
			}
			else
			{
			    // oh dear... something other than 0-9,- has been entered
				var message = "You have entered an invalid character!";
				alert(message);
				document.Range.pageFrom.value = "1-" + numPages;
				document.Range.pageFrom.focus();
				return 0;
			}
		}
		if(currentChar == "_")
		{
		    // we've hit a boundary condition... it's a single number
			// so add it to pageParam
			pageParam = addSingleToParam(pageParam, currentNum);
			currentNum = "";
			pos++;
		}
		else if(currentChar == "-")
		{
		    // we've hit a boundary condition... it's a range so get the
			// second number in the range
			var numFrom = currentNum;
			currentNum = "";
			pos++;
			if(pos == length)
			{
			    // oh crap... someone ended their string with the range char...
				var message = "The range you have chosen does not fall within the pages available.\nPlease recheck your entry.";
				alert(message);
				document.Range.pageFrom.value = "1-" + numPages;
				document.Range.pageFrom.focus();
				return 0;
			}
			currentChar = pageFrom.charAt(pos);
			while((pos < length) && (currentChar != "_"))
			{
				if(currentChar == "-")
				{
				    // x-y-z isn't a valid combination...
					var message = "The range you have chosen does not fall within the pages available.\nPlease recheck your entry.";
					alert(message);
					document.Range.pageFrom.value = "1-" + numPages;
					document.Range.pageFrom.focus();
					return 0;
				}
				if(isPosInteger(currentChar))
				{
				    // add an integer to the current number string
					currentNum += currentChar;
					currentChar = pageFrom.charAt(++pos);
				}
			}
			// okay... we have a range of the form x-y... add it to pageParam
			pageParam = addRangeToParam(pageParam, numFrom, currentNum);
			currentNum = "";
			pos++;
		}
	}
	return pageParam;
}

//
function addSingleToParam(pageParam, numFrom)
{
	var numPages = parseInt(document.Range.numPages.value, 10);
	var pageFrom = parseInt(numFrom, 10);
	if((pageFrom < 1) || (pageFrom > numPages))
	{
	    // the value isn't in the range...
		var message = "The range you have chosen does not fall within the pages available.\nPlease recheck your entry.";
		alert(message);
		document.Range.pageFrom.value = "1-" + numPages;
		document.Range.pageFrom.focus();
		return 0;
	}
	var paramBegin = "";
	var length = pageParam.length;
	var pos = 0;
	var bAdded = false;
	var currentChar = "";
	var currentNum = "";
	while((pos < length) && (!bAdded))
	{
		currentChar = pageParam.charAt(pos);
		while((currentChar != "_") && (currentChar != "-"))
		{
			currentNum += currentChar;
			currentChar = pageParam.charAt(++pos);
		}
		if(currentChar == "_")
		{
			if(parseInt(currentNum, 10) > pageFrom)
			{
				paramBegin += numFrom + "_" + currentNum + "_";
    			bAdded = true;
	    	}
			else if(parseInt(currentNum, 10) == pageFrom)
			{
                paramBegin += numFrom + "_";
    			bAdded = true;
			}
			else paramBegin += currentNum + "_";
		}
		else if(currentChar == "-")
		{
		    numFirst = currentNum;
			currentNum = "";
			currentChar = pageParam.charAt(++pos);
			while(currentChar != "_")
			{
				currentNum += currentChar;
				currentChar = pageParam.charAt(++pos);
			}
			if(parseInt(currentNum, 10) < pageFrom)
			{
			    paramBegin += numFirst + "-";
				if(parseInt(currentNum, 10) == (pageFrom - 1))
				{
				    pageFrom = parseInt(currentNum, 10);
					numFrom = currentNum;
				    bAdded = true;
				}
				paramBegin += currentNum + "_";
			}
			else if(parseInt(numFirst, 10) > pageFrom)
			{
			    if(parseInt(numFirst, 10) == (pageFrom + 1))
					numFirst = numFrom;
				else paramBegin += numFrom + "_";
			    paramBegin += numFirst + "-" + currentNum + "_";
				bAdded = true;
			}
			else if((parseInt(numFirst, 10) <= pageFrom) && (parseInt(currentNum, 10) >= pageFrom))
			{
		        paramBegin += numFirst + "-" + currentNum + "_";
			    bAdded = true;
			}
		}
		currentNum = "";
		pos++;
	}
	if(!bAdded)
		paramBegin += pageFrom + "_";
	else
	{
		while(pos < length)
			paramBegin += pageParam.charAt(pos++);
		paramBegin += "_";
	}
	return paramBegin;
}

//
function addRangeToParam(pageParam, numFrom, numTo)
{
	var numPages = parseInt(document.Range.numPages.value, 10);
	var pageFrom = parseInt(numFrom, 10);
	var pageTo = parseInt(numTo, 10);
	if(pageFrom == pageTo)
		return addSingleToParam(pageParam, numFrom);
	else if((pageFrom < 1) || (pageTo > numPages))
	{
		var message = "The range you have chosen does not fall within the pages available.\n\nPlease enter a number between 1 and " + numPages;
		alert(message);
		document.Range.pageFrom.value = "1-" + numPages.toString();
		document.Range.pageFrom.focus();
		return 0;
	}
	else if(pageFrom > pageTo)
	{
		var message = "Range invalid!";
		alert(message);
		document.Range.pageFrom.value = "1-" + numPages.toString();
		document.Range.pageFrom.focus();
		return 0;
	}
	else
	{
		var paramBegin = "";
		var length = pageParam.length;
		var pos = 0;
		var bAdded = false;
		var currentChar = "";
		var currentNum = "";
		var prevNum = "";
		while((pos < length) && !bAdded)
		{
			currentChar = pageParam.charAt(pos);
			while((currentChar != "_") && (currentChar != "-"))
			{
				currentNum += currentChar;
				currentChar = pageParam.charAt(++pos);
			}
			if(currentChar == "_")
			{
			    if(parseInt(currentNum, 10) < pageFrom)
				{
				    if(parseInt(currentNum) == (pageFrom - 1))
					{
					    pageFrom = parseInt(currentNum, 10);
						numFrom = currentNum;
					}
					else paramBegin += currentNum + "_";
				}
				else if(parseInt(currentNum, 10) > pageTo)
				{
				    paramBegin += numFrom + "-" + numTo + "_" + currentNum + "_";
					bAdded = true;
				}
			}
			else if(currentChar == "-")
			{
			    prevNum = currentNum;
				currentNum = "";
				currentChar = pageParam.charAt(++pos);
				while(currentChar != "_")
				{
    				currentNum += currentChar;
	    			currentChar = pageParam.charAt(++pos);
		    	}
				if(parseInt(prevNum) > (pageTo + 1))
				{
					paramBegin += numFrom + "-" + numTo + "_" + prevNum + "-" + currentNum + "_";
					bAdded = true;
				}
				else if(parseInt(currentNum, 10) < (pageFrom - 1))
				    paramBegin += prevNum + "-" + currentNum + "_";
				else
				{
					if(parseInt(prevNum) < pageFrom)
					{
		                pageFrom = parseInt(prevNum);
		    	        numFrom = prevNum;
		    		}
	    			if(parseInt(currentNum, 10) > pageTo)
    				{
					    pageTo = parseInt(currentNum, 10);
						numTo = currentNum;
					}
				}
			}
			prevNum = "";
			currentNum = "";
			pos++;
		}
		if(!bAdded)
			paramBegin += pageFrom + "-" + pageTo + "_";
		else
		{
			while(pos < length)
				paramBegin += pageParam.charAt(pos++);
			paramBegin += "_";
		}
		return paramBegin;
	}
}

//
function compactParam(pageParam)
{
    var bRange = false;
	var currentChar = "";
	var currentNum = "";
	var prevNum = "";
	var paramBegin = "";
	var rangeStart = "";
	var length = pageParam.length;
	var pos = 0;
	currentChar = pageParam.charAt(pos);
	while((currentChar != "_") && (currentChar != "-") && (pos < length))
	{
		prevNum += currentChar;
		if(pos == (length - 1))
			currentChar = "_";
		else currentChar = pageParam.charAt(++pos);
	}
	if(currentChar == "_")
	    bRange = false;
	else if(currentChar == "-")
	{
	    paramBegin += prevNum + "-"
		prevNum = "";
		currentChar = pageParam.charAt(++pos);
		while((currentChar != "_") && (currentChar != "-") && (pos < length))
	    {
    		prevNum += currentChar;
			currentChar = pageParam.charAt(++pos);
		}
	    bRange = true;
	}
	while(pos < length)
	{
		currentNum = "";
		currentChar = pageParam.charAt(++pos);
		while((currentChar != "_") && (currentChar != "-") && (pos < length))
	    {
    		currentNum += currentChar;
			if(pos == (length - 1))
			{
				currentChar = "_";
				pos++;
			}
			else currentChar = pageParam.charAt(++pos);
		}
		if(currentChar == "_")
		{
		    if(parseInt(prevNum, 10) == (parseInt(currentNum, 10) - 1))
			{
			    if(bRange)
				    prevNum = currentNum;
				else
				{
				    paramBegin += prevNum + "-";
					prevNum = currentNum;
					bRange = true;
				}
			}
			else
			{
			    paramBegin += prevNum + "_";
				prevNum = currentNum;
				bRange = false;
			}
		}
		else if(currentChar == "-")
		{
		    rangeStart = currentNum;
			currentNum = "";
		    currentChar = pageParam.charAt(++pos);
		    while((currentChar != "_") && (pos < length))
	        {
        		currentNum += currentChar;
				if(pos == (length - 1))
					currentChar = "_";
				else currentChar = pageParam.charAt(++pos);
			}
			if(parseInt(prevNum, 10) == (parseInt(rangeStart, 10) - 1))
			{
			    if(bRange)
				    prevNum = currentNum;
				else
				{
    			    paramBegin += prevNum + "-";
					prevNum = currentNum;
    				bRange = true;
				}
			}
			else
			{
			    paramBegin += prevNum + "_" + rangeStart + "-";
				prevNum = currentNum;
				bRange = true;
			}
		}
	}
	paramBegin += prevNum;
	return paramBegin;
}

// isPosInteger() just returns true if the string is a combination of
// numbers between 0-9
function isPosInteger(inputVal)
{
	inputStr = inputVal.toString();
	for(var i = 0; i < inputStr.length; i++)
	{
		var oneChar = inputStr.charAt(i);
		if(oneChar < "0" || oneChar > "9")
		{
			return false;
		}
	}
	return true;
}
