


var divs = new Array('about_us','account','contact_us','help','login','popup_overlay','popup_underlay','register','report_abuse','upload');



function _clearradiobuttons(group)
{
	for ( i=0; i<group.length; i++ ) 
	{
		if (group[i].checked == true)
			group[i].checked = false
	}
}



function _displaystory ( t, b )
{
	var h      = '<h2>Engagement story: ' + t + '</h2>' + b + '<br />' + '<center><a href="#" onClick="_togglestory()();return false;">hide story</a></center>';
	// h       = '<br /><center><a href="#" onClick="_togglestory()();return false;">hide story</a></center><br />' + h;

	var content = document.getElementById('d_story_content');
	var sizer   = document.getElementById('d_story_sizer');
	var reader  = document.getElementById('d_story_reader');

	clearElement(content);
	sizer.innerHTML  = h;
	var size         = _getsize(sizer);

	var overflow            = size.height > 300;
	reader.style.visibility = 'visible';
	reader.style.overflowY  = overflow ? 'scroll' : 'hidden';

	var rsize  = {
		height: 0,
		left:   -217,
		top:    size.top + size.height - 25,
		width:  size.width - 30 // 30 for CSS padding
	};

	var rsize_ =
	{
		height: overflow ? 300 : size.height,
		left:   rsize.left,
		top:    rsize.top,
		width:  rsize.width
	};


	clearElement(sizer);
	content.innerHTML = h;
	reader.scrollTop  = 0;
	_doslide(reader,_getmoves(rsize,rsize_,10),15,function(){});
}



function _domove( d, i, s_, m_d, m_i, f )
{
	if ( m_d.length < 1 || m_i.length < 1 )
	{
		//
		// reorg everything
		//
		_setrateronclick(true);

		for ( var i = 0; i < 3; ++i )
		{
			var e = document.getElementById('d_ring_main_'+i);

			var z = parseInt(e.style.zIndex) + 1;
			if ( z == 4 )
			{
				e.style.zIndex  = 1;
			}
			else if ( z == 2 )
			{
				e.style.display = 'none';
				e.style.zIndex  = 2;
				_setsize(
					e,
					{
						height: 317,
						left:   -217,
						top:    405 - 317,
						width:  434
					}
				);
				_setsize(
					document.getElementById('i_ring_main_'+i),
					{
						height: 313,
						left:   2,
						top:    2,
						width:  430
					}
				);

				//
				// hide the average rating
				//
				document.getElementById('d_ring_rating_'+i).style.visibility = 'hidden';
			}
			else
			{
				e.style.zIndex = 3;
				document.getElementById('d_name_tag_'+i).style.display = 'block';
				$(e).fadeIn('def');
			}
		}

		if ( f )
		{
			f();
		}

		return;
	}

	_setsize(d,m_d.shift());
	_setsize(i,m_i.shift());

	setTimeout(
		function()
		{
			_domove(d,i,s_,m_d,m_i,f);
		},
		s_
	);
}



function _doslide( e, m, s_, f )
{
	if ( !m || m.length < 1 )
	{
		if ( f )
		{
			f();
		}

		return;
	}

	_setsize(e,m.shift());
	setTimeout(
		function()
		{
			_doslide(e,m,s_,f);
		},
		s_
	);
}



function _elementmap( m, f, e )
{
	if ( !e )
	{
		e = document.body.childNodes;
	}

	for ( var i = 0; i < e.length; ++i )
	{
		if ( e[i].childNodes )
		{
			_elementmap(m,f,e[i].childNodes);
		}

		var _b = false;
		for ( var k in m )
		{
			if ( m[k] != e[i][k] )
			{
				_b = true;
				break;
			}
		}

		if ( _b )
		{
			continue;
		}

		f(e[i]);
	}
}



function _getactiveringindex ()
{
	var k = null;

	for ( var i = 0; i < 3; ++i )
	{
		var z = parseInt(document.getElementById('d_ring_main_'+i).style.zIndex);

		if ( z == 3 )
		{
			k = i;
			break;
		}
	}

	return k;
}



function _getmoves( b, e, s )
{
	var hs = _getpoints(b.height,e.height,s);
	var ls = _getpoints(b.left,  e.left,  s);
	var ts = _getpoints(b.top,   e.top,   s);
	var ws = _getpoints(b.width, e.width, s);

	var r  = new Array();

	for ( var i = 0; i < hs.length; ++i )
	{
		r.push({
			height: hs[i],
			left:   ls[i],
			top:    ts[i],
			width:  ws[i]
		});
	}

	return r;
}



//
// fix the physics here
//
function _getpoints( a, b, s )
{
	var r  = new Array();
	var a_;
	var s_ = parseInt(s/2);

	if ( s % 2 )
	{
		var t  = ( s_ * ( s_ + 1 ) ) + s_ + 1;
		var h  = ( b - a ) / 2;
		a_     = 2 * h / t;
	}
	else
	{
		var t = ( s_ * ( s_ + 1 ) );
		var h = ( b - a ) / 2;
		a_    = 2 * h / t;
	}

	var v  = 0;
	var c  = a;

	for ( var i = 0; i < s; ++i )
	{
		if ( i < s / 2 )
		{
			v += a_;
		}
		else if ( i > s / 2 )
		{
			v -= a_;
		}

		r.push(parseInt(c+=v));
	}

	r.unshift(a);
	//r.push(b);

	return r;
}



function _getsize( element )
{
	if ( !element )
	{
		return null;
	}

	var element_dimensions = {
		height:   element.offsetHeight,
		left:     0,
		top:      0,
		toString: function()
			{
				return '(' + this.left + ',' + this.top + ') (' + this.width + ',' + this.height + ')';
			},
		width:    element.offsetWidth
	};

	var element_parent = element;
	while ( element_parent )
	{
		element_dimensions.left += element_parent.offsetLeft;
		element_dimensions.top  += element_parent.offsetTop;

		element_parent = element_parent.offsetParent;
	}

	return element_dimensions;
}



function _hidedivtimeout( e )
{
	setTimeout(
		function()
		{
			e.style.display = 'block';
			e.style.display = 'none';
		},
		0
	);
}



function _hideoverlay()
{
	//
	// If this doesn't exist *and* come first, IE throws a conniption fit.
	//
	for ( var i = 0; i < divs.length; ++i )
	{
		var e = document.getElementById('d_'+divs[i]);
		if ( e.parentNode.getAttribute('id') == 'd_popup_overlay' )
		{
			e.style.display = 'none';
		}
	}

	document.getElementById('d_popup_overlay').style.display =  'none';
	document.getElementById('d_popup_underlay').style.display = 'none';
}



function _hidestory ( f )
{
	var reader   = document.getElementById('d_story_reader');
	var size     = _getsize(reader);
	size.left    = -217;
	size.top    -= 25;

	var size_    = {
		height: 0,
		left:   size.left,
		top:    size.top,
		width:  size.width
	};

	var f_     = function ()
	{
		reader.style.visibility = 'hidden';

		if ( f )
		{
			f();
		}
	};

	_doslide(reader,_getmoves(size,size_,12),15,f_);
}



function _initiatemove( d, i, t, f )
{
	t.style.display = 'none';

	var d_  = _getsize(d);
	var i_  = _getsize(i);
	d_.left = -217;
	d_.top  -= 25;
	i_.left = 2;
	i_.top  = 2;

	var s_ = 25;   // ms/frame
	var t_ = 0.75; // duration
	var ss = t_ * 1000 / s_;

	var d_n = {
		height: parseInt(d_.height/3),
		left:   d_.left - 240,
		top:    d_.top  + 170,
		width:  parseInt(d_.width/3)
	};
	var i_n = {
		height: d_n.height - 4,
		left:   2,
		top:    2,
		width:  d_n.width - 4
	};

	var m_d = _getmoves(d_,d_n,ss);
	var m_i = _getmoves(i_,i_n,ss);

	_domove(d,i,s_,m_d,m_i,f);
}



function _loadaccountinfo()
{
	document.getElementById('s_account_update').style.visibility = 'hidden';

	document.getElementById('a_password_0').value = '';
	document.getElementById('a_password_1').value = '';

	_showaccountinfo({
		email:      '',
		firstname:  '',
		lastname:   '',
		ringRating: '?',
		ringURL:    '',
		storyBody:  '',
		storyTitle: ''
	});
	document.getElementById('d_account_loading').style.visibility = 'visible';

	jQuery.get(
		'account.php',
		null,
		function( data, text )
		{
			_showaccountinfo(data);
		},
		'json'
	);
}



function _makemetadatadom( d )
{
	var t = d.storytitle;
	var b = d.storybody;
	
	/*if (t.length > 1 && b.length > 8)
		t = "Engagement story: " + t;*/

	if ( t.length < 1 && b.length < 8 )
	{
		return DOM([['span',null,'']]);
	}

	if ( b.length < 8 )
	{
		return DOM([['span',null,_makestorytitle(t)]]);
	}

	if ( t.length < 1 )
	{
		return DOM([
			[
				'a',
				{
					title: t,		
					href:    '#',
					onclick: _togglestory(t,b)
				},
				'Read this story'
			]
		]);
	}

	return DOM([
		[
			'a',
			{
				title: t,				
				href:    '#',
				onclick: _togglestory(t,b)
			},
			 _makestorytitle(t)
		]
	]);
}



function _makestorytitle ( t )
{
	var LEN = 28;
	var ts  = t.split(/\s+/);

	var i;
	var t_ = '';
	for ( i = 0; i < ts.length; ++i )
	{
		if ( t_.length + ts[i].length + 1 > LEN )
		{
			if ( i < 3 )
			{
				var r = LEN - t_.length - 1;
				if ( r > 0 )
				{
					if ( t_.length > 0 )
					{
						t_ += ' '
					}

					t_ += ts[i].substr(0,r);
				}
			}

			t_ += '\u2026';

			break;
		}

		if ( t_.length > 0 )
		{
			t_ += ' ';
		}
		t_ += ts[i];
	}

	return t_;
}



function _movering ( k )
{
	return function ()
	{
		_initiatemove(
			document.getElementById('d_ring_main_'+k),
			document.getElementById('i_ring_main_'+k),
			document.getElementById('d_name_tag_'+k),
			function()
			{
				_setring((k+1)%3,desire.getImage());

				var r = document.getElementById('d_ring_rating_'+k);
				var q = _getsize(document.getElementById('d_ring_main_'+k));
				r.style.height = q.height + 'px';
				var s = _getsize(r);

				// s.left  = 0;
				// s.top   = 0;
				// s.width = 0;
				s.height = 0;
				s.left   = 0;

				s.top    = document.all ? 0 : ( document.getElementById('i_ring_main_'+k).style.height + 4 );

				r.style.visibility = 'visible';
				var s_ = {
					height:   40,       // q.height,
					left:     s.left,   // -80,
					top:      s.top,    // 0,
					toString: s.toString,
					width:    s.width   // 80
				};

				var r_ = _getsize(r.childNodes[0]);
				// r.childNodes[0].style.top = parseInt( ( s_.height - r_.height ) / 2 ) + 'px';
				r.childNodes[0].style.top = '7px';

				_doslide(r,_getmoves(s,s_,20),25,function()
				{
				});
				_clearradiobuttons(document.getElementsByName("rating"));	
			}
		);
	}
}



function _rate( v, k )
{
	var image_src  = document.getElementById('i_ring_main_'+k).getAttribute('src');
	var image_path = image_src.split('/');
	var image_bits = image_path[image_path.length-1].split('.');

	var ring_id    = image_bits[0];
	var image_id   = image_bits[1];

	var owner_name = document.getElementById('s_ring_owner_'+k).firstChild.data;
		
	var p = {
		ringID: ring_id,
		rating: v
	};
		
	jQuery.post(
		'rateImage.php',
		p,
		function( data, text )
		{
			_setimagerating(data.value,document.getElementById('s_ring_rating_'+k),owner_name);
		},
		'json'
	);
}



function _seterror( e, o, m )
{
	e.innerHTML     = m;
	e.style.display = 'block';

	if ( o )
	{
		o.style.visibility = 'hidden';
	}
}



function _setgradient( c0, c1 )
{
	document.getElementById('d_ring_main').style.backgroundImage = 'url(_gradient.php?0=' + c0 + '&1=' + c1 + ')';
}



function _setimagerating( v, e, o )
{
	v = parseInt( v * 10 ) / 10;
	if ( parseInt(v) == v )
	{
		v += '.0';
	}

	if ( o.substr(-1,1) == 's' )
	{
		o += "'";
	}
	else
	{
		o += "'s";
	}

	e.style.textAlign = 'center';
	e.innerHTML       = o + ' Ring<br />Average Rating: ' + v;
}



function _setrateronclick( b )
{
	var r = document.body.getElementsByTagName('input');
	for ( var i = 0; i < r.length; ++i )
	{
		if ( r[i].getAttribute('type') != 'radio' )
		{
			continue;
		}

		r[i].onclick = function( e )
		{
			if ( b )
			{
				_setrating(this.value);
			}
		};
	}
}


function _setrating( v )
{
	_setrateronclick(false);

	var k = _getactiveringindex();
	_rate(v,k);

	if ( desire.atLastImage() )
	{
		desire.loadRandomImages();
	}


	var mr = _movering(k);
	var r  = document.getElementById('d_story_reader');
	if ( r && r.style.visibility == 'visible' )
	{
		_hidestory(mr);
	}
	else
	{
		mr();
	}
}



function _setring( i, r )
{
	document.getElementById('i_ring_main_'+i).src           = r.url;
	document.getElementById('s_ring_owner_'+i).innerHTML    = r.user;

	var m = document.getElementById('s_ring_metadata_'+i);
	clearElement(m);	
	if(r.data.storytitle.length > 1 && r.data.storybody.length > 8) {
		m.appendChild(document.createTextNode("Read about my proposal:"));
		m.appendChild(document.createElement("br"));
	}
	m.appendChild(_makemetadatadom(r.data));
}



function _setsize( e, s )
{
	//
	// Some quick bounds-checking never hurt anyone.
	//
	if ( s.height < 0 )
	{
		s.height = 0;
	}
	if ( s.width < 0 )
	{
		s.width = 0;
	}

	e.style.height = s.height + 'px';
	e.style.left   = s.left   + 'px';
	e.style.width  = s.width  + 'px';

	if ( s.bottom )
	{
		e.style.bottom = s.bottom + 'px';
	}
	else if ( s.top )
	{
		e.style.top    = s.top    + 'px';
	}
}



function _showaccountinfo( a )
{
	document.getElementById('a_firstname').value = a.firstname;
	document.getElementById('a_lastname').value  = a.lastname;
	document.getElementById('a_email_0').value   = a.email;
	document.getElementById('a_email_1').value   = a.email;

	document.getElementById('a_story').value     = a.storyBody;
	document.getElementById('a_title').value     = a.storyTitle;

	document.getElementById('d_account_loading').style.visibility = 'hidden';

	var b = document.getElementById('d_account_ring_data');
	var d = document.getElementById('d_account_ring');
	var i = document.getElementById('i_account_ring');
	var n = document.getElementById('d_account_ring_info');
	if ( a.ringURL == '' )
	{
		b.innerHTML        = 'Rating: <strong>???</strong>';
		d.style.cursor     = 'pointer';
		d.onclick          = function ( event )
		{
			parent.location  = '#upload';
			_showdiv('d_upload');
		};
		i.style.visibility = 'hidden';

		clearElement(n);
		n.appendChild(DOM([
			[
				'span',
				null,
				[
					[
						'span',
						null,
						'Can you outshine the rest? '
					],
					[
						'a',
						{
							href:    '#upload',
							onclick: function( event )
							{
								_showdiv('d_upload');
							}
						},
						'Upload your ring'
					],
					[
						'span',
						null,
						' and see how you compare.'
					]
				]
			]
		]));

		document.getElementById('t_account_story').style.display = 'none';
	}
	else
	{
		b.innerHTML        = 'Rating: <strong>' + a.ringRating + '</strong>';
		d.style.cursor     = 'auto';
		d.onclick          = function(event){};
		i.setAttribute('src',a.ringURL);
		i.style.visibility = 'visible';

		clearElement(n);
		n.appendChild(DOM([
			[
				'a',
				{
					href:    '#account',
					onclick: function( event )
					{
						document.getElementById('d_account_loading').style.visibility = 'visible';

						jQuery.post(
							'removeImage.php',
							{
								imageid: a.imageid
							},
							function ( data, text )
							{
								_showaccountinfo(data);
							},
							'json'
						);
					}
				},
				'Remove this ring'
			]
		]));

		var lnk = document.getElementById('a_link');
		clearElement(lnk);
		lnk.setAttribute('href','http://www.doesitsparkle.com/?sparkle='+a.linkURL);
		lnk.appendChild(document.createTextNode('http://www.doesitsparkle.com/?sparkle='+a.linkURL));

		var tas = document.getElementById('t_account_story');
		tas.style.display = '';
		tas.style.width   = '100%';
	}
}



function _showanchordiv()
{
	if ( parent.location.href.indexOf('#') < 0 )
	{
		page_tracker._trackPageview('/splash');
		return;
	}

	m = parent.location.href.match(/#([^\?]*)/);
	_showdiv('d_'+m[1].replace('-','_'));
}



//
// Hit this up with some JQuery action
//
function _showdiv( _e )
{
	//
	// The (internal) order of this function doesn't make much sense from
	// a readability standpoint, but if we organize it any other way IE will
	// barf and display previously focused divs, even though display is set
	// to none.
	//

	e = document.getElementById(_e);
	if ( e == null )
	{
		return;
	}

	var n = e.parentNode.getAttribute('id');
	if ( n != 'd_text_body' && n != 'd_popup_overlay' )
	{
		return;
	}
	else
	{
		page_tracker._trackPageview('/'+_e.substr(2));
	}

	e.style.display = 'block';

	var o = document.getElementById('d_popup_overlay');
	var u = document.getElementById('d_popup_underlay');
	o.style.display = 'block';
	u.style.display = 'block';

	if ( n == 'd_popup_overlay' )
	{
		e.style.width = '400px';
	}

	// _elementmap({tagName:'INPUT'},function(e){if(e.blur)e.blur();});

	switch ( _e )
	{
		case 'd_account':
			if ( document.getElementById('a_toggle_login').innerHTML == 'Login' )
			{
				_showdiv('d_login');

				_e = 'd_login';
				document.getElementById(_e).style.display = 'block';
			}
			else
			{
				_loadaccountinfo();
				e.style.width = '600px';
			}
			break;

		case 'd_contact_us':
			document.getElementById('c_name').focus();
			break;

		case 'd_login':
			document.getElementById('l_username').focus();
			break;

		case 'd_register':
			e.style.width = '600px';
			document.getElementById('r_username').focus();
			break;

		case 'd_report_abuse':
			document.getElementById('p_report_error').style.display = 'none';
			document.getElementById('ra_comments').value            = '';
			break;

		case 'd_upload':
			if ( document.getElementById('a_toggle_login').innerHTML == 'Login' )
			{
				_showdiv('d_login');

				//
				// Reset _e so that we remember to show the login window.
				//
				_e = 'd_login';
				document.getElementById(_e).style.display = 'block';
			}

			document.getElementById('p_upload_error').style.display = 'none';
			break;

		default:
			o.style.display = 'none';
			u.style.display = 'none';
			break;
	}

	for ( var i = 0; i < divs.length; ++i )
	{
		if ( 'd_' + divs[i] == _e )
		{
			continue;
		}

		var m = document.getElementById('d_'+divs[i]);
		if ( m.parentNode.getAttribute('id') == n )
		{
			m.style.display = 'none';

			//
			// Dear Internet Explorer,
			//
			// Go fuck yourself.
			//
			// Love,
			//   Kyle
			//
			// UPDATE:
			// Patched by hiding inset divs *before* the overlay div is none'd.
			//
			/**
			if ( document.all )
			{
				_hidedivtimeout(m);
			}
			/**/
		}
	}
}


function _skipImage()
{
	var k = _getactiveringindex();
	if ( desire.atLastImage() )
	{
		desire.loadRandomImages();
	}
	
	var mr = _movering(k);
	var r  = document.getElementById('d_story_reader');
	if ( r && r.style.visibility == 'visible' )
	{
		_hidestory(mr);
	}
	else
	{
		mr();
	}
	var image_src  = document.getElementById('i_ring_main_'+k).getAttribute('src');
	var image_path = image_src.split('/');
	var image_bits = image_path[image_path.length-1].split('.');

	var ring_id    = image_bits[0];
	var image_id   = image_bits[1];	
	var owner_name = document.getElementById('s_ring_owner_'+k).firstChild.data;
	
	var p = {
		ringID: ring_id
	};
	
	jQuery.post(
		'skipImage.php',
		p,
		function( data, text )
		{
			_setimagerating(data.value,document.getElementById('s_ring_rating_'+k),owner_name);
		},
		'json'
	);
}

function _togglestory ( t, b )
{
	return function ( event )
	{
		if ( document.getElementById('d_story_reader').style.visibility == 'visible' )
		{
			_hidestory();
		}
		else
		{
			_displaystory(t,b);
		}
	};
}



function _toggleuserstatus( s )
{
	var d = document.getElementById('d_top_button_login');
	var e = document.getElementById('a_toggle_login');
	var f = document.getElementById('a_toggle_register');

	if ( s == 'login' )
	{
		e.setAttribute('href','#login');
		e.onclick   = function(event){_showdiv('d_login');};
		e.innerHTML = 'Login';

		f.setAttribute('href','#register');
		f.onclick   = function(evt){_showdiv('d_register');};
		f.innerHTML = 'Register';

		d.style.visibility = 'visible';
	}
	else if ( s == 'account' )
	{
		e.setAttribute('href','#account');
		e.onclick   = function(event){_showdiv('d_account');};
		e.innerHTML = 'My Account';

		f.setAttribute('href','#logout');
		f.onclick   = function(evt){_trylogout();};
		f.innerHTML = 'Logout';

		d.style.visibility = 'hidden';
	}
}



function _sendContactEmail()
{
	document.getElementById('d_contact_loading').style.visibility = 'visible';
	
	var e = document.getElementById('c_contact_error');
	var s = document.getElementById('c_status');
	var p = {
		name: document.getElementById('c_name').value,
		email: document.getElementById('c_email').value,
		subject: document.getElementById('c_subject').value,
		message: document.getElementById('c_message').value
	};
	e.style.display = 'none';
	
	jQuery.post(
		'sendContactEmail.php',
		p,
		function( data, text )
		{
			if ( data.status == 'error' )
			{
				e.innerHTML		= 'Error: ' + data.value;
				e.style.display = 'block';
				
				page_tracker._trackPageview('/contact_error');
			}
			else
			{
				e.style.display = 'none';
				s.innerHTML	= '<p>Thank you for your message.  We will get back to you soon.</p>';
				s.style.display = 'block';
				
				document.getElementById('c_name').value = '';
				document.getElementById('c_email').value = '';
				document.getElementById('c_subject').value = '';
				document.getElementById('c_message').value = '';
				
			}
			document.getElementById('d_contact_loading').style.visibility = 'hidden';					
		},
		'json'
	);
}



function _trylogin()
{
	document.getElementById('d_login_loading').style.visibility = 'visible';

	var e = document.getElementById('p_login_error');
	var p = {
		username: document.getElementById('l_username').value,
		password: document.getElementById('l_password').value
	};
	e.style.display = 'none';

	jQuery.post(
		'loginUser.php',
		p,
		function( data, text )
		{
			if ( data.status == 'error' )
			{
				e.innerHTML     = 'Error: ' + data.value;
				e.style.display = 'block';

				page_tracker._trackPageview('/login_error');
			}
			else
			{
				e.style.display = 'none';

				for ( k in p )
				{
					document.getElementById('l_'+k).value = '';
				}

				//
				// Reset bottom links
				//
				_toggleuserstatus('account');

				//
				// Move to the account tab
				//
				parent.location = '#account';
				_showdiv('d_account');
			}

			document.getElementById('d_login_loading').style.visibility = 'hidden';
		},
		'json'
	);

	return false;
}



function _trylogout()
{
	page_tracker._trackPageview('/logout');

	jQuery.post(
		'logoutUser.php',
		null,
		function( data, text )
		{
			_toggleuserstatus('login');
			_showdiv('d_about_us');
		},
		'json'
	);
}



function _tryregisteraccount()
{
	var o = document.getElementById('d_register_loading');
	o.style.visibility = 'visible';

	var e = document.getElementById('p_register_error');
	var p = {
		username:   document.getElementById('r_username').value,
		firstname:  document.getElementById('r_firstname').value,
		lastname:   document.getElementById('r_lastname').value,
		email:      document.getElementById('r_email_0').value,
		email_0:    '',
		email_1:    '',
		password_0: document.getElementById('r_password_0').value,
		password_1: document.getElementById('r_password_1').value
	};

	//
	// Pre-handle errors.
	//
	if ( p.username == '' )
	{
		_seterror(e,o,'There was a problem with your registration: you must choose a username.');
		return false;
	}
	else if ( p.username.replace(/[^a-z0-9A-Z_]/) == '' )
	{
		_seterror(e,o,'There was a problem with your registration: your username must contain only letters, numbers, and _.');
		return false;
	}
	else if ( p.firstname == '' )
	{
		_seterror(e,o,'There was a problem with your registration: please enter your first name.');
		return false;
	}
	else if ( p.email != document.getElementById('r_email_1').value )
	{
		_seterror(e,o,'There was a problem with your registration: email addresses must match.');
		return false;
	}
	else if ( p.value == '' )
	{
		_seterror(e,o,'There was a problem with your registration: please enter your email address.');
		return false;
	}
	else if ( p.password_0 != p.password_1 )
	{
		_seterror(e,o,'There was a problems with your registration: passwords must match.');
		return false;
	}

	jQuery.post(
		'registerUser.php',
		p,
		function( data, text )
		{
			if ( data.status == 'error' )
			{
				e.innerHTML     = 'There was a problem with your registration: ' + data.value;
				e.style.display = 'block';

				page_tracker._trackPageview('/register_error');
			}
			else
			{
				e.style.display = 'none';

				for ( k in p )
				{
					if ( document.getElementById('r_'+k) )
					{
						document.getElementById('r_'+k).value = '';
					}
				}

				document.getElementById('r_tos').checked = false;
				document.getElementById('r_submit').setAttribute('disabled','disabled');

				//
				// Reset bottom links
				//
				_toggleuserstatus('account');

				//
				// Move to the account tab
				//
				_showdiv('d_account');
			}

			document.getElementById('d_register_loading').style.visibility = 'hidden';
		},
		'json'
	);

	return false;
}



function _tryreportabuse ()
{
	var c = document.getElementById('ra_comments');
	var e = document.getElementById('p_report_error');

	if ( c.value.length < 1 )
	{
		e.innerHTML     = 'Error: you must provide comments to flag an image for abuse.';
		e.style.display = 'block';

		return;
	}

	e.style.display    = 'none';
	var a              = document.getElementById('d_report_loading');
	a.style.visibility = 'visible';

	var k = _getactiveringindex();
	var p = {
		comments: c.value,
		imageurl: document.getElementById('i_ring_main_'+k).src
	};

	jQuery.post(
		'reportAbuse.php',
		p,
		function ( data, text )
		{
			a.style.visibility = 'hidden';
			_hideoverlay();

			if ( document.getElementById('d_story_reader').style.visibility == 'visible' )
			{
				_togglestory();
			}

			document.getElementById('s_ring_rating_'+k).innerHTML = '<span style="color:red;">This image has been reported for abuse.</span>';
			var mr = _movering(k);
			mr();
		},
		'json'
	);

	return false;
}



function _tryupdateinfo()
{
	var p = {
		email:           document.getElementById('a_email_0').value,
		emailconfirm:    document.getElementById('a_email_1').value,
		firstname:       document.getElementById('a_firstname').value,
		lastname:        document.getElementById('a_lastname').value,
		password:        document.getElementById('a_password_0').value,
		passwordconfirm: document.getElementById('a_password_1').value,
		storybody:       document.getElementById('a_story').value,
		storytitle:      document.getElementById('a_title').value
	};

	var a = document.getElementById('s_account_update');
	var e = document.getElementById('p_account_error');
	a.style.visibility = 'hidden';
	e.style.display    = 'none';

	if ( p.firstname == '' )
	{
		e.style.display = 'block';
		e.innerHTML     = 'Error: please enter your first name.';
		return;
	}
	else if ( !/^[a-zA-Z0-9\-_]+[a-zA-Z0-9\-_\.\+]*@[a-zA-Z0-9\-\_]+(\.[a-zA-Z0-9\-\_]{2,})+/.exec(p.email) )
	{
		e.style.display = 'block';
		e.innerHTML     = 'Error: please enter a valid email address.';
		return;
	}
	else if ( p.email != p.emailconfirm )
	{
		e.style.display = 'block';
		e.innerHTML     = 'Error: email addresses must match.';
		return;
	}
	else if ( p.password != p.passwordconfirm )
	{
		e.style.display = 'block';
		e.innerHTML     = 'Error: passwords must match.';
		return;
	}

	var j = document.getElementById('d_account_loading');
	j.style.visibility = 'visible';

	jQuery.post(
		'updateUser.php',
		p,
		function ( data, text )
		{
			j.style.visibility = 'hidden';

			if ( data.status == 'success' )
			{
				a.style.visibility = 'visible';
			}
			else
			{
				e.innerHTML = 'Error: ' + data.value;
			}
		},
		'json'
	);
}



function _tryupload()
{
	document.getElementById('d_upload_loading').style.visibility = 'visible';
	var e           = document.getElementById('p_upload_error');
	e.style.display = 'none';

	if ( document.getElementById('a_toggle_login').innerHTML == 'Login' )
	{
		e.innerHTML     = 'You must <a href="#login" onclick="_showdiv(\'d_login\');">log in</a> to upload an image.';
		e.style.display = 'block';

		return false;
	}

	document.getElementById('u_iframe').oncomplete = function( event )
	{
		var a = document.getElementById('d_upload_loading');
		var d = null;
		if ( this.contentDocument )
		{
			d = this.contentDocument;
		}
		else if ( this.contentWindow && this.contentWindow.document )
		{
			d = this.contentWindow.document;
		}

		if ( d )
		{
			var r = eval(d.body.innerHTML);
			r     = r[0];

			if ( r.status && r.status == 'error' )
			{
				e.innerHTML     = 'Error: ' + r.value;
				e.style.display = 'block';

				a.style.visibility = 'hidden';
				return;
			}
		}

		parent.location = '#account';
		_showdiv('d_account');
		a.style.visibility = 'hidden';
	};

	return true;
}



function DISImage( url, user, data )
{
	this.data = data;
	this.url  = url;
	this.user = user;
}



function DISImageRatingEmcee ( random )
{
	this.image  = 0;
	this.images = [];
	this.random = random;



	DISImageRatingEmcee.prototype.atLastImage = function ()
	{
		if ( this.image >= this.images.length )
		{
			this.image %= this.images.length;
			return true;
		}

		return false;
	};



	DISImageRatingEmcee.prototype.getImage = function ()
	{
		return this.images[this.image++];
	};



	DISImageRatingEmcee.prototype.loadRandomImages = function ()
	{
		$.getJSON(
			'createImageArray.php',
			{
				limit: this.random
			},
			this.loadRandomImages_()
		);
	};



	DISImageRatingEmcee.prototype.loadRandomImages_ = function ()
	{
		var _this = this;

		return function ( data )
		{
			_this.images = data.map(function(e)
			{
				return new DISImage(e.url,e.user,e.data);
			});
		};
	};



	DISImageRatingEmcee.prototype.setImagesFromJSON = function ( data )
	{
		this.images = eval(data);
	};
}



Array.prototype.map = function ( f )
{
	var a = [];

	for ( var i = 0; i < this.length; ++i )
	{
		a[i] = f(this[i]);
	}

	return a;
};



