﻿/*
**************************************************************
Forum Module Media
**************************************************************
This Mod is designed to work with GuildPortal's forum editor
To add this mod, simply point to this file using a script tag
This mod includes:
 YouTube, Mp3 (Google & Word Press)
by Rob G (Mottie)
v1.0 completed 3/2009
v1.1 updated 4/2009 - Added color selection to the word press player
v2.0 updated 7/2009 - Updated to work with Telerik's Editor
v2.1 updated 1/2010 - Updated for newer version of Telerik's Editor
v2.2 updated 4/2010 - Updated to work with editor with different IDs
v2.3 updated 9/2011 - Updated to work with the new GP mod system
v2.4 updated 9/2011 - Converted into a plugin
**************************************************************
License: http://sam.zoy.org/wtfpl/
*/
;(function($){
$.forumModuleMedia = function(options){

	// add module if editor window exists
	if ( !$('#bodyTransbackInterior').length ) { return; }

	// look for module box, add it if not there
	if (!$('#customModules').length) {
		// WYSIWYG Editor
		if ($('div.reToolbarWrapper').length) {
			$('div.reToolbarWrapper').append('<ul class="reToolbar Default"><li class="reGrip grip_first"></li>' +
				'<span id="customModules" class="richEditor"></span><li class="reGrip grip_last"></li>');
		} else {
			// Plain Text Editor
			$('div#editorContent table tr').prepend('<td id="customModules" class="txtEditor"></td>');
		}
	}

	var defaults = {
		addYouTube : true,
		youTubeColor1 : "#000000",
		youTubeColor2 : "#dddddd",
		addMp3 : true,
		mp3LeftBkgd : "#357dce",
		mp3LeftIcon : "#f2f2f2",
		mp3Text : "#1d4572",
		mp3LoaderBar : "#303030",
		mp3Silder : "#357dce",
		mp3Bkgd : "#cce4ff",
		mp3Track : "#969696",
		mp3Border : "#ffffff",
		mp3RightBkgd : "#af2910",
		mp3RightIcon : "#f2f2f2",
		mp3RightBkgdHover : "#f06a51",
		mp3RightIconHover : "#333333",
		allowMp3ColoringByAll : true,
		allowMp3ColoringByAdmin : true
	},
	o = $.extend({}, defaults, options),
	tmp, modicon, editmode;

	// 10 seconds of silence
	// backup files: http://www.axiomfiles.com/Files/258012/silence.mp3
	o.testmusic = "/Cargo/Mods/79/silence.mp3";

	// Find out if an admin is logged on
	if ( $('.WfTopMenu a:contains("Control Panel")').length && o.allowMp3ColoringByAdmin ) {
		o.allowMp3ColoringByAll = true;
	}

	// Only add if posting/editing the forums
	if ($('#customModules').html() !== null) {
		editmode = ($('#customModules').hasClass('richEditor')) ? true : false;

		// Add YouTube Icon
		// ********************
		if (o.addYouTube) {
			tmp = '<a unselectable="on" title="Insert YouTube Video" class="reTool tooltip addYouTube" href="#" ' +
			'style="text-decoration: none;"><span unselectable="on"><img width="18" style="border:0" ' +
			'src="/Cargo/Mods/79/youtube.png"/></span></a>';
			modicon = (editmode) ? '<li>' + tmp + '</li>' : tmp + '&nbsp;';
			$("#customModules")
				.append(modicon)
				.find('.addYouTube').click(function(){
					fxnAddYouTube();
					return false;
				});
		}

		// Add Mp3 Player Icon
		// *********************
		if (o.addMp3) {
			tmp = '<a unselectable="on" title="Insert Music Player" class="reTool tooltip addMp3" href="#" ' +
			'style="text-decoration: none;"><span unselectable="on"><img width="18" style="border:0" ' +
			'src="/Cargo/Mods/79/music.png"/></span></a>';
			modicon = (editmode) ? '<li>' + tmp + '</li>' : tmp + '&nbsp;';
			$("#customModules")
				.append(modicon)
				.find('.addMp3').click(function(){
					fxnAddMp3();
					return false;
				});
		}
	}

	// Make YouTube Popup
	// *********************
	function fxnAddYouTube() {
		var modpop = '<div class="enterYouTube">' +
		'<img width="25" src="/Cargo/Mods/79/youtube2.gif" style="vertical-align: middle;"/> ' +
		'<span class="title">YouTube</span><span class="errBox"/><br><hr>' +
		'<table class="colortable" width="520" cellpadding="3"><tr><td colspan="2">Video Name<br><input type="text" id="ytName"/></td>' +
		'<td width="140" rowspan="5" style="padding-left:15px"><div id="ytsample"><object width="126" height="104">' +
		'<param name="movie" value="http://www.youtube.com/v/iGVCR7Z4aOY&hl=en&fs=0&rel=0&color1=0x' + o.youTubeColor1.replace('#','') +
		'&color2=0x' + o.youTubeColor2.replace('#','') + '&border=1&start=330"></param><embed src="http://www.youtube.com/v/iGVCR7Z4aOY&hl=en&fs=0&rel=0&color1=0x' +
		o.youTubeColor1.replace('#','') + '&color2=0x' + o.youTubeColor2.replace('#','') + '&border=1&start=330" ' +
		'type="application/x-shockwave-flash" width="126" height="104"></embed></object></div></td></tr>' +
		'<tr><td colspan="2">Video URL<br><input id="ytUrl" type="text" placeholder="ex: http://www.youtube.com/watch?v=iGVCR7Z4aOY&fmt=" value=""></td></tr>' +
		'<tr style="height:40px"><td style="width:220px;padding-top:10px">Video Size:</td><td style="width:150px;padding-top:10px">' +
		'<select id="ytSize"><option value="25">25%</option><option value="50">50%</option>' +
		'<option value="75">75%</option><option selected="selected" value="100">100%</option><option value="125">125%</option>' +
		'<option value="150">150%</option><option value="175">175%</option><option value="200">200%</option></select></td></tr></table>' +
		'<table class="colortable" width="520" cellpadding="3"><tr><td width="200">Shadow Color:</td>' +
		'<td width="70"><input id="ytShadow" class="colorwell" type="text" name="#000000" value="#000000"></td>' +
		'<td rowspan="8" style="padding-left:10px"><div id="picker"></div></td></tr>' +
		'<tr><td>Highlight Color:</td><td><input id="ytHilight" class="colorwell" type="text" name="#888888" value="#888888"></td></tr>' +
		'<tr><td>Border</td><td><input id="ytBorder" type="checkbox" checked></td></tr>' +
		'<tr><td>Play in HD (if available)</td><td><input id="ytHD" type="checkbox" checked></td></tr>' +
		'<tr><td>Allow Fullscreen</td><td><input id="ytFS" type="checkbox" checked></td></tr>' +
		'<tr><td>Autoplay</td><td><input id="ytAutoplay" type="checkbox"></td></tr>' +
		'<tr><td>Loop</td><td><input id="ytLoop" type="checkbox"></td></tr>' +
		'<tr><td>Show Related Videos</td><td><input id="ytRelated" type="checkbox" checked></td></tr></table><br>' +
		'<input class="scbutton save" type="button" value="Save">&nbsp;' +
		'<input class="scbutton close" type="button" value="Cancel"></div>';
		$.facebox(modpop);
	}

	function setupYouTubeMod(){
		var f, selected, cellvalue,
		fb = $('#facebox');
		console.debug('ok');
		if (!fb.find('.enterYouTube').length) { return; }

		fb.find('.scbutton').click(function(){
			if ($(this).is('.save')) {
				saveYouTube();
			}
		});

		f = $.farbtastic('#picker');
		$('#picker').addClass('dim');
		cellvalue = "";

		fb.find('.colorwell')
			.each(function(){
				f.linkTo(this);
				$(this).addClass('dim');
			})
			.blur(function(){
				$(this).addClass('dim');
				$('#picker').addClass('dim');
				if ($(this).val() != cellvalue) {
					updateYTBox();
				}
			})
			.focus(function(){
				if (selected) {
					$(selected)
						.addClass('dim')
						.removeClass('colorwell-selected');
				}
				f.linkTo(this);
				$('#picker').removeClass('dim');
				selected = this;
				$(this)
					.removeClass('dim')
					.addClass('colorwell-selected');
				cellvalue = $(this).val();
			});
	}

	function updateYTBox(){
		var c1 = gv('ytShadow'),
		c2 = gv('ytHilight');
		tmp = '<object width="126" height="104"><param name="movie" value="http://www.youtube.com/v/iGVCR7Z4aOY&hl=en&fs=0&rel=0&color1=0x' +
		c1 + '&color2=0x' + c2 + '&border=1&start=330"></param><embed src="http://www.youtube.com/v/iGVCR7Z4aOY&hl=en&fs=0&rel=0&color1=0x' +
		c1 + '&color2=0x' + c2 + '&border=1&start=330" type="application/x-shockwave-flash" width="126" height="104"></embed></object>';
		$('#ytsample object').remove();
		$('#ytsample').html(tmp);
	}

	// Save YouTube Embed
	function saveYouTube(){
		var tmp, yvid, yt, ysize, ywid, yhgt, yfs,
		ytitle = $("#ytName").val(),
		yURL = $("#ytUrl").val();
		if (yURL === ''){
			youMissed("#ytUrl","Please enter a URL");
			return;
		}
		if (!/^(https?|ftp):\/\/.*$/i.test(yURL)){
			youMissed("#ytUrl","Please enter a valid URL");
			return;
		}
		yvid = gup('v',yURL);
		if (yvid !== "" && yURL.match("youtube")){
			yt = 'http://www.youtube.com/v/' + yvid;
			ysize = $("#ytSize").val();
			ywid = Math.round(425 * (ysize/100));
			yhgt = Math.round(344 * (ysize/100));
			yt += '&color1=0x' + gv('ytShadow') + '&color2=0x' + gv('ytHilight');
			yt += ($("#ytBorder").attr('checked')) ? '&border=1' : '';
			yt += ($("#ytHD").attr('checked')) ? '&hd=1' : '';
			yfs = $("#ytFS").attr('checked');
			yt += (yfs) ? '&fs=1' : '&fs=0';
			yt += ($("#ytAutoplay").attr('checked')) ? '&autoplay=1' : '';
			yt += ($("#ytLoop").attr('checked')) ? '&loop=1' : '';
			yt += ($("#ytRelated").attr('checked')) ? '&rel=1' : '';
			tmp = ( ytitle === "" ) ? '' : '<b>' + ytitle + '</b><br>';
			tmp += '<object width="' + ywid + '" height="' + yhgt + '">' +
			'<param name="movie" value="' + yt + '"/>' +
			'<param name="allowFullScreen" value="' + yfs + '"/>' +
			'<param name="allowscriptaccess" value="always"/>' +
			'<embed src="' + yt + '" type="application/x-shockwave-flash" allowscriptaccess="always" ' +
			'allowfullscreen="' + yfs + '" width="' + ywid + '" height="' + yhgt + '"></embed></object><br>';
		} else {
			if (ytitle === ""){
				youMissed("#ytName","Please enter a video title");
				return;
			}
			tmp = '<a href="' + yURL + '">' +  ytitle + '</a>';
		}
		$(document).trigger('close.facebox');
		postMedia(tmp);
	}

	function gup(n,s){
		n = n.replace(/[\[]/,"\\[").replace(/[\]]/,"\\]");
		var p = (new RegExp("[\\?&]"+n+"=([^&#]*)")).exec(s);
		return (p===null) ? "" : p[1];
	}

	// Make Mp3 popup
	// *********************
	function fxnAddMp3(){
		var modpop = '<div class="enterMp3Player">' +
		'<img style="vertical-align:middle" width="25" src="/Cargo/Mods/79/music.png"> ' +
		'<span class="title">Mp3 Player</span><span class="errBox"/><br><hr>' +
		'mp3 Player:<br><div id="picker" style="float:right;display:none;"></div>' +
		'<select id="mp3type"><option value="1">Google</option>' +
		'<option value="2" selected>Word Press</option></select><br><br>' +
		'mp3 Title:<br><input id="mp3title" style="width:400px" type="text"><br><br>' +
		'mp3 URL:<br><input id="mp3url" style="width:400px" type="text"><br><br>' +
		'<div id="googleimg" style="display:none;"><img src="/Cargo/Mods/79/google-player.jpg"></div>' +
		'<div id="wpplayer"></div><div id="wordpresscolor" style="display:none;">' +
		'<fieldset class="colorlegend" style="width:290px" onclick="$(this).find(\'.mpsb\').toggle()">' +
		'<legend><strong>Color Legend</strong> <small>(click to show)</small></legend>' +
		'<img style="display:none;" class="mpsb" src="/Cargo/Mods/79/mp3player.gif"></fieldset>' +
		'<table class="colortable"><tr><td colspan=2><b>Background</b></td><td colspan=2><b>Styles</b></td></tr>' +
		'<tr><td width="125"><div style="margin-left:10px;">Main:<br>Left:<br>Right:<br>Right(hover):<hr>' +
		'<b>Icon</b><br>Left:<br>Right:<br>Right(hover):</div></td><td>' +
		'<input type="text" id="mpc0" class="colorwell" name="' + o.mp3Bkgd + '" value="' + o.mp3Bkgd + '"/><br>' +
		'<input type="text" id="mpc1" class="colorwell" name="' + o.mp3LeftBkgd + '" value="' + o.mp3LeftBkgd + '"/><br>' +
		'<input type="text" id="mpc2" class="colorwell" name="' + o.mp3RightBkgd + '" value="' + o.mp3RightBkgd + '"/><br>' +
		'<input type="text" id="mpc3" class="colorwell" name="' + o.mp3RightBkgdHover + '" value="' + o.mp3RightBkgdHover + '"/><div style="height:2em"/>' +
		'<input type="text" id="mpc4" class="colorwell" name="' + o.mp3LeftIcon + '" value="' + o.mp3LeftIcon + '"/><br>' +
		'<input type="text" id="mpc5" class="colorwell" name="' + o.mp3RightIcon + '" value="' + o.mp3RightIcon + '"/><br>' +
		'<input type="text" id="mpc6" class="colorwell" name="' + o.mp3RightIconHover + '" value="' + o.mp3RightIconHover + '"/></td>' +
		'<td width=150><div style="margin-left:10px;">Text:<br>Slider:<br>Loader bar:<br>Progress track:<br>Progress border:</div></td><td>' +
		'<input type="text" id="mpc7" class="colorwell" name="' + o.mp3Text + '" value="' + o.mp3Text + '"/><br>' +
		'<input type="text" id="mpc8" class="colorwell" name="' + o.mp3Silder + '" value="' + o.mp3Silder + '"/><br>' +
		'<input type="text" id="mpc9" class="colorwell" name="' + o.mp3LoaderBar + '" value="' + o.mp3LoaderBar + '"/><br>' +
		'<input type="text" id="mpc10" class="colorwell" name="' + o.mp3Track + '" value="' + o.mp3Track + '"/><br>' +
		'<input type="text" id="mpc11" class="colorwell" name="' + o.mp3Border + '" value="' + o.mp3Border + '"/></td></tr></table></div><br>' +
		'<input class="scbutton save" type="button" value="Save"> ' +
		'<input class="scbutton colorreset" type="button" value="Reset"> ' +
		'<input class="scbutton close" type="button" value="Cancel"></div>';
		$.facebox(modpop);
	}

	function setupMp3Mod(){
		var f, selected, cellvalue, fb = $('#facebox');
		if (!fb.find('.enterMp3Player').length) { return; }

		fb.find('.scbutton').bind('click', function(){
			var t = $(this);
			if (t.is('.save')) {
				saveMp3();
			} else if (t.is('.colorreset')) {
				mp3colorReset();
			}
		}).end()
		.find('#mp3type').bind('change', function(){
			showMp3Panel(this.value);
		});

		$("#wpplayer").html(updatePlayer(0, o.testmusic));
		showMp3Panel(2);
		f = $.farbtastic('#picker');
		$('#picker').addClass('dim');
		cellvalue = "";
		$('.colorwell')
			.each(function(){ f.linkTo(this); $(this).addClass('dim'); })
			.blur(function(){
				$(this).addClass('dim');
				$('#picker').addClass('dim');
				if ($(this).val() != cellvalue) {
					$("#wpplayer").html(updatePlayer(0, o.testmusic));
				}
			})
			.focus(function(){
				if (selected) {
					$(selected)
						.addClass('dim')
						.removeClass('colorwell-selected');
					}
				f.linkTo(this);
				$('#picker').removeClass('dim');
				selected = this;
				$(this)
					.removeClass('dim')
					.addClass('colorwell-selected');
				cellvalue = $(this).val();
			});

	}

	function checkColor(n){
		if (typeof(n) === "undefined") { return true; }
		if (!/^(#[\da-fA-F]{6}$)/.test(n)) { return true; }
		return false;
	}

	function mp3colorReset(){
		var j, tmp;
		$("#facebox .errBox").html('');
		for (j=0; j<12; j++){
			tmp = $('#mpc'+j).attr('name');
			$('#mpc'+j)
				.val(tmp)
				.css({
					'background-color' : tmp,
					'color': '#000'
				});
		}
		$("#wpplayer").html(updatePlayer(0, o.testmusic));
	}

	function updatePlayer(mode, mURL){
		// backup #1: http://img231.imageshack.us/img231/2533/player.swf
		// backup #2: http://www.axiomfiles.com/Files/243007/player.swf
		// backup #3: http://img510.imageshack.us/img510/4659/playerqo9.swf
		o.plyr = '/Cargo/Mods/79/player.swf';
		var autoplay = (mode === 0) ? 'autostart=yes&loop=yes&' : '';
		return '<object height="27" width="290" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" ' +
		'codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,0,0">' +
		'<param name="movie" value="' + o.plyr + '?soundFile=' + mURL + '" />' +
		'<param name="allowFullScreen" value="true"/>' +
		'<param name="allowScriptAccess" value="always"/>' +
		'<param name="wmode" value="transparent"/>' +
		'<param name="FlashVars" value="' + autoplay + plyrColors() + '"/>' +
		'<embed height="27" width="290" type="application/x-shockwave-flash" src="' + o.plyr + '?soundFile=' + mURL +
		'" allowfullscreen="true" allowscriptaccess="always" wmode="transparent" FlashVars="' + autoplay + plyrColors() +
		'" pluginspage="http://www.macromedia.com/go/getflashplayer"/></object>';
	}

	function gv(cid){
		tmp = $('#'+cid).val().replace(/#/g,'');
		tmp = '#' + tmp.substring(0,6);
		if(!/^#([\da-fA-F]{6}$)/.test(tmp)){
			tmp = $('#'+cid).attr('name'); // default color is stored in the name attribute
			$.farbtastic('#picker').setColor(tmp);
			$('#'+cid).css("background-color",tmp);
			youMissed('#'+cid,"Color was reset, please enter a valid six digit code");
		}
		$('#'+cid).val(tmp);
		$('#'+cid).css("background-color",tmp);
		return tmp.replace(/#/g,'');
	}

	function showMp3Panel(j){
		j = parseInt(j, 10);
		var tmp0 = (j === 2) ? "none" : "",
		tmp1 = (j === 2) ? "" : "none",
		tmp2 = tmp1,
		tmp3 = (j === 2) ? "300px" : "500px";
		if (j === 2 && !o.allowMp3ColoringByAll) {
			tmp1 = "";
			tmp2 = "none";
			tmp3 = "500px";
		}
		$('#googleimg').css('display',tmp0);
		$('#wpplayer').css('display',tmp1);
		$('#facebox .colorreset').css('display',tmp2);
		$('#wordpresscolor').css('display',tmp2);
		$('#picker').css('display',tmp2);
		$('input#mp3title').css('width',tmp3);
		$('input#mp3url').css('width',tmp3);
	}

	function plyrColors(){
		return 'bg=0x' + gv('mpc0') + '&leftbg=0x' + gv('mpc1') + '&rightbg=0x' + gv('mpc2') + '&rightbghover=0x' + gv('mpc3') +
		'&lefticon=0x' + gv('mpc4') + '&righticon=0x' + gv('mpc5') + '&righticonhover=0x' + gv('mpc6') +
		'&text=0x' + gv('mpc7') + '&slider=0x' + gv('mpc8') + '&loader=0x' + gv('mpc9') +
		'&track=0x' + gv('mpc10') + '&border=0x' + gv('mpc11');
	}

	// Save Mp3 Embed
	function saveMp3(){
		var mType = $("#mp3type").val(),
			mTitle = $("#mp3title").val(),
			mURL = $("#mp3url").val();
		if (mURL == "") {
			youMissed("#mp3url","Please enter a mp3 URL");
			return;
		}
		if(!/^(https?|ftp):\/\/.*$/i.test(mURL)){
			youMissed("#mp3url","Please enter a valid URL");
			return;
		}
		$(document).trigger('close.facebox');
		tmp = (mTitle == '') ? '' : '<b>' + mTitle + '</b><br>';
		// Google player
		if (mType == "1") {
			// backup #1: http://www.axiomfiles.com/Files/243007/google-audio-player.swf
			// backup #2: http://img113.imageshack.us/img113/6941/googleaudioplayer.swf
			o.plyr = '/Cargo/Mods/79/google-audio-player.swf';
			tmp += '<object height="27" width="290" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" ' +
			'codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,0,0">' +
			'<param name="movie" value="' + o.plyr + '?audioUrl=' + mURL + '"/>' +
			'<param name="allowFullScreen" value="true"/>' +
			'<param name="allowScriptAccess" value="always"/>' +
			'<embed height="27" width="290" type="application/x-shockwave-flash" src="' + o.plyr + '?audioUrl=' + mURL +
			'" allowfullscreen="true" allowscriptaccess="always" ' +
			'pluginspage="http://www.macromedia.com/go/getflashplayer"/></object><br>';
		}
		// Word Press player
		if (mType == "2") {
			tmp += updatePlayer(1, mURL);
		}
		postMedia(tmp);
	}

	// Show error message
	function youMissed(iid,msg,nValue){
		if (typeof(nValue)!="undefined") {$(iid).attr("value",nValue);}
		$("#facebox .errBox").html(" - " + msg);
		$(iid).focus();
	}

	function postMedia(tmp){
		var j, eID, editor;
		if ($('#customModules').hasClass('richEditor')) {
			eID = $('[id$=txtEditor_internalEditor]').attr('id');
			editor = $find(eID);
			editor.pasteHtml(tmp);
			editor.set_mode(2);
			editor.set_mode(1);
		} else {
			j = $("[id$=txtEditor_internalTextBox]");
			j.val ( j.val() + tmp );
		}
	}

	// Special Styling for facebox
	$(document)
		.bind('reveal.facebox', function(){
			$('#facebox')
				.addClass('forum-mod')
				.css('z-index', 999) // one less than the tooltip
				.find('.scbutton.close').click(function(){
					$(document).trigger('close.facebox');
				});
			setupYouTubeMod();
			setupMp3Mod();
		})
		.bind('afterClose.facebox', function() {
			$('#facebox').removeClass('forum-mod');
		});

};

})( jQuery );

