/*
Copyright © 2006 Dynamic Interface Solutions, LLC All rights reserved.
You may not use this script in any way without the written consent of its owner.
*/

var biddingAreasCollection = new Object();
biddingAreasCollection["size"] = 0;

function simpleArrayCopy(originalArray) {
	if (originalArray == null) return null;
	var copyOfArray = new Array();
	for (var i = 0; i < originalArray; i++) {
		copyOfArray[i] = originalArray[i]; 
	}
	return copyOfArray;
}

function getAllCombinations(valuesArray) {
	var combinations = new Array();
	//first get all pointer strings
	var pointerStrings = getPointerStringsArray(valuesArray.length);	
	for (var i = 0;i < pointerStrings.length; i++) {
		combinations.push(constructArrayFromPointer(pointerStrings[i].split("|"), valuesArray));
	}
	return combinations;	
}

function getPointerStringsArray(n) {
	var pointerStrings = new Array();
	var s;
	for (var i = 0; i < n; i++) {
		if (i == 0) {
			pointerStrings.push(i + "");
		} else {
			var currentArraySize = pointerStrings.length; 
			pointerStrings.push(i + "");
			for (var j = 0; j < currentArraySize; j++) {
				var newIndexString = pointerStrings[j] + "|" +  i;
				pointerStrings.push(newIndexString);
			}
		}
	}
	return pointerStrings;			
}


function constructArrayFromPointer(pointerArray, values) {	
	var returnArray = new Array(pointerArray.length);
	for (var i = 0; i < pointerArray.length; i++) {
		returnArray[i] = values[parseInt(pointerArray[i], 10)];
	}
	return returnArray;
}

function addAreaToCollection() {
	var areaNameInput = document.getElementById("area_name");
	var areaName = trim(areaNameInput.value);
	if (areaName == "") {
		alert("Area name is required.");
		areaNameInput.value = "";
		areaNameInput.focus();
		return;
	}
	if (biddingAreasCollection[areaName] != null) {
		alert("Area has already been defined.  You must delete the existing before adding it again.");
		areaNameInput.focus();
		areaNameInput.select();
		return;
	}
	var starLevelInput = document.getElementById("star_level");
	var area = new Object();
	area["name"] = areaName;
	area["maximumStarLevel"] = parseInt(starLevelInput.value, 10);
	area["maximumStarLevelDescription"] = starLevelInput.options[starLevelInput.selectedIndex].text;
	biddingAreasCollection[areaName] = area;
	biddingAreasCollection["size"]++;
	clearAreaInputs();
	areaNameInput.focus();
	var newRow = addAreaToTable(area);
	area["tableRow"] = newRow;
	var newOption = addAreaToSelect(area);
	area["selectOption"] = newOption;
	
}

function removeAreaFromCollection(areaKey, td) {
	var areaToRemove = biddingAreasCollection[areaKey];
	var biddingAreaTableBody = document.getElementById("bidding_areas_table_body");	
	if (areaToRemove != null) {
		biddingAreaTableBody.removeChild(td.parentNode);
		document.getElementById("bidding_area_name").removeChild(areaToRemove["selectOption"]);
		biddingAreasCollection[areaKey] = null;
		biddingAreasCollection["size"]--;
	}
	if (biddingAreasCollection["size"] == 0) {
		var newRow = document.createElement("tr");
		var newCell = createNewTableCell("None defined.");
		newCell.colSpan = 3;
		newRow.appendChild(newCell);
		biddingAreaTableBody.appendChild(newRow);
	}
}

function clearAreaInputs() {
	document.getElementById("area_name").value = "";
}

function addAreaToTable(area) {
	var biddingAreaTableBody = document.getElementById("bidding_areas_table_body");
	if (biddingAreasCollection["size"] == 1) {
		if (biddingAreaTableBody.rows.length == 1) {
			//biddingAreaTableBody.removeChild(biddingAreaTableBody.childNodes[0]);
			biddingAreaTableBody.deleteRow(biddingAreaTableBody.childNodes[0]);
		}
	}
	var newRow = document.createElement("tr");
	newRow.appendChild(createNewTableCell(area["name"]));
	newRow.appendChild(createNewTableCell(area["maximumStarLevelDescription"]));
	newRow.appendChild(createNewClickableCell("Delete", "removeAreaFromCollection(\"" + area["name"] + "\", this);"));
	biddingAreaTableBody.appendChild(newRow);
	return newRow;
}

function trim(s) {
	return s.replace(/^(\s*)/, "").replace(/(\s*)$/, "");
}

function createNewTableCell(cellText, isBold) {
	var newCell = document.createElement("td");	
	if (isBold != null && isBold == true) {
		newCell.appendChild(createTextSpan(cellText, true));
	} else {
		newCell.appendChild(document.createTextNode(cellText));
	}
	return newCell;
}

function createNewTableHeader(cellText) {
	var newCell = document.createElement("th");
	newCell.appendChild(document.createTextNode(cellText));
	return newCell;
}

function createNewClickableCell(cellText, onClickFunctionText) {
	var newCell = document.createElement("td");
	newCell.appendChild(document.createTextNode(cellText));
	newCell.onclick = new Function(onClickFunctionText);	
	newCell.className = "clickableCell";
	return newCell;
}

function createNewOption(value, text) {
	var option = document.createElement("option");
	option.appendChild(document.createTextNode(text));
	option.value = value;
	return option;
}

function addAreaToSelect(area) {
	var biddingArea = document.getElementById("bidding_area_name");
	var option = createNewOption(area["name"], area["name"]);
	biddingArea.appendChild(option);
	return option;
}

function generateStrategy() {
	if (biddingAreasCollection["size"] == 0) {
		alert("There are no areas defined.");
		document.getElementById("area_name").focus();
		return;
	}
	var startingBid = document.getElementById("starting_bid");;
	var maxBid = document.getElementById("maximum_bid");;
	var starLevelInput = document.getElementById("bidding_star_level");
	var starLevel = parseInt(starLevelInput.value, 10);	
	var biddingArea = biddingAreasCollection[document.getElementById("bidding_area_name").value];
	var starLevelDescription = starLevelInput.options[starLevelInput.selectedIndex].text;
	var mode = getRadioValue(document.getElementsByName("bidding_mode"));
	if (starLevel > biddingArea["maximumStarLevel"]) {
		alert("Based of the information you entered.  The desired bidding area does not offer hotels at your desired star level of " + starLevelDescription + ".");
		document.getElementById("bidding_star_level").focus();
		return;
	}
	//check the min and maximum bids	
	if (!isInteger(startingBid.value)) {
		alert("The starting bid is invalid or missing.  Enter whole dollars only.");
		startingBid.value = "";
		startingBid.focus();
		return;
	}
	if (!isInteger(maxBid.value)) {
		alert("The maximum bid is invalid or missing.  Enter whole dollars only.");
		maxBid.value = "";
		maxBid.focus();
		return;
	}
	if (parseInt(startingBid.value, 10) >= parseInt(maxBid.value, 10)) {
		alert("The starting bid must be less than the maximum bid.");
		startingBid.focus();
		return;
	}
	
	var bids = getBids();
	
	//generate the report
	var strategyContainer = document.getElementById("strategyContainer"); 
	//remove all children
	while (strategyContainer.childNodes.length > 0) {
		strategyContainer.removeChild(strategyContainer.childNodes[0]);
	}
	//add header
	var headerDiv = document.createElement("div");
	headerDiv.appendChild(createText("Hotel bidding strategy for bidding area of "));
	headerDiv.appendChild(createTextSpan(biddingArea["name"], true));
	headerDiv.appendChild(createText(" and star level of "));
	headerDiv.appendChild(createTextSpan(starLevelDescription, true));
	headerDiv.appendChild(createText("."));
	headerDiv.appendChild(document.createElement("br"));
	headerDiv.appendChild(document.createElement("br"));
	headerDiv.appendChild(createTextSpan("Please support BidSmartForHotels.com by using the links provided within this generated strategy.  The links open Priceline in a new window to preserve your strategy.", true));
	headerDiv.appendChild(document.createElement("br"));
	headerDiv.appendChild(document.createElement("br"));	
	if (bids.length > 1) {
		//build table
		var strategyTableBody = document.createElement("tbody");	
		var headerRow = document.createElement("tr");
		headerRow.vAlign = "top";
		headerRow.appendChild(createNewTableHeader("Bid"));
		headerRow.appendChild(createNewTableHeader("Bidding Area(s)"));
		headerRow.appendChild(createNewTableHeader("Bid Amount"));
		var step = 1;
		strategyTableBody.appendChild(headerRow);	
		
		var startRow = document.createElement("tr");
		var startCell = document.createElement("td");
		startCell.appendChild(createText("Visit the "));
		startCell.appendChild(getPLLinkSpan());
		startCell.appendChild(createText(" page, click on the Name Your Own Price"));
		startCell.appendChild(createTrademark());
		startCell.appendChild(createText(" link, enter your destination and dates, and place the following bids."));
		startCell.colSpan = 3;
		startRow.appendChild(startCell);
		strategyTableBody.appendChild(startRow);				
		
		for (var i = 0; i < bids.length; i++) {
			var bid = bids[i];
			var bidRow = document.createElement("tr");
			bidRow.appendChild(createNewTableCell("" + step, true));
			bidRow.appendChild(createNewTableCell("Select " + bid["areas"]));
			bidRow.appendChild(createNewTableCell("Bid $" + bid["amount"]));
			strategyTableBody.appendChild(bidRow);
			step++;
			if (bid["logoutAfter"] == true && i < (bids.length - 1)) {
				if (mode != "expert" || (bid["areaCount"] >= bids[i + 1]["areaCount"])) {
					var logoutRow = document.createElement("tr");
					var logoutCell = document.createElement("td");
					logoutCell.appendChild(createText("Signout of Priceline, close the Priceline window, and return to the "));
					logoutCell.appendChild(getPLLinkSpan());
					logoutCell.appendChild(createText(" page, click on the Name Your Own Price"));
					logoutCell.appendChild(createTrademark());
					logoutCell.appendChild(createText(" link, enter your destination and dates, and place the following bids."));
					logoutCell.colSpan = 3;
					logoutRow.appendChild(logoutCell);
					strategyTableBody.appendChild(logoutRow);
				}
			}
		}
		var strategyTable = document.createElement("table");
		strategyTable.cellPadding = 0;
		strategyTable.cellSpacing = 0;
		strategyTable.border = 1;	
		strategyTable.appendChild(strategyTableBody);
		strategyContainer.appendChild(headerDiv);
		strategyContainer.appendChild(strategyTable);
	} else {
		//there were no free rebid zones!
		var noRebidDiv = document.createElement("div");
		noRebidDiv.appendChild(createText("Unfortunately, there were no free rebid areas for your target area and star level.  We suggest that you start at your minimum bid and increase it after each 24hr lockout period.  Alternatively, you could increase your star level if possible in your area."));	
		strategyContainer.appendChild(headerDiv);
		strategyContainer.appendChild(noRebidDiv);
	}
	
	
}

function isInteger(s) {
	var regX  = /(^\d\d*$)/;
	return regX.test(s);	
}

function getBids() {
	var starLevel = parseInt(document.getElementById("bidding_star_level").value, 10);
	var biddingArea = document.getElementById("bidding_area_name").value;
	var startingBid = parseInt(document.getElementById("starting_bid").value, 10);
	var maxBid = parseInt(document.getElementById("maximum_bid").value, 10);
	var rebidAreas = new Array();
	var i = 0;
	for (var prop in biddingAreasCollection) {
		if (prop != "size" && prop != biddingArea) {
			var thisArea = biddingAreasCollection[prop];
			if (thisArea != null) {
				if (thisArea["maximumStarLevel"] < starLevel) {
					rebidAreas[i] = prop;
					i++;
				}
			}
		}
	}
	
	var mode = getRadioValue(document.getElementsByName("bidding_mode"));
	var bids = new Array();
	var thisBid;
	var bidAreasString = biddingArea;
	thisBid = new Object();
	thisBid["areas"] = bidAreasString;
	bids.push(thisBid);
	if (mode == "simple") {
		for (var x = 0; x < rebidAreas.length; x++) {
			bidAreasString += ", " + rebidAreas[x];
			thisBid = new Object();
			thisBid["areas"] = bidAreasString;
			thisBid["logoutAfter"] = false;			
			bids.push(thisBid);
		}
	} else if (mode == "advanced") {
		for (var x = 0; x < rebidAreas.length - 1; x++) {
			bidAreasString += ", " + rebidAreas[x];
			thisBid = new Object();
			thisBid["areas"] = bidAreasString;
			thisBid["logoutAfter"] = (x == rebidAreas.length - 2);
			bids.push(thisBid);
		}
		bidAreasString = biddingArea + ", " + rebidAreas[rebidAreas.length - 1];
		thisBid = new Object();
		thisBid["areas"] = bidAreasString;
		thisBid["logoutAfter"] = false;
		bids.push(thisBid);
		if (rebidAreas.length > 1) {
			for (var x = 0; x < rebidAreas.length - 1; x++) {
				bidAreasString += ", " + rebidAreas[x];
				thisBid = new Object();
				thisBid["areas"] = bidAreasString;
				thisBid["logoutAfter"] = (x == rebidAreas.length - 2);
				bids.push(thisBid);
			}		
		}		
	} else if (mode == "expert") {
		var combos = getAllCombinations(rebidAreas);
		for (var z = 0; z < combos.length; z++) {
			var thisCombo = combos[z];
			if (thisCombo != null && thisCombo.length > 0) {
				bidAreasString =  biddingArea + ", " + thisCombo.join(", ");
				thisBid = new Object();
				thisBid["areas"] = bidAreasString;
				thisBid["areaCount"] = thisCombo.length + 1;
				thisBid["logoutAfter"] = true;
				bids.push(thisBid);							
			}
		}
		
	}	
	var biddingRange = maxBid - startingBid;
	var numberOfBidsAvailable = bids.length;
	var currentBidAmount = startingBid;
	if (numberOfBidsAvailable - 1 > biddingRange) {
		returnedBids = new Array();
		for (var q = 0; currentBidAmount <= maxBid; q++, currentBidAmount++) {
			thisBid = bids[q];
			thisBid["amount"] = currentBidAmount;
			returnedBids.push(thisBid);
		}
		bids = returnedBids;
	} else {
		//increment by calculated value
		var increment = biddingRange/(numberOfBidsAvailable - 1);
		for (var q = 0; q < numberOfBidsAvailable; q++) {
			thisBid = bids[q];
			thisBid["amount"] = Math.round(currentBidAmount);
			currentBidAmount += increment;			
		}
		thisBid = bids[numberOfBidsAvailable - 1];
		if (numberOfBidsAvailable > 1) {
			thisBid["amount"] = maxBid;
		} 
	}
	return bids;		
}

function getRadioValue(radioCollection) {
	for (var i = 0; i < radioCollection.length; i++) {
		if (radioCollection[i].checked) {
			return radioCollection[i].value;
		}
	}
}

function createText(s) {
	return document.createTextNode(s);
}

function createTrademark() {
	var sup = document.createElement("sup");
	//sup.appendChild(document.createTextNode("&reg;"));
	sup.innerHTML = "&reg;";
	return sup;
}

function createTextSpan(s, isBold) {
	var span = document.createElement("span");
	if (isBold != null && isBold == true) {
		span.style.fontWeight = "bold";
	}
	span.appendChild(document.createTextNode(s));
	return span;
}

function showHelp(topic) {
	var url = "faq.html";
	if (topic != null) {
		url = url + "#" + topic;
	}
	var screenWidth = 1024
	var screenHeight = 768;
	if (document.all || document.layers) {
   	screenWidth = screen.availWidth;
	   screenHeight = screen.availHeight;
	}
	var popupWidth = 600
	var popupHeight = 400;
	var left = (screenWidth - popupWidth)/2;
	var top = (screenHeight - popupHeight)/2;	
	var popup = window.open(url, "help", "height=400,width=600,location=no,menubar=no,scrollbars=yes,top=" + top + ",left=" + left);
	popup.focus();
}innerText="Show Detailed Help";

function showOrHide(e,link) {
	if (e.style.display == "none") {
		e.style.display = "";
		link.removeChild(link.childNodes[0]);
		link.appendChild(createText("- Hide Detailed Help"));
	} else {
		e.style.display = "none";
		link.removeChild(link.childNodes[0]);
		link.appendChild(createText("+ Show Detailed Help"));
	}
}

function getPLLinkSpan() {
	var linkSpan = document.createElement("span");
	linkSpan.innerHTML = "<a href=\"http://www.kqzyfj.com/click-2142920-10392970\" target=\"_blank\">Priceline.com Hotels</a><img src=\"http://www.tqlkg.com/image-2142920-10392970\" width=\"1\" height=\"1\" border=\"0\"/>";
	return linkSpan;
}