/*****************************************************
* Poster Slider
*****************************************************/
var PS = {
	posterWidth: 213 			// includes padding/margins
	, wrap: true 				// when we get to the end of one side, wrap posters from the other side
	, visiblePosters: 4			// number of posters visible at a time
	, slideBy: 4 				// number of posters to slide in on each slide
	, speed: .3					// time (in seconds) per item
	, _moving: false
	, _curLeft: 0
	, _posterCount: 0
	, _containerWidth: 0
	, _pc: false
	, _sl: false
	, _sr: false
	, init: function(postersContainer, slideLeft, slideRight) {
		// check poster numbers - if greater than visiblePosters, add functionality to both arrows, otherwise hide arrows
		PS._pc = postersContainer;
		PS._sl = slideLeft;
		PS._sr = slideRight;
		
		if (PS._pc && PS._sl && PS._sr) {		
			PS._posterCount = PS._pc.childElements().length;
			
			if (PS._posterCount > PS.visiblePosters) {
				PS._sl.onclick = PS.slide_left;
				PS._sr.onclick = PS.slide_right;
				
				PS._containerWidth = PS._posterCount * PS.posterWidth;
				PS._pc.setStyle('width:' + PS._containerWidth + 'px;');
			} else {
				PS._sl.setStyle('visibility:hidden;');
				PS._sr.setStyle('visibility:hidden;');
			}
		} else { 
			// fail
			alert('postersContainer, slideLeft, and slideRight must all exist!');
		}
	}, slide_left: function() {
		if (!PS._moving) {
			// update curLeft, moving
					
			// how many posters are there hidden on the left?
			var buffer = PS._posterCount - PS.visiblePosters;
			
			// how many do we want to slide by?
			sb = Math.min(buffer, PS.slideBy);
			
			PS._moving = true;
			if (PS._curLeft == (PS._posterCount - PS.visiblePosters)) {
				// no room to slide, unless we're wrapping
				if (PS.wrap) {
					// need to move some posters from the beginning to the end
					
					// ok, move sb posters to the beginning, and instantly shift our list
					for (var i = 0, j = sb; i < j; ++i) {
						PS._pc.insert({bottom:PS._pc.childElements()[0]});
					}
					PS._curLeft -= sb;
					PS._pc.setStyle('left: -' + ((PS._curLeft) * PS.posterWidth) + 'px;'); // we can put this in the loop if it looks fucked up					
				} else {
					PS._moving = false;
					return; // can't slide - we're done
				}
			}
			PS._curLeft += sb;
			PS._pc.visualEffect('move', {x: (-1 * (sb * PS.posterWidth)), y:0, mode:'relative', duration:PS.speed * sb, afterFinish: function() { PS._moving = false; } });			
		}
	}, slide_right: function() {
		if (!PS._moving) {
			// update curLeft, moving
					
			// how many posters are there hidden on the left?
			var buffer = PS._posterCount - PS.visiblePosters;
			
			// how many do we want to slide by?
			sb = Math.min(buffer, PS.slideBy);
			
			PS._moving = true;
			if (PS._curLeft == 0) {
				// no room to slide, unless we're wrapping
				if (PS.wrap) {
					// need to move some posters from the beginning to the end
					
					// ok, move sb posters to the end, and instantly shift our list
					for (var i = 0, j = sb; i < j; ++i) {
						PS._pc.insert({top:PS._pc.childElements()[PS._posterCount - 1]});
					}
					PS._curLeft += sb;
					PS._pc.setStyle('left: -' + ((PS._curLeft) * PS.posterWidth) + 'px;'); // we can put this in the loop if it looks fucked up					
				} else {
					PS._moving = false;
					return; // can't slide - we're done
				}
			}
			PS._curLeft -= sb;
			PS._pc.visualEffect('move', {x: (sb * PS.posterWidth), y:0, mode:'relative', duration:PS.speed * sb, afterFinish: function() { PS._moving = false; } });		
		}
	}
};

/*****************************************************
* Basic Ajax Functions
*****************************************************/
function ajax_validResponse(json) {
	if (json.length > 0) {
		eval('response = '+json);		
		if (response.header) {
			return true;
		}
	}
	return false;
}

function ajax_req(hash, successFunction) {
	req(hash, successFunction, 'pd-ajax.html');
}

function req(hash, successFunction, dest) {
	new Ajax.Request(dest, {
		method: 'post',
		parameters: hash,
		onSuccess: function(transport) { 
			if (ajax_validResponse(transport.responseText)) {
				eval('response = '+transport.responseText);
				successFunction.call(response);				
			}
		},
		onFailure: function(transport) { 
			generalError('Error connecting to server.'); 
		}
	});
}

/*****************************************************
* Save User Content
*****************************************************/
var PD_SaveContent = {
	_waiting: false
	, _waitingType: ''
	, _waitingForm: 0
	, saveImage: function(form) {
		if (!PD_SaveContent._waiting) {
			if (PD_SaveContent._checkRequired(form)) {
				form.down('input.save').disabled = true;
				PD_SaveContent._waitingType = 'image';
				PD_SaveContent._saveFile(form);
			}
		}
	}, saveAudio: function(form) {
		if (!PD_SaveContent._waiting) {
			if (PD_SaveContent._checkRequired(form)) {
				form.down('input.save').disabled = true;
				PD_SaveContent._waitingType = 'audio';
				PD_SaveContent._saveFile(form);
			}
		}
	}, saveText: function(form) {
		if (!PD_SaveContent._waiting) {
			if (PD_SaveContent._checkRequired(form)) {
				PD_SaveContent._resetForm(form);
				PD_SaveContent._waiting = true;
				form.down('input.save').disabled = true;
				PD_SaveContent._waitingForm = form;
				var hash = $H(
					{ "name": 		$F(form.down('input.name'))
					, "email": 		$F(form.down('input.email'))
					, "text": 		$F(form.down('textarea.comment'))
					, "title": 		$F(form.down('input.title'))
					, "desc": 		$F(form.down('textarea.description'))
					, "qc": 		PD_SaveContent._docToCode($F(form.down('input.doc-id')))
					, "approved": 	1
					, "type": 		"text"}
				);
				
				ajax_req(hash, PD_SaveContent._saveResponse);
			}
		}
	}, saveVideo: function(form) {
		if (!PD_SaveContent._waiting) {
			if (PD_SaveContent._checkRequired(form)) {
				PD_SaveContent._resetForm(form);
				PD_SaveContent._waiting = true;
				form.down('input.save').disabled = true;
				PD_SaveContent._waitingForm = form;
				var hash = $H(
					{ "name": 		$F(form.down('input.name'))
					, "email": 		$F(form.down('input.email'))
					, "key": 		$F(form.down('input.youtube'))
					, "title": 		$F(form.down('input.title'))
					, "desc": 		$F(form.down('textarea.description'))
					, "qc": 		PD_SaveContent._docToCode($F(form.down('input.doc-id')))
					, "approved": 	1
					, "type": 		"video"}
				);
				
				ajax_req(hash, PD_SaveContent._saveResponse);
			}
		}
	}, _saveFile: function(form) {
		PD_SaveContent._resetForm(form);
		PD_SaveContent._waiting = true;
		PD_SaveContent._waitingForm = form;
		// submit file form here
		$(PD_SaveContent._waitingType+'-file-upload-form').target = "upload_target";
		$(PD_SaveContent._waitingType+'-file-upload-form').submit();
	}, uploadComplete: function(files) {
		// upload complete, now we post the rest of the _waiting values via ajax
		if (files[0].success) {
			var hash = $H(
				{ "name": 		$F(PD_SaveContent._waitingForm.down('input.name'))
				, "email": 		$F(PD_SaveContent._waitingForm.down('input.email'))
				, "title": 		$F(PD_SaveContent._waitingForm.down('input.title'))
				, "desc": 		$F(PD_SaveContent._waitingForm.down('textarea.description'))
				, "key": 		files[0].key
				, "qc": 		PD_SaveContent._docToCode($F(PD_SaveContent._waitingForm.down('input.doc-id')))
				, "approved": 	1
				, "type": 		PD_SaveContent._waitingType }
			);
			ajax_req(hash, PD_SaveContent._saveResponse);
		} else {
			// error uploading file
			PD_SaveContent._waitingForm.down('dt.status').update(files[0].message);
			PD_SaveContent._waitingForm.down('dt.status').addClassName('error');
			PD_SaveContent._waitingForm.down('input.save').disabled = false;
			PD_SaveContent._waiting = false;
		}
	}, _saveResponse: function() {
		// should only have to do this on error, but because the browser saves the disabled state, we'd better reset it
		PD_SaveContent._waitingForm.down('input.save').disabled = false; 
		if (this.header.sc != 0) {
			PD_SaveContent._waitingForm.down('dt.status').addClassName('error');	
		} else {
			PD_SaveContent._waitingForm.down('dt.status').addClassName('success');
			// reset form
			PD_SaveContent._waitingForm.select('input[type=text]').each(function(s) {
				if (!s.hasClassName('email')) {
					s.value = '';
				}
			});
			
			PD_SaveContent._waitingForm.select('textarea').each(function(s) {
				s.value = '';
			});
			
			PD_SaveContent._waitingForm.select('input[type=file]').each(function(s) {
				s.value = '';
			});
			//PD_SaveContent._waitingForm.up('.tab').update('<div class="status success">'+this.header.msg+'</div');
		}	
		PD_SaveContent._waitingForm.down('dt.status').update(this.header.msg);
		PD_SaveContent._waiting = false;
	}, _checkRequired: function(form) {
		var arr = form.select('.required:not([type~=checkbox])');
		var req_error = false;
		
		for (var i = 0, j = arr.length; i < j; ++i) {
			if ($F(arr[i]).length == 0) {
				arr[i].addClassName('error');
				//arr[i].highlight();
				req_error = true;
			}
		}
		
		if (req_error) {
			form.down('dt.status').update('Please fill in all of the required fields above.');
			form.down('dt.status').addClassName('error');			
			return false; 
		}
		
		if (!form.down('input.agree').checked) {
			//form.down('input.agree').up().highlight();
			form.down('dt.status').update('You must agree to the terms and conditions to save your content.');
			form.down('dt.status').addClassName('error');
			return false; 
		}
		
		return true;		
	}, _docToCode: function(docID) {
		// turn a document id into a request code for the server
		
		// would love to just subtract 10 from the docID, but this is just a strange coincidence and won't be true
		// for any future additions or modifications to the document tree
		switch (docID) {
			case '10':
				return 0;
			case '11':
				return 1;
			case '12':
				return 2;
			case '13':
				return 3;
			case '14':
				return 4;
			case '15':
				return 5;
			default:
				return -1;
		}
	}, _resetForm: function(form) {
		form.down('dt.status').update('');
		form.down('dt.status').removeClassName('error');
		form.down('dt.status').removeClassName('success');
		form.select('.error').each(function(s) { s.removeClassName('error'); });
	}
};

function uploadComplete(files) {
	// called when the upload frame has finished - just a wrapper for the PD_SaveContent.uploadComplete function
	PD_SaveContent.uploadComplete(files);
}

function focusInput(input) {
	if (!input.def) {
		input.def = input.value;
	}
	if (input.value == input.def) {
		input.value = '';
		$(input).removeClassName('empty');
	}
}

function blurInput(input) {
	if (input.value == '') {
		input.value = input.def;
		$(input).addClassName('empty');
	}
}

function limitText(limitField, limitCount, limitNum) {
	if (limitField.value.length > limitNum) {
		limitField.value = limitField.value.substring(0, limitNum);
	} else {
		limitCount.innerHTML = limitNum - limitField.value.length;
	}
}

function previewVideo(input) {
	/*$key = strstr($key, '?v=');
	if (strlen($key) > 0) {
		if (strstr($key, '&')) {
			$key = substr($key, 0, strpos($key, '&') +1);
		}
		$key = substr($key, 3);
	} else {
		return $this->resp_badYouTube();
	}*/
	var a_key = new Array();
	var key = '';
	
	try {
		a_key = $F(input).split('=');		
		key = a_key[1];
		
		if (key.indexOf('&') > 0) {
			key = key.split('*')[0];
		}
		
		if (key.length > 0) {
			showVideo(key, input.next('.video-preview'));
		} else {
			input.next('.video-preview').update('Invalid YouTube link! Please try again.');
		}
	} catch (err) {
		input.next('.video-preview').update('Invalid YouTube link! Please try again.');
	}
}

function showVideo(yt_key, target) {
	target.update('<object width="320" height="265"><param name="movie" value="http://www.youtube-nocookie.com/v/'+yt_key+'&hl=en&fs=1&rel=0"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube-nocookie.com/v/'+yt_key+'&hl=en&fs=1&rel=0" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="320" height="265"></embed></object>');
}

function changeMediaType(selector) {
	var index = selector.selectedIndex;
	var media_container = selector.up().next('.media-container');
	
	if (media_container.select('.media-type').length > index) {
		media_container.down('.media-type:not(.hidden)').addClassName('hidden');
		media_container.select('.media-type')[index].removeClassName('hidden');
	}
}

/*****************************************************
* Tab Controls
*****************************************************/
function toggleTab(tab_container, index, s) {
	if (tab_container.select('.tab').length > index) {
		if (s.hasClassName('hidden')) {
			tab_container.down('.tab-control:not(.hidden)').addClassName('hidden');
			tab_container.down('.tab:not(.hidden)').addClassName('hidden');
			tab_container.select('.tab')[index].removeClassName('hidden');
			s.removeClassName('hidden');
		}
	}
}

function initializeTabs(tab_container) {
	tab_container.select('.tab-control').each(function(s, index) {
		s.onclick = function() { toggleTab(tab_container, index, s); };
	});
}

/*****************************************************
* Virtual Dragon
*****************************************************/
var vd_messages = {
	_msgs: []
	, _cur_msg: 0
	, _max_height: 400
	, _delay_per_char: 75
	, _min_delay: 4000
	, get_vds_response: function() {
		if (this.header.sc == 0) {
			vd_messages._msgs = vd_messages.shuffle(this.body);
			vd_messages.show_next_message();
		}
	}, show_next_message: function() {
		var msg = vd_messages._msgs[vd_messages._cur_msg];
		if ($('wop-message-holder').down('.message')) {		
			$('wop-message-holder').down('.message').visualEffect('fade', { duration: .8, afterFinish: function() {
				vd_messages.update_message(msg);				
			}});
		} else {
			// should only get here on the first call
			$('wop-message-holder').update('<div class="message" style="display:none;"></div>');
			vd_messages.update_message(msg);	
		}	
	}, update_message:function(msg) {
		//alert('showing next message');
		var msg_text = '<p class="body">'+msg.message+'</p><p class="author"><span class="name">'+msg.name+'</span>, <span class="age">'+msg.age+'</span></p>';
		$('wop-message-holder').down('.message').update(msg_text);
		
		if ($('wop-message-holder').down('.message').offsetHeight > vd_messages._max_height) {
			$('wop-message-holder').down('.message').setStyle('height:'+vd_messages._max_height+'px; overflow:auto; margin-top:0;');
		} else {
			var msg_top = vd_messages._max_height - $('wop-message-holder').down('.message').offsetHeight;
			msg_top = (msg_top < 150 ? 0 : msg_top - 150);
			$('wop-message-holder').down('.message').setStyle('height:auto;margin-top:'+msg_top+'px;');
		}		
		
		$('wop-message-holder').down('.message').visualEffect('appear', { duration: .8, to: .85, afterFinish: function() {
			vd_messages._cur_msg = (vd_messages._cur_msg + 1) % vd_messages._msgs.length;		
			window.setTimeout('vd_messages.show_next_message();', Math.max((msg.message.length * vd_messages._delay_per_char), vd_messages._min_delay));		
		}});	
	}, shuffle: function(ar) {
		// shuffle an array
		for (var k = 0, l = ar.length; k < l; ++k){
			for (var i = 0, j = ar.length; i < j - 1; ++i) {
				if (Math.floor(Math.random() * 2) == 1) {
					a = ar[i];
					ar[i] = ar[i+1];
					ar[i+1] = a;
				}
			}
		}
		return ar;
	}
};

function approve_vd(id) {
	$('vd-'+id).addClassName('approving');
	ajax_req($H({"qc":7, "id":id}), approve_vd_response);
}

function delete_vd(id) {
	$('vd-'+id).addClassName('deleting');
	ajax_req($H({"qc":8, "id":id}), delete_vd_response);
}

function get_vds() {
	ajax_req($H({"qc":9}), vd_messages.get_vds_response);
}

function saveVirtualDragonMessage(form) {
	form.down('input.save').disabled = true;
	form.down('dt.status').update('');
	form.down('dt.status').removeClassName('error');
	form.down('dt.status').removeClassName('success');
	
	form.select('.error').each(function(s) { s.removeClassName('error'); });
	
	var name = $F(form.down('input.name'));
	var age = $F(form.down('input.age'));
	var message = $F(form.down('textarea.message'));
	
	var req_error = false;
	
	if (!name.length > 0) {
		form.down('input.name').addClassName('error');
		//form.down('input.name').highlight();
		req_error = true;
	}
	
	if (!age.length > 0) {
		form.down('input.age').addClassName('error');
		//form.down('input.age').highlight();
		req_error = true;
	}
	
	if (!message.length > 0) {
		form.down('textarea.message').addClassName('error');
		//form.down('textarea.message').highlight();
		req_error = true;
	}
	
	if (req_error) {
		form.down('dt.status').update('Please fill in all of the fields above.');
		form.down('dt.status').addClassName('error');
		form.down('input.save').disabled = false;
		return;
	}
		
	if (!form.down('input.agree').checked) {
		//form.down('input.agree').up().highlight();
		form.down('dt.status').update('You must agree to the terms and conditions to save your content.');
		form.down('dt.status').addClassName('error');
		form.down('input.save').disabled = false;
		return; 
	}
	
	ajax_req($H({"name": name, "age": age, "message": message, "approved":1, "qc":6}), virtualDragonResponse);
}

function approve_vd_response() {
	if (this.header.sc == 0) {
		$('vd-'+this.body).remove();
	} else {
		$('vd-'+this.body).removeClassName('approving');
		alert(this.header.msg);
	}
}

function delete_vd_response() {
	if (this.header.sc == 0) {
		$('vd-'+this.body).remove();
	} else {
		$('vd-'+this.body).removeClassName('deleting');
		alert(this.header.msg);
	}
}

function virtualDragonResponse() {
	form = $$('.user-contribution-form.virtual-dragon .form')[0];
	form.select('.error').each(function(s) { s.removeClassName('error'); });
	form.down('dt.status').removeClassName('error');
	form.down('dt.status').removeClassName('success');
	form.down('dt.status').update(this.header.msg);
	
	if (this.header.sc == 0) {
		form.down('dt.status').addClassName('success');
	} else {
		form.down('dt.status').addClassName('error');
	}
	
	form.down('input.save').disabled = false;
}

/*****************************************************
* Popups
*****************************************************/
function showALVideo(key, li) {
	var title = li.down('.title').innerHTML;
	var summary = li.down('.summary').innerHTML;

	var content = '<object width="640" height="505"><param name="movie" value="http://www.youtube-nocookie.com/v/'+key+'&hl=en&fs=1&rel=0"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube-nocookie.com/v/'+key+'&hl=en&fs=1&rel=0" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="640" height="505"></embed></object><div class="video-summary"><h2>'+title+'</h2><p>'+summary+'</p></div>';
	
	showPopup(content);
}

function showAVImage(image, li) {
	var title = li.down('.title').innerHTML;
	var summary = $F(li.down('.full-summary'));

	var content = '<img src="'+image+'" alt="'+title+'" class="popup-image" /><div class="image-summary"><h2>'+title+'</h2><p>'+summary+'</p></div>';

	showPopup(content);
}

function showUCVideo(key, li) {
	var title = li.down('.title').innerHTML;
	var summary = $F(li.down('.full-summary'));
	var name = li.down('.name').innerHTML;

	var content = '<object width="640" height="505"><param name="movie" value="http://www.youtube-nocookie.com/v/'+key+'&hl=en&fs=1&rel=0"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube-nocookie.com/v/'+key+'&hl=en&fs=1&rel=0" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="640" height="505"></embed></object><div class="user video-summary"><h2>'+title+'</h2><span class="author">'+name+'</span><p>'+summary+'</p></div>';
	
	showPopup(content);
}

function showUCImage(image_key, li) {
	var title = li.down('.title').innerHTML;
	var summary = $F(li.down('.full-summary'));
	var name = li.down('.name').innerHTML;

	var content = '<a href="pd/get-file.php?&type=image&k='+image_key+'" target="_blank"><img src="pd/get-file.php?&type=image&image=popup&k='+image_key+'" alt="'+title+'" class="popup-image" /></a><div class="user image-summary"><h2>'+title+'</h2><span class="author">'+name+'</span><p>'+summary+'</p></div>';

	showPopup(content);
}

function toggleALCategory(category) {
	if (!category.moving) {
		category.moving = true;
		
		cat_effect = 'blind_down';
		
		if (category.hasClassName('open')) {		
			cat_effect = 'blind_up';
		} 
		
		category.down('.lessons').visualEffect(cat_effect, { duration:.3, afterFinish:function() { category.moving = false; } });
		category.toggleClassName('open');		
	}
}

function showPopup(content) {
	if ($('popup')) {
		closePopup();
		return;
	}
	var offsets = document.viewport.getScrollOffsets();	
	var over_width = $$('body')[0].offsetWidth;	
	var left = ((over_width - 680) / 2);
	var top = 30 + offsets.top;
	
	var popup = '<div id="popup" style="display:none;left:'+left+'px;top:'+top+'px;"><div class="header"><img src="art/close.gif" onclick="closePopup();" class="close" alt="close" /></div><div class="body">'+content+'</div><div class="footer"></div></div>';
	
	// show popup - for now just fade it in
	$$('body')[0].insert({top:popup});
	$('popup').visualEffect('appear', {duration:.5});
}

function closePopup() {
	if ($('popup')) { 
		if ($('popup').down('object')) $('popup').down('object').setStyle('visibility:hidden;');
		$('popup').visualEffect('fade', {duration:.5, afterFinish:function() { $('popup').remove(); }}); 
	}
}

function processUrl() {
	try {
		if (window.location.href.indexOf('#') > 0) {
			var index = window.location.href.split('#')[1]
			toggleTab($$('.tab-container')[0], index, $$('.tab-container')[0].select('.tab-control')[index]);
		}
	} catch(err) {
		return;
	}
}
