UI = {
	'debugging':		false,
	'loggedIn':			false,
	'sLoggedIn':		false,
	'iPerRow':			20,
	'highZIndex':		1000,
	'fadeWornItems':	false,
	'fadeWornItemsT':	false,
	'setup':			function(){
		$('img')
			.one('load', function(){$(this).show();});
		
		UI.randAvatar();
		
		if(window.location.hash && window.location.hash.match(/\#d/)){
			UI.debugging = true;
		} else if(window.location.hash && window.location.hash.match(/\#s\:[a-zA-Z]+/)){
			UI.loadAvatar([window.location.hash.match(/\#s\:([a-zA-Z]+)/)[1]], true);
		} else if($('body').is('.loggedin.withdefault')){
			UI.loadAvatar(['default']);
		}
	},
	
	'log': function(m){
		if(console.log && UI.debugging){
			console.log((new Date).getTime()+': '+m);
		}
	},
	
	'randAvatar': function(){
		// Set hair current to default
		Hair.current = Hair['default'];
		
		// Set random hair color
		var hairColor = '#'+($.map(Array(3), function(e){
			var hex = Math.floor(Math.random()*256).toString(16);
			
			return hex.length == 2 ? hex : '0'+hex;
		}).join(''));
		
		Hair.setColor('base', hairColor);
		
		// Set random hair style
		var hairStyle 	= $('div#mid-hair-container > div:not(.hair-style-1)');
		var hairStyle	= $(hairStyle[Math.floor(Math.random()*hairStyle.length)])
							.attr('class').match(/hair-style-([0-9]+)/)[1];
		
		Hair.setStyle(hairStyle);
		
		// Set random base components
		$('#mid-base h3').each(function(){			
			var elems = $(this)
				.next()
				.find('> div > div');
			
			if($(this).next().is('#mid-base-body')){
				$(elems[Math.floor(Math.random()*7)]).trigger('click');
			} else if($(this).next().is('#mid-base-zombie')) {
				return;	
			} else {
				$(elems[Math.floor(Math.random()*elems.length)]).trigger('click');
			}
		});	
	},
	
	'setDefaultAvatar': function(id){
		$.getJSON('ajax/index.php/Account/setDefaultAvatar/', {'avatar': id}, function(r){
			if(r.error){
				alert('ERROR: '+r.error);
				return;
			} else {
			
				alert('Default set!');
			}
		});
	},
	
	'loadAvatar': function(selected, shared){
		$.getJSON('ajax/index.php/Account/getAvatarData/', {'avatar': selected.join(','), 'shared': shared}, function(r){
			var avatar = r.avatar;
			
			if(avatar){
				UI.setAvatarData(avatar);
			}
			
			UI.overlay.hide();
		});
	},
	
	'getAvatarData': function(){
		var items = [];
		
		$.each(Wardrobe.items.equipped, function(k, v){
			items.push(Wardrobe.items.data[v]);
		});
		
		return {'clothes': items, 'hair': Hair.current, 'base': Wardrobe.getBase()};
	},
	
	'setAvatarData': function(avatar){		
		if(avatar.base != false){
			Wardrobe.inspiration.base = avatar.id;
			
			avatar.base.skin = [avatar.base.skin.substr(0, 1), avatar.base.skin.substr(1)];
			avatar.base.eyes = avatar.base.eye.split('_');
			
			$('div#mid-base-body img.base-skin[src$="m'+avatar.base.skin[1]+'.png"], div#mid-base-body img.base-skin[src$="f'+avatar.base.skin[1]+'.png"]')
				.add('div#mid-base-gender img.base-gender[src*="base/'+avatar.base.skin[0]+'"]')
				.add('div#mid-base-mouth img.base-mouth[src$="'+avatar.base.mouth+'.png"]')
				.add('div#mid-base-nose img.base-nose[src$="'+avatar.base.nose+'.png"]')
				.add('div#mid-base-eyecolor img.base-eye[src$="_'+avatar.base.eyes[1]+'.png"]')
				.add('div#mid-base-eyestyle img.base-eye[src*="'+avatar.base.eyes[0]+'_"]')
				.parent()
				.click();
			
			if(avatar.base.zombie){
				$('div#mid-base-zombie img.base-zombie[src*="'+avatar.base.zombie+'.png"]').click();
			} else {
				$('.base-zombie-none').click();
			}					
		}
		
		if(avatar.hair != false){
			Wardrobe.inspiration.hair = avatar.id;
			
			$('.hair-preview.hair-style-'+avatar.hair.style)
				.click();
			
			Hair.current = avatar.hair;
			Hair.update();
		}
		
		if(avatar.clothes != false){
			Wardrobe.inspiration.clothes = avatar.id;
			
			$('div#w-equipped li:not(#worn-hair)').each(function(i, e){
				var itemID = $(this).attr('class').match(/item-([0-9]+)/)[1];
				
				Wardrobe.items.unequip(itemID);
			});
			
			$.each(avatar.clothes, function(i, item){
				if(item != 'hair'){
					Wardrobe.items.data[parseInt(item.id)] = item;
					Wardrobe.items.equip(item.id);
				} else {
					$('div#w-equipped li#worn-hair')
						.prependTo('div#w-equipped ul');
				}
			});
			
			Wardrobe.items.updateAvatar();
		}	
	},
	
	'editAvatar': function(e){	
		var data = {
			'avatar':	$('#save-avatar-id').val(),
			'name':		$('#save-avatar-name').val(),
			'public':	$('input[name="save-avatar-public"]:checked').val()
		}
		
		$('button#do-edit-avatar')
			.addClass('working');
		
		$.post('ajax/index.php/account/editHA/', {'saveData': JSON.stringify(data)}, function(r){
			if(r.success == true){
				UI.overlay.hide();
				
				$('#load-avatar-container')
					.trigger('update');
			} else {
				alert('ERROR: '+r.error);
			}
		}, 'json');
	},
	
	'saveAvatar': function(e){		
		var data		= {
			'base':			Wardrobe.getBase(),
			'hair':			Hair.current,
			'clothes':		Wardrobe.items.getEquipped()
		};
		
		var saveData	= {
			'name':		$('input#save-avatar-name').val(),
			'public':	$('input:radio[name="save-avatar-public"]:checked').val(),
			'inspiration':	Wardrobe.inspiration		
		};

		$('button#do-save-avatar')
			.addClass('working');
		
		e.preventDefault();
		
		// Check which components should be saved
		$.each(['base', 'hair', 'clothes'], function(i, v){
			var checked = $('#save-avatar-'+v).attr('checked');
			
			if(checked){
				saveData[v] = data[v];
			}
		});
		
		// Actually save
		$.post('ajax/index.php/account/saveHA/', {'saveData': JSON.stringify(saveData)}, function(r){
			if(r.success == true){
				UI.overlay
					.setContent('Your avatar has been saved.')
					.setTitle('Success');
					
				$('#load-avatar-container')
					.trigger('update');				
			} else {
				alert('ERROR: '+r.error);
				
				UI.overlay.hide();
			}
		}, 'json');
	},
		
	'preview':	{
		'spawn':	function(e){
			var t = (new Date).getTime();
			
			// Remove old exploded previews
			UI.preview.destroy();
			
			var gender		= false;
			var which		= false;
			var coords		= false;
			var parent		= $(this).parent();
			var scroll		= parent;
			var label		= $(this).find('.label:eq(0)');
			var lbh			= label.css('margin-left');
			var pWidth		= $(this).parent().innerWidth();
			var pPos		= $(this).position();
			var clone 		= $(this).clone()
								.css('position', 'absolute')
								.addClass('exploded')
								.appendTo(parent);
			
			$(this)
				.addClass('previewing');
			
			clone
				.css({
					'padding-bottom': clone.find('.label').outerHeight(),
				});
			
			if(!$(this).hasClass('base-preview')){
				var coords 	= {
					top: 	Math.max(
								scroll.scrollTop(),
								Math.min(
									parent.innerHeight()+scroll.scrollTop()-clone.outerHeight()-(parseInt($(this).css('margin-top'))*2)-1,
									pPos.top+scroll.scrollTop()-((clone.outerHeight()-$(this).outerHeight())/2)
								)
							),
							
					left:	Math.max(
								0,
								Math.min(
									pWidth+scroll.scrollLeft()-clone.outerWidth()-(parseInt($(this).css('margin-left'))*2)-1,
									pPos.left+scroll.scrollLeft()-((clone.outerWidth()-$(this).outerWidth())/2)
								)
							)
				}
			} else {
				var coords 	= {
					top: 	pPos.top-1,		
					left:	pPos.left-1
				}			
			}
			
			
			// Place clone, add name			
			clone
				.css({
					'top':	coords.top,
					'left':	coords.left+parent.scrollLeft(),
				})
				.appendTo(parent)
				.find('a')
				.bind('click', $.noop)
				.show();

			clone
				.find('canvas')
				.remove();
			
			// Add already worn items to preview
			$('#ha-preview-wearables img')
				.clone()
				.appendTo('.exploded');

			$('.ha-preview-base:eq(0)')
				.clone()
				.prependTo('.exploded')
				.find('canvas')
				.remove();
			
			if(clone.hasClass('base-preview')){
				// If we're previewing a base element,
				// remove matching currently worn element
				// from preview
				
				which	= $(this)
							.find('img[class^="base-"]:eq(0)')
							.attr('class')
							.match(/base-(skin|eye|nose|mouth|zombie)/)[1];
				clone
					.find('div.ha-preview-base img.base-'+which)
					.attr('src', $(this).find('img.base-'+which).attr('src'));
				
				clone
					.find('> img.base-'+which)
					.remove();
				
				if($(this).hasClass('base-zombie-none')){
					clone.find('.base-zombie').remove();
				} else if($(this).hasClass('base-preview-zombie')){
					clone.find('.base-zombie').show();
				}
				
				// And, if previewing gender, update worn items and zombie skin to currently previewed gender
				if($(this).hasClass('base-preview-gender')){					
					gender = $(this).find('img.base-skin').attr('src').match(/base\/(m|f)/)[1];
					
					clone.find('img').each(function(){
						var src		= $(this).attr('src');
						
						if(!src){
							return;
						}
						
						var itemSrc	= src.substr(src.lastIndexOf('/')+1);
						var itemID	= $(this).attr('class').match(/item-([0-9]+)/);
						
						if(itemID){
							$(this).attr('src', (gender == 'f'
								? Wardrobe.items.data[itemID[1]].o.f
								: Wardrobe.items.data[itemID[1]].o.m));
						}
					});
					
					clone.find('img.base-zombie:visible').each(function(){						
						var src	= $(this)
							.attr('src')
							.replace(/base\/(f|m)([z0-9]+).png/, 'base/'+gender+'$2.png');
							
						$(this).attr('src', src);
					});
				}
			} else if(clone.hasClass('item-preview')){
				$('<div>')
					.addClass('indicator-container')
					.append(
						$('<div>')
							.addClass('indicator')
							.css({
								'height': 250/($('div.exploded > img:not(.previewed)').length+1),
								'top': 0
							})
					)
					.appendTo(clone);
			}
		},
		
		'destroy': function(e){
			var from = (e ? $(e.fromElement || e.relatedTarget) : false);
			
			// Check mouse leaving parent			
			if(from && ($(e.relatedTarget).is('.popout') || $(e.relatedTarget).parents('.popout').length > 0))
			{
				return;
			}
			
			$('.hair-preview.exploded canvas.base-hair')
				.prependTo('.previewing');
			
			$('.popout.exploded')
				.remove();
			
			$('.previewing')
				.removeClass('previewing');
		}
	},
	
	'overlay': {
		'selectors': {
			'backdrop':	'#overlay-backdrop',
			'overlay':	'#overlay',
			'title':	'#overlay .title',
			'body':		'#overlay .body',
			'error':	'#overlay .error',
			'tabTitle': '#switch-generic .title',
			'tabSide':	'#w-genericside',
			'tabBody':	'#mid-generic'
		},
		
		'setContent': function(t){
			var body  = $(UI.overlay.selectors.body);
			
			// Delete old buttons
			$('#window-buttons')
				.remove();
			
			// Set body content
			body.html(t);
			
			// Place buttons below body, otherwise they could get lost at the bottom
			// if body overflows
			
			if(body.find('.buttons').length < 1){
				buttons = $('<div>')
					.addClass('buttons')
					.append(
						$('<button>')
							.text('Close')
							.addClass('close-overlay suggested')
					);
			} else {
				buttons = body.find('.buttons');
			}
			
			buttons
				.attr('id', 'window-buttons')
				.insertAfter(UI.overlay.selectors.body);
			
			$(window).resize();
			
			return UI.overlay;
		},
		
		'setTabContent': function(t){
			$('#generic-footer, #w-generic').empty();
			
			$('#mid-generic #generic-content')
				.html(t);
			
			if($('#generic-content .footer').length > 0){
				$('#generic-content .footer')
					.appendTo('#generic-footer');
				
				window.setTimeout(function(){
					$('#generic-content').css('bottom', $('#generic-footer').outerHeight());
				}, 100);
			} else {				
				$('#generic-content')
					.css('bottom', 0);
			}
			
			// Sidebar?
			if($('#generic-content .sidebar').length > 0){
				$('#generic-content .sidebar')
					.appendTo('#w-generic')
					.find('> :eq(0)')
					.unwrap();
			}
			
			return UI.overlay;
		},
		
		'show': function(t){			
			if(t){
				$(UI.overlay.selectors.body).text(t);
			}
			
			$(UI.overlay.selectors.backdrop)
				.fadeIn()
				.css({
					'z-index':	++UI.highZIndex
				});
			
			window.setTimeout(function(){
				$(UI.overlay.selectors.body)
					.fadeIn(function(){
						$(window).resize();
					});		
			}, 50);
			
			return UI.overlay;
		},
		
		'showTab': function(){
			$('#switch-generic')
				.fadeIn()
				.click();
			
			return UI.overlay;
		},
		
		'load': function(t, d, o){
			if(!t){return false;}
			
			
			var data	= $.extend(d || {}, {'window': t});
			var content = false;
			var title	= false;
						
			$.getJSON('ajax/index.php/UI/loadWindow/', data, function(r){
				if(r.success != true){
					alert(r.error);
				} else {
					content		= $(r.templateContents);
					title		= content.filter('#window-title').text() || 'Untitled Window';
					filtered	= content.not('#window-title, input[name="tabbed"]');
					
					if(content.filter('input[name="tabbed"]').length > 0){
						UI.overlay
							.setTabContent(filtered)
							.setTabTitle(title)
							.showTab();
					} else {
						UI.overlay
							.setContent(filtered)
							.setTitle(title)
							.show();
					}
					
					if(o && o.onload){
						o.onload();
					}
				}
			});
		},
		
		'hide': function(){
			$(UI.overlay.selectors.body)
				.fadeOut();
				
			$(UI.overlay.selectors.backdrop)
				.fadeOut();
			
			return UI.overlay;
		},
		
		'recalc': function(){
			var bh = $(window).height();
			var oh = $('#overlay').height();
			var sp = (bh-oh)/2;
			
			var margin = {
				top: -($(UI.overlay.selectors.overlay).outerHeight()/1.75),
				left: -($(UI.overlay.selectors.overlay).outerWidth()/2) 
			}
			
			$(UI.overlay.selectors.overlay)
				.css({
					'margin-left': margin.left,
					'margin-top': margin.top
				})
				
			return UI.overlay;	
		},
		
		'setTitle': function(t){
			$(UI.overlay.selectors.title)
				.text(t);
			
			return UI.overlay;
		},
		
		'setTabTitle': function(t){
			$(UI.overlay.selectors.tabTitle)
				.text(t);
			
			return UI.overlay;
		}
	},
	
	'switchViewport': function(selector){
		$('#main > div')
			.not(selector)
			.fadeOut();
		
		$('#main')
			.find(selector)
			.fadeIn();
	}
}

$(function(){
	$(UI.overlay.selectors.overlay)
		.find('button.cancel')
		.live('click', function(e){
			e.preventDefault();
			
			UI.overlay.hide();
		});
	
	$('button.to-wardrobe')
		.click(function(){UI.switchViewport('#wardrobe')});
	
	// Disable all form submitting by hitting enter key
	(function(){
		$('form')
			.live('submit', function(e){
				e.preventDefault();
				return false;
			});
	})();
	
	// Hovering things
	(function(){
		var previewAvatar = function(id, e){
			var initBy	= $(e.currentTarget);
			
			return $('<div>')
				.data('initBy', initBy)
				.addClass('float-preview')
				.append(
					$('<div>')
						.addClass('content')
						.css({'width': 125, 'height': 250})
						.append(
							$('<img>')
								.attr('src', 'a/'+id)
						)
					
				)
				.css({'top': 0, 'left': 0, 'z-index': ++UI.highZIndex})
				.hide()
				.appendTo('body');
		}

		var previewItem = function(id, e){
			var initBy	= $(e.currentTarget);
			
			return $('<div>')
				.data('initBy', initBy)
				.addClass('float-preview')
				.css({'top': 0, 'left': 0, 'z-index': ++UI.highZIndex})
				.append(
					$('<div>')
						.addClass('content item f')
						.css({'width': 125, 'height': 250})
						.append(
							$('<img>')
								.attr('src', 'i/'+id)
						)
					
				)
				.css({'top': 0, 'left': 0})
				.hide()
				.appendTo('body');
		}
				
		var doPreview = function(e, preview){
			$('.float-preview').fadeOut(500);
			
			var iCount	= preview.find('img').length;
			var loaded	= 0;
			var initBy	= $(e.currentTarget);
			var pos	= {
				top:	initBy.offset().top-(preview.outerHeight())-4,
				left:	(initBy.offset().left+initBy.outerWidth()/2)-(preview.outerWidth()/2)
			}
			
			if(pos.top < 0){
				pos.top = initBy.offset().top+initBy.outerHeight()+4;
				preview.addClass('down');
			}
			
			$(preview)
				.css({top: pos.top, left: pos.left})
				.append(
					$('<div>').addClass('loading')
				)
				.fadeIn();
			
			$(preview).find('img').on('load', function(){
				var initBy = preview.data('initBy');
				var pos	= {
					top:	initBy.offset().top-(preview.outerHeight())-4,
					left:	(initBy.offset().left+initBy.outerWidth()/2)-(preview.outerWidth()/2)
				}

				if(pos.top < 0){
					pos.top = initBy.offset().top+initBy.outerHeight()+4;
					preview.addClass('down');
				}
							
				if(++loaded == iCount){
					$(this).parents('.float-preview').find('.loading')
						.fadeOut(500);
				}
				
				$(preview)
					.css({top: pos.top, left: pos.left})
					.fadeIn(500);
			});
			
			$(e.currentTarget).on('mouseleave', function(e){
				var to = $(e.relatedTarget);
				
				if(!to.hasClass('float-preview')){
					preview.fadeOut(500, function(){preview.remove()});
				} else {
					$(this).off('mouseleave');
					
					preview.on('mouseleave', function(){
						preview.fadeOut(250, function(){preview.remove()});
					});
				}
			});
		}
		
		$(document)
			.on('mouseenter', '.hover-preview', function(e){
				var kind	= $(this).attr('class').match(/preview-(avatar|item)-([0-9]+)/)[1];
				var id		= $(this).attr('class').match(/preview-(avatar|item)-([0-9]+)/)[2];
				var preview	= false;
				
				switch(kind){
					case 'avatar':
						preview = previewAvatar(id, e);	
					break;
					case 'item':
						preview = previewItem(id, e);
					break;
				}
				
				doPreview(e, preview);
			});
	})();
	
	
	// Tagging things
	(function(){
		$(document)
			// Process key presses and entry
			.on('keypress', '.add-tag input:not(.placeholder)', function(e){
				var path 	= window.location.pathname.match(/\/([A-Za-z0-9-]+)\//)[1];
				var itemID 	= $(this).attr('id').match(/add-tag-([0-9]+)/)[1];
 				var tag 	= $.trim($(this).val());
				var all		= [];
				var entry	= $(this);
				
				// On space, add tag
				if(e.which == 13 && tag.length > 2){
					// Check if tag has been previously added
					var all = $.map($('.tag'), function(t){
						var c = $(t).clone();
							c.find('.delete').remove();
							
						return $.trim(c.text()).length > 2 ? $.trim(c.text()) : null;
					});
					
					// If already added, do nothing
					if($.inArray(tag, all) == -1){
					
						// Add to DB
						$.getJSON('/'+path+'/ajax/index.php/UI/tag/', {item: itemID, tag: $(this).val()}, function(r){
							if(!r.error){
								$('<span>')
									.addClass('tag')
									.attr('id', 'tag-'+r.tagID)
									.text(tag)
									.insertBefore(entry.parents('.add-tag:eq(0)'))
									.hide()
									.append(
										$('<span>')
											.addClass('delete')
											.html('&#10006;')
									)
									.fadeIn(250);			
							} else {
								alert(r.error);
							}
						});
					}
					
					$(this).val('');
				}
			})
			
			// Process deleting tags
			.on('click', '.tag .delete', function(){
				var path 	= window.location.pathname.match(/\/([A-Za-z0-9-]+)\//)[1];
				var tagID	= $(this).parent().attr('id').match(/tag-([0-9]+)/)[1];
				var tag		= $(this).parent();
				
				$.getJSON('/'+path+'/ajax/index.php/UI/untag/', {tagID: tagID}, function(r){
					if(!r.error){
						tag.fadeOut();		
					} else {
						tag.find('.delete').fadeOut();
					}
				});
			});
	})();
	
	// Rating things
	(function(){
		$(document)
			.on('mouseenter', '.stars:not(.entry):not(.rated)', function(){
				if(!$(this).data('origWidth')){
					$(this).data('origWidth', $(this).width());
				}
				
				if($(this).find('.entry').length == 0){
					$(this)
						.clone()
						.addClass('entry')
						.appendTo($(this))
						.children()
						.remove();
				}
			})
			
			// Remove rating entry on mouseout without entry
			.on('mouseleave', '.stars:not(.entry)', function(){
				$('.stars:not(.rated) .entry:not(.pending)')
					.remove();
			})
			
			// Update size of rating stars
			.on('mousemove', '.stars:not(.entry):not(.rated)', function(e){
				var pos = Math.floor(Math.max(0, Math.min(100, (e.pageX-($(this).offset().left))/$(this).width()*100))*1000)/1000;
				
				$(this).find('.entry').css('width', pos+'%');
			})
			
			// Submit rating
			.on('click', '.stars:not(.rated):not(.entry)', function(e){
				var cont	= $(this).parents('.rate');
				var entry	= $(this).find('.entry');
				var path 	= window.location.pathname.match(/\/([A-Za-z0-9-]+)\//)[1];
				var label 	= cont.find('.hover');
				var rating	= {
					kind:	$(this).parents('.rate').attr('class').match(/(avatar|item)-([0-9]+)/)[1],
					id:		$(this).parents('.rate').attr('class').match(/(avatar|item)-([0-9]+)/)[2],
					rate:	Math.floor(Math.max(0, Math.min(100, (e.pageX-($(this).offset().left))/$(this).width()*100))*1000)/1000
				}
				
				entry.addClass('pending');
				label.text('Rating...');
				
				$.getJSON('/'+path+'/ajax/index.php/UI/rate/', rating, function(r){
					entry
						.removeClass('pending');
					
					if(r.success == true){
						entry.parent()
							.addClass('rated');
						
						// Update rating
						cont
							.find('.stars.allusers')
							.css('width', r.rating.average+'%');
						
						cont
							.find('.count')
							.text(r.rating.count);
							
						cont
							.find('.pluralize')
							.toggle(r.rating.count != 1);
							
						label.text('Rated!');
					} else {
						label
							.addClass('error')
							.text('Error!');
							
						alert(r.error);
					}
				});			
			});
	})();
	
	// Fade landing pane avatars in and out
	(function(){
		var t = 5000;
		var f = function(){			
			if($('.showcase-avatar:visible').length < 1){
				window.clearInterval(i);
				return;
			}
			
			var fOut = $('.showcase-avatar.active')
						.removeClass('active')
						.fadeOut(500);
						
			var fIn  = $(fOut.next().length > 0
							? fOut.next()
							: fOut.parent().find('.showcase-avatar:eq(0)')
						)
						.addClass('active')
						.fadeIn(500);
		}
		
		var i = window.setInterval(f, t);
		
		$('#landing-showcase')
			.mouseenter(function(){
				window.clearInterval(i);
			})
			.mouseleave(function(){
				i = window.setInterval(f, t);
			});
	})();
	
	// Switch designer tabs
	$('#switch-base, #switch-hair, #switch-wardrobe, #switch-generic')
		.live('click', function(){
			// Do nothing if already active tab
			if($(this).hasClass('active')){
				return;
			}
					
			var switchTo	= $(this).attr('id').match(/switch-([a-z]+)/)[1];
			var hide		= '#mid-base, #mid-clothes, #mid-hair, #mid-generic, #w-search, #w-hairdye, #w-generic';
			var filter		= {
				'base':		'#mid-base',
				'wardrobe':	'#mid-clothes, #w-search',
				'hair':		'#mid-hair, #w-hairdye',
				'generic':	'#mid-generic, #w-generic'
			}
			
			$(this)
				.addClass('active')
				.siblings()
				.removeClass('active');
			
			$(hide).fadeOut();
			$(filter[switchTo]).fadeIn();
			
			if(switchTo == 'base' || (switchTo == 'generic' && $('#w-generic').is(':empty'))){
				$('#w-mid')
					.css('right', 8);
				$('#w-right')
					.css({
						'width':	0,
						'opacity':	0
					});
			} else {
				$('#w-mid')
					.css('right', 250);
				$('#w-right')
					.css({
						'width':	250,
						'opacity':	1
					});
			}
			
			window.setTimeout(function(){$(window).resize()}, 410);
		});
	
	// Periodically check if user is logged in to Subeta
	(function(){
		var f = (function f(){			
			var img = $('<img>')
				.attr('src', 'http://subeta.net/slib/hex.php/base.png?t='+(new Date).getTime())
				.css({
					'position':	'absolute',
					'top':		-1000,
					'left':		-1000
				})
				.bind('load', function(){
					UI.sLoggedIn = true;
					
					$('body').addClass('sb-loggedin');
					
					img.remove();
				})
				.error(function(){
					UI.sLoggedIn = false;
					
					$('body').removeClass('sb-loggedin');
					
					img.remove();
				})
				.appendTo('body');
			
			return f;
		})();

		
		window.setInterval(f, 60000);
	})();
	
	// Check for new updates
	(function(){
		var f = (function f(){
			$.getJSON('ajax/index.php/account/getUpdateCount', function(r){
				if(r.success && r.count){	
					$('.updates')
						.find('.update-count')
						.text(r.count);
						
					if(r.count > 0){
						$('.updates-plural').toggle(r.count != 1);
						$('.updates').fadeIn();
					} else {
						$('.updates-plural').show();
						$('.updates').fadeOut();
					}
				}
			});
			
			return f;
		})();

		
		window.setInterval(f, 30000);
	})();
});
