/**
 * [CONTACT FORM HANDLER JS]
 * Using PHPMailer 2.0.2
 * 
 * @author	Tom Goodsun (http://www.tom-gs.com/)
 * @date	2009.01.16
 * 
 */

/**
 * <public class ContactForm>
 * Constractor ContactForm.initialize()
 */

var ContactForm = {
	
	formElement: document.forms[0],
	
	script: {
		version: "1.0.0",
		scriptName: "ContactForm"
	},
	
	// Flag that form element values is changed
	formChanged: false,
	
	// ID name of element to show status message
	statusElement: "contactformStatus",
	
	// Status of form
	stat: "normal",
	
	// Status of form
	classNameConfirm: "state-confirm",
	
	// Furigana check type (ref.furiganaCheckRegexp)
	furiganaCheckType: "furigana",
	
	// Excepted requirement field
	exceptedFields: [
		"contactformFurigana"
	],
	
	// Messages to show in the 'statusElement'
	messages: {
		"normal":            "メッセージを送信します。必要項目を入力してください。", 
		"confirm":           "以下の内容で送信します。よろしいですか。", 
		"clear":             "すべての項目をクリアします。\nよろしいですか？", 
		"close":             "問い合わせフォームを閉じます。\nよろしいですか？", 
		"novalue":           "必須項目が入力されていません。", 
		"regexMail":         "正しいメールアドレスを入力してください。", 
		"regex_furigana":    "ふりがなを正しく入力してください。", 
		"regex_hiragana":    "ふりがなはカタカナで正しく入力してください。", 
		"regex_katakana":    "フリガナはカタカナで正しく入力してください。", 
		"regex_mb_katakana": "フリガナは全角カタカナで正しく入力してください。", 
		"regex_sb_katakana": "ﾌﾘｶﾞﾅは半角カタカナで正しく入力してください。", 
		"regex_multibyte":   "ふりがなを正しく入力してください。"
	},
	
	// Types of furigana check
	furiganaCheckRegexp: {
		"furigana":    "^[\u3040-\u309F\u30A0-\u30FF\uFF65-\uFF9F]+$", // Hiragna and Katakana
		"hiragana":    "^[\u3040-\u309F]+$", // Multibyte Hiragana
		"katakana":    "^[\u30A0-\u30FF]+$", // Multibyte Katakana
		"mb_katakana": "^[\u30A0-\u30FF]+$", // Multibyte Katakana
		"sb_katakana": "^[\uFF65-\uFF9F]+$", // Singlebyte Katakana
		"multibyte":   "^[\u3040-\u309F\u30A0-\u30FF]+$" // Multibyte Katakana
	},
	
	/**
	 * public void ContactForm.initialize()
	 * 	Start ContactForm class
	 */
	initialize: function(formElement, exceptedFields){
		this.printMessage(this.stat);
		this.formElement = formElement;
		this.exceptedFields = exceptedFields;
		$("confirmButtons").innerHTML = '<a href="#" id="send" class="contactform-button">入力内容の確認</a><a href="#" id="clear" class="contactform-button">クリア</a><a href="#" id="cancel" class="contactform-button">キャンセル</a>';
		
		this.setDisabled(window.document.contactform, false);
		
		$$(".change").addEvent("change", function(){ContactForm.changed()});
		$("send").addEvent("click", function(){ContactForm.check(ContactForm.formElement)});
		$("clear").addEvent("click", function(){ContactForm.clear(ContactForm.formElement)});
		$("cancel").addEvent("click", function(){window.parent.SqueezeBox.close()});
		
	},
	
	/**
	 * public void ContactForm.check(HTMLObject form)
	 * 	Check form field values
	 */
	check: function(form){
		var elements = form.elements;
		for (var i = 0; i < elements.length; i++){
			if (this.isExcepted(elements[i].name)){
				continue;
			}
			if (this.checkEmptyField(elements[i])){
				continue;
			}else{
				this.printMessage("novalue");
				return;
			}
		}
		if (this.checkMailAddress(form.contactformMail.value)){
			this.printMessage("regexMail");
			return;
		}
		if (form.contactformFurigana.value != ""){
			if (this.checkFurigana(form.contactformFurigana.value)){
				this.printMessage("regex_" + this.furiganaCheckType);
				return;
			}
		}
		this.setDisabled(ContactForm.formElement, true);
		this.createHiddens(ContactForm.formElement);
		this.printMessage("confirm");
		$("confirmButtons").innerHTML = '<a href="#" id="send" class="contactform-button">送信</a><a href="#" id="back" class="contactform-button">戻る</a><a href="#" id="cancel" class="contactform-button">キャンセル</a>';
		$("back").addEvent("click", function(){ContactForm.backToInput()});
		$("send").addEvent("click", function(){ContactForm.formElement.submit()});
		$("cancel").addEvent("click", function(){window.parent.SqueezeBox.close()});
		
		new Element("input", {
			type : "hidden",
			id: "pageFlag",
			name : "page",
			value: "checked"
		}).injectInside(form);
	},
	
	/**
	 * public void ContactForm.clear(HTMLObject form)
	 * 	Set empty character to fields
	 */
	clear: function(form){
		if (this.getFormChanged()) {
			if (window.confirm(this.getStatusMessage("clear"))){
				var elements = form.elements;
				for (var i = 0; i < elements.length; i++){
					this.initializeValue(elements[i]);
				}
			}
		}
	},
	
	/**
	 * public void ContactForm.backToInput()
	 */
	backToInput: function(){
		this.removeHiddens(ContactForm.formElement);
		$("pageFlag").dispose();
		this.initialize(ContactForm.formElement, this.exceptedFields);
	},
	
	/**
	 * private void ContactForm.setDisabled(HTMLObject form, boolean flag)
	 * 	Set empty character to fields
	 */
	setDisabled: function(form, flag){
		var elements = form.elements;
		for (var i = 0; i < elements.length; i++){
			elements[i].disabled = flag;
			this.giveStateToClassName(elements[i], flag);
		}
	},
	
	/**
	 * private void ContactForm.giveStateToClassName(HTMLObject element, boolean flag)
	 * 	Add or remove classname for state appearance
	 */
	giveStateToClassName: function(element, flag){
		if (flag){
			element.addClass(this.classNameConfirm);
		}else{
			element.removeClass(this.classNameConfirm);
		}
	},
	
	/**
	 * private void ContactForm.createHiddens(HTMLObject form)
	 */
	createHiddens: function(form){
		var elements = form.elements;
		var elementsLength = elements.length; // avoid infinite loop
		for (var i = 0; i < elementsLength; i++){
			new Element("input", {
				type : "hidden",
				id: this.script.scriptName + "_" + elements[i].name,
				name : elements[i].name,
				value: elements[i].value
			}).injectInside(form);
		}
	},
	
	/**
	 * private void ContactForm.removeHiddens(HTMLObject form)
	 */
	removeHiddens: function(form){
		var elements = form.elements;
		var elementsLength = elements.length; // avoid infinite loop
		for (var i = 0; i < elementsLength; i++){
			if (elements[i]) {
				if (elements[i].type == "hidden" && elements[i].id == this.script.scriptName + "_" + elements[i].name){
					elements[i].dispose();
					i--; // Shift reference to input object due to removing
				}
			}else{
				break;
			}
		}
	},
	
	/**
	 * public String ContactForm.getStatusMessage(String stat)
	 */
	getStatusMessage: function(stat){
		return this.messages[stat];
	},
	
	/**
	 * private void ContactForm.printMessage(String stat)
	 */
	printMessage: function(stat){
		$(this.statusElement).innerHTML = this.getStatusMessage(stat);
		if (stat == "normal"){
			$(this.statusElement).className = "status-" + stat;
		}else if (stat == "confirm"){
			$(this.statusElement).className = "status-" + stat;
		}else{
			$(this.statusElement).className = "status-error";
		}
	},
	
	/**
	 * private boolean ContactForm.checkEmptyField(HTMLInputObject element)
	 */
	checkEmptyField: function(element){
		var value = element.value;
		switch(element.type){
			case "text":
			case "password":
			case "textarea":
				return this.isEmptyTextField(value);
			case "select-one":
				return this.isEmptySelectOne(value);
			case "checkbox":
			case "radio":
			default:
				return true;
		}
	},
	
	/**
	 * private void ContactForm.initializeValue(HTMLInputObject element)
	 */
	initializeValue: function(element){
		switch(element.type){
			case "text":
			case "password":
			case "textarea":
				element.value = "";
				break;
			case "select-one":
				element.options[0].selected = true;
				break;
			case "checkbox":
			case "radio":
			default:
				return;
		}
	},
	
	/**
	 * private boolean ContactForm.initializeValue(String value)
	 */
	isEmptyTextField: function(value){
		return (value != "");
	},
	
	/**
	 * private boolean ContactForm.isEmptySelectOne(String value)
	 */
	isEmptySelectOne: function(value){
		return (value != "" && value != 0);
	},
	
	/**
	 * private boolean ContactForm.checkMailAddress(String address)
	 */
	checkMailAddress: function(address){
		return (!address.match(/[!#-9A-~]+@[!#-9A-~]+\.+[a-z0-9]+/i));
	},
	
	/**
	 * private boolean ContactForm.checkFurigana(String furigana)
	 */
	checkFurigana: function(furigana){
		var re = new RegExp(this.furiganaCheckRegexp[this.furiganaCheckType]);
		return (!furigana.match(re));
	},
	
	/**
	 * private void ContactForm.changed()
	 */
	changed: function(){
		this.formChanged = true;
	},
	
	/**
	 * public boolean ContactForm.getFormChanged()
	 */
	getFormChanged: function(){
		return this.formChanged;
	},
	
	/**
	 * private boolean ContactForm.isExcepted(String name)
	 */
	isExcepted: function(name){
		for (var i = 0; i < this.exceptedFields.length; i++){
			if (name == this.exceptedFields[i]){
				return true;
			}
		}
		return false;
	}
}


window.addEvent("domready", function(){ContactForm.initialize(window.document.contactform, ["contactformFurigana"]);});
