function init_linkview(){
	if ( $('link_add_form') ) {
		$('link_add_form').observe('submit',function(e) {
			e.stop();
			if ( !$F('url') || !$F('titl')) $('errormsg').update('All fields are required');
			else {
				new Ajax.Request(base_url+'links/quickadd', {
					postBody: $('link_add_form').serialize(),
					onCreate: function() {
						$('errormsg').update('');
						$('subbtn').hide(); //EITHER ADD CLASS NAME HERE OR FIND OUT HOW TO STYLE DISABLED BUTTONS...
					},
					onSuccess: function(res) {
						var d=res.responseText;
						switch(d.substring(0,5)) {
							case 'fail:':
								$('errormsg').update('Access denied.')
								break;
							case 'error':
								$('errormsg').update(d.substring(5));
								break;
							default:
								$('new_link').insert(d.substring(5)).down('.link').down('a[title=Edit]')
								.observe('click',edit_link).up('li').highlight({startcolor: '#707000'})
								.down('a.l_up').observe('click',function(e){lvote(e,1);})
								.next('a').observe('click',function(e){lvote(e,0);})
								.next('a').observe('click',function(e){lvote(e,-1);});
								break;
						}
						$('subbtn').show();
					}
				});
			}
		});
	}
	if ( $$('.link')[0] ) {
		initiate_linker();
	}
	flag_mark( $$('.link a.flagged') );
	extra = '';
	var url = window.location.toString();
	if (!url.include('browse')) {	//php limitation on using uri segments
		var p = url.split('/').last().split('#');
		if (p[0] > 0) {
			if (p[1] > 0) fetch_comments( $('l_'+p[0]).next('span') , p[1] );
			else fetch_comments( $('l_'+p[0]).next('span') );
		}
	}	
	if (url.include('/view/')) {
		var username = $('l_'+p[0]).down('h4 a').innerHTML;
	}
	else {
		if (url.include('/user')) {
			var position = url.split('/').collect(function(e,i){ return (e == 'user') ? i : 0;}).find(function(e) {return e > 0;});
			var username = url.split('/')[position+1];
		}
		if (url.include('/category')) {
			var position = url.split('/').collect(function(e,i){ return (e == 'category') ? i : 0;}).find(function(e) {return e > 0;});
			var category = url.split('/')[position+1];
		}
		if (url.include('/sort')) {
			var position = url.split('/').collect(function(e,i){ return (e == 'sort') ? i : 0;}).find(function(e) {return e > 0;});
			var sort = url.split('/')[position+1];
		}
		if (url.include('/tl')) {
			var position = url.split('/').collect(function(e,i){ return (e == 'tl') ? i : 0;}).find(function(e) {return e > 0;});
			var tl = url.split('/')[position+1];
		}
	}
	//$('heading').update(username);
	new Ajax.Autocompleter('linkname', 'autocomplete_choices', base_url+'links/search/',{parameters: 'user='+username+'&category='+category });
	//want to fix the enter bug with this (parameters cannot be unset from set completers/requests unless you reload them, meh.
	
	$('link_search_form').observe('submit',function(e){
		e.stop();
		new Ajax.Request(base_url+'links/search',{
			postBody:'link=true&limit=50&linkname='+$F('linkname')+'&user='+username+'&category='+category,
			onCreate: function() {
				$('link_result').update('<span class="loadingi"></span>');
				$('link_legend','b2t').invoke('appear');
			},
			onSuccess: function(r) {
				$('link_result').update(r.responseText).appear();
				$$('#link_result li').last().addClassName('brdr');;
				initiate_linker();
				flag_mark( $$('#link_result li a.flagged') );
				
			}
		});
	});
	$$('div.pagin a').invoke('observe','click',function paginate(e) {	//REALLY NEED TO OBSERVE F5 AND GOTO URL NOW
		e.stop();
		var offset = e.element().readAttribute('href').split('/').last();

		new Ajax.Request(base_url+'links/get',{
			postBody: 'offset='+offset+'&user='+username+'&category='+category+'&sort='+sort+'&tl='+tl,
			onCreate: function() {
				$$('#full_link_list li').invoke('remove');
				$('full_link_list').update('<span class="loadingi"></span>');
				$$('div.pagin a').invoke('removeClassName','curr');
				e.element().addClassName('curr');
			},
			onSuccess: function(r) {
				d=r.responseText.split('<split>');
				var u = url.split('/');
				if (!u.include('browse') && !u.include('view') ) u.push('browse');
				if (u.include('o')) {
					var position = u.collect(function(e,i){ return (e == 'o') ? i : 0;}).find(function(e) {return e > 0;});
					u[position+1] = offset;
				}
				else { u.push('o');u.push(offset); }
				$('full_link_list').update('<li class="notification"><p><b>Current URL:</b> <input class="silent" size="20" onclick="javascript:focus();select();" type="text" value="'+u.join('/')+'"> <a href="'+u.join('/')+'" title="refresh" class="reload"></a></p></li><br><li id="new_link">'+d[1]);
				$$('div.pagin')[0].update(d[0]);	//old observers disappear here so can self-reference:>
				$$('.pagin a').findAll(function(e){return e.empty();}).invoke('hide');
				$$('div.pagin a').invoke('observe','click',paginate);
				$('header').scrollTo();
				initiate_linker();
				flag_mark( $$('.link a.flagged') );
			}
		});
	});
	//these only need to be done once
	$$('input[name=linkname]')[0].size = [(window.innerWidth - 580)/7.2,10].max().floor();	//long searchfields..
	
	strlen = [(window.innerWidth - 500)/8.6,12].max().floor();
	var extra = ( $('heading').innerHTML.length > strlen ) ? '...' : '';
	$('heading').update( $('heading').innerHTML.substr( 0, strlen )+extra );	//long headings..
}


function flag_mark(elements) {	//dont wanna duplicate this like other initialize stuff
	elements.invoke('writeAttribute','title','This link has been marked as dead.').each(function(e){
		e.up('h5').insert('<a title="Try googling." href="http://google.com/search?q='+e.up('h5').down('a').innerHTML.escapeHTML().split(' ').join('+')+'&ie=utf-8">G</a>'); //F I X ! ! !
	});
}

function initiate_linker() {
	$$('.link p.right')
		.invoke('observe','click',function(e){ e.stop(); fetch_comments( e.findElement('li').next('span') ); })
		.invoke('writeAttribute','title','Fetches the latest comments live');
	$$('.link a.flag').invoke('observe','click',flag);
	
	$$('a[title=Edit]')
		.invoke('observe','click',edit_link)
		.each(function(e){
			e.up('li').down('a.flag').writeAttribute('title','Mark this link as dead.');
	});

	var strlen = [(window.innerWidth-530)/8.2,10].max().floor();	//resolution fix for long titles
	$$('.link h5 a').each(function(e) {
		if ( e.innerHTML.length > strlen) {
			e.writeAttribute('title',e.innerHTML.substr(strlen-3))
			 .update(e.innerHTML.slice(0,strlen-3)+'...');
		}
	});
	
	$$('.link a.l_up')
		.invoke('writeAttribute','title','Vote up this link')
		.invoke('observe','click',function(e){lvote(e,1);});
	$$('.link a.l_dn')
		.invoke('writeAttribute','title','Vote down this link')
		.invoke('observe','click',function(e){lvote(e,-1);});
	$$('.link a.l_na')
		.invoke('observe','click',function(e){lvote(e,0);});
	
	//$$('.link a.l_dn, .link a.l_up, .link a.l_na').invoke('writeAttribute','onmouseover','this.previous(\'p.l_vtz\').morph(\'opacity:0.8\',{duration:0.3});').invoke('writeAttribute','onmouseout','this.previous(\'p.l_vtz\').morph(\'opacity:0.1\',{duration:0.3});');

	$$('.link')
		.invoke('writeAttribute','onmouseover','this.down(\'p.l_vtz\').setOpacity(0.9);')
		.invoke('writeAttribute','onmouseout','this.down(\'p.l_vtz\').setOpacity(0.1);') //.previous(\'img\').setOpacity(0.9)
		.last().addClassName('brdr');

	$$('#sidebar ul li a[href*=/links/view/]').invoke('observe','click',exists_c);
}

function exists_c(e) {	//check if comment exists on page else redirect
	e.stop();
	var lid = e.findElement('li').readAttribute('id').substr(4);
	
	if ( ele = $('l_'+lid) ) {
		fetch_comments( ele.next('span') );
		Effect.ScrollTo(ele);
	}
	else window.location = base_url+'links/view/'+lid;
}

function del_link() {
	if ( $('delete') ) $('delete').show();
	else new Insertion.Before( $$('.main')[1] , '<div id="delete" class="main"><b>Are you sure you want to delete this link?</b><br><input type="button" value="Confirm" id="real_delete"> <input type="button" value="Cancel" id="cancel"></div>');
	$('cancel').observe('click',function(){$('delete').hide();})
	$('real_delete').observe('click',function(){
		new Ajax.Request(base_url+'links/quickdel',{
			postBody: 'lid='+$F('elid'),
			onCreate: function() {
				$('l_'+$F('elid')).highlight({startcolor: '#700000', duration: 0.3}).fade({duration:0.3});
				$('delete','elf1','elf2').invoke('hide');
			}
		});
	});
}

function edit_link(e) {
	e.stop();
	var ele = e.findElement('li');
	$('elid').value = ele.readAttribute('id').substr(2);
	var lid = $F('elid');
	var title = ele.down('h5').down('a').innerHTML;
	var url = ele.down('h5').down('a').readAttribute('href');
	var cid = ( cat = ele.down('h4').down('a[href*=/category/]') ) ? cat.readAttribute('href').toString().split('/').last() : 0;
	globalfuckvar = {'cid':cid,'title':title,'lid':lid,'url':url};
	var date = ele.down('h4').readAttribute('id').split('d_').last(); //put id in the front of that to avoid duplicate ids
	var d = new Date();
	if ( Math.floor(d.getTime()/1000) - 86400 > date ) $$('#link_edit_form input[type=button]')[0].hide();
	else $$('#link_edit_form input[type=button]')[0].show();	//can only delete if recent
	$('link_edit_form').observe('submit',edit_save).down('option[value='+cid+']').selected = true;
	$('etitl').value = title;
	$('eurl').value = url;
	$('elf1','elf2').invoke('show');
	$$('body')[0].scrollTo();
	$('elf2').highlight({duration:0.5,startcolor:'#707000',endcolor:'#041300'});
}

function edit_save(e) {
	var lid = globalfuckvar['lid'];
	var cid = globalfuckvar['cid'];
	var url = globalfuckvar['url'];
	var title = globalfuckvar['title'];
	e.stop();
	if ( !$F('eurl') || !$F('etitl') ) $('eerrormsg').update('All fields are required');
	else {
		$('eerrormsg').update('');
		$('link_edit_form').request({
			onSuccess: function(r) {
				d=r.responseText;
				$('eerrormsg').update('');
				switch(d.substring(0,5)) {
					case 'yayos':
						$('l_'+lid).highlight({duration:0.6}).scrollTo().down('h5').down('a').writeAttribute('href',$F('eurl')).update($F('etitl'));
						cid = $F('ecid');
						var category = $('link_edit_form').down('option[value='+cid+']').innerHTML.toLowerCase();
						if ( el = $('l_'+lid).down('h4').down('a[href*=/category/]') ) el.writeAttribute('href','/links/browse/category/'+cid).update( category );
						else  new Insertion.Before( $('l_'+lid).down('a[title=Edit]') , 'in <a href="/links/browse/category/'+cid+'">'+category+'</a>');
						$('elf1','elf2').invoke('hide');
						break;
					default:
						$('eerrormsg').update(d.substring(5));
						break;
				}					
			}
		});
	}
}

function remove_results() {
	$('link_result').blindUp({duration:0.6});
	$('b2t','link_legend').invoke('hide');
}

function flag(e) {
	e.stop();
	ele = e.element();
	if ( ele.up('li').down('a[title=Edit]') ) {	//has edit access for this particular links
		var value = (ele.hasClassName('flagged')) ? 0 : 1;
		var lid = ele.up('li').readAttribute('id').substr(2);
		new Ajax.Request(base_url+'links/flag',{
			postBody: 'lid='+lid+'&value='+value,
			onCreate: function() {
				if (value) ele.addClassName('flagged').writeAttribute('title','This link has been marked as dead.');
				else {
					ele.removeClassName('flagged').writeAttribute('title','');
					ele.up('h5').down('a[title="Try googling."]').remove();	//BE MORE SPECIFIC HERE TO AVOID OCCASIONAL GOOGLE FAIL!
				}
			}
		});
	}
}

function lvote(e,value) {
	e.stop();
	var control = {0:'a.l_na',1:'a.l_up'};
	control[-1] = 'a.l_dn';
	var lid = e.element().up('li').readAttribute('id').substr(2);	//i.e can ditch href tags in voters if i dont care about non-js
	var owner = e.element().up('li').down('p.l_vtz').readAttribute('id').split('_lu_').last();
	
	new Ajax.Request(base_url+'links/vote',{
		postBody: 'value='+value+'&lid='+lid+'&owner='+owner,
		onCreate: function() {
			var oldvote = (ele = $('l_'+lid).down('a.voted')) ? {'l_up':1,'l_dn':-1,'l_na':0}[ ele.removeClassName('voted').classNames() ] : 0;
			$('l_'+lid).down(control[value]).addClassName('voted')
					   .previous('p.l_vtz').update( 	parseInt($('l_'+lid).down('p.l_vtz').innerHTML) - oldvote + value	);
		}
	});
}

function fetch_comments(span,cid) {
	if ( !span.empty() && span.visible() ) {
		span.hide();
		if ( $$('.link').size() > 1 ) span.previous('li').removeClassName('brdr');
	}
	else {
		
		if ( $$('.fetched_comments').any() ) $$('.fetched_comments').invoke('remove');
		var lid = span.previous('li').addClassName('brdr').readAttribute('id').substr(2);
		span.show();
		new Ajax.Request(base_url+'links/get_comments', {
			postBody: 'lid='+lid,
			onCreate: function() {
				span.insert('<div class="fetched_comments" id="comments_'+lid+'"></div>');
				$('comments_'+lid).update('<span class="loadingi"></span>');
			},
			onSuccess: function(res) {
				d=res.responseText;
				$('comments_'+lid).update(d);
				initiate_commenter();
				
				if (elem = $('c_'+cid) ) {
					Effect.ScrollTo(elem);
					var postdate = parseInt(elem.down('p.cmnrep').readAttribute('id').substr(2));
					elem.siblings('li.cmnt')
						.findAll(function(e){return e.down('p.cmnrep')})	//above still doesnt ensure li is a comment somehow
						.findAll(function(e){return parseInt(e.down('p.cmnrep').readAttribute('id').substr(2)) > postdate;})
						.invoke('highlight',{startcolor:'#707000'});	//highlights newer posts
				}
				
				
			}
		});
	}
}
