RL = {};

RL.avatar = {
	crop_cache_w: 0,
	crop_cache_h: 0,

	init: function() {
		var form = $("#avatar-form");
		var input = $("#avatar-input");
		var image = $("#page .avatar img");
		var preview = $("#page .avatar .frame");
		var crop = $("#avatar-crop-form");
		var show = $("#avatar-form-show");
		var submit = $("#avatar-form-submit");

		var action = $("#avatar-crop-form");
		var coordx = action.children(".coord-x");
		var coordy = action.children(".coord-y");
		var coordw = action.children(".coord-w");
		var coordh = action.children(".coord-h");

		var avatar_crop = $(".avatar-crop");
		var avatar_src = avatar_crop.attr("data-src");
		var avatar = $("<img>");

		// Update preview
		var change = function(coords) {
			var rx = 128 / coords.w;
			var ry = 128 / coords.h;

			image.css({
				width: Math.round(rx * RL.avatar.crop_cache_w) + 'px',
				height: Math.round(ry * RL.avatar.crop_cache_h) + 'px',
				marginLeft: '-' + Math.round(rx * coords.x) + 'px',
				marginTop: '-' + Math.round(ry * coords.y) + 'px'
			});

			update(coords);
		};

		// Update coordinate values
		var update = function(coords) {
			coordx.val(coords.x);
			coordy.val(coords.y);
			coordw.val(coords.w);
			coordh.val(coords.h);
		};

		// Add form submit event
		submit.click(function(){
			crop.submit();
			return false;
		});

		// Add form show event
		show.click(function(){
			show.hide();
			form.show();
			input.focus();
		});

		avatar.load(function(){
			// Install jCrop
			avatar.each(function(){
				image.attr("src", avatar.attr("src"));

				// Cache image width and height
				RL.avatar.crop_cache_w = avatar.width();
				RL.avatar.crop_cache_h = avatar.height();

				var api = $.Jcrop(avatar, {
					aspectRatio: 1,
					boxWidth: 620,
					onChange: change,
					setSelect: [0, 0, RL.avatar.crop_cache_w, RL.avatar.crop_cache_h]
				});

				// api.setSelect([0, 0, RL.avatar.crop_cache_w, RL.avatar.crop_cache_h]);
			});
		});

		avatar_crop.html(avatar);
		avatar.attr("src", avatar_src);
	}
};

RL.show_slug = {
	init: function() {
		var form = $("#show-create");
		var name = $("#f_nm", form);
		var slug = $("#f_sl", form);
		var fb = $("#show-slug-feedback", form);

		name.keyup(function(){
			var clean = RL.show_slug.clean(name.val());
			slug.val(clean);
			fb.html(clean);
		});

		slug.keyup(function(){
			var clean = RL.show_slug.clean(slug.val());
			slug.val(clean);
			fb.html(clean);
		});

		slug.keyup();
	},

	clean: function(clean) {
		clean = clean.toLowerCase();
		clean = clean.replace(/\ /g, "-");
		clean = clean.replace(/[^a-z0-9\-]/g, "");

		return clean;
	}
};

RL.show_category = {
	init: function() {
		var form = $("#show-create");
		var checkboxes = $(".category-limit input:checkbox", form);

		checkboxes.change(function(){
			var checked = $("input:checked", form);

			if (checked.length > 3) {
				$(this).attr("checked", "");
			} else {
				$(this).parent().toggleClass("selected");
			}
		});
	}
};

RL.limit = {
	init: function() {
		$(".limit").keyup(function(){
			var f = $(this);
			var l = f.attr("data-limit");
			var ui = $("#" + f.attr("data-limit-ui"));

			var len = f.val().length;

			if (len > l) {
				f.val(f.val().substring(0, l));
				len = l;
			}

			ui.text(l - len);
		}).each(function(){
			var f = $(this);
			var l = f.attr("data-limit");
			var ui = $("#" + f.attr("data-limit-ui"));
			var len = f.val().length;
			ui.text(l - len);
		});
	}
};

RL.confirm = {
	init: function() {
		$("a.confirm").click(function(){
			var a = $(this);
			var parent = a.parent();
			var link = a.attr("data-action");

			// Confirm
			var yes = $("<a>Confirm</a>").addClass("confirm-yes").attr("href", link);

			yes.click(function(){
				var remove = a.attr("data-remove");

				if (typeof remove !== "undefined") {
					$("#" + remove).slideUp();

					// Call AJAX
					$.get(link);

					return false;
				}
			});

			// Cancel
			var no = $("<a>Cancel</a>").addClass("confirm-no").click(function(){
				$("a.confirm-yes", parent).remove();
				$("a.confirm-no", parent).remove();

				a.show();

				return false;
			});

			$(this).after(no).after(yes).hide();

			return false;
		});
	}
};

RL.tabs = {
	init: function() {
		$(".tab-pane").each(function(){
			var pane = $(this);

			var tab_links = $("ol li", pane);

			tab_links.click(function(){
				var li = $(this);
				var a = $("a", li);

				tab_links.removeClass("selected");
				li.addClass("selected");

				$(".tab-pane-content", pane).removeClass("selected");
				$("#" + a.attr("data-tab")).addClass("selected");

				return false;
			});
		});
	}
};

RL.upload = {
	init: function() {
		var field = $("#podcast_field");
		var form = field.parents("form");
		var after = $("fieldset.after", form).hide();
		var actions = $("fieldset.actions", form).hide();

		if (field.size() < 1) {
			return;
		}

		field.fileUpload({
			auto:			"true",

			// Resources
			uploader:		"/swf/uploader.swf",
			script:			form.attr("data-upload"),

			// File validation
			sizeLimit:		104857600, // 100mb
			fileExt:		"*.mp3",

			// Look
			cancelImg:		"/js/uploadify/cancel.png",
			buttonText:		"Select MP3",
			wmode:			"transparent",

			onSelectOnce: function() {
				$("embed").css({visibility: "hidden", height: 0});
			},

			onSelect: function(event, queue, file) {
				after.show();
				var name = file.name.replace(/\.mp3/, "").replace(/\.MP3/, "");
				$("#pt").val(name).focus();
				return true;
			},

			onComplete: function(event, queue, file, response, data) {
				$("#upload_mp3").val(response);
				actions.show();
				return false;
			}
		});
	}
};

RL.podcast = {
	create_resource: function(options) {
		var sound = soundManager.createSound({
			id: options.id,
			url: options.mp3,

			whileloading: function() {
				options.onLoad((this.bytesLoaded / this.bytesTotal) * 100);
			},

			whileplaying: function() {
				options.onSeek((this.position / this.duration) * 100);
			},

			onpause: function() {
				options.onPause();
			}
		});

		return {
			play: function() {
				sound.play();
				options.onPlay();
			},

			pause: function() {
				sound.pause();
				options.onPause();
			},

			pauseAll: function() {
				soundManager.pauseAll();
			},

			stop: function() {
				sound.destruct();
			},

			stopAll: function() {
				soundManager.stopAll();
			},

			seek: function(percent) {
				sound.setPosition(.01 * percent * sound.duration);
			},

			isPlaying: function() {
				return sound.playState === 1 && !sound.paused;
			},

			isPaused: function() {
				return sound.paused;
			}
		};
	},

	init: function() {
		var podcasts = $(".podcast-player");

		if (podcasts.size() < 1) {
			return;
		}

		podcasts.each(function(i){
			var podcast = $(this);

			var ui_play = $(".player-play", podcast);
			var ui_scrub_base = $(".player-scrub", podcast);
			var ui_scrub_load = $(".player-scrub-load", podcast);
			var ui_scrub_seek = $(".player-scrub-active", podcast);

			// Set up resource
			var resource = RL.podcast.create_resource({
				id: "rl-podcast-resource-" + i,

				swf: podcast.attr("data-swf"),
				mp3: podcast.attr("data-src-mp3"),
				ogg: podcast.attr("data-src-ogg"),

				onLoad: function(percent) {
					ui_scrub_load.css({
						width: (percent * 2.46) + "px"
					});
				},

				onSeek: function(percent) {
					ui_scrub_seek.css({
						width: (percent * 2.46) + "px"
					});
				},

				onPlay: function() {
					// Update button style
					ui_play.addClass("playing");
				},

				onPause: function() {
					// Update button style
					ui_play.removeClass("playing");
				}
			});

			ui_play.click(function(){
				if (resource.isPlaying()) {
					// Already playing, let's pause
					resource.pause();
				} else {
					// Pause all other podcasts on the page
					resource.pauseAll();

					// Start playing this podcast
					resource.play();
				}

				return false;
			});

			ui_scrub_base.click(function(e){
				var offset = e.pageX - this.offsetLeft - podcast.get(0).offsetLeft;

				// Seek resource position
				resource.seek(offset / 2.46);

				// Play resource
				if (!resource.isPlaying()) {
					resource.pauseAll();
					resource.play();
				}
			});
		});
	}
};

RL.schedule = {
	table: null,
	form: null,
	form_day: null,
	form_start: null,

	init: function() {
		// Get DOM elements
		RL.schedule.table = $("#schedule.admin");
		RL.schedule.form = $("#schedule-form");
		RL.schedule.form_id = $("#s_id");
		RL.schedule.form_day = $("#s_day");
		RL.schedule.form_start = $("#s_start");

		// Is there a schedule on this page?
		if (RL.schedule.table.size() != 1) {
			return;
		}

		RL.schedule.attachGridEvents();

		// AJAX-ify form submittion
		RL.schedule.form.submit(function(){
			RL.schedule.form.hide();

			// Get parameters
			var parameters = $(":input", RL.schedule.form).serializeArray();

			// Replace the table with the result
			$.get(
				RL.schedule.form.attr("action"),
				parameters,
				function(data) {
					RL.schedule.table.replaceWith(data);
					RL.schedule.table = $("#schedule.admin");
					RL.schedule.attachGridEvents();
				}
			);

			return false;
		});

		// Close form action
		$("#schedule-cancel", RL.schedule.form).click(function(){
			RL.schedule.form.fadeOut();
		});

		// Delete form action
		$("#schedule-delete", RL.schedule.form).click(function(){
			// Replace the table with the result
			$.get(
				$(this).attr("href"),
				{schedule_id: RL.schedule.form_id.val()},
				function(data){
					RL.schedule.table.replaceWith(data);
					RL.schedule.table = $("#schedule.admin");
					RL.schedule.attachGridEvents();
				}
			);

			RL.schedule.form.fadeOut();

			return false;
		});
	},

	attachGridEvents: function() {
		$("td", RL.schedule.table).click(function(){
			var td = $(this);
			var p = td.offset();

			// Position form above the TD
			RL.schedule.form.css({
				top: p.top + 55,
				left: p.left + (td.width() / 2) - (RL.schedule.form.width() / 2)
			});

			// Update the day and time fields to match the TD
			RL.schedule.form_id.val("-");
			RL.schedule.form_day.val(td.attr("data-day"));
			RL.schedule.form_start.val(td.attr("data-time"));

			// Add a new schedule item
			if (td.hasClass("empty")) {
				$(".schedule-create", RL.schedule.form).show();
				$(".schedule-edit", RL.schedule.form).hide();

			// Edit an existing schedule item
			} else {
				// Pass along the Schedule ID
				RL.schedule.form_id.val(td.attr("data-id"));

				// Set the TD's show info
				$("#ss", RL.schedule.form).val(td.attr("data-show"));
				$("#sl", RL.schedule.form).val(td.attr("data-length"));

				$(".schedule-create", RL.schedule.form).hide();
				$(".schedule-edit", RL.schedule.form).show();
			}

			RL.schedule.form.show();
		});
	}
};

RL.schedule_info = {
	init: function() {
		var schedule = $("#schedule.public");
		var tds = $("tr td.occupied", schedule);
		var info = $("#show-info");
		var info_content = $("#show-info-content");

		if (tds.size() < 1) {
			return;
		}

		tds.click(function(){
			var td = $(this);
			var href = td.attr("data-info");
			var p = td.offset();

			tds.removeClass("selected");
			td.addClass("selected");

			// Position info pane above the TD
			info.css({
				top: p.top + 95,
				left: p.left + (td.width() / 2) - (info.width() / 2)
			});

			$.get(
				href,
				function(data){
					info_content.html(data);
					info.show();

					$("#show-info-close").click(function(){
						info.fadeOut(function(){
							td.removeClass("selected");
							info_content.html("");
						});
					});
				}
			);
		});
	}
};

jQuery(function(){
	RL.avatar.init();
	RL.show_slug.init();
	RL.limit.init();
	RL.show_category.init();
	RL.confirm.init();
	RL.tabs.init();
	RL.upload.init();
	RL.schedule.init();
	RL.schedule_info.init();
});

if (typeof soundManager !== "undefined") {
	soundManager.debugMode = false;
	soundManager.url = "/swf/";
	soundManager.useHighPerformance = true;
	soundManager.onload = function(){
		RL.podcast.init();
	};
}