
Math.randomInt = function(min, max) {
	return Math.floor(Math.random() * (max - min + 1)) + min;
};

Number.prototype.toFormatString = function(place) {
	place = place || 2;
	var str = this.toString();
	while (str.length < place) str = '0'+str;
	return str;
};


new function() {
	var options = {
		suffix: '_on'
	};

	$.rollSetup = function(o) {
		$.extend(options, o);
	};

	$.fn.roll = function roll() {
		return this.each(function() {
			var src = this.src;
			if (!src) {
				var target = $('img, input[type="button"]', this);
				if (target.length) roll.call(target);
				return;
			}

			var out  = src;
			var over = src.replace(/(\.[^.]+$)/, options.suffix+'$1');
			$('<img src="'+over+'"/>');
			$(this)
				.mouseenter(function() { this.src = over; })
				.mouseleave(function() { this.src = out; });
		});
	};
};

// so disgraceful..
$.fn.killContextMenu = function() {
	return this.bind('contextmenu', function() {
		return false;
	});
};


applyTemplate = (function() {
	var markup = /#\{([^|}]+)(?:\|(.*?)\|)?\}/g;
	return function(t, o, escape) {
		return (!t || !o) ?
			t :
			t.replace(markup, function(_, prop, alt) {
				prop = o[prop];
				if (!prop && prop !== '' && prop !== 0)
					prop = alt || '';
				return escape ? prop.escapeTag() : prop;
			});
	};
})();


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


if (typeof F == 'undefined') F = {};


F.parseDate = function(date) {
	date = /(\d{4})(\d{2})(\d{2})$/.exec(date || '');
	if (!date) return;
	date.shift();
	date = $.map(date, function(n) { return parseInt(n, 10); });
	date[1]--; // month
	return new Date(Date.UTC.apply(null, date));
};

F.work = (function() {
	var work;
	return function() {
		return ($('body#works-detail').length) ?
			(work = work || (/.+\/(.+?)\.html/).exec(location.href).slice(1)) :
			null;
	};
})();

F.character = (function() {
	var character;
	return function() {
		return ($('body#characters-detail').length) ?
			(character = character || (/.+\/(.+?)_(.+?)\.html/).exec(location.href).slice(1).reverse()) :
			null;
	};
})();


F.Gallery = (function() {
	var type;
	var params = null;
	var container;
	var total = 0;
	var current_page = 1;

	var template = {
		content  : [
			'<ul>',
			'#{thumbnail}',
			'</ul>',
			'#{nav}'
		].join(''),
		thumbnail: '<li><a href="#{href}"><img src="#{src}" alt="" width="86" height="86"/></a></li>',
		prev     : '<a class="prev" href="javascript:F.Gallery.prev()"><img src="/img-common/gallery_btn_prev.gif" alt="prev" width="42" height="42"/></a>',
		next     : '<a class="next" href="javascript:F.Gallery.next()"><img src="/img-common/gallery_btn_next.gif" alt="next" width="42" height="42"/></a>',
		work     : '/works/img/#{0}_gallery#{thumb}_#{n}.jpg',
		character: '/characters/img/#{1}_#{0}_gallery#{thumb}_#{n}.jpg'
	};

	return {
		setup: function() {
			if (params = F.work())
				type = 'work';
			else if (params = F.character())
				type = 'character';
			else
				return;

			container = container || $('<div class="gallery-content"/>').appendTo('#primary div.gallery');
			total = window.gallery_count;

			F.Gallery.show();
		},

		show: function() {
			var self = F.Gallery;

			var from = (current_page - 1) * 10;
			var to = self.last() ? (total % 10 || 10) : 10;
			var thumbnail = [];
			for (var i = 0; i < to; i++) {
				var n = from + i;
				var p = {
					src : self.image(n, true),
					href: self.image(n)
				};
				thumbnail.push(applyTemplate(template.thumbnail, p));
			}
			var p = {
				thumbnail: thumbnail.join(''),
				nav      : self.nav()
			};
			container
				.html(applyTemplate(template.content, p))
				.find('li a')
					.lightBox({
						fixedNavigation: true,
						imageLoading   : '/img-common/lightbox-ico-loading.gif',
						imageBtnClose  : '/img-common/lightbox-btn-close.gif',
						imageBtnPrev   : '/img-common/lightbox-btn-prev.gif',
						imageBtnNext   : '/img-common/lightbox-btn-next.gif'
					})
					.end()
				.find('.next img, .prev img').roll();
		},

		first: function() {
			return current_page <= 1;
		},

		last: function() {
			return (current_page * 10 >= total);
		},

		nav: function() {
			var self = F.Gallery;
			var nav = [];
			if (!self.first()) nav.push(template.prev);
			if (!self.last())  nav.push(template.next);
			return nav.join('');
		},

		next: function(e) {
			current_page++;
			F.Gallery.show();
		},

		prev: function() {
			current_page--;
			F.Gallery.show();
		},

		image: function(n, thumb) {
			var p = $.extend({
				thumb: thumb ? '_thumb' : '',
				n    : (n + 1).toFormatString()
			}, params);
			return applyTemplate(template[type], p);
		}
	};	
})();


F.NewItem = (function() {
	var expire = (1000 * 60 * 60 * 24) * 14;
	var new_icon = '<img src="/img-common/sign_new.gif" class="signNew" alt="NEW" width="39" height="24"/>';
	var thumbnail;

	return {
		setup: function() {
			thumbnail = thumbnail || $('ul.thumbList li');
			thumbnail.each(function() {
				var date = F.parseDate($('div[class^="date"]', this).attr('class'));
				if (F.NewItem.newly(date))
					$('.thumb', this).append(new_icon);
			});
		},

		newly: function(created) {
			return (created && new Date(new Date - created) <= expire);
		}
	};
})();


F.Header = (function() {
	return {
		setup: function() {
			F.Header.fav();
			F.Header.friend();
		},

		fav: function() {
			if (!$.browser.msie) return;
			$('li.bookmark')
				.show()
				.click(function() {
					window.external.AddFavorite(
						location.protocol+'//'+location.host+'/',
						'藤子・F・不二雄 公式サイト | 藤子・F・不二雄ワールド'
					);
				});
		},

		friend: function() {
			$('li.tell-a-friend')
				.find('a')
				.attr('href', 'mailto:?subject=%E8%97%A4%E5%AD%90%E3%83%BBF%E3%83%BB%E4%B8%8D%E4%BA%8C%E9%9B%84%E3%83%AF%E3%83%BC%E3%83%AB%E3%83%89&body=' + location.href);
		}
	};
})();


F.Menu = (function() {
	return {
		setup: function() {
			F.Menu.category_setup();
		},

		category_setup: function() {
			$('#gadgetNewsCategories > ul > li').each(function() {
				var sub_category = $('ul', this);
				if (!sub_category.length) return;

				$('span', this).toggle(
					function() {
						sub_category.slideDown();
					},
					function() {
						sub_category.slideUp();
					}
				);
			});
		}
	};
})();


F.Footer = (function() {
	var container;

	return {
		setup: function() {
			F.Footer.random_image();
		},

		random_image: function() {
			container = container || $('#footInner');

			var type = Math.randomInt(0, 1) ?
				'1' :
				Math.randomInt(2, 6);
			container
				.removeClass()
				.addClass('bg'+type);
		}
	};
})();


F.Search = (function() {
	return {
		setup: function() {
			F.Search.input_prompt();
		},

		input_prompt: function() {
			var input = $('#srchInput')
				.focus(function() {
					input.css('background-image', 'none');
				})
				.blur(function() {
					if (!input.val())
						input.css('background-image', '');
				});
		}
	};
})();

F.DailyCharacter = (function() {
	return {
		setup: function() {
			F.DailyCharacter.show();
		},

		show: function() {
			var d = new Date();
			var mm = (d.getMonth() + 1).toFormatString();
			var dd = d.getDate().toFormatString();
			var inc_url = '/modules-static/dailycharacter/'+mm+dd+'.inc';
			$.get(inc_url, function(content) {
				$('#gadgetDailyCharacter')
					.append(content)
					.find('img').killContextMenu();
			});
		}
	};
})();

F.DailyGoods = (function() {
	return {
		setup: function() {
			F.DailyGoods.show();
		},

		show: function() {
			var d = new Date();
			var mm = (d.getMonth() + 1).toFormatString();
			var dd = d.getDate().toFormatString();
			var inc_url = '/modules-static/dailygoods/'+mm+dd+'.inc';
			$.get(inc_url, function(content) {
				$('#gadgetDailyGoods')
					.append(content)
					.find('img').killContextMenu();
			});
		}
	};
})();

F.wall = {
	template: [
		'<div id="overlay" onclick="F.wall.close()"></div>',
		'<div id="lbWallpaper">',
		'<p class="close">',
		'<a href="javascript:F.wall.close()">',
		'<img src="/wallpaper/img/btn_close_01.png" width="53" height="14" alt="閉じる"/>',
		'</a>',
		'</p>',
		'<p class="image"><img src="/wallpaper/img/img_wallpaper_#{n}_lb.png" width="716" height="538" alt=""/></p>',
		'<ul class="btns">',
		'<li><a href="/wallpaper/img/wp#{n}/wp_1024.jpg"><img src="/wallpaper/img/btn_1024.png" class="btn" width="253" height="30"/></a></li>',
		'<li><a href="/wallpaper/img/wp#{n}/wp_1280.jpg"><img src="/wallpaper/img/btn_1280.png" class="btn" width="253" height="30"/></a></li>',
		'</ul>',
		'</div>'
	].join(''),

	setup: function() {
		if (!(/^\/wallpaper/.test(location.pathname))) return;

		$('#listWallpaper li').each(function() {
			var n = (/\/img_wallpaper_(\d+)\.png$/.exec($('h3 img', this).attr('src')) || [])[1];
			$('a', this).click(function() {
				F.wall.open(n);
				return false;
			});
		});
	},

	open: function(n) {
		$(applyTemplate(F.wall.template, { n: n }))
			.appendTo('body')
			.css('top', $(window).scrollTop() + 45)
			.find('.btn').roll();
		
		var css = {
				top    : 0,
				left   : 0,
				width  : '100%',
				height : '100%',
				opacity: 0.8
		};
		if ($.browser.msie && $.browser.version < 7) {
			css.position = 'absolute';
			css.height   = Math.max($(window).height(), $().height(), $('body').height());
		}
		else
			css.position = 'fixed';

		$('#overlay').css(css);
	},

	close: function() {
		$('#overlay, #lbWallpaper').remove();
	}
}

F.setup = function() {
	F.Header.setup();
	F.Menu.setup();
	F.Footer.setup();
	F.Search.setup();
	F.NewItem.setup();
	F.Gallery.setup();
	F.DailyCharacter.setup();
	F.DailyGoods.setup();
	F.wall.setup();

	$('img').killContextMenu();
};


$(F.setup);
