$.fn.gallery = function(opts) {
	return this.each(function(){
		var defaults = {
			amount: 9,
			controls: jQuery(this).find('div.controls'),
			container: jQuery(this).find('div.thumbs_container'),
			speed: 0
		}
		var o = $.extend({},defaults,opts);
		
		// setup thumbs
		var overflowW = o.container.width();
		var thumbsLi = o.container.find('li');
		var thumbs = (thumbsLi.length / o.amount);
		
		
		lis = [];
		
		for(i=0; i < thumbs; i++){
			index = i * o.amount -1;
			ul = o.container.find('ul:first');
			if (i == 0) {
				lis[i] = ul.find('li:lt('+o.amount+')');
			} else {
				lis[i] = ul.find('li:gt('+index+'):lt('+o.amount+')');
			}
		}
		a = '';
		for (i=0; i < lis.length; i++) {
			lis[i].wrapAll('<ul />');
			x = parseInt(i+1);
			a += "<li><a href='"+x+"'><span>"+x+"</span></a></li>";
		};
		o.controls.find('li:first').after(a);
		
		o.container.find('ul:first').css({
			width: lis.length * o.container.width() +'px'
		});
		
		highlightMarker();

		function highlightMarker() {
			var thumbsUl = o.container.find('ul:first');
			var overallW = thumbsUl.width();
			var leftPos = thumbsUl.css('left').replace('px','').replace('-','');
			var index = (leftPos/o.container.width())+1;
			galleryAnimateActivate();
			o.controls.find('li a.active').removeClass('active');
			o.controls.find('li:eq('+index+') a').addClass('active');			
		}
		
		function galleryAnimateActivate (){
			galleryAnimate = true;
		}
		
		// setUp arrows 
		o.controls.find('a.cntrl_right').click(function(){
			if (galleryAnimate == true){
				galleryAnimate = false;
				var thumbsUl = o.container.find('ul:first');
				var overallW = thumbsUl.width();
				leftPos = thumbsUl.css('left').replace('px','');
				if (leftPos == -overallW + o.container.width() ){
					galleryAnimateActivate();
					return false;
				}
				thumbsUl.animate({left:leftPos- o.container.width() },o.speed,highlightMarker);
				return false;
			}
			else{}
			
		});
		o.controls.find('a.cntrl_left').click(function(){
			if (galleryAnimate == true){
				galleryAnimate = false;
				var thumbsUl = o.container.find('ul:first');
				leftPos = thumbsUl.css('left').replace('px','');
				if (leftPos == 0 ){
					galleryAnimateActivate();
					return false;
				}
				thumbsUl.animate({left:parseInt(leftPos)+ o.container.width() },o.speed,highlightMarker);
				return false;
			}
			else{}
		});
		
		// markers -----------------------------------------------------
		
		o.controls.find('li a').not('.cntrl_left,.cntrl_right').click(function(){
			pos = jQuery(this).find('span').text() -1;
			o.container.find('ul:first').animate({
				left: -pos * o.container.width() +'px'
			},o.speed,highlightMarker);
			return false;
		});
		
	});

}

$.fn.hoverFade = function(opts) {
	if(isiPhone()){return false;}
return this.each( function(){
	var defaults = {
		endOpacity: 0.8,
		startOpacity: 1,
		inSpeed: 700,
		outSpeed: 500,
		not: '',
		border: false,
		obj: $(this),
		trigger: $(this)
	}
	var o = $.extend({},defaults,opts);
	
	obj = o.trigger.find(o.obj).first();
	obj.css({opacity:o.startOpacity})
	o.trigger.bind({
		mouseover: function() {$(this).find(o.obj).stop().animate({opacity:o.endOpacity},o.inSpeed)},
		mouseout: function() {$(this).find(o.obj).stop().animate({opacity:o.startOpacity},o.outSpeed)}
	})
	.css({cursor:'pointer'});
	
	if(o.border) {
		brdDiv = $('<div />',{
			css:{
				border:o.border,
				width: obj.width(),
				height: obj.height()
			}
		})
		obj.css({border:'none'}).wrap(brdDiv);
	}
	
}); // end return each

}

/**
 * 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);
	});
});
