var oSortable = function( oConfig ){
	var aItems, aOrder;
	var sDest, sName;

	init( oConfig );
	
	function init ( oConfig ){
		sDest = oConfig.sDest;
		sName = oConfig.sName;
		aItems = oConfig.aItems;
		
		aOrder = doOrder( oConfig.phpOrder );
		
		_build();
	}
	
	function doOrder( phpOrder ){
		aOrder = [];
		for( var i in phpOrder ){
			aOrder.push( aItems[ phpOrder[i] ] );
		}
		return aOrder;
	}
	
	function preprocessItem( item ){
		item.id = sName + '_' + item.name;
	}
	
	function buildItemHTML( i, item ){
		if( !item ) item = aOrder[i];
		
		var sOut = '<div id="' + item.id + '"class="prioritiesItem"><span class="rank">' + (1+parseInt(i)) +'</span>';
		sOut += '<div class="prioritiesItem rankTitle">' + item.title + '<br/><small>' + item.desc + '</small></div>';
		sOut += getButtons( i ) + getInputTag( i, item );
		sOut += '</div>';
		
		return sOut;
	}
	
	function getInputTag( i, item ){
		if( !item ) item = aOrder[i];
		sOut = "<input type='hidden' name='" + item.name + "' value = '" + (1+parseInt(i)) + "' />";
		return sOut;
	}
	
	function getButtons( i ){
		var sOut = '<div class="prioritiesItem rankControls">';
		sOut += '<div class="rankMove"><a  id="sort-button_' + sName + '_' + i + '_up" href="#"><div class="arrowicon down"></div>MOVE DOWN</a></div>';
		sOut += '<div class="rankMove"><a id="sort-button_' + sName + '_' + i + '_down" href="#"><div class="arrowicon up"></div>MOVE UP</a></div>';
		sOut += '</div>';
		return sOut;
	}
	
	function _build(){
		var sOut = '';
		sOut += '<div class="' + sName + '">';
		var nCount = 0;
		for( var i in aOrder ){
			sOut += buildItemHTML( nCount, aOrder[i] );
			nCount++;
		}
		sOut += '</div>';
		
		$( '#' + sDest ).html( sOut );
		_setBehaviour();
	}
	
	function _setBehaviour(){
		for( var i in aOrder ){
			setButtons( i, aOrder[i] );
		}
	}
	
	function setButtons( i, item ){
		$( '#sort-button_' + sName + '_' + i + '_up' ).bind( 'click', function(){
			_moveUp( i );
			return false;
		} );
		$( '#sort-button_' + sName + '_' + i + '_down' ).bind( 'click', function(){
			_moveDown( i );
			return false;
		} );
	}
	
	function _moveDown( nIndex ){
		if( nIndex > 0 && nIndex < aOrder.length ){
			var aNew = [];
			for( var i = 0; i < aOrder.length; i++ ){
				if( i == ( nIndex - 1 ) ){
					aNew[i] = aOrder[ nIndex ];
				}else if( i == nIndex ){
					aNew[i] = aOrder[ nIndex - 1 ];
				}else{
					aNew[i] = aOrder[i];
				}
			}
			aOrder = aNew;
			_build();
		}
		return false;
	}
	
	function _moveUp( i ){
		_moveDown( 1 + parseInt(i) );
		return false;
	}
	
	return {
		build: function(){
			_build();
		}
	};

};