
(function($){

	"use strict";

	/* DOM ready. */
	$(document).ready(function(){

		/* Setup rollover. */
		$('#header, #content, #footer')
			.find('img.over, input.over')
			.rollover()
		;
		$('#gnav')
			.find('img.over')
			.rollover({
				suffix: '_over'
			})
		;

		/* Activate current page. */
		$('img.on').each(function(){
			this.src = this.src.replace(/^(.+)(\.[a-z]+)$/, '$1_on$2');
		});

		/* Open link as '_blank'. */
		$('a[rel=external], area.external').click(function(){					
			window.open(this.href, '_blank');
			return false;
		});

		initFormValidator();
		setupAsideForm();
		setupAsideNav();
		setupLatestCases();

		fixIE();
	});

	/**
	 * Initialize form validator.
	 */
	function initFormValidator() {
		/* Add custom validations. */
		$.validator.addMethod(
			'vendorchar',
			function(value, element) {
				var re = /[①②③④⑤⑥⑦⑧⑨⑩⑪⑫⑬⑭⑮⑯⑰⑱⑲⑳ⅠⅡⅢⅣⅤⅥⅦⅧⅨⅩ㍉㌔㌢㍍㌘㌧㌃㌶㍑㍗㌍㌦㌣㌫㍊㌻㎜㎝㎞㎎㎏㏄㎡㍻〝〟№㏍℡㊤㊥㊦㊧㊨㈱㈲㈹㍾㍽㍼]/;
				return this.optional(element) || !re.test(value);
			},
			'機種依存文字が含まれています'
		);
		$.validator.addMethod(
			'iskana',
			function(value, element) {
				var re = /^[ァ-ヶー]*$/;
				return this.optional(element) || re.test(value);
			},
			'カタカナで入力してください'
		);
		$.validator.addMethod(
			'phone1',
			function(value, element) {
				return this.optional(element) || /^\d{2,5}$/.test(value);
			},
			'数字を入力してください'
		);
		$.validator.addMethod(
			'phone2',
			function(value, element) {
				return this.optional(element) || /^\d{1,4}$/.test(value);
			},
			'数字を入力してください'
		);
		$.validator.addMethod(
			'phone3',
			function(value, element) {
				return this.optional(element) || /^\d{2,4}$/.test(value);
			},
			'数字を入力してください'
		);

		/* Over ride validations. */
		$.validator.methods.email = function(value, element) {
			return this.optional(element) || /^([a-z0-9_]|\-|\.|\+)+@(([a-z0-9_]|\-)+\.)+[a-z]{2,6}$/.test(value);
		};
	}

	/**
	 * Setup aside form.
	 */
	function setupAsideForm() {
		/* Store objects. */
		var $form = $('#aside div.contact form');
		var $submit = $form.find('div.submit :input');

		/* Disable submit on page load. */
		$submit.attr('disabled', 'disabled');

		$form
			/* Set agreement handler. */
			.find(':checkbox[name="doui[]"]')
				.attr('checked', false)
				.click(function(){
					$submit.attr('disabled', !$(this).is(':checked'));
				})
			.end()

			/* Set validation. */
			.validate({
				//debug: true,
				onkeyup: false,
				errorElement: 'span',
				groups: {
					phone: 'tel1 tel2 tel3'
				},
				errorPlacement: function($error, $e){
					var name = $e.attr('name');
					if (name.search(/^tel1|tel2|tel3|doui$/) !== -1) {
						$error.appendTo($e.closest('div'));
					}
					else {
						$error.insertAfter($e);
					}
				},
				submitHandler: function(form){
					/* Add a hidden parameter to compare mail value. */
					$('<input />')
						.attr({
							type: 'hidden',
							name: 'mail_confirm',
							value: $(form).find(':text[name=mail]').val()
						})
						.appendTo(form)
					;
					form.submit();
				},

				/* Set validation rules. */
				rules: {
					estimate_service_category: {
						required: true
					},
					estimate_affiliate_category: {
						required: true
					},
					estimate_monitoring_category: {
						required: true
					},
					estimate_media_category: {
						required: true
					},
					estimate_posting_category: {
						required: true
					},
					company: {
						required: true,
						vendorchar: true,
						maxlength: 256
					},
					name: {
						required: true,
						vendorchar: true,
						maxlength: 64
					},
					kana: {
						required: true,
						iskana: true,
						maxlength: 64
					},
					mail: {
						required: true,
						email: true,
						maxlength: 256
					},
					tel1: {
						required: true,
						phone1: true,
						maxlength: 5
					},
					tel2: {
						required: true,
						phone2: true,
						maxlength: 4
					},
					tel3: {
						required: true,
						phone3: true,
						maxlength: 4
					},
					inquiry: {
						required: true,
						maxlength: 400
					}
				},

				/* Override error messages. */
				messages: {
					estimate_service_category: {
						required: 'コンテンツ内容が正しく選択されていません。'
					},
					estimate_affiliate_category: {
						required: '会員数が正しく選択されていません。'
					},
					estimate_monitoring_category: {
						required: '監視時間が正しく選択されていません。'
					},
					estimate_media_category: {
						required: 'メディアが正しく選択されていません。'
					},
					estimate_posting_category: {
						required: '投稿数（日）が正しく選択されていません。'
					},
					company: {
						vendorchar: '貴社名が正しく入力されていません。'
					},
					name: {
						vendorchar: 'ご担当者様お名前が正しく入力されていません。'
					},
					kana: {
						iskana: 'ご担当者様フリガナが正しく入力されていません。'
					},
					mail: {
						email: 'メールアドレスが正しく入力されていません。'
					},
					tel1: {
						phone1: '電話番号が正しく入力されていません。'
					},
					tel2: {
						phone2: '電話番号が正しく入力されていません。'
					},
					tel3: {
						phone3: '電話番号が正しく入力されていません。'
					},
					inquiry: {
						required: 'お問い合わせ内容が正しく入力されていません。'
					}
				}
			})
		;
	}

	/**
	 * Setup aside nav.
	 */
	function setupAsideNav() {
		$('#aside div.nav > ul > li')
			/* Set switch handle. */
			.filter(':has(ul)')
				.find('span')
					/* Set click handler. */
					.toggle(
						function(e, isInit){
							if (isInit === true) {
								$(this).siblings('ul').stop(false, true).show();
							}
							else {
								$(this).siblings('ul').stop(false, true).slideDown('fast');
							}
						},
						function(){
							$(this).siblings('ul').stop(false, true).slideUp('fast');
						}
					)
					/* Set hover handler. */
					.hover(
						function(){
							$(this).addClass('over');
						},
						function(){
							$(this).removeClass('over');
						}
					)
				.end()
			.end()

			/* Initialize slide menus. */
			.children('ul')
				.hide()
			.end()
			.filter('.current')
				.find('span')
					/* Fire event with a init option parameter. */
					.trigger('click', true)
				.end()
			.end()
		;
	}

	/**
	 * Load Latest cases block from HTML.
	 */
	function setupLatestCases() {
		$('#latest_case').load('/sidebar.html', function(){
			$(this).find('img.over, input.over').rollover();
		});
	}

	/**
	 * Fix IE problem.
	 */
	function fixIE() {
		if (!$.browser.msie) {
			return;
		}

		/* Background flicker. */
		try {
			document.execCommand('BackgroundImageCache', false, true);
		}
		catch(e) {}
	}

})(jQuery);



/**
 * jQuery tiny rollover plugin.
 */
(function(a){a.fn.rollover=function(c){var d="$1"+a.extend({suffix:"_on"},c).suffix+"$2";return a(this).each(function(){var b=new Image;b.src=this.src.replace(/^(.+)(\.[a-z]+)$/,d);a(this).data("rolloverImage",{defaultImage:this.src,hoverImage:b.src}).hover(function(){this.src=a(this).data("rolloverImage").hoverImage},function(){this.src=a(this).data("rolloverImage").defaultImage})})}})(jQuery);



/**
 * l10n in Japanese for jquery.validate.js.
 */
(function($){

	if ($.isFunction($.validator)) {
		$.extend($.validator.messages, {
			accept: '拡張子を入力してください',
			creditcard: 'クレジットカード番号を入力してください',
			date: '日付を入力してください',
			dateISO: '日付を入力してください',
			digits: '0-9までを入力してください',
			email: 'メールアドレスを入力してください',
			equalTo: '同じ値を入力してください',
			max: $.format('{0} 以下の値を入力してください'),
			maxlength: $.format('{0} 文字以下を入力してください'),
			min: $.format('{0} 以上の値を入力してください'),
			minlength: $.format('{0} 文字以上を入力してください'),
			number: '有効な数字を入力してください',
			range: $.format(' {0} から {1} までの値を入力してください'),
			rangelength: $.format('{0} 文字以上 {1} 文字以下で入力してください'),
			remote: '入力を修正してください',
			required: '必須項目です',
			url: 'URLを入力してください'
		});
	}

})(jQuery);



/**
 * thx PHP.js. (http://phpjs.org/functions/array_chunk:306)
 */
function array_chunk (input, size) {
	// Split array into chunks  
	// 
	// version: 1006.1915
	// discuss at: http://phpjs.org/functions/array_chunk    // +   original by: Carlos R. L. Rodrigues (http://www.jsfromhell.com)
	// *     example 1: array_chunk(['Kevin', 'van', 'Zonneveld'], 2);
	// *     returns 1: {0 : {0: 'Kevin', 1: 'van'} , 1 : {0: 'Zonneveld'}}
 
	for (var x, i = 0, c = -1, l = input.length, n = []; i < l; i++){        (x = i % size) ? n[c][x] = input[i] : n[++c] = [input[i]];
	}
 
	return n;
}



