var RollingArchives = {};
RollingArchives = Class.create();

RollingArchives.prototype = {
	initialize: function(attachitem, targetitem, url, pagetext) {
		this.attachitem = attachitem;
		this.targetitem = targetitem;
		this.url = url;
		this.pagetext = pagetext;

		this.rollnext = 'rollnext';
		this.rollprev = 'rollprevious';
		this.rollpages = 'rollpages';
		this.rollload = 'rollload';
		this.rollhome = 'rollhome';
		this.rolldates = 'rolldates';
		this.rollnotices = 'rollnotices';
		this.rollhover = 'rollhover';

		this.pagehandle = 'pagehandle';
		this.pagetrack = 'pagetrack';

		this.trimmer = new TextTrimmer("texttrimmer", "dynamic-content", "entry-content", 1, 100);

		this.query = null;
		this.pagenumber = 0;
		this.pagecount = 0;
		this.pagedates = null;
		
		this.rollingState = null;

		this.nextPageListener = this.gotoNextPage.bindAsEventListener(this);
		this.prevPageListener = this.gotoPrevPage.bindAsEventListener(this);
		this.homePageListener = this.gotoHomePage.bindAsEventListener(this);

		this.initialized = false;
	},

	startEvents: function() {
		if (this.initialized) {
			this.stopEvents();
		}

		Event.observe(this.rollprev, 'click', this.prevPageListener);
		Event.observe(this.rollnext, 'click', this.nextPageListener);
		Event.observe(this.rollhome, 'click', this.homePageListener);
	},

	stopEvents: function() {
		Event.stopObserving(this.rollprev, 'click', this.prevPageListener);
		Event.stopObserving(this.rollnext, 'click', this.nextPageListener);
		Event.stopObserving(this.rollhome, 'click', this.homePageListener);
	},

	setupSlider: function() {
		var thisRolling = this;
		var sliderValues = new Array(this.pagecount);

		if (this.pageSlider instanceof Control.Slider) {
			this.pageSlider.dispose();
		}

		for (var i = 0; i < this.pagecount; i++) {
			sliderValues[i] = i + 1;
		}

		this.pageSlider = new Control.Slider(thisRolling.pagehandle, thisRolling.pagetrack, {
			range: $R(thisRolling.pagecount, 1),
			values: sliderValues,
			sliderValue: thisRolling.pagenumber,
			onSlide: function(v) { thisRolling.updatePageText(v); },
			onChange: function(v) { thisRolling.gotoPage(v); },
			handleImage: thisRolling.pagehandle
		});
	},

	updatePageText: function(v) {
		$(this.rollhover).show();
		
		$(this.rollpages).innerHTML = (this.pagetext.replace('%1$d', v)).replace('%2$d', this.pagecount);
		$(this.rolldates).innerHTML = this.pagedates[v - 1];
	},

	validatePage: function(newpage) {
		if (this.pagecount > 1) {
			if (newpage >= this.pagecount) {
				$(this.attachitem).className = 'lastpage';
				this.pagenumber = this.pagecount;

			} else if (newpage == 1) {
				$(this.attachitem).className = 'firstpage';
				this.pagenumber = 1;

			} else {
				$(this.attachitem).className = 'nthpage';
				this.pagenumber = newpage;
			}

			this.updatePageText(this.pagenumber);
			return true;
		}

		$(this.attachitem).className = 'emptypage';
		return false;
	},

	gotoNextPage: function() {
		this.pageSlider.setValueBy(-1);
	},

	gotoPrevPage: function() {
		this.pageSlider.setValueBy(1);
	},

	gotoHomePage: function() {
		this.pageSlider.setValue(1);
	},

	gotoPage: function(newpage) {
		new Effect.Appear(this.rollload, {duration: .3});

		this.validatePage(newpage);
		this.processQuery();

		new Ajax.Updater(
			{
				success: this.targetitem,
				failure: this.rollnotices
			},
			this.url,
			{
				method: 'get',
				evalScripts: true,
				parameters: this.query,
				onComplete: this.rollComplete.bind(this),
				onFailure: this.rollError.bind(this)
			}
		);
	},

	rollComplete: function() {
		new Effect.Fade(this.rollhover, {duration: 1});
		new Effect.Fade(this.rollload, {duration: .3});

		/* Spool Texttrimmer */
		this.trimmer.trimAgain(this.trimmer.curValue);
	},
	
	rollError: function() {
		$(this.rollnotices).style.display = 'block';
		$(this.rollnotices).innerHTML = 'Some kind of error has occurred! Danger, Will Robinson! Danger!';
	},

	processQuery: function() {
		this.query.merge({ paged: this.pagenumber, k2dynamic: 1 });
	},

	setRollingState: function(pagenumber, pagecount, query, pagedates) {
		if ( typeof(query) == 'string' ) {
			query = $H(query.toQueryParams());
		}

		this.query = query;
		this.pagenumber = pagenumber;
		this.pagecount = pagecount;
		this.pagedates = pagedates;

		if (this.validatePage(this.pagenumber)) {
			this.startEvents();
			$(this.rollload).hide();
			$(this.rollnotices).hide();
			$(this.rollhover).hide()
			this.setupSlider();

			$(this.attachitem).style.visibility = 'visible';
		} else {
			$(this.attachitem).style.visibility = 'hidden';
		}

		this.trimmer.setupTrimmer(100);

		this.initialized = true;
	},

	saveRollingState: function() {
		this.rollingState = new Hash({
			query: this.query,
			pagenumber: this.pagenumber,
			pagecount: this.pagecount,
			pagedates: this.pagedates
		});

		this.trimmer.saveState();
	},

	restoreRollingState: function() {
		if (this.rollingState instanceof Hash) {
			//console.log(this.rollingState.inspect());

			this.setRollingState(this.rollingState.pagenumber, this.rollingState.pagecount, this.rollingState.query, this.rollingState.pagedates);

			if (this.pagecount > 1) {
				this.pageSlider.setValue(this.rollingState.pagenumber);
			}

			this.rollingState = null;

			this.trimmer.restoreState();
		}
	},

	saveCookie: function() {
		setCookie('k2RollingQuery', this.query.toQueryString());
	}
}