// 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);

	var startPage = parseInt(document.Range.startPage.value, 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-0)+(startPage-0)-1) + "_";

	else

	{

		while(pos < length)

			paramBegin += pageParam.charAt(pos++);

		paramBegin += "_";

	}
	
	return paramBegin;

}



//

function addRangeToParam(pageParam, numFrom, numTo)

{	
	var startPage = parseInt(document.Range.startPage.value, 10);
		
	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-0)+(startPage-0)-1) + "-" + ((pageTo-0)+(startPage-0)-1) + "_";

		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;

}

