/*
Developed by Kyle Somogyi
*/
function Shiftr(_ia)
{
	var me = this;

	// Global Configuration Variables
	me.galleryTitle = me.setValue(_ia.galleryTitle, false);
	me.mainElement = me.setValue(_ia.bindTo, function(){ console.log('You must set an element to bind to for Shiftr...'); });
	me.animation = me.setValue(_ia.animation, function(){ console.log('Shiftr needs an animation to work.'); });
	me.animationSpeed = me.setValue(_ia.animationSpeed, 500);
	me.jumpAmount = me.setValue(_ia.jumpAmount, 1);
	me.modules = me.setValue(_ia.modules, false);
	me.path = me.setValue(_ia.path, '');
	me.loaded = "";
	me.mod = [];
	me.modOL = [];

	if(me.modules !== false)
	{
		for(x in me.modules)
		{
			var s = {
				name: x
			}
			me.modOL.push(s);
		}
	}

	if(eval("typeof "+me.animation) == 'function')
	{
		// Assume plugin files are already loaded
		me.ext = eval('new '+me.animation+'(me)');

		me.getModules(null);
	} else {
		// Autoload Animation and Module Plugins
		me.getAnimations();
	}

	if(_ia.disableEvents !== true)
		me.bindEvents();
}

Shiftr.prototype.getAnimations = function()
{
	var me = this,
		an = this.animation;

	$.getScript(
		me.path+'animations/shiftr.'+an+'.js',
		function()
		{
			me.ext = eval('new '+an+'(me)');
			me.getModules(null);
		});
};

Shiftr.prototype.getModules = function(_mn)
{
	var me = this;

	if(me.modules !== false)
	{
		var mi = 0;
		if(_mn === null)
			mi = me.modOL.length;
		else
			mi = _mn;
		
		while(mi--)
		{
			if(eval("typeof "+me.modOL[mi].name) == "function" || me.loaded.search(me.modOL[mi].name) >= 0)
			{
				var tM = eval('new '+me.modOL[mi].name+'(me, me.modules[me.modOL[mi].name].options)');
				me.mod.push(tM);
			} else {
				me.fetchModule(mi, me.modOL[mi].name);
				break;
			}
		}
	}
};

Shiftr.prototype.fetchModule = function(_mnm, _mn)
{
	var me = this;

	$.getScript(me.path+'modules/shiftr.'+_mn+'.js',
		function()
		{
			var tM = eval('new '+_mn+'(me, me.modules[_mn].options)');
			me.mod.push(tM);
			me.loaded += _mn+';';
			me.getModules(_mnm);
		});
};

Shiftr.prototype.bindEvents = function()
{
	var me = this,
		mainElement = me.mainElement,
		mod = me.mod;
	
	if($(mainElement).find('.buttonPrevious, .buttonNext').get().length > 0)
	{
		$(mainElement).find('.buttonPrevious, .buttonNext').css(
		{
			'position': 'absolute',
			'z-index': '380'
		});
		$(mainElement).find('.buttonPrevious').click(function()
		{
			me.ext.prev();
			for(x in mod)
			{
				if(mod[x].click)
					mod[x].click('prev');
			}
		});
		$(mainElement).find('.buttonNext').click(function()
		{
			me.ext.next();
			for(x in mod)
			{
				if(mod[x].click)
					mod[x].click('next');
			}
		});
	}
	
	$(mainElement).hover(function()
	{
		for(x in mod)
		{
			if(mod[x].hoverStart)
				mod[x].hoverStart();
		}
	}, function()
	{
		for(x in mod)
		{
			if(mod[x].hoverEnd)
				mod[x].hoverEnd();
		}
	});

	if(me.galleryTitle === true)
	{
		if($(mainElement).find('.title').length <= 0)
			$(mainElement).prepend('<div class="title"></div>');
		
		setTimeout(function()
		{
			$(mainElement).find('.title').html($(mainElement).children().find(':first').attr('title'));
		}, me.animationSpeed);
	}
};

// Set value to default _dv if _mv is undefined or empty
Shiftr.prototype.setValue = function(_mv, _dv)
{
	if(_mv == undefined || _mv == '' || _mv == null)
	{
		if(typeof _dv == 'function')
			_dv();
		else
			return _dv;
	} else
		return _mv;
};
