// common.js

(function($) {

	$(function() {

		$('body').addClass('js-enabled');
		$('a, area').linkType();
		$('.external, .pdf').openWindow();
		$('img.rollover, .rollover a img:not(.no-rollover)').rollover();
		$('.nav.global li').dropdown();
		$('.gallery.thumbs a').lightBox({
			imageLoading: '../img/lightbox-ico-loading.gif',
			imageBtnPrev: '../img/lightbox-btn-prev.gif',
			imageBtnNext: '../img/lightbox-btn-next.gif',
			imageBtnClose: '../img/lightbox-btn-close.gif',
			imageBlank: '../img/lightbox-blank.gif'
		});
		$('.map.thumbs a').lightBox({
			imageLoading: '../img/lightbox-ico-loading.gif',
			imageBtnPrev: '../img/lightbox-btn-prev.gif',
			imageBtnNext: '../img/lightbox-btn-next.gif',
			imageBtnClose: '../img/lightbox-btn-close.gif',
			imageBlank: '../img/lightbox-blank.gif'
		});
		$('.diagram.thumbs a').lightBox({
			imageLoading: '../img/lightbox-ico-loading.gif',
			imageBtnPrev: '../img/lightbox-btn-prev.gif',
			imageBtnNext: '../img/lightbox-btn-next.gif',
			imageBtnClose: '../img/lightbox-btn-close.gif',
			imageBlank: '../img/lightbox-blank.gif'
		});
		$('.q a').qa();

	});

	$.fn.linkType = function(options) {
		var o = $.extend({
			externalClass: 'external',
			sslClass: 'ssl',
			pdfClass: 'pdf',
			zipClass: 'zip'
		}, options);
		this
			.filter('[href^="http"]').each(function() {
				if (this.hostname != window.location.hostname) {
					$(this).addClass(o.externalClass);
				}
			}).end()
			.filter('[href^="https"]').addClass(o.sslClass).end()
			.filter('[href$=".pdf"]').addClass(o.pdfClass).end()
			.filter('[href$=".zip"]').addClass(o.zipClass);
		return this;
	};

	$.fn.openWindow = function() {
		this.click(function() {
			window.open(this.href);
			return false;
		});
		return this;
	};

	$.fn.rollover = function(options) {
		var o = $.extend({
			rolloverClassPostfix: '-ro',
			currentClassPostfix: '-c'
		}, options);
		this.each(function() {
			this.originalSrc = $(this).attr('src');
			this.rolloverSrc = this.originalSrc.replace(new RegExp('(' + o.rolloverClassPostfix + '|' + o.currentClassPostfix + ')?(\.gif|\.jpeg|\.jpg|\.png)$', 'i'), o.rolloverClassPostfix + '$2');
			this.rolloverImg = new Image;
			this.rolloverImg.src = this.rolloverSrc;
		}).hover(function() {
			$(this).attr('src', this.rolloverSrc);
		}, function() {
			$(this).attr('src', this.originalSrc);
		});
		return this;
	};

  $.fn.dropdown = function(options) {
    var o = $.extend({
      suckerfish: '> ul',
      hoverClass: 'hover',
			mouseOverTime: 100,
			mouseOutTime: 200,
      showSpeed: 200,
      hideSpeed: 100
    }, options);
    this.each(function() {
      var suckerfish = $(this).find(o.suckerfish).hide();
      $(this).hover(function() {
        $(this).addClass(o.hoverClass).stopTime('mouseOut').oneTime(o.mouseOverTime, 'mouseOver', function() {
          $(suckerfish).slideDown(o.showSpeed);
        });
      }, function() {
        $(this).stopTime('mouseOver').oneTime(o.mouseOutTime, 'mouseOut', function() {
          $(suckerfish).slideUp(o.hideSpeed, function() {
						$(this).parent().removeClass(o.hoverClass);
					});
        });
      });
    });
    return this;
  };

	$.fn.qa = function(options) {
		var o = $.extend({
			speed: 0,
			toggleClass: 'block'
		}, options);
		this.each(function() {
			var target = $($(this).attr('href')).hide();
			$(this).click(function() {
				target.toggle();
				return false;
			});
		});
		return this;
	};

	$.fn.cycle = function(options) {
		var o = $.extend({
			images: '',
			href: '',
			btnPrev: 'img/home/c-aside-gallery-nav-prev.png',
			btnPrevAlt: '戻る',
			btnNext: 'img/home/c-aside-gallery-nav-next.png',
			btnNextAlt: '進む'
		}, options);
		this.each(function() {
			$(this).append(
				'<p class="pic"><a href="' + o.href + '"><img src="' + o.images[0] + '" /></a></p>' +
				'<ul class="nav">' +
					'<li class="prev"><a href="#"><img src="' + o.btnPrev + '" alt="' + o.btnPrevAlt + '" /></a></li>' +
					'<li class="next"><a href="#"><img src="' + o.btnNext + '" alt="' + o.btnNextAlt + '" /></a></li>' +
				'</ul>'
			);
			var i = 0;
			var r;
			var img = $(this).find('.pic').find('img');
			$(this).find('.prev').click(function() {
				i = i + o.images.length - 1;
				setAttr();
				return false;
			});
			$(this).find('.next').click(function() {
				i = i + 1;
				setAttr();
				return false;
			});
			function setAttr() {
				r = i % o.images.length;
				img.attr('src', o.images[r]);
			}
		});
		return this;
	};

})(jQuery);



/**
 * jQuery.timers - Timer abstractions for jQuery
 * Written by Blair Mitchelmore (blair DOT mitchelmore AT gmail DOT com)
 * Licensed under the WTFPL (http://sam.zoy.org/wtfpl/).
 * Date: 2009/10/16
 *
 * @author Blair Mitchelmore
 * @version 1.2
 *
 **/

jQuery.fn.extend({
	everyTime: function(interval, label, fn, times) {
		return this.each(function() {
			jQuery.timer.add(this, interval, label, fn, times);
		});
	},
	oneTime: function(interval, label, fn) {
		return this.each(function() {
			jQuery.timer.add(this, interval, label, fn, 1);
		});
	},
	stopTime: function(label, fn) {
		return this.each(function() {
			jQuery.timer.remove(this, label, fn);
		});
	}
});

jQuery.extend({
	timer: {
		global: [],
		guid: 1,
		dataKey: "jQuery.timer",
		regex: /^([0-9]+(?:\.[0-9]*)?)\s*(.*s)?$/,
		powers: {
			// Yeah this is major overkill...
			'ms': 1,
			'cs': 10,
			'ds': 100,
			's': 1000,
			'das': 10000,
			'hs': 100000,
			'ks': 1000000
		},
		timeParse: function(value) {
			if (value == undefined || value == null)
				return null;
			var result = this.regex.exec(jQuery.trim(value.toString()));
			if (result[2]) {
				var num = parseFloat(result[1]);
				var mult = this.powers[result[2]] || 1;
				return num * mult;
			} else {
				return value;
			}
		},
		add: function(element, interval, label, fn, times) {
			var counter = 0;
			
			if (jQuery.isFunction(label)) {
				if (!times) 
					times = fn;
				fn = label;
				label = interval;
			}
			
			interval = jQuery.timer.timeParse(interval);

			if (typeof interval != 'number' || isNaN(interval) || interval < 0)
				return;

			if (typeof times != 'number' || isNaN(times) || times < 0) 
				times = 0;
			
			times = times || 0;
			
			var timers = jQuery.data(element, this.dataKey) || jQuery.data(element, this.dataKey, {});
			
			if (!timers[label])
				timers[label] = {};
			
			fn.timerID = fn.timerID || this.guid++;
			
			var handler = function() {
				if ((++counter > times && times !== 0) || fn.call(element, counter) === false)
					jQuery.timer.remove(element, label, fn);
			};
			
			handler.timerID = fn.timerID;
			
			if (!timers[label][fn.timerID])
				timers[label][fn.timerID] = window.setInterval(handler,interval);
			
			this.global.push( element );
			
		},
		remove: function(element, label, fn) {
			var timers = jQuery.data(element, this.dataKey), ret;
			
			if ( timers ) {
				
				if (!label) {
					for ( label in timers )
						this.remove(element, label, fn);
				} else if ( timers[label] ) {
					if ( fn ) {
						if ( fn.timerID ) {
							window.clearInterval(timers[label][fn.timerID]);
							delete timers[label][fn.timerID];
						}
					} else {
						for ( var fn in timers[label] ) {
							window.clearInterval(timers[label][fn]);
							delete timers[label][fn];
						}
					}
					
					for ( ret in timers[label] ) break;
					if ( !ret ) {
						ret = null;
						delete timers[label];
					}
				}
				
				for ( ret in timers ) break;
				if ( !ret ) 
					jQuery.removeData(element, this.dataKey);
			}
		}
	}
});

jQuery(window).bind("unload", function() {
	jQuery.each(jQuery.timer.global, function(index, item) {
		jQuery.timer.remove(item);
	});
});
