var MAX_PRICE_DIGITS = 8;
var DEFAULT_JUMP_TO_VALUE = "price";

var searchNavTop = document.getElementById("searchNav0");
var searchNavBottom = document.getElementById("searchNav1");

var jumpToDivTop = document.createElement("div");
	jumpToDivTop.setAttribute("id", "jumpToPriceTop");
	jumpToDivTop.setAttribute("class", "jumpToPrice");

var jumpToDivBottom = document.createElement("div");
	jumpToDivBottom.setAttribute("id", "jumpToPriceBottom");
	jumpToDivBottom.setAttribute("class", "jumpToPrice");

var jumpToInputTop = document.createElement("input");
	jumpToInputTop.setAttribute("id", "jumpToPriceInputTop");
	jumpToInputTop.setAttribute("class", "jumpToPriceInput");
	jumpToInputTop.setAttribute("type", "text");
	jumpToInputTop.setAttribute("value", DEFAULT_JUMP_TO_VALUE);

var jumpToInputBottom = document.createElement("input");
	jumpToInputBottom.setAttribute("id", "jumpToPriceInputBottom");
	jumpToInputBottom.setAttribute("class", "jumpToPriceInput");
	jumpToInputBottom.setAttribute("type", "text");
	jumpToInputBottom.setAttribute("value", DEFAULT_JUMP_TO_VALUE);

var jumpToLabelTop = document.createElement("label");
	jumpToLabelTop.setAttribute("class", "jumpToPriceLabel");

var jumpToLabelBottom = document.createElement("label");
	jumpToLabelBottom.setAttribute("class", "jumpToPriceLabel");

jumpToLabelTop.appendChild(document.createTextNode("Jump to: "));
jumpToDivTop.appendChild(jumpToLabelTop);
jumpToDivTop.appendChild(jumpToInputTop);

jumpToDivBottom.appendChild(document.createTextNode("Jump to: "));
jumpToDivBottom.appendChild(jumpToLabelBottom);
jumpToDivBottom.appendChild(jumpToInputBottom);


//Response
var responseDivTop = document.createElement("div");
responseDivTop.setAttribute("class", "jumpToPriceResponse");
responseDivTop.setAttribute("id", "jumpToPriceResponseTop");
responseDivTop.appendChild(document.createTextNode(" "));
jumpToDivTop.appendChild(responseDivTop);

var responseDivBottom = document.createElement("div");
responseDivBottom.setAttribute("class", "jumpToPriceResponse");
responseDivBottom.setAttribute("id", "jumpToPriceResponseBottom");
responseDivBottom.appendChild(document.createTextNode(" "));
jumpToDivBottom.appendChild(responseDivBottom);


//searchNavTop.parentNode.insertBefore(jumpToDivTop,searchNavTop.nextSibling);

//searchNavBottom.parentNode.insertBefore(jumpToDivBottom,searchNavBottom.nextSibling);


searchNavTop.appendChild(jumpToDivTop);

searchNavBottom.appendChild(jumpToDivBottom);

/*
jumpToDivTop.style.fontWeight = "bold";
jumpToDivTop.style.textAlign = "right";
jumpToDivTop.style.margin = "1em 1em 0 0";
//jumpToDivTop.style.cssFloat = "right";

responseDiv.style.fontSize = "12px";
responseDiv.style.fontWeight = "normal";
responseDiv.style.textAlign = "right";

jumpToInputTop.style.width = "7em";
jumpToInputTop.style.color = "#666";
*/



var jumpToPriceTimer;
var enterPressed = false;


var http_request = false;

function makeGETRequest(url, responseHandler) {
	http_request = false;
	if (window.XMLHttpRequest) { // Mozilla, Safari,...
		http_request = new XMLHttpRequest();
		if (http_request.overrideMimeType) {
			http_request.overrideMimeType("text/html");
		}
	} else if (window.ActiveXObject) { // IE
		try {
			http_request = new ActiveXObject("Msxml2.XMLHTTP");
		} catch (e) {
			try {
				http_request = new ActiveXObject("Microsoft.XMLHTTP");
			} catch (e2) {}
		}
	}

	if (!http_request) {
		alert("Cannot create XMLHTTP instance");
		return false;
	}


	//http_request.overrideMimeType("text/html");
	http_request.open("GET", url, true);
	http_request.onreadystatechange = responseHandler;
	http_request.send();

	return true;
}


function handleJumpToResponse() {
	if (http_request.readyState == 4) {
		if (http_request.status == 200) {
			response = eval("("+http_request.responseText+")");
			if (response.error != null) {
				responseDivTop.innerHTML = response.error;
                responseDivBottom.innerHTML = response.error;
			} else {
				var url = "/search?q="+searchPhrase+"&start="+response.start;
				if (enterPressed) {
					enterPressed = false;
					window.location = url;
				} else {
					responseDivTop.innerHTML = "<a href=\""+ url +"\">go to page " + (response.start/10 + 1) + "</a>";
                    responseDivBottom.innerHTML = "<a href=\""+ url +"\">go to page " + (response.start/10 + 1) + "</a>";
                }
			}
		} else {
			//alert("There was a problem with the request. Please try again in a few minutes. Response status: "+ http_request.status);
		}
	}
}


function getKeyChar(event) {
	var keynum;

	if(window.event) { //IE
		keynum = event.keyCode;
	} else if (event.charCode) {// Netscape/Firefox/Opera
		keynum = event.charCode;
	} else if (event.which) {
		keynum = event.which;
	}
	return String.fromCharCode(keynum);
}


function tryNumberFormat(obj, event) {
        var keyCode = event.keyCode ? event.keyCode : event.which;
        
	var keychar = getKeyChar(event);
	var oldValue = obj.value;
	var insertIndex = getCaretPosition(obj);

	var numberString;

	if (keychar == '\t') {
		return true;
	}

	if (keychar == '\b' || keyCode == 8) {
		numberString = toNumber(oldValue.substr(0,insertIndex-1) + oldValue.substr(insertIndex));
	} else {
		numberString = toNumber(oldValue.substr(0,insertIndex) + keychar + oldValue.substr(insertIndex)) ;
	}

	if (numberString.length <= MAX_PRICE_DIGITS) {
		obj.value = "$" + addCommas(numberString);
	}

	var sizeDelta =  obj.value.length - oldValue.length;

	setCaretPosition(obj, Math.max(insertIndex + sizeDelta,1));


	return false;
}

function toNumber(string) {
	var nonNumber = /\D/gi;
	var number = parseInt(string.replace(nonNumber, ""), 10);

	return isNaN(number) || number == 0 ? "" : number + "";
}

function getSelectedText(input) {
	var startPos = input.selectionStart;
	var endPos = input.selectionEnd;
	var doc = document.selection;

	if (doc && doc.createRange().text.length != 0) {
		return doc.createRange().text;
	} else if (!doc && input.value.substring(startPos,endPos).length != 0) {
		return input.value.substring(startPos,endPos)
	}
	return null;
}


function addCommas(numberString) {
	var formatted = numberString;
	var regex = /(\d+)(\d{3})/;

	while (regex.test(formatted)) {
		formatted = formatted.replace(regex, '$1' + ',' + '$2');
	}

	return formatted;
}

function getCaretPosition (ctrl) {
	var CaretPos = 0;	// IE Support
	if (document.selection) {
		ctrl.focus ();
		var Sel = document.selection.createRange ();
		Sel.moveStart ('character', -ctrl.value.length);
		CaretPos = Sel.text.length;
	}
	// Firefox support
	else if (ctrl.selectionStart || ctrl.selectionStart == '0')
		CaretPos = ctrl.selectionStart;
	return (CaretPos);
}

function setCaretPosition(ctrl, pos){
	if(ctrl.setSelectionRange) {
		ctrl.focus();
		ctrl.setSelectionRange(pos,pos);
	}
	else if (ctrl.createTextRange) {
		var range = ctrl.createTextRange();
		range.collapse(true);
		range.moveEnd('character', pos);
		range.moveStart('character', pos);
		range.select();
	}
}

function trySendRequest(price) {

	if (!isNaN(price)) {
		makeGETRequest("/getPageByPrice.do?q=" + searchPhrase + "&totalFound=" + numberOfListingsFound + "&timeRetrieved=" + timeRetrieved + "&price=" + price, handleJumpToResponse);
	}
}

function clearDefaultJumpToText(input) {
	if (input.value == DEFAULT_JUMP_TO_VALUE) {
		input.value = "";
		input.style.backgroundColor=null;
		input.style.color = "#000";
	}
}

function replaceDefaultJumpToText(input) {
	if (input.value == "" || input.value == "$") {
		input.value = DEFAULT_JUMP_TO_VALUE;
		input.style.color = "#777";
	}
}


function jumpToKeyUp(event) {
    if (!event) {
        event = window.event;
    }

    var target = event.target || event.srcElement;

    if (event.keyCode == 13) {
        if (jumpToPriceTimer != null) {
            clearTimeout(jumpToPriceTimer);
        }

        enterPressed = true;

        var price = parseInt(toNumber(target.value));

        trySendRequest(price);
    }
}

function jumpToKeyDown(event) {
    if (!event) {
        event = window.event;
    }

    var keyCode = event.keyCode ? event.keyCode : event.which;
    

    if (keyCode == 8) {
        var target = event.target || event.srcElement;

        var keyValid = tryNumberFormat(target, event);

        var price = parseInt(toNumber(target.value));

        jumpToPriceTimer = setTimeout('trySendRequest('+price+')',1000);

        return keyValid;
    }

    return true;
}

function jumpToKeyPress(event) {
	if (!event) {
		event = window.event;
	}

    var target = event.target || event.srcElement;

	if (event.keyCode == 37 || //Arrow left
		event.keyCode == 39 || event.keyCode == 8) { //Arrow right
		return true;
	}

	if (jumpToPriceTimer != null) {
		clearTimeout(jumpToPriceTimer);
	}

    var keyValid = tryNumberFormat(target, event);

	var price = parseInt(toNumber(target.value));

	jumpToPriceTimer = setTimeout('trySendRequest('+price+')',1000);

	return keyValid;
}

jumpToInputTop.onfocus = function() {
	clearDefaultJumpToText(jumpToInputTop);
}

jumpToInputTop.onblur = function() {
	replaceDefaultJumpToText(jumpToInputTop);
}

jumpToInputBottom.onfocus = function() {
	clearDefaultJumpToText(jumpToInputBottom);
}

jumpToInputBottom.onblur = function() {
	replaceDefaultJumpToText(jumpToInputBottom);
}

jumpToInputTop.onkeypress = jumpToKeyPress;
jumpToInputTop.onkeydown = jumpToKeyDown;
jumpToInputTop.onkeyup = jumpToKeyUp;

jumpToInputBottom.onkeypress = jumpToKeyPress;
jumpToInputBottom.onkeydown = jumpToKeyDown;
jumpToInputBottom.onkeyup = jumpToKeyUp;


