/**
 * @author nic
 */
(function($){
	$.lco = function( settings ){
		settings.$t = $(this);
		settings = $.extend( $.lco.settings, settings );
		var effects = ['blind', 'clip', 'drop', 'explode', 'fold', 'puff', 'slide', 'scale', 'fade'];
		var effectOptions = {
			blind: [{ direction: 'horizontal' }, { direction: 'vertical' }], clip: [{ direction: 'horizontal' }, { direction: 'vertical' }],
			drop: [{ direction: 'down' }, { direction: 'up' }, { direction: 'right' }, { direction: 'left' }],
			explode: [{ number: 9 }], fold: [{ size: 15 }], puff: [{ percent: 150 }],
			slide: [{ direction: 'down' }, { direction: 'up' }, { direction: 'right' }, { direction: 'left' }],
			scale: [], fade: []
		};
		if(settings.open.effect == 'random'){
			settings.open.effect = effects[Math.round(Math.random() * (effects.length - 1))];
			settings.open.option = effectOptions[Math.round(Math.random() * (effectOptions[settings.open.effect].length - 1))];
		}
		if(settings.close.effect == 'random'){
			settings.close.effect = effects[Math.round(Math.random() * (effects.length - 1))];
			settings.close.option = effectOptions[Math.round(Math.random() * (effectOptions[settings.close.effect].length - 1))];
		}

		settings.position = $.lco._setPosition(settings);
		if(!settings.position) return false;
		settings = $.extend(
			settings,
			{
				startPosition: settings.open.effect == 'move' ? $.lco._setStartPosition(settings) : settings.position,
				endPosition: settings.close.effect == 'move' ? $.lco._setEndPosition(settings) : settings.position
			}
		);

		settings.closeButton.unbind('click')
			.click(function(){settings.$t.lco.closeAction(settings)})
			.hover(function(){$(this).addClass('hover')},function(){$(this).removeClass('hover')});
		if(settings.display_trigger == 'immediately')
			$.lco.openAction();
	}
	$.lco.openAction = function(settings){
		settings = $.extend( $.lco.settings, settings );
		settings.$t
			.css({
				position: 'absolute',
				display: 'block',
				zIndex: 20000,
				left: settings.startPosition.left + $(document).scrollLeft(),
				top: settings.startPosition.top + $(document).scrollTop()
			})
			.width(Math.round(settings.size.width))
			.height(Math.round(settings.size.height));
		if(settings.open.effect == 'move')
			settings.$t
				.animate({
					left: settings.position.left + $(document).scrollLeft(),
					top: settings.position.top + $(document).scrollTop()
				}, settings.open.speed, function(){
					if(typeof settings.open.fn == 'function') settings.open.fn.call(this, settings);
					$(this).exFixed({
						left: settings.position.left,
						top: settings.position.top
					});
			});
		else if(settings.open.effect == 'fade')
			settings.$t.css('display', 'none').fadeIn(settings.open.speed, function(){
				if(typeof settings.open.fn == 'function') settings.open.fn.call(this, settings);
				$(this).exFixed({
					left: settings.position.left,
					top: settings.position.top
				});
			});
		else
			settings.$t.show(settings.open.effect, settings.open.option, settings.open.speed, function(){
				if(typeof settings.open.fn == 'function') settings.open.fn.call(this, settings);
				$(this).exFixed({
					left: settings.position.left,
					top: settings.position.top
				});
			});
		$(window).resize(function(){});
	}
	$.lco.closeAction = function(settings){
		settings = $.extend( $.lco.settings, settings );
		if(settings.close.effect == 'move')
			settings.$t.animate(settings.endPosition, settings.close.speed, 'linear', function(){
				if(typeof settings.close.fn == 'function') settings.close.fn.call(this, settings);
				$(this).css('display', 'none');
			});
		else if(settings.close.effect == 'fade')
			settings.$t.fadeOut(settings.close.speed);
		else
			settings.$t.hide(settings.close.effect, settings.close.option, settings.close.speed, function(){
				if(typeof settings.close.fn == 'function') settings.close.fn.call(this, settings);
				$(this).css('display', 'none');
			});
	}
	$.lco.settings = {
		open: {
			effect: 'scale',
			option: {},
			speed: 1000,
			fn: null
		},
		close: {
			effect: 'scale',
			option: {},
			speed: 1000,
			fn: null
		},
		position: 'center',
		size: {width: 200, height: 200},
		startPosition: {left: 0, top: 0},
		padding: 10,
		closeButton: $(this),
		display_trigger: 'immediately',
		$t: $(this)
	}
	$.lco._setPosition = function(settings){
		var _bw = $(window).width()+$(document).scrollLeft(), _bh = $(window).height()+$(document).scrollTop();
		var position = {left:0, top: 0}
		var paddingW = 0;//Math.round(($.lco.settings.$t.css('padding-right').match(/[0-9]+/))[0]) + Math.round(($.lco.settings.$t.css('padding-left').match(/[0-9]+/))[0]);
		switch(settings.position){
			case 'lefttop':
				position = {
					left: settings.padding,
					top: settings.padding
				}
				break;
			case 'top':
				position = {
					left: Math.round(($(window).width() - settings.size.width) / 2),
					top: settings.padding
				}
				break;
			case 'righttop':
				position = {
					left: $(window).width() - settings.size.width - settings.padding - paddingW,
					top: settings.padding
				}
				break;
			case 'left':
				position = {
					left: settings.padding,
					top: Math.round(($(window).height() - settings.size.height) / 2)
				}
				break;
			case 'center':
				position = {
					left: Math.round(($(window).width() - settings.size.width) / 2),
					top: Math.round(($(window).height() - settings.size.height) / 2)
				}
				break;
			case 'right':
				position = {
					left: $(window).width() - settings.size.width - settings.padding,
					top: Math.round(($(window).height() - settings.size.height) / 2)
				}
				break;
			case 'leftbottom':
				position = {
					left: settings.padding,
					top: $(window).height() - settings.size.height - settings.padding
				}
				break;
			case 'bottom':
				position = {
					left: Math.round(($(window).width() - settings.size.width) / 2),
					top: $(window).height() - settings.size.height - settings.padding
				}
				break;
			case 'rightbottom':
				position = {
					left: $(window).width() - settings.size.width - settings.padding,
					top: $(window).height() - settings.size.height - settings.padding
				}
				break;
			default:
				if(settings.position.match(/[0-9]+,[0-9]+/)){
					var pos = settings.position.split(',');
					position = {
						left: Math.round((pos[0] / 100) * ($(window).width() - settings.size.width)),
						top: Math.round((pos[1] / 100) * ($(window).height() - settings.size.height))
					}
					break;
				}
				return false;
		}
		return position;
	}
	$.lco._setStartPosition = function(settings){
		var _bw = $(window).width(), _bh = $(window).height();
		var startPosition = {left: 0, top: 0}
		switch(settings.open.option){
			case 'down':
				startPosition = {
					left: settings.position.left,
					top: 0 - settings.size.height
				}
				break;
			case 'up':
				startPosition = {
					left: settings.position.left,
					top: _bh
				}
				break;
			case 'left':
				startPosition = {
					left: 0 - settings.size.width,
					top: settings.position.top
				}
				break;
			case 'right':
				startPosition = {
					left: _bw,
					top: settings.position.top
				}
				break;
			default:
				startPosition = {
					left: settings.position.left,
					top: settings.position.top
				}
		}
		return startPosition;
	}
	$.lco._setEndPosition = function(settings){
		var _bw = $(window).width(), _bh = $(window).height();
		var endPosition = {left: 0, top: 0}
		switch (settings.close.option) {
			case 'down':
				endPosition = {
					left: settings.position.left,
					top: _bh
				}
				break;
			case 'up':
				endPosition = {
					left: settings.position.left,
					top: 0 - settings.size.height
				}
				break;
			case 'left':
				endPosition = {
					left: _bw,
					top: settings.position.top
				}
				break;
			case 'right':
				endPosition = {
					left: 0 - settings.size.width,
					top: settings.position.top
				}
				break;
			default:
				endPosition = {
					left: settings.position.left,
					top: settings.position.top
				}
		}
		return endPosition;
	}
	$.extend( $.prototype, {
		lco: $.lco
	} );
})(jQuery);
