//------------------------------------------------------------------------------
// Location
//------------------------------------------------------------------------------
var Location = {
	replace: function (url) {
		location.href = url;
	}
}

//------------------------------------------------------------------------------
// String
//------------------------------------------------------------------------------
Object.extend(
	String.prototype, {
		isEmpty: function () {
			return (this.length == 0);
		},

		equals: function (string, ignoreCase) {
			if (ignoreCase) {
				return (this.toUpperCase() == string.toUpperCase());
			}
			return (this == string);
		},

		bind: function () {
			var string = new String(this);
			for (var i = 0, j = arguments.length; i < j; i++) {
				string = string.replace(
					new RegExp('\\$'.concat((i + 1).toString()), 'g'),
					arguments[i]
				);
			}
			return string;
		},

		encodeURL: function () {
			return encodeURIComponent(this);
		},

		decodeURL: function () {
			return decodeURIComponent(this);
		},

		escapeHTML: function() {
			var div = document.createElement('div');
			var text = document.createTextNode(this);
			div.appendChild(text);
			return div.innerHTML.replace(/"/g, '&quot;');
		}
	}
);

//------------------------------------------------------------------------------
// StringBuilder
//------------------------------------------------------------------------------
var StringBuilder = Class.create();

StringBuilder.prototype = {
	string: '',

	initialize: function (string) {
		if (string) {
			this.string = string;
		}
	},

	append: function (string) {
		this.string = this.string.concat(string);
	},

	toString: function () {
		return this.string;
	}
}

//------------------------------------------------------------------------------
// ReleaseChecker
//------------------------------------------------------------------------------
var ReleaseChecker = {}

//------------------------------------------------------------------------------
// ReleaseChecker.Controller
//------------------------------------------------------------------------------
ReleaseChecker.Controller = {
	setLoadHandlerToWindow: function () {
		Event.observe(window, 'load', this.setSubmitHandlerToForm, false);
	},

	setSubmitHandlerToForm: function () {
		Event.observe(
			ReleaseChecker.Form.self(),
			'submit',
			ReleaseChecker.RssGenerator.execute.bindAsEventListener(
				ReleaseChecker.RssGenerator
			),
			false
		);
	}
}

//------------------------------------------------------------------------------
// ReleaseChecker.RssGenerator
//------------------------------------------------------------------------------
ReleaseChecker.RssGenerator = {
	execute: function (event) {
		if (event) {
			Event.stop(event);
		}

		if (ReleaseChecker.Form.getKeyword().isEmpty()) {
			Location.replace(ReleaseChecker.URL.ofTopPage());
			return;
		}

		ReleaseChecker.Form.disable();
		ReleaseChecker.LoadingImage.display();

		new Ajax.Request(
			ReleaseChecker.URL.ofRssGenerator(),
			{
				method: 'get',
				parameters: ReleaseChecker.URL.queryOfRSS(),
				onSuccess: this.reportSuccess,
				onFailure: this.reportFailure
			}
		);
	},

	reportSuccess: function (request) {
		ReleaseChecker.Form.enable();
		ReleaseChecker.LoadingImage.hide();
		Location.replace(ReleaseChecker.URL.ofResultPage());
	},

	reportFailure: function (request) {
		if (ReleaseChecker.Result.isBusy(request)) {
			this.execute();
			return;
		}

		ReleaseChecker.Form.enable();
		ReleaseChecker.LoadingImage.hide();
		Location.replace(ReleaseChecker.URL.ofResultPage());
	}
}

//------------------------------------------------------------------------------
// ReleaseChecker.URL
//------------------------------------------------------------------------------
ReleaseChecker.URL = {
	ofTopPage: function () {
		return location.href.replace(/[^\/]*$/, '');
	},

	queryOfRSS: function () {
		var query = 'keyword='.concat(ReleaseChecker.Form.getKeyword().encodeURL());
		if (!ReleaseChecker.Form.getOmit().isEmpty()) {
			query = query.concat('&omit=').concat(ReleaseChecker.Form.getOmit());
		}
		if (!ReleaseChecker.Form.getStrict().isEmpty()) {
			query = query.concat('&strict=').concat(ReleaseChecker.Form.getStrict());
		}
		return query;
	},

	ofRssGenerator: function () {
		return this.ofTopPage().concat('rss');
	},

	ofResultPage: function () {
		return this.ofTopPage().concat('?').concat(this.queryOfRSS());
	}
}

//------------------------------------------------------------------------------
// ReleaseChecker.Form
//------------------------------------------------------------------------------
ReleaseChecker.Form = {
	self: function () {
		return document.forms[0];
	},

	getKeyword: function () {
		return this.self().elements[0].value;
	},

	getOmit: function () {
		var omit = 'bfmdgs';
		for (var i = 0, j = this.self().elements['genre[]'].length; i < j; i++) {
			if (this.self().elements['genre[]'][i].checked) {
				omit = omit.replace(this.self().elements['genre[]'][i].value, '');
			}
		}
		return omit;
	},

	getStrict: function () {
		if (this.self().elements['strict'].checked) {
			return this.self().elements['strict'].value;
		}
		return '';
	},

	setKeyword: function (keyword) {
		this.self().elements[0].value = keyword;
	},

	disable: function () {
		Form.disable(this.self());
	},

	enable: function () {
		Form.enable(this.self());
	}
}

//------------------------------------------------------------------------------
// ReleaseChecker.LoadingImage
//------------------------------------------------------------------------------
ReleaseChecker.LoadingImage = {
	display: function () {
		if (!window.opera) {
			ReleaseChecker.Message.display('<p class="loading">生成中…<\/p>');
			return;
		}

		var offsets = new Position.cumulativeOffset(ReleaseChecker.Form.self());
		var div = document.createElement('div');
		div.id = 'loading';
		div.style.left = (offsets[0] + 20).toString().concat('px');
		div.style.top = (offsets[1] + 20).toString().concat('px');
		div.innerHTML = '<p class="loading">生成中…<\/p>';
		document.body.appendChild(div);
	},

	hide: function () {
		if (window.opera) {
			Element.remove(document.getElementById('loading'));
		}
	}
}

//------------------------------------------------------------------------------
// ReleaseChecker.Message
//------------------------------------------------------------------------------
ReleaseChecker.Message = {
	display: function (message) {
		this.clear();
		this.append(message);
	},

	clear: function () {
		while (ReleaseChecker.Form.self().nextSibling) {
			ReleaseChecker.Form.self().nextSibling.parentNode.removeChild(
				ReleaseChecker.Form.self().nextSibling
			);
		}
	},

	append: function (message) {
		new Insertion.Bottom(document.body, message);
	}
}

//------------------------------------------------------------------------------
// ReleaseChecker.Result
//------------------------------------------------------------------------------
ReleaseChecker.Result = {
	isBusy: function (request) {
		return (request.status == 503);
	}
}

//------------------------------------------------------------------------------
// Main
//------------------------------------------------------------------------------
ReleaseChecker.Controller.setLoadHandlerToWindow();
