$(document).ajaxError(
	function(event, request, settings){
		if ( request.status == 403 ) {
			alert("please login");
		}
	}
);


function connectFormToURL(url, parentDiv) {
	function submitForm(button) {
		var data = {};
		parentDiv.find("form :input")
		.filter(":enabled")
		.not(":submit") // remove submit buttons
		.each(
			function() {
				data[this.name]=this.value;
			}
		);
		if ( button ) {
			data[button.name]=button.value;
		}
		
		$.ajax({
			type: "POST",
			url: url,
			data: data,
			success: function(data) {
				parentDiv.find('form').unbind();
				parentDiv.find('form :submit').unbind();
				
				// need to pull out any script tags (used for google ad tracking)
				// and then need whatever is in the noscript tag - as we'll use that instead
				var elements = $(data);
				parentDiv
					.html("")
					.append(elements.filter(":not(script)").filter(":not(noscript)"))
					.append(elements.filter("noscript").text());
					
				connectFormToURL(url, parentDiv);
			}
		});
	}


	// bind to click on submit buttons,
	// so we know which button was pressed
	parentDiv.find('form :submit').click(
		function(event) {
			var target = event.target;
			submitForm(target);
			return false;
		}
	);

	// bind to generic form submission 
	// (without submit button clicked)
	// e.g. when user presses enter
	parentDiv.find('form').submit(
		function(event) {
			submitForm(null);
			return false;
		}
	);
}


function attachJavascriptBidding(biddingFormDiv) {
	var originalURL = biddingFormDiv.find('form').attr('action');
	if ( originalURL ) {
		var javascriptURL = originalURL.replace(/#.*$/, '') + "/jsbid";
		connectFormToURL(javascriptURL, biddingFormDiv);
	}
}

function attachAllJavascriptBidding(biddingFormDivs) {
	biddingFormDivs.each(
		function() {
			attachJavascriptBidding($(this));
		}
	);
}

function processLotsJSON(lotsJSON, processLot) {
	for ( var i = 0; i < lotsJSON.length; i++ ) {
		var lot = lotsJSON[i];
		var id = lot.id;
		processLot(id, lot);
	}
}

var pendingTimeout = 0;
var pendingRequest = false;

function updateLots(processLot, updateRate) {
	
	if ( pendingRequest )
		return;
	
	if ( pendingTimeout ) {
		clearTimeout(pendingTimeout);
		pendingTimeout = 0;
	}

	if ( LOT_IDS.length == 0 )
		return;
	
	if ( !updateRate ) {
		updateRate = 3000;
	}
	
	var startTime = new Date().getTime();
	var url  = JS_UPDATE_URL;
	var data = { ids: LOT_IDS.join(','), t: startTime }
	pendingRequest = true;
	
	var updateLotsAgain = function() { updateLots(processLot, updateRate); };
	
	$.ajax({
		type: "GET",
		url: url,
		data: data,
		dataType: 'json',
		success: function(data) {
			processLotsJSON(data, processLot);
			var endTime = new Date().getTime();
			var diff = endTime - startTime;
			var delay = Math.max(updateRate - diff, 100);
			pendingTimeout = setTimeout(updateLotsAgain, delay);
			pendingRequest = false;
		},
		error: function(XMLHttpRequest, textStatus, errorThrown) {
			// try again later
			pendingTimeout = setTimeout(updateLotsAgain, 3*updateRate);
			pendingRequest = false;
		}
	});
}