(function($) {
	function Gallery(el, options) {
		this._hold = $(el);
		this.initOptions(options);
		this._timer = options.autoRotation;
		this._t;
		this.initialize();
	}
	
	$.fn.gallery = function(options) {
		return new Gallery(this.get(0), options);
	};
	
	Gallery.prototype = {
		initOptions: function(_obj){
			this.options = {
				duration: 700,
				slideElement: 1,
				autoRotation: false,
				effect: false,
				listOfSlides: 'ul > li',
				switcher: false,
				disableBtn: false,
				nextBtn: 'a.link-next, a.btn-next, a.next',
				prevBtn: 'a.link-prev, a.btn-prev, a.prev',
				circle: true,
				direction: false,
				IE: false
			};
			for(key in _obj) this.options[key] = _obj[key];
		},
		initialize: function(){
			var _this = this;
			var _hold = _this._hold;
			var _speed = _this.options.duration;
			var _timer = _this.options.autoRotation;
			var _el = _hold.find(_this.options.listOfSlides);
			if (_this.options.effect) var _list = _el;
			else var _list = _el.parent();
			var _switcher = _hold.find(_this.options.switcher);
			var _next = _hold.find(_this.options.nextBtn);
			var _prev = _hold.find(_this.options.prevBtn);
			var _count = _el.index(_el.filter(':last'));
			var _w = _el.outerWidth(true);
			var _h = _el.outerHeight(true);
			if (_this.options.switcher) var _active = _switcher.index(_switcher.filter('.active:eq(0)'));
			else var _active = _el.index(_el.filter('.active:eq(0)'));
			if (_active < 0) _active = 0;
			var _last = _active;
			
			// Installation directions
			if (!_this.options.direction) {
				var _wrapHolderW = Math.ceil(_list.parent().width() / _w);
				if (((_wrapHolderW - 1) * _w + _w / 2) > _list.parent().width()) _wrapHolderW--;
			}
			else{
				var _wrapHolderW = Math.ceil(_list.parent().height()/_h);
				if (((_wrapHolderW-1)*_h + _h/2) > _list.parent().height()) _wrapHolderW--;
			}
			
			// Setting "fade" or "slide" effect
			if (!_this.options.effect) var rew = _count - _wrapHolderW + 1;
			else var rew = _count;
			if (!_this.options.effect) {
				if (!_this.options.direction) _list.css({marginLeft: -(_w * _active)})
				else _list.css({marginTop: -(_h * _active)})
			}
			else {
				_list.css({
					opacity: 0
				}).removeClass('active').eq(_active).addClass('active').css({
					opacity: 1
				}).css('opacity', 'auto');
				_switcher.removeClass('active').eq(_active).addClass('active');
			}
			
			// Disable or enable buttons "prev next"
			if (_this.options.disableBtn) {
				if (_count < _wrapHolderW) _next.addClass(_this.options.disableBtn);
				_prev.addClass(_this.options.disableBtn);
			}
			
			// Function to "fade"
			function fadeElement(){
				if ($.browser.msie && _this.options.IE){
					_list.eq(_last).css({opacity:0});
					_list.removeClass('active').eq(_active).addClass('active').css({opacity:'auto'});
				}
				else{
					_list.eq(_last).animate({opacity:0}, {queue:false, duration: _speed});
					_list.removeClass('active').eq(_active).addClass('active').animate({
						opacity:1
					}, {queue:false, duration: _speed, complete: function(){
						$(this).css('opacity','auto');
					}});
				}
				if (_this.options.switcher) _switcher.removeClass('active').eq(_active).addClass('active');
				_last = _active;
			}
			
			// Function for "slide"
			function scrollEl(){
				if (!_this.options.direction) _list.animate({marginLeft: -(_w * _active)}, {queue:false, duration: _speed})
				else _list.animate({marginTop: -(_h * _active)}, {queue:false, duration: _speed})
				if (_this.options.switcher) _switcher.removeClass('active').eq(_active).addClass('active');
			}
			
			function toPrepare(){
				if ((_active == rew) && _this.options.circle) _active = -_this.options.slideElement;
				for (var i = 0; i < _this.options.slideElement; i++){
					_active++;
					if (_active > rew) {
						_active--;
						if (_this.options.disableBtn &&(_count > _wrapHolderW)) _next.addClass(_this.options.disableBtn);
					}
				};
				if (_active == rew) if (_this.options.disableBtn &&(_count > _wrapHolderW)) _next.addClass(_this.options.disableBtn);
				if (!_this.options.effect) scrollEl();
				else fadeElement();
			}
			_this._hold.bind('runTimer', function(){
				if(_this._t) clearTimeout(_this._t);
				_this._t = setInterval(function(){
					toPrepare();
				}, _this._timer);
			});
			_next.click(function(){
				if(_this._t) clearTimeout(_this._t);
				if (_this.options.disableBtn &&(_count > _wrapHolderW)) _prev.removeClass(_this.options.disableBtn);
				toPrepare();
				if (_this._timer) _this._hold.trigger('runTimer');
				return false;
			});
			_prev.click(function(){
				if(_this._t) clearTimeout(_this._t);
				if (_this.options.disableBtn &&(_count > _wrapHolderW)) _next.removeClass(_this.options.disableBtn);
				if ((_active == 0) && _this.options.circle) _active = rew + _this.options.slideElement;
				for (var i = 0; i < _this.options.slideElement; i++){
					_active--;
					if (_active < 0) {
						_active++;
						if (_this.options.disableBtn &&(_count > _wrapHolderW)) _prev.addClass(_this.options.disableBtn);
					}
				};
				if (_active == 0) if (_this.options.disableBtn &&(_count > _wrapHolderW)) _prev.addClass(_this.options.disableBtn);
				if (!_this.options.effect) scrollEl();
				else fadeElement();
				if (_this._timer) _this._hold.trigger('runTimer');
				return false;
			});
			if (_this.options.switcher) _switcher.click(function(){
				_active = _switcher.index($(this));
				if(_this._t) clearTimeout(_this._t);
				if (!_this.options.effect) scrollEl();
				else fadeElement();
				if (_this._timer) _this._hold.trigger('runTimer');
				return false;
			});
			if (_this._timer) _this._hold.trigger('runTimer');
		},
		stop: function(){
			var _this = this;
			if (_this._t) clearTimeout(_this._t);
		},
		play: function(){
			var _this = this;
			if (_this._t) clearTimeout(_this._t);
			if (_this._timer) _this._hold.trigger('runTimer');
		}
	}
}(jQuery));


function initSlideBox(_el){
	$('div.gallery-holder, div.gallery-popup', _el).each(function(){
		var hold = $(this);
		var link = hold.find('ul > li > a');
		var span = hold.find('ul > li > a > span');
		if (hold.hasClass('gallery-popup')) hold = hold.find('div.gallery');
		var h = span.outerHeight(true);
		
		span.css({bottom:-h});
		hold.hover(function(){
			span.animate({bottom:0}, {queue:false, duration: 300});
		}, function(){
			span.animate({bottom:-h}, {queue:false, duration: 300});
		});
	});
}
function initHoverLink(){
	$('div.gallery-holder a.btn-prev, div.gallery-holder a.btn-next, div.gallery-popup a.btn-prev, div.gallery-popup a.btn-next')
		.live('mouseenter',function(){
			$(this).find('> span').show();
		}).live('mouseleave',function(){
			$(this).find('> span').hide();
		}).find('> span').hide();
}
function initTwitterSlide(_el){
	$('div.grey-bar', _el).each(function(){
		var hold = $(this);
		var link = hold.find('span.bird');
		var box = hold.find('div.twitter-box');
		var h = box.outerHeight(true);
		
		box.css({height:0});
		hold.hover(function(){
			box.animate({height:h}, {queue:false, duration: 300});
		}, function(){
			box.animate({height:0}, {queue:false, duration: 300});
		});
	});
}
$(document).ready(function(){
	$('div.gallery.gallery-holder').ajaxTabFade({
		btPrev: 'a.btn-prev',
		btNext: 'a.btn-next',
		tabs: 'ul.slide-list a',
		holder: 'div ul',
		scrollEl: 'li',
		duration: 500,
		ajaxComplete:function(_slide){
			var _span = $(_slide).find('span');
			var h = _span.outerHeight(true);
			$(_slide).closest('div.gallery').mouseenter(function(){
				if (parseInt(_span.closest('li').css('opacity'))) {
					_span.animate({bottom:0}, {queue:false, duration: 300});
				}
			}).mouseleave(function(){
				if (parseInt(_span.closest('li').css('opacity')))
					_span.animate({bottom:-h}, {queue:false, duration: 300});
			});
		}
	});
	
	initSlideBox(document);
	initHoverLink();
	
	$('div.projects-list a.link-popup').simpleLightbox({
		ajaxCallback:function(_lb){
			$('div.gallery-popup', _lb).gallery({
				duration: 500,
				listOfSlides: '> div.gallery ul > li',
				switcher: 'ul.pics-list > li',
				effect: 'fade'
			});
		}
	});
	
	initTwitterSlide(document);
});


jQuery.fn.simpleLightbox = function(_options){
	// defaults options
	var _options = jQuery.extend({
		lightboxContentBlock: '.lightbox',
		faderOpacity: 0.5,
		faderBackground: '#000000',
		closeLink:'a.btn-close',
		href:true,
		onClick: null,
		ajaxCallback:function(){return true}
	},_options);

	var _popupCounter = 1;

	return this.each(function(i, _this){
		var _this = jQuery(_this);
		if (!_options.href)
			_this.lightboxContentBlock = _options.lightboxContentBlock;
		else _this.lightboxContentBlock = _this.attr('href');
		if (_this.lightboxContentBlock != '' && _this.lightboxContentBlock.length > 1) {
			_this.faderOpacity = _options.faderOpacity;
			_this.faderBackground = _options.faderBackground;
			_this.closeLink = _options.closeLink;
			var _fader;
			var _lightbox = $(_this.lightboxContentBlock);
			if (!jQuery('div.lightbox-fader').length)
				_fader = $('body').append('<div class="lightbox-fader"></div>');
			
			_fader = jQuery('div.lightbox-fader');
			_lightbox.css({
				'zIndex':999
			});
			_fader.css({
				opacity:_this.faderOpacity,
				backgroundColor:_this.faderBackground,
				display:'none',
				position:'absolute',
				top:0,
				left:0,
				zIndex:998,
				textIndent: -9999
			}).text('&nbsp;');
			_lightbox.shownFlag = false;
			_this.click(function(){
				if (jQuery.isFunction(_options.onClick)) {
					_options.onClick.apply(_this);
				}

				var _popupURL = _this.attr('href');
				if(jQuery('div[rel*="'+_popupURL+'"]').length == 0) {
					$.ajax({
						url: _popupURL,
						global: false,
						type: "GET",
						dataType: "html",
						success: function(msg){
							// append loaded popup
							_lightbox = $(msg);
							_lightbox.attr('rel',_popupURL).css({
								zIndex:999,
								position:'absolute',
								display:'block',
								top: -9999,
								left: -9999
							});
							_lightbox.attr('id','ajaxpopup'+_popupCounter);
							jQuery('body').append(_lightbox);
							_popupCounter++;
							// attach close event
							jQuery(_this.closeLink, _lightbox).click(function(){
								_lightbox.fadeOut(400, function(){
									_fader.fadeOut(300);
									_scroll = false;
								});
								return false;
							});

							// show lightbox
							_lightbox.hide();
							_lightbox.shownFlag = true;
							jQuery.fn.simpleLightbox.positionLightbox(_lightbox);
							_fader.fadeIn(200, function(){
								_lightbox.fadeIn(250);
								jQuery.fn.simpleLightbox.positionLightbox(_lightbox);
								_options.ajaxCallback(_lightbox);
							});
						},
						error: function(msg){
							alert('ajax error');
							return false;
						}
					});
				} else {
					_fader.fadeIn(300, function(){
						jQuery('div[rel*="'+_popupURL+'"]').fadeIn(400);
						jQuery.fn.simpleLightbox.positionLightbox(jQuery('div[rel*="'+_popupURL+'"]'));
					});
				}
				return false;
			});
			jQuery(_this.closeLink).click(function(){
				_lightbox.fadeOut(400, function(){
					_fader.fadeOut(300);
					_scroll = false;
				});
				return false;
			});
			_fader.click(function(){
				_lightbox.fadeOut(400, function(){
					_fader.fadeOut(300);
				});
				return false;
			});
			var _scroll = false;
			jQuery.fn.simpleLightbox.positionLightbox = function (_lbox) {
				var _height = 0;
				var _width = 0;
				var _minWidth = $('body > div:eq(0)').outerWidth();
				if (window.innerHeight) {
					_height = window.innerHeight;
					_width = window.innerWidth;
				} else {
					_height = document.documentElement.clientHeight;
					_width = document.documentElement.clientWidth;
				}
				var _thisHeight = _lbox.outerHeight();
				var _page = $('body > div:eq(0)');
				if (_lbox.length) {
					if (_width < _minWidth) {_fader.css('width',_minWidth);} else {_fader.css('width','100%');}
					if (_height > _page.innerHeight()) _fader.css('height',_height); else _fader.css('height',_page.innerHeight());
					if (_height > _thisHeight) {
						if ($.browser.msie && $.browser.version < 7) {
							_lbox.css({
								position:'absolute',
								top: (document.documentElement.scrollTop + (_height - _thisHeight) / 2)+"px"
							});
						} else {
							_lbox.css({
								position:'fixed',
								top: ((_height - _lbox.outerHeight()) / 2)+"px"
							});
						}
					}
					else {
						var _fh = parseInt(_fader.css('height'));
						if (!_scroll) {
						if (_fh - _thisHeight > parseInt($(document).scrollTop())) {
								_fh = parseInt($(document).scrollTop())
								_scroll = _fh;
							} else {
								_scroll = _fh - _thisHeight;
							}
						}
						_lbox.css({
							position:'absolute',
							top: _scroll
						});
					}
					if (_width > _lbox.outerWidth()) _lbox.css({left:((_width - _lbox.outerWidth()) / 2 + 10) + "px"});
					else _lbox.css({position:'absolute',left: 0});
				}
			}
			jQuery(window).resize(function(){
				if (_lightbox.is(':visible'))
					jQuery.fn.simpleLightbox.positionLightbox(_lightbox);
			});
			jQuery(window).scroll(function(){
				if (_lightbox.is(':visible')) {
					jQuery.fn.simpleLightbox.positionLightbox(_lightbox);
				}
			});
			jQuery.fn.simpleLightbox.positionLightbox(_lightbox);
				$(document).keydown(function (e){
				if (!e) evt = window.event;
				if (e.keyCode == 27) {
					_lightbox.fadeOut(400, function(){
						_fader.fadeOut(300);
					});
				}
			});
		}
	});
}

jQuery.fn.ajaxTabFade = function(_options){
	// defaults options
	var _options = jQuery.extend({
			btPrev: 'a.prev',
			btNext: 'a.next',
			tabs: 'ul.tabset a',
			holder: 'div',
			scrollEl: 'li',
			loadIco: '.loading',
			duration: 2000,
			ajaxComplete:function(){}
	},_options);

	return this.each(function(){
		var _this = $(this);
		
		var _holder = $(_options.holder, _this),
			_scrollEl = $('> '+_options.scrollEl, _holder),
			_next = $(_options.btNext,  _this),
			_prev = $(_options.btPrev,  _this),
			_tabs = $(_options.tabs,  _this),
			_loadIco = $(_options.loadIco,  _this),
			_sliding = false, _clickEl = false;
		
		var _margin = 0, _duration = _options.duration,
			_current = 0, _step = _holder.innerWidth(),
			_length = _tabs.length, _activeSlide = _scrollEl,
			_activeIndex = _current;

		if (_options.btNext) {
			_next.click(function(){
				nextSlides();
				return false;
			});
		}
		if (_options.btPrev) {
			_prev.click(function(){
				if (!$('> '+_options.scrollEl, _holder).is(':animated') && !_sliding) {
					_clickEl = this;
					_current -= 1;
					if (_current < 0) _current = _length-1;
					animateTab();
					setActive();
				}
				return false;
			});
		}
		
		if (!_tabs.filter('.active').length) {
			_tabs.eq(0).addClass('active');
		}
		_scrollEl.addClass('loadTab').attr('rel',_tabs.filter('.active').attr('href'));
		
		_tabs.click(function(){
			if (!$(this).hasClass('active') && !$('> '+_options.scrollEl, _holder).is(':animated')) {
				_clickEl = this;
				var i = _tabs.index(this);
				_tabs.removeClass('active');
				$(this).addClass('active');
				_current = i;
				animateTab();
			}
			return false;
		});
		
		function nextSlides(){
			if (!$('> '+_options.scrollEl, _holder).is(':animated') && !_sliding) {
				_clickEl = _next.get(0);
				_current += 1;
				if (_current >= _length) _current = 0;
				setActive();
				animateTab();
			}
			return false;
		}
		function animateTab(){
			var _rel = _tabs.eq(_current).attr('href');
			var _el = $('.loadTab[rel='+_rel+']');
			if (_el.length) {
				slideThis();
			} else {
				if (_loadIco.length) _loadIco.show();
				$.ajax({
					url: _rel,
					success: function(msg){
						var _loadSlide = $(msg);
						_sliding = true;
						var _images = _loadSlide.find('img');
						if (_images.length) {
							var _loadIndex = 0;
							_images.each(function(){
								var _imageLoad = new Image();
								if (_imageLoad.complete) {
									_loadIndex++;
									if (_loadIndex >= _images.length) {
										initSlide();
									}
								} else {
									_imageLoad.onload = function(){
										_loadIndex++;
										if (_loadIndex >= _images.length) {
											initSlide();
										}
										this.onload = function(){};
									}
									_imageLoad.src = $(this).attr('src');
								}
							});
						} else {
							initSlide();
						}
						function initSlide(){
							_loadSlide.addClass('loadTab').attr('rel',_rel).css({'opacity':0});
							_holder.append(_loadSlide);
							if (_loadIco.length) _loadIco.hide();
							_el = _loadSlide;
							slideThis();
							_options.ajaxComplete(_loadSlide);
						}
					}
				});
			}
			function slideThis(){
				_sliding = false;
				_holder.children().css('zIndex',0);
				_el.css('zIndex',1).animate({'opacity':1}, {duration:_duration});
				_activeSlide.animate({'opacity':0}, {duration:_duration});
				
				_activeSlide = _el;
				_activeIndex = _current;
			}
		}
		function setActive () {
			if (_options.tabs) {
				_tabs.removeClass('active');
				_tabs.eq(_current).addClass('active');
			}
		}
	});
}

