/*! Copyright (c) 2009 Brandon Aaron (http://brandonaaron.net)
 * Dual licensed under the MIT (http://www.opensource.org/licenses/mit-license.php)
 * and GPL (http://www.opensource.org/licenses/gpl-license.php) licenses.
 * Thanks to: http://adomas.org/javascript-mouse-wheel/ for some pointers.
 * Thanks to: Mathias Bank(http://www.mathias-bank.de) for a scope bug fix.
 *
 * Version: 3.0.2
 * 
 * Requires: 1.2.2+
 */

(function($) {

var types = ['DOMMouseScroll', 'mousewheel'];

$.event.special.mousewheel = {
	setup: function() {
		if ( this.addEventListener )
			for ( var i=types.length; i; )
				this.addEventListener( types[--i], handler, false );
		else
			this.onmousewheel = handler;
	},
	
	teardown: function() {
		if ( this.removeEventListener )
			for ( var i=types.length; i; )
				this.removeEventListener( types[--i], handler, false );
		else
			this.onmousewheel = null;
	}
};

$.fn.extend({
	mousewheel: function(fn) {
		return fn ? this.bind("mousewheel", fn) : this.trigger("mousewheel");
	},
	
	unmousewheel: function(fn) {
		return this.unbind("mousewheel", fn);
	}
});


function handler(event) {
	var args = [].slice.call( arguments, 1 ), delta = 0, returnValue = true;
	
	event = $.event.fix(event || window.event);
	event.type = "mousewheel";
	
	if ( event.wheelDelta ) delta = event.wheelDelta/120;
	if ( event.detail     ) delta = -event.detail/3;
	
	// Add events and delta to the front of the arguments
	args.unshift(event, Math.round(delta));

	return $.event.handle.apply(this, args);
}

})(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/02/08
 *
 * @author Blair Mitchelmore
 * @version 1.1.2
 *
 **/
jQuery.fn.extend({
	everyTime: function(interval, label, fn, times, belay) {
		return this.each(function() {
			jQuery.timer.add(this, interval, label, fn, times, belay);
		});
	},
	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.event.special

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, belay) {
			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 (times && times.constructor != Number) {
				belay = !!times;
				times = 0;
			}
			
			times = times || 0;
			belay = belay || false;
			
			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 (belay && this.inProgress) 
					return;
				this.inProgress = true;
				if ((++counter > times && times !== 0) || fn.call(element, counter) === false)
					jQuery.timer.remove(element, label, fn);
				this.inProgress = false;
			};
			
			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);
	});
});

(function ($) {
    $.fn.Horinaja = function (t) {
        u = {
            capture: '',
            delai: 0.3,
            duree: 4,
            leftright: true,
            distanceLR: 10,
            pagination: true
        };
        var u = $.extend(u, t);
        return this.each(function () {
            $this = $(this);
            var d = u.capture;
            var f = $('#' + d + '').width();
            var g = $('#' + d + '').height();
            var h = u.leftright;
            var j = u.distanceLR;
            var k = (u.delai) * 1000;
            var l = (u.duree) * 1000;
            var n = u.pagination;
            $('#' + d + '>*').addClass('horinaja_moved');
            var o = $('#' + d + ' > .horinaja_moved > li').length;
            var p = 0;
            var q = 0;
            $('#' + d + ' > .horinaja_moved').wrap('<div class="capture"></div>');
            $('#' + d).css({
                'overflow': 'visible'
            });
            if (h) {
                $('#' + d + '').append('<div class="horinaja_leftright"><span class="horinaja_left"><a>left</a></span><span class="horinaja_right"><a>right</a></span></div>');
                var r = $('#' + d + ' > .horinaja_leftright > span.horinaja_left').width();
                $('#' + d + ' > .horinaja_leftright > span.horinaja_left').css({
                    'left': '-' + (parseInt(j) + parseInt(r)) + 'px'
                });
                $('#' + d + ' > .horinaja_leftright > span.horinaja_right').css({
                    'left': '' + (parseInt(f) + parseInt(j)) + 'px'
                })
            }

            function fadeP(a, b) {
                if (n) {
                    if (b == 0.4) {
                        $('#' + d + ' > ol.horinaja_pagination > li:eq(' + a + ')').fadeTo("fast", b).removeClass('active')
                    } else {
                        $('#' + d + ' > ol.horinaja_pagination > li:eq(' + a + ')').fadeTo("fast", b).addClass('active')
                    }
                }
            }

            function moveP() {
                if (p != -((f * o) - f)) {
                    $('#' + d + ' > .capture > .horinaja_moved').animate({
                        left: (p - f) + "px"
                    }, k);
                    p = p - f;
                    fadeP(q, 0.4);
                    q = q + 1;
                    fadeP(q, 1)
                } else {
                    $('#' + d + ' > .capture > .horinaja_moved').animate({
                        left: "0px"
                    }, k);
                    p = 0;
                    fadeP(q, 0.4);
                    q = 0;
                    fadeP(q, 1)
                }
            }
            $(this).everyTime(l, d, function () {
                moveP()
            });
            $('#' + d + ' > .capture > .horinaja_moved').css({
                'width': f * o + 'px'
            });
            $('#' + d + ' > .capture > .horinaja_moved > li').css({
                'width': f,
                'float': 'left'
            });
            if (n) {
                $('#' + d + ' > .capture').after('<ol class="horinaja_pagination"></ol>');
                $('#' + d + ' > ol.horinaja_pagination').css({
                    'width': f + 'px',
                    'top': (g - 40) + 'px'
                });
                var s = Math.floor(f / o);
                for (i = 1; i != (o + 1); i++) {
                    $('#' + d + ' > ol.horinaja_pagination').append('<li><a style="width:' + s + 'px;">' + i + '</a></li>')
                }
                $('#' + d + ' > ol.horinaja_pagination > li').fadeTo("fast", 0.4);
                $('#' + d + ' > ol.horinaja_pagination > li:first').fadeTo("fast", 1).addClass('active');
                $('#' + d + ' > ol.horinaja_pagination').fadeOut(600)
            }
            $(this).bind('mousewheel', function (a, b) {
                var c = b > 0 ? 'Up' : 'Down',
                    vel = Math.abs(b);
                if (c == 'Up') {
                    if (p != 0) {
                        $('#' + d + ' > .capture > .horinaja_moved').animate({
                            left: (p + f) + "px"
                        }, k);
                        p = p + f;
                        fadeP(q, 0.4);
                        q = q - 1;
                        fadeP(q, 1)
                    }
                } else {
                    if (p != -((f * o) - f)) {
                        $('#' + d + ' > .capture > .horinaja_moved').animate({
                            left: (p - f) + "px"
                        }, k);
                        p = p - f;
                        fadeP(q, 0.4);
                        q = q + 1;
                        fadeP(q, 1)
                    }
                }
                return false
            });
            $(this).bind('mouseenter', function () {
                $(this).stopTime(d);
                $('#' + d + ' > ol.horinaja_pagination').fadeIn(600)
            });
            $(this).bind('mouseleave', function () {
                $(this).everyTime(l, d, function () {
                    moveP()
                });
                $('#' + d + ' > ol.horinaja_pagination').fadeOut(600)
            });
            if (n) {
                $('#' + d + ' > ol.horinaja_pagination > li').each(function (i) {
                    $(this).bind('click', {
                        index: i
                    }, function (e) {
                        var a = parseInt(e.data.index);
                        fadeP(a, 1);
                        fadeP(q, 0.4);
                        if (q > a) {
                            var b = q - a;
                            p = p + (f * b);
                            q = a;
                            $('#' + d + ' > .capture > .horinaja_moved').animate({
                                left: (p) + "px"
                            }, k)
                        } else if (q < a) {
                            b = a - q;
                            p = p - (f * b);
                            q = a;
                            $('#' + d + ' > .capture > .horinaja_moved').animate({
                                left: (p) + "px"
                            }, k)
                        }
                    })
                })
            }
            if (h) {
                $('#' + d + ' > .horinaja_leftright > span > a').each(function (m) {
                    $(this).bind('click', {
                        index: m
                    }, function (e) {
                        var a = parseInt(e.data.index);
                        if (a == 1) {
                            if (p != -((f * o) - f)) {
                                $('#' + d + ' > .capture > .horinaja_moved').animate({
                                    left: (p - f) + "px"
                                }, k);
                                p = p - f;
                                fadeP(q, 0.4);
                                q = q + 1;
                                fadeP(q, 1)
                            }
                        } else {
                            if (p != 0) {
                                $('#' + d + ' > .capture > .horinaja_moved').animate({
                                    left: (p + f) + "px"
                                }, k);
                                p = p + f;
                                fadeP(q, 0.4);
                                q = q - 1;
                                fadeP(q, 1)
                            }
                        }
                    })
                })
            }
        })
    }
})(jQuery);
