var PriceSearch = {
	urlBase : "",
	title : "",
	upc : "",
	partners : {},
	prices : {},
	isLoading : 0,
	notFound : '',
	tmp1 : '',

	begin: function(title, upc, image, ean, binding, price) {
		this.title = title;
		this.upc = upc;
		this.image = image;
		this.ean = ean;
		this.binding = binding;
		this.price = price;
		this.startSearch();
		$('AjaxLoading').update('<center><img src="ajax-loader.gif"></center>');
	},
	// get partner list
	startSearch: function() {
		new Ajax.Request( this.urlBase + '/api/partners/load.php', {
			method: 'get',
			onSuccess : function(res) {
				var json = res.responseText.evalJSON();
				PriceSearch.partners = $H(json);
				PriceSearch.prices = $H();
				PriceSearch.partners.values().each(function(partner) {
					PriceSearch.prices.set(partner.id, 0);
					PriceSearch.searchPartner(partner);
				});
			}
		});
	},
	// search a given partner
	searchPartner: function(partner) {
		this.isLoading += 1;
		var x = new Ajax.Request(this.urlBase + '/api/partners/prices.php', {
			method: 'get',
			parameters: {
				id: partner.id,
				title: this.title,
				upc: this.upc
			},
			onSuccess: function(res) {
				var json = res.responseText.evalJSON();
				// add to table
				if (json.price > 0) {
					PriceSearch.prices.set(json.id, json.price);
					PriceSearch.addRowToResultsTable(json);
				} else {
					var partner = PriceSearch.partners.get(json.id);
					if (PriceSearch.notFound == '') {
						PriceSearch.notFound = '<a href="/partner.php?id=' + partner.id + '">' + partner.title + '</a>';
					} else {
						PriceSearch.notFound += ', <a href="/partner.php?id=' + partner.id + '">' + partner.title + '</a>';
					}
				}
				PriceSearch.updateNotFound();
			},
			onComplete: function() {
				PriceSearch.isLoading -= 1;
				if (PriceSearch.isLoading <= 0) {
					$('AjaxLoading').update('');
				}
			}
		});
	},
	// get partner list
	setLowprice: function() {
		var lowprice = 0;
		var id = 0;
		PriceSearch.prices.each(function(pair) {
			if (pair.value > 0) {
				if (lowprice == 0) {
					lowprice = pair.value;
					id = pair.key;
				}
				if (pair.value < lowprice) {
					lowprice = pair.value;
					id = pair.key;
				}
			}
		});
		if (lowprice > 0) {
			new Ajax.Request(this.urlBase + '/api/partners/lowprice.php', { parameters: { id: id }});
		}
	},
	// add partner row to table
	addRowToResultsTable: function(data) {
		var table = $('PriceTable');
		var rows = table.tBodies[0].rows;
		var partner = this.partners.get(data.id);

		var url = '/go.php?id=' + data.id + '&amp;url=' + escape(data.link);
		var row = '<tr>';
		if (data.imageUri) {
			row = row + '<td><a href="' + url + '" target="_blank">' + partner.title + '<br /><img border="0" src="' + data.imageUri + '"></a></td>';
		} else {
			row = row + '<td><a href="' + url + '" target="_blank">' + partner.title + '</a></td>';
		}
		row = row + '<td>$' + data.price + '</td>';
		if (data.shipping > 0) {
			row = row + '<td>$' + data.shipping + '</td>';
		} else {
			row = row + '<td>none</td>';
		}
		if (partner.coupon > 0) {
			coupons = '<br /><a href="#" class="ajaxable" onclick="PriceSearch.showCoupons(' + data.id + ');return false;">' + partner.coupon + ' coupon' + (partner.coupon > 1 ? 's' : '') + '</a><div class="dropdown_coupons" id="coupons_' + data.id + '" style="display: none;">(fetching coupons...)</div>';
		} else {
			coupons = '';
		}
		row = row + '<td><a class="total" href="' + url + '" target="_blank">$' + data.total + '</a>' + coupons + '</td>';
		row = row + '<td>' + data.availability + '</td>';
		row = row + '<td><a href="' + url + '" target="_blank">Buy It!</a></td>';
		row = row + '</tr>';

		if (rows.length == 0) {
			// empty table, so just add this row
			$(table.tBodies[0]).insert(row);
			return;
		}
		for (var i = 0; i < rows.length; i++) {
			var strTotal = $(rows[i]).select(".total")[0].innerHTML.replace("$", "");
			var rowTotal = parseFloat(strTotal);
			if (data.total < rowTotal) {
				// insert before
				$(rows[i]).insert({ 'before' : row });
				return;
			}
		}
		// add row to the end
		if (table.innerHTML.indexOf(data.title)==-1) {
			$A(rows).last().insert({ 'after' : row });
		}
	},
	// list of partners which did not have the specified DVD
	updateNotFound: function() {
		$('NotFound').show();
		$('NotFoundLinks').update(this.notFound);
	},

	searchProducts: function(keyword, binding, page, isWatched) {
		$('searchResults').update('<br><span style="color: gray">Loading... Please wait.</span><br>');
		var x = new Ajax.Request(this.urlBase + '/api/partners/products.php', {
			parameters: {
				keyword: keyword,
				binding: binding,
				page: page
			},
			asynchronous: false,
			onSuccess: function(res) {
				var json = res.responseText.evalJSON();

				if (json.length > 0) {
					PriceSearch.writeResultsTable(json, keyword, binding, page, isWatched);
				} else {
					$('searchResults').update("Your search returned no results. Please try again.");
				}
			}
		});
	},
	writeResultsTable: function(json, keyword, binding, page, isWatched) {
		$('searchResults').update('');
		for (var i = 0; i < json.length; i++) {
			searchText = isWatched ? 'Add DVD to watched list' : 'Compare Prices';
			searchUrl = isWatched ? '/user.adddvd.php' : '/search_prices.php';

			searchUrl += '?title=' + json[i].title +
				'&upc=' + json[i].upc +
				'&ean=' + json[i].ean +
				'&binding=' + json[i].binding +
				'&price=' + json[i].price +
				'&image=' + json[i].image;

			row  = '<table class="CreateTableText"><tr>';
			row += '<td valign="top">';
			row += '<a href="' + searchUrl + '">' + '<img src="' + json[i].image + '" border="0"></a>';
			row += '</td>';
			row += '<td valign="top">';
			row += '<span class="TextSearch"><b>Title:</b> ' + json[i].title + '</span><br />';
			row += '<span class="TextSearch"><b>Binding:</b> ' + json[i].binding + '</span><br />';
			row += '<span class="TextSearch"><b>EAN:</b> ' + json[i].ean + '</span><br />';
			row += '<span class="TextSearch"><b>UPC:</b> ' + json[i].upc + '</span><br />';
			row += '<span class="TextSearch"><b>List Price:</b> $' + json[i].price + '</span><br />';
			row += '<span class="TextSearch">';
			row += '<a href="' + searchUrl + '">' + searchText + '</a>';
			if (isWatched == false) {
				row += ' (as low as $' + json[i].price + ')';
			}
			row += '</span>';
			row += '</td></tr></table>';
			row += '<br /><hr /><br />';
			$('searchResults').innerHTML += row;
		}
		$('searchResults').innerHTML += '<br /><div id="labels">';
		if (page > 1) {
			$('searchResults').innerHTML += '<a href="#" onclick="PriceSearch.searchProducts("' + keyword + '", "' + binding + '", ' + (page - 1) + ', ' + isWatched + ')">Previous</a> ';
		}
		if (page < 400 && json.length >= 10) {
			$('searchResults').innerHTML += '<a href="#" onclick="PriceSearch.searchProducts(\'' + keyword + '\', \'' + binding + '\', ' + (page + 1) + ', ' + isWatched + ')">Next</a> ';
		}
		$('searchResults').innerHTML += '</div><br /><br />';
	}
}