$(document).ajaxError(
    function(event, request, settings){
        if ( request.status == 403 ) {
            if ( !LOGIN_URL ) {
        		alert("please login");
            }
            else {
				var currentURL = window.location.href;
				window.location=LOGIN_URL+'?forwardTo='+escape(currentURL);
            }
        }
    }
);


function connectFormToURL(url, parentDiv, formCallback) {
    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();
                parentDiv.html(data);
				if ( formCallback ) {
                	formCallback();
				}
                connectFormToURL(url, parentDiv, formCallback);
            }
        });
    }


    // 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, formCallback) {
    var originalURL = biddingFormDiv.find('form').attr('action');
    if ( originalURL ) {
    	var javascriptURL = originalURL.replace(/#.*$/, '') + "/jsbid";
    	connectFormToURL(javascriptURL, biddingFormDiv, formCallback);
    }
}

function attachAllJavascriptBidding(biddingFormDivs, formCallback) {
    biddingFormDivs.each(
        function() {
            attachJavascriptBidding($(this), formCallback);
        }
    );
}

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;
        }
    });
}