function AuctionTimer(auctionIds, options)
{
	this.options = $.extend(AuctionTimer.GetDefaultOptions(), options);
	this.timeout = null; //current timeout running
	this.auctionIds = auctionIds;
	this.remainingAuctionTimes = null;

	// Start the loop to repeatedly call UpdateTime
	var thisReference = this;
	window.setInterval(function() { thisReference.UpdateTime(); }, this.options.updateTimerFrequency);

	this.SynchronizeTimer();
}

// Some useful constants, miliseconds per Second, Minute, Hour, and Day
AuctionTimer.msPerSecond = 1000;
AuctionTimer.msPerMinute = 60000;
AuctionTimer.msPerHour = 3600000;
AuctionTimer.msPerDay = 86400000;

// Return Default options
AuctionTimer.GetDefaultOptions = function()
{
	return {
		url: '/index.php?action=RemainingAuctionTime',
		synchTimerFrequency: 20000,
		updateTimerFrequency: 100,
		onUpdate: AuctionTimer.OnUpdate
	};
}

AuctionTimer.prototype.SynchronizeTimer = function()
{
	var thisReference = this;
	//$.get(this.url, function(responseData) { thisReference.SynchronizeTimerOnComplete(responseData); });
	var postData = {'auctionIds[]':this.auctionIds}
	var callback = function(responseData) { thisReference.SynchronizeTimerOnComplete(responseData); };
	$.post(this.options.url, postData, callback, 'json');
}

AuctionTimer.prototype.SynchronizeTimerOnComplete = function(responseData)
{
	this.remainingAuctionTimes = responseData.remainingAuctionTimes;

	// Set a timeout to call SynchronizeTimer again and restart this process.
	var thisReference = this;
	this.timeout = window.setTimeout(function() { thisReference.SynchronizeTimer(); }, thisReference.options.synchTimerFrequency);
}

AuctionTimer.prototype.UpdateTime = function()
{
	if (!this.remainingAuctionTimes) { return; }

	for (var i = 0; i < this.remainingAuctionTimes.length; i++) { this.remainingAuctionTimes[i].timeRemaining -= this.options.updateTimerFrequency; }

	// Bail out here if no one's listening.
	if (!this.options.onUpdate) { return; }

	// Doing this as 2 loops because it's technically more correct.  We should internally run the updates even if no one is listening.
	for (var i = 0; i < this.remainingAuctionTimes.length; i++)
	{ this.options.onUpdate(this.remainingAuctionTimes[i].auctionId, AuctionTimer.ParseTimeRemaining(this.remainingAuctionTimes[i].timeRemaining)); }
}

AuctionTimer.ParseTimeRemaining = function(timeRemaining)
{
	var timeInfo = { days: 0, hours: 0, minutes: 0, seconds: 0, miliseconds: 0, timeRemaining: timeRemaining };

        timeInfo.days = Math.floor(timeRemaining / AuctionTimer.msPerDay);
        timeRemaining = timeRemaining % AuctionTimer.msPerDay;

        timeInfo.hours = Math.floor(timeRemaining / AuctionTimer.msPerHour);
        timeRemaining = timeRemaining % AuctionTimer.msPerHour;

        timeInfo.minutes = Math.floor(timeRemaining / AuctionTimer.msPerMinute);
        timeRemaining = timeRemaining % AuctionTimer.msPerMinute;

        timeInfo.seconds = Math.floor(timeRemaining / AuctionTimer.msPerSecond);
        timeRemaining = timeRemaining % AuctionTimer.msPerSecond;

        timeInfo.miliseconds = timeRemaining;

	return timeInfo;
}

// The built-in onUpdate function, runs if you never passed your own onUpdate() via constructor options
AuctionTimer.OnUpdate = function(auctionId, timeInfo)
{
	//console.log(timeInfo);
}

