init.push(function()
{
	if(window.opera) //opera doesn't like to have the cathandle fx.slide onDomReady for some reason.
		window.addEvent('load', initCatHandle);
	else
		initCatHandle();
	
	//set event handlers for categories
	$('categories').getElements('a.catButton').each(function(el)
	{
		$(el).addEvent('click',function(event)
		{
			var check = $(el).getElement("input");
			if($(el).getProperty("id")=='allCats')
			{//it's the allCats
				$(el).addClass("on");
				check.checked=true;
				$('categories').getElements('a.catButton').each(function(el)
				{//turn off all other cats
					if(el.id!='allCats')
					{	
						$(el).getElement("input").removeProperty("checked");
						$(el).removeClass("on");
					}
				});
			}
			else if(check.getProperty("checked"))
			{// it's a normal category, and it's on. set to off.
				$(el).removeClass("on");
				check.checked=false;
			}
			else
			{//normal category, and it's off. turn on.
				$(el).addClass("on");
				$(check).checked=true;
				//$(check).innerHTML=$(check).innerHTML;
			}
			
			if($(el).getProperty('id')!='allCats')
			{
				var allOff = true;
				$('categories').getElements('a.catButton').each(function(el)
				{
					check = $(el).getElement("input");
					if($(el).getProperty('id')!='allCats')
					{
						allOff = !check.getProperty("checked") && allOff;
					}
				});
				if(allOff)
				{
					$('allCats').addClass('on');
					$('allCats').getElement("input").checked=true;
				}
				else
				{
					$('allCats').removeClass('on');
					$('allCats').getElement("input[type=checkbox]").checked=false;;
				}
			}
			
			$('submissionsContainer').toggleClass('loading');
			window.async.send($('categoryForm').getProperty('action'),
			{ 
				onJSON:	function(jason)
				{
					var con = jason.content;
					$('submissionList').setHTML(con);
					attachSubmissionListEvents();
					$('submissionsContainer').removeClass('loading');
				},
				data: $('categoryForm').toQueryString(),
				wait: false
			});
		});
	});
	
	//preload some images
	$('cache').adopt(new Asset.images([ '/img/up+.gif', '/img/up~.gif', '/img/down+.gif', '/img/down~.gif' ]));
	
	attachSubmissionListEvents();

});

function initCatHandle()
{
//pretty effects!
	 $('moreCats').slide = new Fx.Slide('moreCats', {mode: 'vertical', framerate:15, duration: 500, onComplete: function()
	{
		//change the handle nicely
		$('catHandle').setText($('catHandle').getText()=='more' ? 'less' : 'more'); 
	}});
	$('moreCats').slide.hide();
	$('moreCats').removeClass("hidden");
	
	$('catHandle').addEvent('click', function(event)
	{
		$('moreCats').slide.toggle();	
	});

}

function attachSubmissionListEvents()
{
	//attach vote events to everything a.vote
	$('submissionList').getElements("a.vote").each(function(a,b)
	{
		a.addEvent('click', function(){vote(a);});
	});
	
	$('submissionList').getElements("a.link").each(function(a,b)
	{
		a.addEvent('click', function(){visit(a);});
	});
	
	registerRequiredLogin($('submissionList'));
	
	$('submissionList').getElements(".submission").each(function(el)
	{
		
		
		
		
		try
		{
			el.getElement("div.toolbar").getChildren().each(function(elly)
			{
				if(elly.hasClass('more'))
				{
					elly.addEvent('click',function(event)
					{
						moreInfo=el.getElement(".moreInfo");
						if($type(moreInfo.slide)!="object")
						{	
							//hide moreinfo and prepare it.
							moreInfo.slide= new Fx.Slide(moreInfo, {mode: 'vertical', framerate:15, duration: 500, 
							onStart: function(elly)
							{
								el.getElement("div.toolbar a.more").addClass("querying");
							},
							onComplete: function(elly)
							{
								el.getElement("div.toolbar a.more").removeClass("querying");
								el.getElement("div.toolbar a.more").setText(el.getElement("div.toolbar a.more").getText()=="more info" ? 'less info' : 'more info');
							}});
							moreInfo.slide.hide();
							moreInfo.removeClass("hidden");
						}
						moreInfo.slide.toggle();
					});
				}
				
				
				if(elly.hasClass('save'))
				{
					elly.addEvent('click',function(event)
					{//save link
						saveLink(el);
						try{event.preventDefault();}catch(err){}
						return false;
					});
				}
				else if(elly.hasClass('unsave'))
				{
					elly.addEvent('click',function(event)
					{//save link
						el.getElement("div.toolbar a.unsave").toggleClass('hidden');
						el.getElement("div.toolbar .unsaveMenu").toggleClass('hidden');
						try{event.preventDefault();}catch(err){}
						return false;
					});
				}
				else if(elly.hasClass('unsaveMenu'))
				{
					elly.getElement("a.no").addEvent('click',function(event)
					{//save link
						el.getElement("div.toolbar a.unsave").toggleClass('hidden');
						el.getElement("div.toolbar .unsaveMenu").toggleClass('hidden');
						try{event.preventDefault();}catch(err){}
						return false;
					});		
				
					elly.getElement("a.yes").addEvent('click',function(event)
					{//save link
						el.getElement("div.toolbar a.unsave").toggleClass('hidden');
						el.getElement("div.toolbar .unsaveMenu").toggleClass('hidden');
						unsaveLink(el);
						try{event.preventDefault();}catch(err){}
						return false;
					});	
				}
				else if(elly.hasClass('hide'))
				{
					elly.addEvent('click',function(event)
					{//save link
						el.getElement("div.toolbar a.hide").toggleClass('hidden');
						el.getElement("div.toolbar .hideMenu").toggleClass('hidden');
						try{event.preventDefault();}catch(err){}
						
						return false;
					});
				}
				else if(elly.hasClass('hideMenu'))
				{
					elly.getElement("a.no").addEvent('click',function(event)
					{//save link
						el.getElement("div.toolbar a.hide").toggleClass('hidden');
						el.getElement("div.toolbar .hideMenu").toggleClass('hidden');
						try{event.preventDefault();}catch(err){}
						return false;
					});		
				
					elly.getElement("a.yes").addEvent('click',function(event)
					{//save link
						el.getElement("div.toolbar a.hide").toggleClass('hidden');
						el.getElement("div.toolbar .hideMenu").toggleClass('hidden');
						hideLink(el);
						try{event.preventDefault();}catch(err){}
						return false;
					});	
				}
			});
		}catch(error){}

	});
	
}

function visit(a)
{
	var submissionId = a.getParent().getParent().getElement('input[name="id"]').getProperty('value');
	window.async.send('/async/visit',
	{
		wait: false,
		data: {'submission' : submissionId}
	});
}

function vote(a)
{
	//remove cloths
	$ES("div.reminder", 'submissionsContainer').each(function(reminder){reminder.remove();});
	
	var submissionId = a.getParent().getParent().getElement('input[name="id"]').getProperty('value');
	
	//figure out vote value
	var voteValue = a.hasClass('up') ? (a.hasClass('votedUp') ? 0 : 1) : (a.hasClass('votedDown') ? 0 : -1); 
	
	$each(a.parentNode.getElements('a'), function(a,b)
	{
		a.removeClass('votedUp');
		a.removeClass('votedDown');
	});
	
	window.async.send('/async/vote',
	{
		wait: false,
		onRequest: function()
		{
			a.addClass(a.hasClass('up') ? 'votingUp' : 'votingDown'); 
		},
		onJSON: function(resp)
		{
			//styling...
			a.removeClass('votingUp');
			a.removeClass('votingDown');
			
			//what do we show now?
			if(resp.vote==0 || resp.vote==false)
			{
				//nothing
			}
			else if(resp.vote>0)
			{
				a.getParent().getElement('a.up').addClass('votedUp');
				a.getParent().getElement('a.down').removeClass('votedDown');
			}
			else if(resp.vote<0)
			{
				a.getParent().getElement('a.up').removeClass('votedUp');
				a.getParent().getElement('a.down').addClass('votedDown');
			}
					
			if(resp.success != false)
			{//was it changed?
				a.getParent().getElement('div[class="votes"]').setText(resp.votes);
				//todo: effects maybe
			}
			else
			{
				if(resp.errors.contains("not logged in"))
				{
					//get rid of current cloth, if there is one.
					try{currentCloth=a.getParent().getParent().getElement("div.reminder").remove();}
					catch(error){};
					a.getParent().getParent().adopt($('cache').getElement('div.reminder').clone());
				}
			}
			
		}, 
		data: {'submission': submissionId, 'vote': voteValue}
	});
}

function saveLink(submission, event)
{
	var button = submission.getElement("div.toolbar a.save");
	window.async.send("/async/save", {
		wait: false,
		data: {'submission': submission.getElement("input[name=id]").value},
		onRequest: function()
		{
			button.addClass("querying");
			button.setText("saving...");
		},
		onSuccess: function(whatever)
		{
			resp=window.async.processJason(whatever);
			if(resp.success && resp.success!="false")
				button.setText("saved.");
			else
				button.setText("save");
			
			button.removeClass("querying");
		}	
	});
	return false;
}

function unsaveLink(submission, event)
{
	var button = submission.getElement("div.toolbar a.unsave");
	window.async.send('/async/unsave', 
	{
		wait: false,
		data: {'submission': submission.getElement("input[name=id]").value},
		onRequest: function()
		{
			button.addClass("querying");
			button.setText("removing from saved...");
		},
		onJSON: function(resp)
		{
			button.removeClass("querying");
			if(resp.success && resp.success!="false")
			{
				button.setText("removed.");
				new Fx.Styles(submission, {framerate:15, duration: 700, onComplete: function(elly)
				{
					submission.remove();
				}}).start({'height': [submission.getSize().size.y, 0] , 'opacity': [1,0]});
			}
			else
				button.setText("ERROR: removal failed... let us know about this.");
		}
	});
	return false;
}

function hideLink(submission, event)
{
	var button = submission.getElement("div.toolbar a.hide");
	window.async.send('/async/hide', 
	{
		wait: false,
		data: {'submission': submission.getElement("input[name=id]").value},
		onRequest: function()
		{
			button.addClass("querying");
			button.setText("hiding...");
		},
		onJSON: function(resp)
		{
			button.removeClass("querying");
			if(resp.success && resp.success!="false")
			{
				button.setText("hidden.");
				new Fx.Styles(submission, {framerate:15, duration: 700, onComplete: function(elly)
				{
					submission.remove();
				}}).start({'height': [submission.getSize().size.y, 0] , 'opacity': [1,0]});
			}
			else
				button.setText("hide");
		}
	});
	return false;
}
