var windowsLoaded = [];
$.fn.reverse = [].reverse;

$(function(){
	// Spawn login window when necessary
	$('.spawn-login').live('click', function(){
		UI.overlay.load('login');
	});
	
	// And close it, too
	$('button.close-overlay').live('click', function(){
		UI.overlay.hide();
	});
	
	// Spawn logout window
	$('.spawn-logout').live('click', function(){
		$.getJSON('ajax/index.php/Account/logout/', function(r){
			if(r.success){
				$('.login-user')
					.text('guest');
				
				$('body')
					.removeClass('loggedin');
				
				UI.overlay.load('loggedout');
			}
		});
	});

	// Registration window
	$('.spawn-registration').live('click', function(){
		UI.overlay.load('createaccount');
	});
	
	// Save avatar window
	$('span#init-save-avatar').live('click', function(){		
		UI.overlay.load('save-avatar');
	});

	$('span#init-share-avatar').live('click', function(){
		var d = UI.getAvatarData();
		var l = $(this);
		
		l.addClass('working');
		
		$.getJSON('ajax/index.php/Account/getShareURL/', {'avatar': window.btoa(JSON.stringify(d))}, function(r){
			if(r.error){
				alert('ERROR: '+r.error);
				return;
			} else {
				l.removeClass('working');
				UI.overlay.load('share-avatar', {'shareURL': r.url});
			}
		});
	});
	
	// Saving avatar
	$('form#save-avatar').live('submit', function(e){
		UI.saveAvatar(e);
	});
	
	$('button#do-save-avatar').live('click', function(e){
		UI.saveAvatar(e);
	});
	
	/// Editing avatar
	$('form#edit-avatar').live('submit', function(e){
		UI.editAvatar(e);
	});
	
	$('button#do-edit-avatar').live('click', function(e){
		UI.editAvatar(e);
	});
		
	// Export avatar
	if(window.btoa && JSON.stringify){
		$('#export-ha').live('click', function(){
			var clicked = $(this).addClass('working');
			
			// Clear lingering iframes
			$('iframe').remove();
			
			// Get images used in avatar
			var images = window.btoa(JSON.stringify($.map($('#ha-preview img:visible'), function(e){
				if($(e).css('opacity') == 1){
					return $(e).attr('src');
				}
				
				return;
			})));
			
			// Add new iframe
			iframe = $('<iframe></iframe>')
				.appendTo('body')
				.hide()
				.attr('src', 'ajax/index.php/account/prepareDownloadImage/?data='+images)
				.one('load', function(){
					var imgID = $(this).contents().text();
					
					clicked.removeClass('working');
					
					$(this)
						.attr('src', 'ajax/index.php/account/downloadImage/?img='+imgID);
				});
		});
	} else {
		$('#export-ha').remove();
	}
	
	// Load avatar window
	$('span#init-load-avatar').live('click', function(){
		UI.overlay.load('load-avatar', false, {
			'onload': function(){
					// Remove loading indicator
					$('#load-avatar-container img').load(function(){
						$(this).parent().removeClass('loading');
					});
				}
			});
		});

	// Updates window
	$('span.show-updates').live('click', function(){
		UI.overlay.load('updates');
	});
	
	// New updates window
	$('span.show-new-updates').live('click', function(){
		UI.overlay.load('updates', {'new': true});
		
		$(this)
			.fadeOut()
			.find('.update-count')
			.text('0');
		
		$('.updates-plural').show();
	});	
				
	// Show loading indicator until page finishes loading
	UI.overlay.hide();
	
	// Login window
	var doLogin = function(e){
		var data = {
			'user': $('input#login-username').val(),
			'pass':	$('input#login-password').val()
		}
		
		$('.error').remove();
		
		e.preventDefault();
		
		if(!data.user){
			$('<div>')
				.addClass('error')
				.text('Please enter your username')
				.insertAfter('input#login-username')
		}
		
		if(!data.pass){
			$('<div>')
				.addClass('error')
				.text('Please enter your password')
				.insertAfter('input#login-password')
		}
		
		if(data.user && data.pass){
			$.getJSON('ajax/index.php/Account/authUser/', data, function(r){
				$('.error').remove();
				
				if(r.success == true){
					// Load default HA?
					if(r.defaultHA && confirm('Load default avatar?')){							
						UI.setAvatarData(r.defaultHA);
					}
					
					$('body')
						.addClass('loggedin');
						
					$('.login-user')
						.text(data.user);
					
					UI.overlay.hide();
					UI.switchViewport('#wardrobe');
				} else {
					switch(r.errorCode){
						case 1:
							$('<div>')
								.addClass('error')
								.text(r.error)
								.insertAfter('input#login-username')							
						break;
						case 2:
							$('<div>')
								.addClass('error')
								.text(r.error)
								.insertAfter('input#login-password')
						break;
					}
				}
			});
		}	
	}
	
	$('#login-form')
		.live('keyup', function(e){
			if(e.which == 13){
				doLogin(e);
			}
		});
		
	$('button#do-login')
		.live('click', doLogin);
	
	// Login window
	var createAccount = function(e){		
		var data = {
			'un': $('input#account-username').val(),
			'sn': $('input#account-subetaname').val(),
			'p'	: $('input#account-password').val(),
			'p2': $('input#account-password-repeat').val()
		}
		
		$('.error').remove();
		
		e.preventDefault();
		
		$.getJSON('ajax/index.php/Account/create/', data, function(r){
			$('.error').remove();
			
			if(r.success == true){
				$('body')
					.addClass('loggedin');
					
				$('.login-user')
					.text(data.un);
				
				UI.overlay.hide();
				UI.switchViewport('#wardrobe')				
			} else {					
				switch(r.errorCode){
					default:
						$('<div>')
							.addClass('error')
							.text(r.error)
							.insertBefore('form#account-create-form')							
					break;
				}
			}
		});
	};
	
	$('button#do-account-create')
		.live('click', createAccount);

	$('#account-create-form')
		.live('keyup', function(e){
			if(e.which == 13){
				createAccount(e);
			}
		});
	
	// Recalc dimensions
	$('#overlay .body, #overlay .buttons').live('DOMNodeInserted', function(){
		UI.overlay.recalc();	
	});
	
	// Resizing
	$(window).resize(function(){
		// Set margin on fitted elements
		$('.fit-elements:visible').each(function(){
			var minPad	= $(this).attr('class').match(/mp-[0-9]+/)
							? parseInt($(this).attr('class').match(/mp-([0-9]+)/)[1])
							: 24;
			var pWidth	= $('<div>').css('border', '1px solid red').addClass('gw').appendTo(this).width()-2;
			var eWidth	= $(this).find('div:eq(0)').outerWidth()+minPad*2;
			var canFit	= Math.floor(pWidth / eWidth);
			var margin	= (pWidth-((canFit)*eWidth))/(canFit*2);
			
			$('.gw').remove();
			
			if($(this).children().length <= canFit){
				return;
			}
			
			$(this).find('> div').css({
				'margin-left':	(minPad+margin)+'px',
				'margin-right':	(minPad+margin)+'px'
			});		
			
			UI.iPerRow = canFit;
		});
		
		// Set max height of overlay body
		(function(){
			var margin 				= 64;
			var overlayBody			= $(UI.overlay.selectors.body);
			var overlayOuterHeight	= $(UI.overlay.selectors.overlay).outerHeight()
										-overlayBody.outerHeight();
			
			overlayBody.css('max-height', $('#overlay-backdrop').height()-(margin * 2)-overlayOuterHeight);
			
			window.setTimeout(UI.overlay.recalc, 100);
			UI.overlay.recalc();
		})()
	});
	
	// Switch wardrobe view type
	$('#mid-switchview li').live('click', function(){
		$('#mid-switchview li')
			.removeClass('active');
			
		$(this)
			.addClass('active');
			
		$('#w-browser')
			.toggleClass('thumbs', $(this).is('.switchview-items'));
			
		$(window).resize();
	});
	
	// Wardrobe searching
	$('#w-search-layers li:not(:empty, .disabled)')
		.live('click', Wardrobe.search.init)
		.live('click', function(e){
			var ms = $(this).parent().find('.active').length > 1 ? true : false;
			
			// Allow multiple selections
			if((e.ctrlKey !== true && e.metaKey !== true)){
				$(this).parent().find('.active').not(this)
					.removeClass('active');
			}
			
			if(!(ms && $(this).hasClass('active')) || (e.ctrlKey == true || e.metaKey == true)){
				$(this).toggleClass('active');
			}
		});

	$('#w-search-custom li').on('click', function(){
		$(this).toggleClass('active');
		
		Wardrobe.search.init();
	});
	
	$('#w-search-name-entry')
		.live('keyup', function(){
			if($(this).val().length >= 3 || $.trim($(this).val()) == ''){
				Wardrobe.search.init();
			}
		});
		
	$('#w-search-order-input')
		.live('change', function(){
			Wardrobe.search.init();
		});
	
	$('#mid-clothes ul.mid-pagination li:not(.label)')
		.live('click', function(){
			$('#mid-clothes ul.mid-pagination li:not(.label)')
				.removeClass('active');
				
			$(this)
				.addClass('active');
				
			Wardrobe.search.toPage(parseInt($(this).text()));
		});
	
	$('#mid-clothes ul.mid-pagination select')
		.live('change', function(){
			Wardrobe.search.init();
			$(this).val();
		});
	
	// Color pickers
	(function(){
		var cPickerTimeout	= 0;
		var cPickerHideTime	= 750;
		var soFarb			= false;
		var linked			= false;
		var updateColors	= function(){
			// Update anything?
				switch(linked.attr('id')){
					case 'w-hair-base-input':
						Hair.setColor('base', soFarb.color);
					break;
					case 'w-hair-basehigh-input':
						Hair.setColor('basehigh', soFarb.color);
					break;
					case 'w-hair-baselow-input':
						Hair.setColor('baselow', soFarb.color);
					break;					
					default:
						if(linked.attr('id').match('hair-highlight')){
							Hair.setHighlight(linked.attr('id').match(/hair-highlight-([0-9]+)/)[1], soFarb.color);
						}
					break;
				}
		}
			
		$('input.color-picker')
			.live('click', function(){
				linked  = $(this);
				
				window.clearInterval(cPickerTimeout);
				
				$('#color-picker')
					.insertAfter($(this).parent())
					.css({
						'position': 'absolute'
					});
					
				if(!soFarb){
					soFarb = $.farbtastic('#color-picker', {'callback': this, 'width': 125});
				} else {
					soFarb.linkTo(this);
				}
				
				window.setTimeout(function(){
					$('#color-picker')
						.slideDown();
				}, 100);
				
				cPickerTimeout = window.setTimeout(function(){
					$('#color-picker')
						.slideUp();
				}, (cPickerHideTime*2)+100);
			})
			.live('change', updateColors)
			.click();
			

		$('div.farbtastic')
			.live('mouseout', function(){
				cPickerTimeout = window.setTimeout(function(){
					$('#color-picker').slideUp();
				}, cPickerHideTime);
			})
			.live('mouseover',function(){
				window.clearInterval(cPickerTimeout);
			})
			.live('mouseup mouseout', updateColors);
	})();
	
	// Add color
	$('#w-search-addcolor-input + button')
		.click(function(){
			var color = $('#w-search-addcolor-input').val();
			
			$('#w-search-colors-container')
				.append(
					$('<li>')
						.css({
							'background-color': color,
							'color': $('#w-search-addcolor-input').css('color')			
						})
						.html(color)
						.append(
							$('<span>')
								.addClass('remove')
								.html('&#10006;')
						)
				);
			
			Wardrobe.search.init();
		});
	
	// Disable colors
	$('#w-search-colors-container li')
		.live('click', function(){
			$(this).toggleClass('disabled');
			Wardrobe.search.init();
		});
			
	// Remove colors
	$('#w-search-colors-container li span.remove')
		.live('click', function(){
			$(this).parent().remove();
			Wardrobe.search.init();
		});
	
	
	// Section collapsing
	$('h3.collapsible')
		.live('click', function(){
			var h = $(this);
			var t = $(this).next();
			
			t.slideToggle(function(){
				h.toggleClass('collapsed');
			});
			
			// Slide up others if specified
			if(h.hasClass('only')){
				h
					.parent()
					.find('h3')
					.not(h)
					.next()
					.slideUp(function(){
						$(this).prev().addClass('collapsed');
					});
			}
			
			$(window).resize();
		});

	// Item previewing
	$('.popout:not(.exploded)')
		.live('mousemove', UI.preview.spawn);
	$('.popout.exploded')
		.live('mouseleave', UI.preview.destroy);
	$('.popout')
		.live('mouseout', UI.preview.destroy);
		
	// Equipping item
	$('.item-preview img')
		.live('click', Wardrobe.items.equip)
		.live('click', UI.preview.destroy)
		.live('mousemove', Wardrobe.items.updatePreview);
	
	$('#show-equipped')
		.live('click', function(){
			var content = $('<div><textarea></textarea></div>');
			
			content
				.find('textarea')
				.css({'height': 110, 'width': 200})
				.text($.map($('#w-equipped li'), function(e){
					var c = $(e).clone();
					
					if(!c.hasClass('item-hair')){
						c.find('span').remove();
					}
					
					return c.text();
				}).join("\n"));
			
			UI.overlay
				.setTitle('Worn items')
				.setContent(content.html())
				.show();
		});
	
	// Make equipped list sortable, unhide
	$('#w-equipped ul')
		.sortable({
			'containment': 	'#w-left',
			'axis': 		'y',
			'change':		Wardrobe.items.updateAvatar
		})
	
	// Allow hiding of single items by clicking them in list of worn item
	$('div#w-equipped li')
		.live('click', function(){
			Wardrobe.items.toggleVisibility(this, $(this).attr('class').match(/item-([0-9]+|hair)/)[1]);
		});
	
	// Set hair to default
	$('#ha-preview-wearables .base-hair')
		.attr('src', Hair.getURL());
	
	// Base editing - hair style
	$('.hair-preview')
		.live('click', function(){
			var hlCount	= $(this).attr('class').match(/hlc-([0-9]+)/)[1];
			var hlElems	= $('#w-hair-highlights > div:has(input)');
			
			if(hlCount == 0){
				$('#w-hair-highlights')
					.add($('#w-hair-highlights').prev())
					.hide();		
			} else {
				$('#w-hair-highlights')
					.add($('#w-hair-highlights').prev())
					.show();
				
				$(hlElems).hide();

				for(var i = 0; i < hlCount; i++){
					$(hlElems[i]).show();
				}
			}
			
			Hair.setStyle($(this).attr('class').match(/hair-style-([0-9]+)/)[1]);
		});
	
	$(':checkbox[id^="w-hair-highlight"]')
		.click(function(){
			var hlID	= $(this).attr('id').match(/w-hair-highlight-([0-9]+)/)[1];
			var checked	= $(this).is(':checked');
			
			
			$(this).parents('div:first').toggleClass('disabled', !checked);
			
			Hair.enableHighlight(hlID, checked);
			Hair.setHighlight(hlID, $(this).parents('div:first').find('input').val())
		});
		
	// Base editing - skin / mouth / nose
	$('div.base-preview:has(.base-skin, .base-mouth, .base-nose, .base-zombie)')
		.live('click', function(){
			var baseImage	  = ($('div.previewing').length > 0
					? $('div.previewing')
					: $(this)
				).find('img[class^="base"]');
			
			var baseComponent = baseImage
				.attr('class')
				.match(/base-([a-z]+)/)[1];
			
			var showhide;
			
			$('.ha-preview-base .base-'+baseComponent)
				.attr('src', baseImage.attr('src'));
				
			// Account for gender change
			if(baseImage.hasClass('base-zombie')){
				$('.ha-preview-base .base-zombie').fadeIn();
			} else if(baseImage.hasClass('base-gender')){
				(function(){
					var gender	= baseImage.attr('src').match(/base\/(m|f)/)[1];
					
					// Change all overlays
					$('img[src*="avatars2"][class*="item"], img.wearable[class*="item"]').each(function(){
						var prv		= $(this);
						var iID 	= $(this)
							.attr('class')
							.match(/item-([0-9]+)/);
						
						if(iID){
							$(this).attr('src', (gender == 'f'
								? Wardrobe.items.data[iID[1]].o.f
								: Wardrobe.items.data[iID[1]].o.m));
						}
					});
					
					// Change base previews
					$('div#mid-base-body img[src*="avatar/base"], div#mid-base-zombie img[src*="/base"], img.base-zombie, .base-zombie-none .base-skin').each(function(){
						var src	= $(this)
							.attr('src');
							
						if(!src){
							return;
						}
						
						$(this).attr('src', src.replace(/base\/(f|m)([z0-9]+).png/, 'base/'+gender+'$2.png'));
					})
				})();
			// Account for skin color change in gender previews
			} else if(baseImage.hasClass('base-skin')){	
				(function(){
					var skinColor = baseImage.attr('src').match(/base\/(f|m)([z0-9]+).png/);
					
					if(!skinColor){
						return;
					}					
					
					// Remove zombie skin?
					if(baseImage.parents('.base-zombie-none').length > 0){
						$('.ha-preview-base .base-zombie').fadeOut();
					}
					
					$('img.base-gender[src*="avatar/base"], .base-zombie-none .base-skin').each(function(){
						var src	= $(this)
							.attr('src')
							.replace(/base\/(f|m)([z0-9]+).png/, 'base/$1'+skinColor[2]+'.png');
						
						$(this).attr('src', src);	
					});
				})();
			}
		});
	
	// Base editing - eye color
	$('div.popout:has(.base-eyecolor)')
		.live('click', function(){
			var i = $(this)
				.find('img.base-eyecolor')
				.attr('src')
				.match(/eyes\/([a-z]+)_([a-z]+).png/)[2];
			
			$('.base-eyestyle')
				.each(function(){
					var img	= $(this);
					var src = img
						.attr('src')
						.replace(/eyes\/([a-z]+)_([a-z]+).png/, 'eyes/$1_'+i+'.png');
						
					img.attr('src', src);
				});
		});
	
	// Base editing - eye color
	$('div.popout:has(.base-eyestyle)')
		.live('click', function(){
			var i = $(this)
				.find('img.base-eyestyle')
				.attr('src')
				.match(/eyes\/([a-z]+)_([a-z]+).png/)[1];
			
			$('.base-eyecolor')
				.each(function(){
					var img	= $(this);
					var src = img
						.attr('src')
						.replace(/eyes\/([a-z]+)_([a-z]+).png/, 'eyes/'+i+'_$2.png');
						
					img.attr('src', src);
				});
		});
		
	// Avatar selection
	$('div.load-avatar-container').live('click', function(){
		var isSelected = $(this).hasClass('selected');
		var isOwned = $(this).hasClass('owned');
		
		$('div.load-avatar-container')
			.removeClass('selected');
		
		if(!isSelected){
			$(this).addClass('selected');
		}
		
		$('button#load-avatar-do')
			.attr('disabled', isSelected);
			
		$('button#delete-avatar-do, button#default-avatar-do, button#edit-avatar-do')
			.attr('disabled', (!isOwned || isSelected));
	});

	// Avatar deleting
	$('button#delete-avatar-do').live('click', function(){
		var selected = $('div.load-avatar-container.selected:eq(0)').attr('class').match(/load-avatar-([0-9]+)/)[1];
		var confirmDelete = confirm('Are you sure you want to delete this avatar?');
				
		if(!confirmDelete){
			return;
		}
		
		// Delete it
		$.getJSON('ajax/index.php/account/deleteHA/', {'avatar': selected}, function(r){
			if(r.error){
				alert('ERROR: '+r.error);
			} else {
				$('div.load-avatar-container.selected')
					.remove();
					
				$('button#load-avatar-do')
					.parent()
					.find('button')
					.attr('disabled', true);
					
				$('#load-avatar-container')
					.trigger('update');
			}
		});
	});
	
	// Avatar defaulting
	$('button#default-avatar-do').live('click', function(){
		var selected = $('div.load-avatar-container.selected:eq(0)').attr('class').match(/load-avatar-([0-9]+)/)[1];
		
		UI.setDefaultAvatar(selected);
	});

	// Avatar loading
	$('button#load-avatar-do').live('click', function(){
		var selected = $.map($('div.load-avatar-container.selected'), function(e){
			return $(e).attr('class').match(/load-avatar-([0-9]+)/)[1];	
		});
		
		if(selected.length < 0){
			alert('No avatar selected!');
			return false;
		}
		
		UI.loadAvatar(selected);
	});
	
	// Avatar detail editing
	$('button#edit-avatar-do').live('click', function(){
		var selected = $.map($('div.load-avatar-container.selected'), function(e){
			return $(e).attr('class').match(/load-avatar-([0-9]+)/)[1];	
		}).join(',');
		
		UI.overlay.load('save-avatar', {mode: 'edit', id: selected});
	});	
	
	// Avatar searching
	(function(){
		var timeout		= false;
		var lastOpts	= {};
		
		var doSearch	= function(withOpts){
			var searchData	= {'window': 'load-avatar', 'advanced': true};
			
			if(!withOpts){
				// Gather data
				if($('#w-loadavatar-item').val() != 0 && !$('#w-loadavatar-item').val().match(/[^0-9]/)){
					searchData.item 	= parseInt($('#w-loadavatar-item').val());
				}
				
				if($('#w-loadavatar-kinds li.active').length > 0){
					searchData.kinds	= $.map($('#w-loadavatar-kinds li.active'), function(e){
						return $(e).text().toLowerCase();
					}).join(',');
				}
				
				// Whose? If none selected, all
				if($('#w-loadavatar-whose li.active').length > 0){
					searchData.whose	= $.map($('#w-loadavatar-whose li.active'), function(e){
						return $(e).attr('id').split('-').pop().toLowerCase();
					}).join(',');
				} else {
					searchData.whose	= $.map($('#w-loadavatar-whose li'), function(e){
						return $(e).attr('id').split('-').pop().toLowerCase();
					}).join(',');
				}
				
				if($('#w-loadavatar-hairstyles-select').val() != 0){
					searchData.hair	= $('#w-loadavatar-hairstyles-select').val();
				}
				
				// Save these options so we can quickly re-use them when switching pages
				lastOpts = searchData;
			} else {
				$.extend(searchData, withOpts);
			}
			
			$.getJSON('ajax/index.php/ui/loadWindow/', searchData, function(r){
				var pg = $('.footer.buttons ul.mid-pagination');
				
				if(r.error){
					alert('ERROR: '+r.error);
					return false;
				}
				
				$('#load-avatar-container')
					.html(r.templateContents);
					
				// Reset page counts
				pg.toggle(r.pages && r.pages > 1);
				
				if(r.pages > 1){
					pg.fadeIn();
					
					pg.find('li:not(:eq(0))').remove();
					
					for(var cp = 1; cp <= r.pages; cp++){
						$('<li>').text(cp).appendTo(pg);
					}
				} else {
					pg.fadeOut();
				}
				
				// Remove loading indicator
				$('#load-avatar-container img').load(function(){
					$(this).parent().removeClass('loading');
				});
			});
		}
		
		var checkClick = function(e){
			var e = $(e.target);
			
			if(!e.is('.ajax-result') && e.parents('.ajax-result').length < 1){
				$(document).unbind('mouseup', checkClick);
				
				$('#w-loadavatar-item')
					.val(0);
					
				$('[class^="ajax-search"]')
					.remove();
					
				$('.ajax-result')
					.removeClass('ajax-result');
					
				doSearch();
			}
		}
		
		$('.avatar-pages li:not(:eq(0))').live('click', function(){
			var page = $(this).text();
			
			doSearch($.extend(lastOpts, {'page': page}));
		});		
		
		$('#load-avatar-container').live('update', function(){
			doSearch();
		});
		
		$('#w-loadavatar-hairstyles-select').live('change', function(){
			doSearch();
		});
		
		$('#w-loadavatar-kinds li, #w-loadavatar-whose li').live('click', function(){
			$(this).toggleClass('active');
			
			doSearch();
		});
		
		$('#w-loadavatar-item-entry').live('keyup', function(){
			var entry = $.trim($(this).val());
			
			$(document)
				.unbind('mouseup', checkClick)
				.bind('mouseup', checkClick);
			
			$(this).removeClass('selected');
			
			$('#w-loadavatar-item')
				.val(0);
					
			if(timeout || entry.length < 3){
				window.clearTimeout(timeout);
			} else if(entry.length >= 3){			
				window.setTimeout(function(){
					$.getJSON('ajax/index.php/ui/findItems/', {'name': entry}, function(r){
						if(r.error){
							alert('ERROR: '+r.error);
							return false;
						}
						
						$('#w-loadavatar-item-container ul')
							.remove();
						
						$(r.templateContents)
							.insertAfter('#w-loadavatar-item-entry');
					});
				}, 250);
				
				$(this)
					.parent()
					.addClass('ajax-result');
			}
		});
		
		$('#w-loadavatar-item-container li').live('click', function(){
			var image = $(this).find('img').attr('src');
			
			$('#w-loadavatar-item')
				.val($(this).attr('class').match(/item-([0-9]+)/)[1]);
				
			$('#w-loadavatar-item-entry')
				.addClass('selected')
				.css('background-image', 'url('+image+')')
				.val($(this).text());
			
			$('[class^="ajax-search"]')
				.remove();
				
			$('.ajax-result')
				.removeClass('ajax-result');
			
			$(document).unbind('mouseup', checkClick);
			
			doSearch();
		});
	})();
	
	// Paginator scrolling on overflowing page counts	
	(function(){
		var origHeight = 24;
		
		$('.mid-pagination-container').live('mouseenter', function(){
			if(!$(this).data('origHeight')){
				$(this).data('origHeight', $(this).height());
			}
			
			var sh = $(this).height();
			var ph = $(this).find('.mid-pagination').innerHeight();
			
			if(sh < ph){
				$(this).css('height', ph);
			}
		});
		
		$('.mid-pagination-container').live('mouseleave', function(){
			$(this).css({
				'height': $(this).data('origHeight')
			});
		});
	})();
});

Hair = {
	'prepend': 'http://subeta.net/slib/avatar.php/1?hair_only=true&hair=',
	'default': {
	    "style": "1",
	    "base": "eaeaea",
	    "basehigh": "ffffff",
	    "baselow": "000000",
	    "streaks": {
	        "0": {
	            "enabled": "false",
	            "color": "CCCCCC"
	        },
	        "1": {
	            "enabled": "false",
	            "color": "CCCCCC"
	        },
	        "2": {
	            "enabled": "false",
	            "color": "CCCCCC"
	        },
	        "3": {
	            "enabled": "false",
	            "color": "CCCCCC"
	        },
	        "4": {
	            "enabled": "false",
	            "color": "CCCCCC"
	        },
	        "5": {
	            "enabled": "false",
	            "color": "CCCCCC"
	        },
	        "6": {
	            "enabled": "false",
	            "color": "CCCCCC"
	        },
	        "7": {
	            "enabled": "false",
	            "color": "CCCCCC"
	        }
	    }
	},
	
	'current': false,
	
	'getURL': function(){
		if(!Hair.current){
			Hair.current = Hair['default'];
		}
		
		return Hair.prepend+encodeURI(JSON.stringify(Hair.current));
	},
	
	'setStyle': function(styleID){
		if(Hair.current.style == styleID){
			return;
		}
		
		Hair.current.style = styleID.toString();
		
		// Set style name
		$('.item-hair span').text($('.hair-style-'+styleID+':eq(0) .label').text());
		
		Hair.update();
	},
	
	'setColor': function(which, color){		
		if(!color.match(/\#[0-9a-f]{6}/) || !$.inArray(which, ['base', 'low', 'high']) < 0){
			return false;
		}
		
		var color = color.substr(1);
		
		switch(which){
			case 'base':
				Hair.current.base = color;
			break;
			case 'basehigh':
				Hair.current.basehigh = color;
			break;
			case 'baselow':
				Hair.current.baselow = color;
			break;
		}
		
		Hair.update();
	},

	'setHighlight': function(which, color){
		if(!color.match(/\#[0-9a-f]{6}/) || which > 7 || which < 0){
			return false;
		}
		
		var color = color.substr(1);
		
		Hair.current.streaks[which].color = color;
		
		Hair.update();
	},

	'enableHighlight': function(which, toggle){	
		if(which > 7 || which < 0){
			return false;
		}
		
		Hair.current.streaks[which].enabled = toggle;
		
		Hair.update();
	},	
	
	'update': function(){		
		$('div#ha-preview-wearables canvas.base-hair')
			.remove();
		
		$('div#ha-preview-wearables img.base-hair')
			.show()
			.attr('src', Hair.getURL());
		
		// Set form elements properly
		$.each(['base', 'basehigh', 'baselow'], function(i, e){
			$('input#w-hair-'+e+'-input')
				.val('#'+Hair.current[e])	
				.css('background-color', '#'+Hair.current[e]);		
		});
		
		for(var i = 0; i < 7; i++){
			$('input#w-hair-highlight-'+i+'-input')
				.val('#'+Hair.current.streaks[i].color)	
				.css('background-color', '#'+Hair.current.streaks[i].color);
			
			$('input#w-hair-highlight-'+i+'-enable')
				.attr('checked', Hair.current.streaks[i].enabled == true)
				.parents('div:first')
				.toggleClass('disabled', Hair.current.streaks[i].enabled != true);
		}
	}
}

Wardrobe = {
	'inspiration': {
		'base': 	0,
		'clothes':	0,
		'hair':		0
	},
	
	'paginateResults': function(p){
		var pElem	= $('#mid-clothes ul.mid-pagination');
		
		// Remove old pagination
		pElem
			.find('li:not(:eq(0))')
			.remove();
		
		// Add new
		for(var ap = 1; ap <= p; ap++){
			$('<li>').text(ap)
				.appendTo(pElem)
				.toggleClass('active', ap == 1);
		}		
	},
	
	'getBase': function(){
		var getElements = ['skin', 'nose', 'mouth', 'eye', 'zombie'];
		var baseData	= {};
		
		$.each(getElements, function(i, v){
			var src = $('div.ha-preview-base img.base-'+v+':visible')
				.attr('src');
			
			if(src){
				src = src
					.substr(src.lastIndexOf('/')+1);
		
				src = src
					.substr(0, src.lastIndexOf('.'));
		
				baseData[v] = src;
			} else {
				baseData[v] = false;
			}
		});
		
		return baseData;	
	},
	
	'items': {
		'checkQueueInterval': 	false,
		'data': 				{},
		'queue': 				[],
		'equipped': 			[],
		'equipAfter': 			false,
		'addedFromQueue': 		0,
		'origQueueLength':		0,
		
		'cleanItemData': function(){
			var d = 0;
			
			// Remove all item unneeded item data
			$.each(Wardrobe.items.data, function(i, v){
				var c = $('.item-'+i).length;
				
				if(c == 0){
					d++;
					
					delete Wardrobe.items.data[parseInt(i)];
				}
			});
		},
		
		'enqueue': function(i){			
			// Clear old item previews and enqueue new ones
			$('#w-browser')
				.empty();
			
			// Clear unneedded old item data
			Wardrobe.items.cleanItemData();
			
			// Clear old queue interval
			if(Wardrobe.items.checkQueueInterval){
				window.clearInterval(Wardrobe.items.checkQueueInterval);
			}
			
			Wardrobe.items.queue				= i;
			Wardrobe.items.addedFromQueue		= 0;
			Wardrobe.items.origQueueLength		= i.length;
			Wardrobe.items.checkQueueInterval 	= window.setInterval(Wardrobe.items.checkQueue, 0);
		},
		
		'checkQueue': function(){
			Wardrobe.items.showItem(Wardrobe.items.queue.shift());
			
			if(Wardrobe.items.queue.length == 0){
				$(window).resize();
				
				window.clearInterval(Wardrobe.items.checkQueueInterval);
			}			
		},
		
		'showItem': function(i){
			if(!i){
				return false;
			}
			
			var newItem = $('<div>')
				.data('item', i)
				.addClass('item-preview popout item-'+i.id)
				.append(
					$('<img>')
						.attr('src', i.o.f)
						.addClass('previewed wearable item-'+i.id)
				)
				.append(
					$('<img>')
						.attr('src', 'http://images.subeta.net/items/'+i.t)
						.addClass('item-thumb')
				)
				.append(
					$('<a>')
						.addClass('label')
						.attr({
							'href':		'items/'+(i.n.replace(/\s/g, '-').toLowerCase())+'.htm',
							'target': 	'_blank'
						})
						.html(i.n+(i.d.i ? '<span class="designer">Designed by <a class="user" href="http://subeta.net/profile.php?user='+i.d.i+'" target="_blank">'+i.d.n+'</a></strong></span>' : ''))
				);
				
			Wardrobe.items.data[parseInt(i.id)] = i;
			
			Wardrobe.items.addedFromQueue++;
			
			if(Wardrobe.items.addedFromQueue % Math.floor(Wardrobe.items.origQueueLength/10) == 0){
				$(window).resize();
			}
			
			newItem
				.appendTo('#w-browser');
		},
		
		'updatePreview': function(e){
			// Don't do anything if there's only one preview
			if($('.exploded img:not(.item-thumb)').length < 2){
				return;
			}
			
			var target		= $(e.currentTarget);
			var mouseRel 	= (e.pageY-(target.offset().top-target.parent().scrollTop()))/target.outerHeight();
			var placeAt		= Math.floor(mouseRel / (1/($('#ha-preview-wearables img').length+1)));
			var stack		= $('.exploded > img:not(.previewed):not(.item-thumb)').reverse();
			
			if(placeAt == 0 || !stack[placeAt-1]){
				$('div.exploded .indicator')
					.css('top', 0);
					
				$('.exploded .previewed')
					.appendTo('.exploded');
					
				Wardrobe.items.equipAfter = false;
			} else {
				$('div.exploded .indicator')
					.css({
						'top': placeAt*(250/(stack.length+1)),
						'height': 250/(stack.length+1)
					});
				
				$('.exploded .previewed')
					.insertBefore(stack[placeAt-1]);
				
				Wardrobe.items.equipAfter = $(stack[placeAt-1]).attr('class').match(/item-([0-9]+|hair)/)[0];
			}
		},
		
		'equip': function(e){
			var gender	= $('div#ha-preview img.base-skin').attr('src').match(/base\/(m|f)/)[1];
			
			if(typeof e == 'object'){
				var p	= $(this).hasClass('item-preview') ? $(this) : $(this).parents('.item-preview:eq(0)');
				var id 	= p.attr('class').match(/item-([0-9]+)/)[1];
				
				if(p.find('img.previewed').length < 1){
					return;
				}
			} else {
				var id	= e;
			}
			
			// Already equipped?
			if($.inArray(id, Wardrobe.items.equipped) >= 0){
				return;
			}
			
			var iData 	= Wardrobe.items.data[id];
						
			// Add item name to list
			var itemListElement = $('<li>')
				.text(iData.n)
				.addClass('item-'+id)
				.append(
					$('<span>')
						.addClass('remove')
						.html('&#10006;')
						.click(function(){Wardrobe.items.unequip(id);})
				)
				
				.prependTo('#w-equipped ul');
			
			// Also add to avatar preview
			var previewedItem = $('<img>')
				.attr('src', iData.o[gender])
				.addClass('wearable item-'+iData.id)
				.appendTo('#ha-preview-wearables');
			
			// Properly order previous two items
			if(Wardrobe.items.equipAfter){
				previewedItem
					.insertBefore('#ha-preview-wearables .'+Wardrobe.items.equipAfter);
				itemListElement
					.insertAfter('#w-equipped ul .'+Wardrobe.items.equipAfter);
			}
			
			// Add item to equipped items
			Wardrobe.items.equipped.push(id);
	
			$('#w-equipped')
				.add($('#w-equipped').prev())
				.removeClass('hidden');
		},
			
		'unequip': function(id){
			var i = $.inArray(id, Wardrobe.items.equipped);
			
			// Remove DOM elements referencing equipped item
			$('#w-equipped ul .item-'+id)
				.add('#ha-preview-wearables .item-'+id)
				.remove();
				
			// Remove from equipped items
			if(i > -1){
				Wardrobe.items.equipped.splice(i, 1);
			}
			
			// Hide equipped items header and container if no items equipped
			if(!Wardrobe.items.equipped.length){
				$('#w-equipped')
					.add($('#w-equipped').prev())
					.addClass('hidden');
			}
		},
		
		'getEquipped': function(){
			var equipped	= [];
			
			$('#w-equipped li').each(function(){
				var id	= $(this)
					.attr('class')
					.match(/item-([0-9]+|hair)/)[1];
				
				equipped.push(id);
			});
			
			return equipped;
		},
		
		'toggleVisibility': function(e, i){
			var e = $(e);
			
			e.toggleClass('disabled', !e.hasClass('disabled'));
			
			// Now hide item
			$('div#ha-preview-wearables')
				.find('.item-'+i)
				.toggleClass('hidden', e.hasClass('disabled'))
				.css('opacity', '');
			
			$('#ha-preview-wearables img:not(.hidden)')
				.css('opacity', 1);
		},
		
		'updateAvatar': function(e, u){
			$('#w-equipped li:not(.ui-sortable-helper)').each(function(i, w){
				var id = $(w).attr('class').match(/item-([0-9]+|hair)/)[1];
				
				$('#ha-preview-wearables img.item-'+id)
					.prependTo('#ha-preview-wearables');
			});
		}
	},
	
	'search': {
		'page':		1,
		'timeout':	false,
		
		'toPage': 	function(p){
			Wardrobe.search['do']({'page': p});
		},
		
		'init': function(){
			window.clearTimeout(Wardrobe.search.timeout);
			
			Wardrobe.search.timeout = window.setTimeout(Wardrobe.search['do'], 750);
		},
		
		'do': function(withData, skipOther){
			var sOpt	= 0;
			var data	= {};
			
			// Set data if not supplied
			if(!skipOther){
				data	= {
					'layers': 	$.map($('#w-search-layers li.active:not(.disabled)'), function(e, i){
									return $(e).attr('id').split('-').pop();
								}).join(','),
								
					'name':		($('#w-search-name-entry').val().length >= 3
									|| $('#w-search-name-entry').val().length == 0
								)
									? $('#w-search-name-entry').val()
									: '',
									
					'color':	($('#w-search-colors-container li').length == 0
									? false
									: $.map($('#w-search-colors-container li:not(.disabled)'), function(c, i){
	      								return $(c).text().match(/[0-9a-fA-F]{6}/)[0]
									})),
									
					'custom':	($('#w-search-custom li.active').length == 0
									? false
									: $.map($('#w-search-custom li.active'), function(c, i){
										return $(c).attr('id').match(/w-search-custom-([a-z]+)/)[1];
									}).join(',')),
									
					'limit':	$('#mid-clothes select.mid-pagination-perpage').val(),
					'order':	$('select#w-search-order-input').val()
				}
			}
			
			if(withData){
				$.extend(data, withData);
			}
			
			// Remove empty fields
			$.each(data, function(k, v){
				if(!v){
					delete data[k];
				} else {
					++sOpt;
				}
			});
			
			if(sOpt > 0){
				$.getJSON('ajax/index.php/Wardrobe/SearchItems/', data, function(r){
					Wardrobe.search.process(r);
					
					// Paginate?
					if(!data.page){
						Wardrobe.paginateResults(r.pagecount);
					}
				});
			}
		},
		
		'process': function(d){
			// Disable layers that contain no items that match criteria
			$.each(d.layercount, function(i, v){
				if(v > 0){
					$('#w-search-layer-'+i)
						.removeClass('disabled');
				} else {
					$('#w-search-layer-'+i)
						.addClass('disabled');				
				}
			});				
			
			Wardrobe.items.enqueue(d.items);
		}
	}
}

$(function(){
	// Run UI setup
	if(window.location.pathname.match(/\/(subeta|sofetch)\/$/)){
		UI.setup();
	}
});
