var sss = new Class({

    Implements: [Options, Events],
    
    options: {
        sortable: true,		// whether or not elements should be slideable
        sortableOptions: {
            clone: false,	// show a clone when sorting
			opacity: .5,	// opacity to set cloned sortable to
            revert: {		// object for sortables revert animation
                transition: Fx.Transitions.Back.easeOut
            }
        },
        slideable: false,	// whether or not the sliders should be made
        slideFxOptions: { 	// options object for Fx.Slide
            transition: Fx.Transitions.Expo.easeOut
        },
        saveable: true,		// whether or not the slide / sort state should be saved
        cookie: true, 		// set to false to use json
        json: {				// the options object for Request.JSON
			url: './'
		}
    },
    
    initialize: function(list, slideToggles, slideElements, options){
        this.setOptions(options);
        if (this.options.sortable) {
            this.list = $(list);
            this.setupSortables();
        }
        if (this.options.saveable) {
            if (this.options.cookie) {
                this.cookie = new Hash.Cookie('sss', {
	                duration: 3600,
                    path: "/"
	            });
            }
            else 
                if (this.options.json) {
                    this.json = new Request.JSON(this.options.json);
                }
            if (this.options.sortable) {
                this.loadSortState();
            }
        }
    },
    
    setupSortables: function(){
        this.sortables = new Sortables(this.list, this.options.sortableOptions);
		if(this.options.saveable)
			this.sortables.addEvent('complete', this.updateSortState.bind(this));
    },
    
    updateSortState: function(){
    	this.sortState = new Hash();
		this.sortables.elements.each(function(e,i){
			this.sortState.set(this.list.getChildren().indexOf(e), i);
		}, this);
		if(this.cookie)
			this.cookie.set('sortState', this.sortState);
		else
			if(this.json){
				this.json.send('set=sortState&sortState='+JSON.encode(this.sortState.getClean()));
			}
    },
    
    loadSortState: function(){
		if(this.cookie){
			this.sortState = $H(this.cookie.get('sortState'));
			if(!$defined(this.sortState[0]))
				this.updateSortState();
			this.setSort();
		}
		else
			if(this.json){
				this.json.send('get=sortState');
				this.temp = function(response){
					if (response) {
						this.sortState = $H(response);
						this.setSort();
					}
					else {
						this.updateSortState();
					}
					this.json.removeEvent('complete', this.temp);
				}.bind(this);
				this.json.addEvent('complete', this.temp);
			}

    },
    
	setSort: function(){
		var order = [];
		this.sortables.elements.each(function(e, i){
			order.push(this.sortables.elements[this.sortState[i]]);
		}, this);
		order.each(function(e){
			e.injectBottom(e.getParent());
		});		
	}
});

function Delete_Cookie( name, path, domain ) {
if ( Get_Cookie( name ) ) document.cookie = name + "=" +
( ( path ) ? ";path=" + path : "") +
( ( domain ) ? ";domain=" + domain : "" ) +
";expires=Thu, 01-Jan-1970 00:00:01 GMT";
}

function Get_Cookie( check_name ) {
	// first we'll split this cookie up into name/value pairs
	// note: document.cookie only returns name=value, not the other components
	var a_all_cookies = document.cookie.split( ';' );
	var a_temp_cookie = '';
	var cookie_name = '';
	var cookie_value = '';
	var b_cookie_found = false; // set boolean t/f default f
	var i = '';
	
	for ( i = 0; i < a_all_cookies.length; i++ )
	{
		// now we'll split apart each name=value pair
		a_temp_cookie = a_all_cookies[i].split( '=' );
		
		
		// and trim left/right whitespace while we're at it
		cookie_name = a_temp_cookie[0].replace(/^\s+|\s+$/g, '');
	
		// if the extracted name matches passed check_name
		if ( cookie_name == check_name )
		{
			b_cookie_found = true;
			// we need to handle case where cookie has no value but exists (no = sign, that is):
			if ( a_temp_cookie.length > 1 )
			{
				cookie_value = unescape( a_temp_cookie[1].replace(/^\s+|\s+$/g, '') );
			}
			// note that in cases where cookie is initialized but no value, null is returned
			return cookie_value;
			break;
		}
		a_temp_cookie = null;
		cookie_name = '';
	}
	if ( !b_cookie_found ) 
	{
		return null;
	}
}
