var Builder = {
	init: function() {
		this.sections  = $(".buildable");
		this.markers   = $(".buildable a.section-marker");
		this.container = this.sections.parent();
		this.summary   = $(".box.first");
		this.oOrder    = {};
		
		for ( var i=0, l=this.markers.length; i<l; ++i ) {
			this.oOrder[ $(this.markers[i]).attr("name") ] = $(this.sections[i]);
		}

		if ( location.hash.match(/#solution:(sb\d(,?))+/g) ) {
			var keys = location.hash.substr(10).split(',');
		
			this.generateList(keys);
			this.build(keys);
		}
	},
	
	build: function(keys) {
		var sortBy = {};
		var ii;

		location.hash = "solution:" + keys.join(",");
		this.summary.hide();

		for ( var i=0; i<keys.length; ++i ) {
			sortBy[ keys[i] ] = 1;
		}

		for ( var i=this.sections.length-1; i>=0; --i ) {
			ii = $.inArray($(this.markers[i]).attr("name"), keys);

			if ( ii == -1 ) {
				$(this.sections[i]).hide();
			} else {
				sortBy[ keys[ii] ] = $(this.sections[i]).show();
			}
		}

		this.sort(sortBy);
		
		// Scroll to the first section
		for ( var i in sortBy ) {
			if ( sortBy.hasOwnProperty(i) ) {
				$.scrollTo(sortBy[i], 400);
				break;
			}
		}
	},
	
	reset: function() {
		this.summary.show();
		this.sections.show();
		this.sort(this.oOrder);
		location.hash = "";
	},
	
	sort: function(order) {
		for ( var i in order ) {
			if ( !order.hasOwnProperty(i) ) { continue; }
			this.container.append(order[i]);
		}
	},
	
	generateList: function(keys) {
		var target = $("#builder-target");
		
		$(".builder-item").each(function(i, li) {
			li = $(li);
			
			if ( $.inArray(li.attr("rel"), keys) != -1 ) {
				target.append( Builder.buildListItem(li.clone(true)) );
				li.hide().fadeTo(0,0);
			}
		});
		
		$("#builder-controls").show();
	},
	
	buildListItem: function(li) {
		return li.append("<a href='#' class='btn-remove'>Remove</a>").addClass("builder-item-inline");
	}
};

//$(window).ready(function() {
$(function() {
	Builder.init();
	
	var target   = $("#builder-target");
	var drags    = $(".builder-item");
	var controls = $("#builder-controls");
	var dragging = false;
	var fadeTime = 400;
	var dropped  = false;
	
	var configDelay = document.all ? 500 : 0;
	var timer = setInterval(function() {
		target   = $("#builder-target");
		drags    = $(".builder-item");
		controls = $("#builder-controls");
		
		if ( target.droppable && drags.draggable && controls ) {
			clearInterval(timer);
			init();
		}
	}, configDelay);
	
	var init = function() {
		target.droppable({
			drop: function(e, ui) {
				dropped = true;
				
				// Prevent duplication on drop callback
				if ( !ui.draggable[0].complete ) {
					ui.draggable[0].complete      = true;
					ui.draggable[0].originDragger = $(dragging)
					try {
						ui.draggable[0].originDragger.fadeTo(fadeTime, 0, function() {
							ui.draggable[0].originDragger.hide();
							drags.draggable('enable');
						});
					} catch(e) {}
					Builder.buildListItem(ui.draggable);
					
					target.removeClass("empty");
					controls.slideDown();
				}
			}
		}).sortable({
			revert: true
		}).disableSelection();
		
		// Draggable section titles
		drags.draggable({
			connectToSortable: target,
			helper:            'clone',
			revert:            'invalid',
			start: function() {
				drags.draggable('disable');
				target.addClass("drop-ready");
				dropped  = false;
				dragging = this;
			},
			stop: function() {
				target.removeClass("drop-ready");
				dragging = false;
				
				if( !dropped ) {
					drags.draggable('enable');
				}
			}
		}).disableSelection();
		
		// Remove button
		$("a", target).live("click", function(e) {
			e.preventDefault();
			var parent = $(this).parent();
			parent.remove()[0].originDragger.show().fadeTo(fadeTime, 1);
			
			if ( !target.children().length ) {
				target.addClass("empty");
				controls.slideUp();
			}
		});
		
		$("#btn-reset").click(function(e) {
			e.preventDefault();
			controls.slideUp();
			target.children().remove();
			target.addClass("empty");
			drags.show().fadeTo(fadeTime, 1);
			Builder.reset();
			return false;
		}).disableSelection();
		
		// Build button
		$("#btn-build").click(function(e) {
			e.preventDefault();
			var children = target.children();
			var result   = [];
			for ( var i=0,l=children.length; i<l; ++i ) {
				result.push( $(children[i]).attr("rel") );
			}
			Builder.build(result);
		}).disableSelection();
		
		
		$("#solution-builder").show();
	};
});