/**
* Toxic Galaxy
* 
* @copyright 	: Toxic Media Ltd. Sofia, Bulgaria
* @author 	: Angel Kostadinov (angel.kostadinov@toxicmedia.bg)
* @internal	: GUI()
* @version	: 1.0
*/
String.prototype.domain = function()
{
	var string = this.slice(1 + this.lastIndexOf('/'));
	return !string.length ? 'index' : string;
};

String.prototype.trim = function() 
{
	return this.replace(/^\/|\/$/g,"");
}

var Screen = function(){};
var Galaxy = function()
{
	$.fn.carousel = this.carousel;
	
	this.texts = 
	{
		contacts: 	'Contacts',
		textarea: 	'Message',
		name:		'Name',
		email: 		'Email',
		phone: 		'Phone',
		website: 	'Website',
		send: 		'Send',
		success: 	'Success',
		portfolio: 	'Portfolio',
		wait:		'Loading...',
		toxic:		'New',
		visit:		'view project'
	};
};

Screen.prototype = new GUI;
Galaxy.prototype = new Screen;



/* Screen class */
Screen.prototype.resize = function()
{
	$('.monitor-frame').animate({ height:900});
};

/* Galaxy class */
Galaxy.prototype.effects = function()
{
	$('li:not(.x)','.gui-menu')
		.add('li:not(.pipe)','.footer-content-links')
		.add('.button-more')
		.OE();
		
	return this;
};

Galaxy.prototype.extend = function(base, object)
{
	for (var property in object)
	{
		if (base.hasOwnProperty(property))
		{
			if (typeof base[property] == "object")
			{
				base[property] = base[property].extend(object[property]);
			}
			else base[property] = object[property];
		}
		else 
		{
			base[property] = object[property];
		}
	}
	return base;
};

Galaxy.prototype.delegate = function(target, method, args)
{
	return (typeof method == "function") ? function() 
	{ 
		return method.apply(target, args); 
	} : function()
	{
		return false;
	};
};

Galaxy.prototype.loadGalaxy = function( url, data,  callback )
{
	$.ajaxSetup({ cache: false });

	$.ajax(
	{
		type: "POST",
		url: url,
		data: data,
		dataType: 'xml',
		success: callback,
		cache: false,
		error: this.delegate(this, this['unknownGalaxy'], [])
	});
};

Galaxy.prototype.unknownGalaxy = function()
{
	gx.loader(false);
	gx.running = false;
	
	var content = $('<div></div>').addClass('floating').css({ left:-200, opacity:0}).appendTo($('.monitor-frame').empty());
	
	var error = new Image();
	
	error.onload = function()
	{
		$(this).addClass('error').appendTo(content);
		
		$('.location').text('Page not found');
		
		$('.monitor-frame').animate({ height: 400},gx.fx.rebuild,function()
		{			
			content.animate(
			{
				left:-10, 
				opacity:1
			},gx.fx.rebuild, function()
			{
				gx.destruct();
			});
		});
				
	};
	error.src = gx.getDomain() + '/templates/themes/galaxy/images/error.png';
};

Galaxy.prototype.destruct = function()
{
	this.running = false;
};

Galaxy.prototype.construct = function(args, callback)
{
	if (!this.running)
	{
		this.stopAll();
		
		/* Start transition process */
		this.running = true;
		
		this.loader(true);
		
		$('.location').text(gx.texts.wait);
		
		$('.arrow').fadeOut(gx.fx.rebuild);
		
		$('.monitor-tools-buttons-container').map(function()
		{
			var w = $(this).width();
			
			$(this).css({ width: w});
		}).andSelf().empty().animate({ width: 20}, gx.fx.rebuild, function()
		{
			$('.monitor-frame').empty();
			
			callback();
		});
	}
};

Galaxy.prototype.appendCarousel = function( callback, expand )
{
	var carousel = $('<div><ul></ul></div>').addClass('carousel');

	$('.monitor-tools-buttons-container').animate({ width: 863}, gx.fx.rebuild, function()
	{
		$(this).append(carousel);
		
		$('<div></div>').addClass('carousel-slideshow fix')
			.append('<ul></ul>')
			.appendTo(carousel);
			
		callback();
	});
};

Galaxy.prototype.page = function( page, navigation )
{
	this.loader(true).running = true; 
	
	this.loadGalaxy(gx.getDomain() + 'gateway/' + page,null, function( response )
	{
		var content = $('<div></div>').addClass('floating').css({ left:-200, opacity:0}).appendTo($('.monitor-frame').empty());
		var columns = $('page',response).attr('units');
		
		/* Tools */
		var tools = $('.monitor-tools-buttons-container');
		
		cs = $('.carousel-slideshow',tools);
		
		$('.location').text($('page',response).attr('title'));
		
		/* Analytics track event */
		_gaq.push(['_trackEvent', 'Page', 'Open', $('page',response).attr('title')]);
		
		$('page content',response).each(function()
		{
			var col = $('<div></div>').addClass('column')
									  .addClass($(this).attr('class'))
									  .css({ width: parseInt(99/columns)-5 + '%'});
			
			col.html($(this).text()).appendTo(content);
		});
		
		if (navigation)
		{
			$('menu',response).each(function()
			{
				var href = $(this).attr('address');
				var link = $('<a href="' + href + '">' + $(this).attr('label') + '</a>');
				var item = $('<li></li>');
				
				if (1 == parseInt($(this).attr('selected')))
				{
					item.addClass('active');
				}
				
				link.bind('click',function()
				{
					$(this).parents().filter('li:first').siblings().removeClass('active').end().addClass('active');
					
					return gx.page(href, false);
					
				}).appendTo(item);
				
				$('ul',cs).append(item);
			});
			
			$('ul li',cs).OE();
		}
		
		/* Calculate height */
		var height = 50 + parseInt(content.height());
		
		/* Limit height maximum */
		height = height > 440 ? 440 : (height < 303 ? 303 : height);
				
		$('.area-shadow').animate({ opacity: (height)*gx.opacity}, gx.fx.rebuild);

		$('.monitor-frame').animate(
		{
			height: height
		},200,function()
		{
			gx.loader(false);
			
			preloader.prePreload().preloadResponse(content.html(), function()
			{
				content.animate(
				{
					left:-10, 
					opacity:1
				},200, function()
				{
					gx.destruct();
				});
			});
		});
	});
	
	return false;
};

Galaxy.prototype.loader = function(open)
{
	var l = $('#loader');
	
	if (!open)
	{
		l.hide();
	} else l.show();
	
	return this;
};

Galaxy.prototype.products = function(args)
{
	this.construct(args, function()
	{
		gx.appendCarousel(function()
		{
			gx.page('products', true);
		}, false);
	});
};

Galaxy.prototype.cms = function(args)
{
	this.selectPrimaryButton('products').construct(args, function()
	{
		gx.appendCarousel(function()
		{
			gx.page('products/cms', true);
		}, false);
	});
};

Galaxy.prototype.ecommerce = function(args)
{
	this.selectPrimaryButton('products').construct(args, function()
	{
		gx.appendCarousel(function()
		{
			gx.page('products/cmscatalog', true);
		}, false);
	});
};

Galaxy.prototype.services = function(args)
{
	this.construct(args, function()
	{
		gx.appendCarousel(function()
		{
			gx.page('services/development', true);
		}, false);
	});
};

Galaxy.prototype.terms = function()
{
	gx.running = true; 
	gx.loader(true);
	
	gx.blockUI(true).loadGalaxy(gx.getDomain() + 'gateway/terms' , null, function(response)
	{
		var content = $('content',response).text();
		
		$('.overlay-message').html(content);
		
		gx.loader(false).running = false;
	});
};

Galaxy.prototype.contacts = function(args)
{
	this.construct(args, function()
	{
		gx.appendCarousel(function()
		{
			$('.location').text(gx.texts.contacts);
			
			gx.loadGalaxy(gx.getDomain() + 'gateway/contacts' , null, function(response)
			{
				gx.loader(false).form([$('content', response).eq(0).text(), $('content', response).eq(1).text()]);
			});
		}, false);
	});
};

Galaxy.prototype.form = function(args)
{
	var frame = $('.monitor-frame');
	
	var fields = [
		{ tag: 'input', name:'name', 	type: 'text', label: this.texts.name },
		{ tag: 'input', name:'email', 	type: 'text', label: this.texts.email },
		{ tag: 'input', name:'phone', 	type: 'text', label: this.texts.phone},
		{ tag: 'input', name:'website', type: 'text', label: this.texts.website }
	];
	
	/* Define form */
	var form = $('<form></form>').addClass('form fix');
	
	/* Colon prototype */
	var base = $('<div></div>').addClass('form-column');
	
	/* Row prototype */
	var rowbase = $('<div></div>').addClass('form-row fix');
	
	var col1 = base.clone(false).appendTo(form);
	var col2 = base.clone(false).appendTo(form);
	
	var required = $('<span>*</span>').addClass('required');
	
	var send 	= $('<div></div>').addClass('send');
	var senda 	= $('<a href="javascript:void(0)">' + this.texts.send + '</a>');
	

	col1.html(args.shift());
	col2.html(args.shift());
	
	/* Append columns */
	
	frame.animate({
				height: 440
	},gx.fx.rebuild, function()
	{
		form.append(col1).append(col2).appendTo(frame);
		
		/* Initialize column one */
		for (var field in fields)
		{
			f 		= document.createElement(fields[field].tag);
			f.type 	= fields[field].type;
			f.name  = fields[field].name;

			var row = rowbase.clone(false);
			var label = $('<div></div>').addClass('label').append(required.clone(false)).append(fields[field].label + ':');
			var field = $('<div></div>').addClass('field');
			
			/* Append input */
			field.append(f);
			
			/* Create row */
			row.append(label).append(field).appendTo(col1);
		}
		
		/* Initialize column two */
		var row = rowbase.clone(false);
		
		f = document.createElement('TEXTAREA');
		
		f.name = 'message';
		
		var row = rowbase.clone(false);
		var label = $('<div></div>').addClass('label').append(required.clone(false)).append(gx.texts.textarea + ':');
		var field = $('<div></div>').addClass('field-area');
		
		/* Append textarea */
		field.append(f);
		
		/* Create row */
		row.append(label).append(field).appendTo(col2);
		
		senda.bind('click',gx.delegate(gx, gx['sendForm'], [form])).appendTo(send);
		
		send.appendTo($('.monitor-tools-buttons-container')).OE();
		
		gx.running = false;
	});
};

Galaxy.prototype.sendForm = function( form )
{
	var data = form.serialize();
	
	gx.loader(true);
	
	gx.running = true;
	
	$.ajax(
	{
		type: "POST",
		url: this.getDomain() + 'libraries/services/mail.php',
		data: data,
		dataType: 'xml',
		success: function( response )
		{
			gx.running = false;
			gx.loader(false);
			
			$('.label').removeClass('error');
			
			if (parseInt($('response',response).attr('result')) == 0)
			{
				_gaq.push(['_trackEvent', 'Form', 'Error']);
				
				$('field',response).each(function()
				{
					
					var label = $('*[name="' + $(this).attr('name') + '"]').parent().prev();

					label.addClass('error');
				});
			}
			else 
			{
				gx.construct(gx.texts.success, function()
				{
					gx.appendCarousel(function()
					{
						gx.page('contacts/success',true);
					}, false);
				});
			}			
		}
	});
};

Galaxy.prototype.about = function(args)
{
	this.selectPrimaryButton('about').construct(args, function()
	{
		gx.appendCarousel(function()
		{
			gx.page('about', true);
		}, false);
	});
};

Galaxy.prototype.portfolio = function(args)
{
	this.construct(args,function()
	{
		$('.location').text(gx.texts.portfolio);
		
		_gaq.push(['_trackEvent', 'Page', 'Open', gx.texts.portfolio]);
		
		gx.DOMTip().loadGalaxy(gx.getDomain() + '/plugins/portfolio/gateway.php?page=portfolio', null, function( response )
		{
			/* Get carousel */
			var carousel 	= $('<div></div>').addClass('carousel');
			
			/* Get showroom */
			var showroom 	= $('<ul></ul>').addClass('showroom');
			
			/* Get tools */
			var tools 		= $('.monitor-tools-buttons-container');
			
			var cs = $('<div></div>').addClass('carousel-slideshow fix');
			
			/* Build showroom */
			$('item',response).each(function(index)
			{
				li = $('<li></li>');
				
				/* Set slide attributes */
				li.attr('title',		$(this).attr('title'));
				li.attr('description', 	$(this).attr('description'));
				li.attr('domain',		$(this).attr('domain'));
				li.attr('fullsize',		$(this).attr('fullsize'));
				li.attr('image',		$('image',this).text());
				
				
				li.addClass(0 == index ? 'visible active' : '').appendTo(showroom);
			});
			
			tools.animate({ width:863}, gx.fx.rebuild, function()
			{
				/* Animate shadow */
				$('.area-shadow').animate({ opacity: 400*gx.opacity}, gx.fx.rebuild);
				
				/* Animate frame height */
				$('.monitor-frame').animate({
					height:440
				}, gx.fx.rebuild, function()
				{
					showroom.appendTo(this);
				
					cs.append('<ul></ul>');
					
					$(this).parent().append('<a class="arrow arrow-prev" rel="large" href="javascript:void(0)"></a>')
						   			.append('<a class="arrow arrow-next" rel="large" href="javascript:void(0)"></a>');
					
					carousel.appendTo(tools)
						.append('<a class="carousel-arrow carousel-prev" rel="small" href="javascript:void(0)"></a>')
						.append(cs)
						.append('<a class="carousel-arrow carousel-next" rel="small" href="javascript:void(0)"></a>');
						

					cs.carousel(typeof args == "number" ? args : 0);

					$('.carousel-arrow').add('.arrow').OE();
					
					gx.loader(false);
					
					/* END transition */
					gx.destruct();
				});
			});
		});
	});
};
Galaxy.prototype.index = function(args)
{	
	this.construct(args, function()
	{
		$('.location').text(gx.texts.toxic);
		
		gx.loadGalaxy(gx.getDomain() + '/plugins/portfolio/gateway.php?page=index', null, function( response )
		{
			var ul = $('<ul class="showroom"></ul>').addClass('showroom');
			
			var size = 0;
			
			var tools = $('.monitor-tools-buttons-container');
			
			$('item',response).each(function(index)
			{
				li = $('<li title="' + $(this).attr('title') + '" technologies="' + $(this).attr('technologies')  + '"></li>');
				
				im = new Image();
				
				im.onload = function(){};
				
				im.src = $('image',this).text();
				
				li.append(im).addClass(0 == index ? 'visible active' : '').appendTo(ul);
			});
			
			tools.css({ width: 'auto'}).append('<div class="monitor-data"></div>').append('<div class="monitor-page"><ul class="fix"></ul><div class="baloon"><a href="">' + gx.texts.details + '</a></div></div>');
			
			$('.area-shadow').animate({ opacity: 300*gx.opacity}, gx.fx.rebuild);

			$('.monitor-frame').animate(
			{
				height: 340
			},gx.fx.rebuild,function()
			{
				$(this).append(ul);
				
				ul.showroom();
				
				gx.loader(false);
				
				gx.destruct();
			});
		});
	});
};

Galaxy.prototype.navigation = function()
{
	var obj = this; 
	
	$('.gui-menu li a').mouseover(function()
	{
		this.name = '#' + this.href.substring(this.href.lastIndexOf('/') + 1);
		
	}).click(function()
	{
		if (!gx.running)
		{
			gx.stopAll();
			
			var parent = $(this).parents().filter('li:first');
			
			if (!parent.hasClass('active') || 1)
			{
				var method = $(this).attr('href').domain();
	
				parent.addClass('active')
					  .andSelf()
					  .siblings()
					  .find('a')
					  .andSelf()
					  .removeClass('active')
					  .removeClass('selected');
				
				obj.delegate(obj, obj[method.slice(1 + method.lastIndexOf('/'))], [$(this).text()])();
				
				return false;
			}
		}
		
		return false;
	});
	
	return this;
};

Galaxy.prototype.selectPrimaryButton = function( href )
{
	$('.gui-menu li a').each(function()
	{
		if ($(this).attr('href').indexOf(href) != -1)
		{
			$(this).parents().filter('li:first').addClass('active').siblings().removeClass('active').find('a').removeClass('selected');
		}
	});
	
	return this;
};

Galaxy.prototype.carousel = function( item )
{
	var obj = jQuery(self);
	
	var fullscale = function( image )
	{
		gx.loader(true).blockUI(false);
		
		
		var container = $('<div></div>').addClass('fullscale overlay-layer').css(
		{
			display:			'none',
			width: 				screen.width-50,
			marginLeft: 		(-screen.width+50)/2
		});
			
		container.unbind().click(function()
		{
			$(this).remove();
			gx.loader(false).unblockUI();
		});
		
		container.appendTo(document.body);
		
		var preview = new Image();
		
		preview.onload = function()
		{
			container.css(
			{
				background:			'url(' + this.src + ') 0 0 no-repeat',
				backgroundPosition: 'center center',
				height: this.height
			}).fadeIn(500);
		};
		preview.src = gx.getDomain() + '/explorer/portfolio/' + image;
		
		return false;
	};
	
	var tooltip = function( visible, label, domain, info, link, fullsize )
	{
		var tip = $('.tooltip');
		
		fullsize = null !== fullsize ? (fullsize.length > 0 ? fullsize : null) : null;
		
		switch(visible)
		{
			case false: tip.stop(true,true).hide(0).css({ bottom: 30, opacity:0 });
				break;
			case true:
			
				_gaq.push(['_trackEvent', 'Portfolio', 'Open', label]);
				
				/* Fill values */
				$('.tooltip-project-label',tip).text(label);
				$('.tooltip-project-domain',tip).text(domain);
				
				switch(fullsize)
				{
					case null:
						$('.tooltip-project-link a',tip).unbind().attr('href','http://' + domain).attr('target','_blank');
						break;
					case false:
						break;
					default:
						$('.tooltip-project-link a',tip).unbind().bind('click',function()
						{
							return fullscale(fullsize);
						});
						break;
				}

				$('.tooltip-project-info',tip).text(info);
				
				tip.stop(true,true).show(0).animate(
				{
					bottom:50,
					opacity: 1
				},300);
				break;
		}
	};
	
	var loadSlide = function(source, callback)
	{
		var image = new Image();
		
		gx.loader(true);

		/* Attach slide load callback */
		image.onload = function()
		{
			callback(image);
		}
		
		/* Image source */
		image.src = source;
	};
	
	var showSlide = function(index)
	{ 
		var pair = [$('li.active','.showroom'),$('li','.showroom').eq(index)];
		
		tooltip(false,null,null,null,null,false);
		
		/* FadeOut active slide */
		pair.shift().stop(true,true).removeClass('active').fadeOut(gx.fx.fade);
		
		/* FadeIn Active slide */
		slide = pair.shift();
		
		loadSlide(slide.attr('image'), 
		function(image)
		{
			gx.loader(false);
			
			slide.stop(true,true).addClass('active').empty().append(image).fadeIn(gx.fx.fade, function()
			{
				tooltip(true, 
					slide.attr('title'), 
					slide.attr('domain'), 
					slide.attr('description'),
					slide.attr('domain'),
					slide.attr('fullsize'));
			});
		});

		return false;
	};
	
	var nextSlide = function( obj, type )
	{
		var item = $('li.active',obj);
		
		if (type.indexOf('large') != -1 && item.next().length)
		{
			item.removeClass('active').andSelf().next().addClass('active');
			
			showSlide(item.next().index());
		}
		
		
	};
	var prevSlide = function( obj, type )
	{
		var item = $('li.active',obj);
		
		if (type.indexOf('large') != -1 && item.prev().length)
		{
			item.removeClass('active').andSelf().prev().addClass('active');
			
			showSlide(item.prev().index());
		}
	};
	
	return this.each(function(index, obj)
	{
		var items = $('ul',obj);
		
		$('.showroom li').each(function(index)
		{
			var item = $(this).clone(false);
			
			var link = $('<a href="javascript:void(0)">' + item.attr('title') + '</a>').bind('click',function()
			{
				slide = $(this).parents().filter('li:first');
				slide.addClass('active').siblings().removeClass('active');
					
				showSlide(index);
			});
			
			item.empty().append(link).appendTo(items);
		});
		
		$('li',obj).OE();
		
		
		$(obj).jCarouselLite(
		{
			btnNext: '.carousel-next, .arrow-next',
			btnPrev: '.carousel-prev, .arrow-prev',
	        visible: 5,
	        speed: gx.fx.scroll,
	        circular: false,
	        easing: 'easeInExpo',
	        onNext: nextSlide,
	        onPrev: prevSlide
	    });
	    
	    $('li',obj).eq(item).addClass('active').siblings().removeClass('active');
	    
	    $('.carousel-next, .carousel-prev').disableTextSelect();
	    
	    showSlide(item);
	});
};

Galaxy.prototype.DOMTip = function()
{
	if (!$('.tooltip').length)
	{
		var tip = $('<div></div>').addClass('tooltip fix');
		
		$('<div></div>').addClass('tooltip-project-name toolcol')
						.append('<div class="tooltip-project-label"></div>')
						.append('<div class="tooltip-project-domain"></div>').appendTo(tip);
						
		tip.append('<div class="tooltip-project-info toolcol"></div>')
		   .append('<div class="tooltip-project-link toolcol"><a href="">' + gx.texts.visit + '</a></div>')
		   .appendTo('.monitor-frame');
	}
	
	return this;
};

Galaxy.prototype.display = function()
{	
	/* Window location */
	var location = window.location.toString().substring(window.location.toString().indexOf('.bg') + 4);
	
	/* System language */
	var language = null;
	
	/* Display */
	$('.galaxy').show(0);
	
	params = location.trim().split(/\/+/);
	
	if (params.length && location.length > 0)
	{
		language = params.shift();
		
		if (language.length != 2) 
		{
			params.unshift(language);
		}

		if (params.length)
		{
			switch(params.join('/').toLowerCase())
			{
				case 'portfolio':
					this.portfolio();
					break;
				default:
					$('.auto-column').hide(0);
					
					this.construct(null, function()
					{
						gx.appendCarousel(function()
						{
							gx.page(params.join('/'),true);
						}, false);
					});				
			}
		}
	}
	
	return this;
};

Galaxy.prototype.block = function()
{
	$('.ie').show();
	
	return false;
};

var gx = new Galaxy();

/* Block IE6 */
gx.addBlockStyles();

$(window).ready(function()
{
	preloader.addFlashPreloader("preloader")
			 .addFlashPreloader("loader")
			 .prePreload().preload(function()
				{
					preloader.postPreload();
					gx.navigation().effects().display(true);
				});
});