jgwhite = {};

jgwhite.Settings = {
	
	dimensions: { width: { min: 480 } }
	
}

jgwhite.Background = {
	
	list: [
		{ url: "/backgrounds/background.001.jpg", position: "center right" },
		{ url: "/backgrounds/background.002.jpg", position: "center right" },
		{ url: "/backgrounds/background.003.jpg", position: "center right" },
		{ url: "/backgrounds/background.005.jpg", position: "center right" },
		{ url: "/backgrounds/background.006.jpg", position: "bottom right" },
		{ url: "/backgrounds/background.007.jpg", position: "center right" }
	],
	
	cookie_lifespan: 7, // days
	
	seen: function () {
		try {
			return document.cookie.match(/__jgwhite\.backgrounds=\[(.*)\]/)[1].split(/[, ]+/);
		} catch (error) {
			return [];
		}
	},
	
	remember: function (index) {
		backgrounds = jgwhite.Background.seen();
		
		if (!backgrounds.include(index)) backgrounds.push(index);
		if (backgrounds.length == jgwhite.Background.list.length) backgrounds = [index];
		
		date = new Date();
		date.setTime(date.getTime()+(jgwhite.Background.cookie_lifespan * 24 * 60 * 60 * 1000));
		
		document.cookie = "__jgwhite.backgrounds=[" + backgrounds.join(",") + "]; expires=" + date.toGMTString() + "; path=/";
	},
	
	decorate: function () {
		background_index = Math.floor(Math.random() * jgwhite.Background.list.length);
		
		if (jgwhite.Background.seen().length < jgwhite.Background.list.length)
			while (jgwhite.Background.seen().include(background_index.toString()))
				background_index = Math.floor(Math.random() * jgwhite.Background.list.length);
				
		jgwhite.Background.remember(background_index);
		background = jgwhite.Background.list[background_index];
		
		if (jgwhite.Background.curtain.closed) {
			jgwhite.Background.load_new_background(background);
		} else {
			jgwhite.Background.curtain.close(jgwhite.Background.load_new_background.bind(this, background));
		}
	},
	
	load_new_background: function (background) {
		loader = $(new Image());
		loader.observe("load", jgwhite.Background.set_new_background.bind(this, background));
		loader.writeAttribute("src", background["url"]);
	},
	
	set_new_background: function (background) {
		$(document.body).setStyle({ background: "#F0F0F0 url(" + background["url"] + ") no-repeat " + background["position"] });
		jgwhite.Background.curtain.open();
	},
	
	curtain: {
		
		element: function () {
			if (!jgwhite.Background.curtain._element) {
				jgwhite.Background.curtain._element = new Element("div", { "class": "curtain" });
				$(document.body).insert({ top: jgwhite.Background.curtain._element });
			}
			return jgwhite.Background.curtain._element;
		},
		
		closed: true,
		
		animation: {
			duration: 0.5
		},
		
		open: function (callback) {
			jgwhite.Background.curtain.closed = false;
			
			new Effect.Fade(jgwhite.Background.curtain.element(), {
				duration: jgwhite.Background.curtain.animation.duration,
				afterFinish: callback
			});
		},
		
		close: function (callback) {
			jgwhite.Background.curtain.closed = true;
						
			new Effect.Appear(jgwhite.Background.curtain.element(), {
				duration: jgwhite.Background.curtain.animation.duration,
				afterFinish: callback
			});
		}
		
	}
	
}

jgwhite.Twitter = Class.create({
	
	initialize: function () {
		
	},
	
	fetch: function () {
		new Ajax.Request("/twitter/statuses/user_timeline/jgwhite.json", {
			method: "get",
			onFailure: this.on_failure.bind(this),
			onSuccess: this.on_success.bind(this),
			onComplete: this.on_complete.bind(this)
		});
	},
	
	on_failure: function (response) {
		
	},
	
	on_success: function (response) {
		
	},
	
	on_complete: function (response) {
		this.display().update(response.responseJSON[0].text);
		this.rig_rollover();
	},
	
	display: function () {
		if (!this._display) {
			this._display = new Element("div", {"class": "twitter_display"});
			this._display.setOpacity(0);
			$("find_me_twitter").insert(this._display);
		}
		return this._display;
	},
	
	rig_rollover: function () {
		$("find_me_twitter").down("a").observe("mouseover", this.show.bind(this));
		$("find_me_twitter").down("a").observe("mouseout", this.hide.bind(this));
	},
	
	animation: {
		show: 0.2, hide: 0.2
	},
	
	show: function () {
		if (this._effect) this._effect.cancel();
		this._effect = new Effect.Morph(this.display(), {
			style: { left: "80px", opacity: "1.0" },
			duration: this.animation.show
		});
	},
	hide: function () {
		if (this._effect) this._effect.cancel();
		this._effect = new Effect.Morph(this.display(), {
			style: { left: "50px", opacity: "0.0" },
			duration: this.animation.hide
		});
	}
	
})
jgwhite.twitter = function () {
	return jgwhite.Twitter.__instance = jgwhite.Twitter.__instance || new jgwhite.Twitter();
}

jgwhite.go = function () {
	if (document.viewport.getWidth() > jgwhite.Settings.dimensions.width.min) {
		jgwhite.Background.decorate();
		jgwhite.twitter().fetch();
	}
}

Event.observe(window, "load", jgwhite.go);
