/* Required configuration variables */
/*
var MIF_SCRIPT_PATH; //string
*/

/* Optional configuration variables */
/*
var MIF_REQUIRE_SSL;     //boolean
var MIF_COMPLETE_IFRAME; //string; default "_complete.html"
*/

if(window['MIF_REQUIRE_SSL'] &&
   !/https/.test(location.protocol)) {
  location.href = location.href.replace(/^http:/, 'https:');
}

if(typeof window['MIF_COMPLETE_IFRAME'] != "string") {
    MIF_COMPLETE_IFRAME = "_complete.html";
}

var InputType = {
    _isSelector: function(i) {
	return (i.tagName == 'SELECT' ||
		(i.tagName == 'INPUT' && (i.type == 'checkbox' || i.type == 'radio')));
    },
    getErrorMessageFor: function(i) {
	return this._isSelector(i) ? "が選択されていません" : "が入力されていません";
    },
    getEmailError: function() {
	return '正しいメールアドレスではありません';
    }
};

var Mif = new (function($) {
	var $$INPUTS;
	var $$CURRENT_PAGE;
	var $$PAGES = {};
	var $$DIV = {};

	var $$VALIDATION_SUCCESS = false;
	var $$AJAX_SUCCESS = false;

	function movePage(pageId) {
	    if($$CURRENT_PAGE) {
		$$CURRENT_PAGE.leave();
	    }
	    $$CURRENT_PAGE = $$PAGES[pageId || "input"];
	    $$CURRENT_PAGE.render();
	}

	function loadCompleteIframe() {
	    var url = MIF_COMPLETE_IFRAME;
	    $('<iframe src="'+ url +'" style="display:none"></iframe>').appendTo($$DIV.complete);
	}

	this.setup = function() {
	    $$PAGES = {
		input: InputPage,
		preview: PreviewPage,
		complete: CompletePage
	    };

	    $$DIV = {
		input: $('#mif-input'),
		preview: $('#mif-preview'),
		complete: $('#mif-complete')
	    };

	    $$INPUTS = $('#mif-input :input');

	    InputPage.init();
	    PreviewPage.init();
	    CompletePage.init();

	    movePage("input");
	}

	this.registerCallback = function () {
	    $("#mif-form").submit(function(e){ return $$CURRENT_PAGE.submit(e); });
	    $.historyInit(movePage)
	}

	var InputPage = new (function() {
		var name2label = {};
		var name2element = {};
		var required = {};
		var emailField;
		var emailReg = /^[-.\w\/]+@[-.\w]+\.[a-z]{2,5}$/;

		this.init = function() {
		    $('#mif-input .mif-input-group').map(function(_, group){
			    $(':input', group).map(function(_, input){
				    if(input.name && !name2element[input.name]) {
					name2element[input.name] = group;
				    }
				});
			});

		    $$INPUTS.map(function(i,e) {
			    if(e.name) {
				if(e.title) {
				    name2label[e.name] = e.title;
				    e.title = "";
				} else {
				    name2label[e.name] = e.name;
				}
				if(!name2element[e.name]) {
				    name2element[e.name] = e;
				}

				if($(e).hasClass('required')) {
				    required[e.name] = InputType.getErrorMessageFor(e);
				}
				if(e.name == 'email') {
				    emailField = e.name;
				}
			    }
			});
		}
		
		this.render = function() {
		    $$DIV.preview.hide();
		    $$DIV.complete.hide();
		    $$DIV.input.show();
		};

		this.leave = function() {
		    clearErrors();
		}

		function clearErrors() {
		    $('ul#mif-errors li').remove();
		    $('ul#mif-errors').hide();
		    $('#mif-input .mif-error-input').removeClass('mif-error-input');
		}

		function showErrors(errors) {
		    var errorList = $('ul#mif-errors');
		    $.each(errors, function(name, msg) {
			    errorList.append('<li>'+ msg +'</li>')
				var logicalElm = $(name2element[name]);
			    logicalElm.addClass('mif-error-input');
			});
		    errorList.show();
		    $.scrollTo(errorList);
		}

		function checkEmail(values) {
		    if(!emailField) {
			return true;
		    }
		    var mailVal = $.grep(values, function(entry) {
			    return entry.name == emailField;
			});
		    if(mailVal.length != 1) {
			return false;
		    }
		    return mailVal[0].value == "" || emailReg.test(mailVal[0].value);
		}

		this.submit = function(e) {
		    clearErrors();

		    $$VALIDATION_SUCCESS = true;
		    var values = $$INPUTS.serializeArray();
		    var errors = {};

		    $.each(required, function(name, msg) {
			    var filled = $.grep(values, function(entry){
				    return entry.name == name && entry.value != "";
				});
			    if(filled.length == 0) {
				errors[name] = name2label[name] + msg;
				$$VALIDATION_SUCCESS = false;
			    }
			});
		    if(!checkEmail(values)) {
			errors[emailField] = InputType.getEmailError();
			$$VALIDATION_SUCCESS = false;
		    }

		    if($$VALIDATION_SUCCESS) {
			$.historyLoad("preview");
		    } else {
			showErrors(errors);
		    }
		    return false;
		}
	    });

	var PreviewPage = new (function() {
		var previewHtml;
		var loading = '#mif-preview .mif-ajax-loading';
		var buttons = '#mif-preview :button, #mif-preview :submit';

		this.init = function() {
		    previewHtml = $$DIV.preview.html();
		}

		this.leave = function() {
		    $(loading).hide();
		    $(buttons).removeAttr('disabled');
		}

		function escapeAndConvertBr(str) {
		    return str.replace(/</g, '&lt;')
		    .replace(/>/g, '&gt;')
		    .replace(/\"/g, '&quot;')
		    .replace(/&/g, '&amp;')
		    .replace(/(\r\n|\n)/g, '<br />');
		}

		function loadComplete() {
		    $.historyLoad("complete");		    
		}

		this.render = function() {
		    // Reload button is pressed.
		    if(!$$VALIDATION_SUCCESS) {
			$.historyLoad('input');
			return;
		    }

		    $$DIV.input.hide();
		    $$DIV.complete.hide();

		    var values = $$INPUTS.serializeArray();
		    var html = previewHtml.replace(/\{([^\}]+)\}/g, function(_, keyword) {
			    var valueArray = $.map($.grep(values, function(e){ return e.name == keyword; }),
						   function(e){ return escapeAndConvertBr(e.value); });
			    if(/\[\]$/.test(keyword)) {
				return valueArray.join("<br />");
			    } else {
				return valueArray.length > 0 ? valueArray.pop() : "";
			    }
			});
		    $$DIV.preview.html(html).show();
		    $.scrollTo($$DIV.preview);
		}
		this.submit = function(e) {
		    $(loading).show();
		    $(buttons).attr('disabled', 'disabled');

		    //$.post($('#mif-form').attr('action'), data, loadComplete);
		    $.ajax({url: $('#mif-form').attr('action'),
				success: function(){ $$AJAX_SUCCESS = true;  loadComplete() },
				error:   function(){ $$AJAX_SUCCESS = false; loadComplete() },
				type: 'POST',
				data: $$INPUTS.serialize()
				});

		    return false;
		}
	    });

	var CompletePage = new (function() {
		this.init = function() {
		};

		this.leave = function() {
		};

		this.render = function() {
		    // Reload button is pressed.
		    if(!$$VALIDATION_SUCCESS) {
			$.historyLoad('input');
			return;
		    }

		    $$DIV.input.hide();
		    $$DIV.preview.hide();

		    if($$AJAX_SUCCESS) {
			$('#mif-success').show();
			$('#mif-server-error').hide();
		    } else {
			$('#mif-success').hide();
			$('#mif-server-error').show();
		    }
		    $$DIV.complete.show();
		    $.scrollTo($$DIV.complete);

		    //load additional html
		    loadCompleteIframe();
		}

		this.submit = function() {
		    return false;
		}
	    });
    })(jQuery);

$(function($) {
	$.getScript(MIF_SCRIPT_PATH + "jquery.history.js", function() {
		$.getScript(MIF_SCRIPT_PATH + "jquery.scrollTo-min.js", function() {
			Mif.setup();
			Mif.registerCallback();
		    });
	    });

    });


