﻿/*
**************************************************************
Forum Module Extras
**************************************************************
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:
 Progress Bar
by Rob G (Mottie)
v1.0 completed 4/2009
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($){
$.forumModuleExtras = 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 = {
		selectedBar : "Striped",
		allowCustom : true,
		images      : []
	},
	o = $.extend({}, defaults, options),
	tmp, editmode, modicon;

	// Only add if posting/editing the forums
	if ($('#customModules').html() !== null) {
		editmode = ($('#customModules').hasClass('richEditor')) ? true : false;

		// Add Progress Bar Icon
		// ********************
		tmp = '<a unselectable="on" title="Insert Progress Bar" class="reTool tooltip addProgressBar" href="#" ' +
			'style="text-decoration: none;"><span unselectable="on"><img width="18" style="border:0" ' +
			'src="http://www.guildportal.com/Cargo/Mods/73/progressbar.gif"/></span></a>';
		modicon = (editmode) ? '<li>' + tmp + '</li>' : tmp + '&nbsp;';
		$("#customModules")
			.append(modicon)
			.find('.addProgressBar')
			.click(function(){
				fxnAddProgressBar();
				return false;
			});
	}

	// Make Progress Bar Popup
	// *********************
	function fxnAddProgressBar() {
		var f, selected, cellvalue,
		modpop = '<div class="enterProgressBar">' +
		'<img style="vertical-align:middle" width="25" src="http://www.guildportal.com/Cargo/Mods/73/progressbar.gif"> ' +
		'<span class="title">Progress Bar</span><span class="errBox"/><br><hr>' +
		'Progress Bar Title<br><input id="pbTitle" type="text"><div style="height:10px"/>' +
		'<table class="colortable" cellpadding=3><tr><td width=130>Percentage:</td>' +
		'<td width=120><input id="pbPercent" style="width:50px;text-align:center" type="text" value="50%"></td>' +
		'<td rowspan=6 align="right"><div id="picker" style="padding-left:20px;"></div></td></tr>' +
		'<tr><td>Border Type:</td><td><select id="pbBorderType"><option value="0">None</option>' +
		'<option value="1" selected>Image</option><option value="2">Solid</option><option value="3">Dotted</option>' +
		'<option value="4">Dashed</option><option value="5">Double</option></select></td></tr>' +
		'<tr><td>Border:</td><td><select id="pbBorderImageColor"><option value="black" selected>Black</option><option value="silver">Silver</option></select>' +
		'<input id="pbBorderColor" class="colorwell" style="display:none;" type="text" name="#000000" value="#000000">' +
		'<select id="pbBorderSize" style="display:none;width:30px;"><option>1</option><option selected>2</option><option>3</option><option>4</option><option>5</option>' +
		'<option>6</option><option>7</option><option>8</option><option>9</option><option>10</option></select></td></tr>' +
		'<tr><td>Bar Color:</td><td><input id="pbBarColor" class="colorwell" type="text" name="#0000ff" value="#0000ff"></td></tr>' +
		'<tr><td>Text Color:</td><td><input id="pbTextColor" class="colorwell" type="text" name="#ffffff" value="#ffffff"></td></tr>' +
		'<tr height=40><td>Bar Image:</td><td width=70><select id="pbBarImage">' +
		'<option value="0">None</option>' + (o.allowCustom ? '<option value="1">Custom</option>' : '') +
		'<option value="http://www.guildportal.com/Cargo/Mods/73/bar.png">Striped</option>' +
		'<option value="http://www.guildportal.com/Cargo/Mods/73/loader.gif">Animated</option></select></td></tr>' +
		'<tr><td><span class="custom" style="display:none;">Custom Image URL:<br><br></span></td>' +
		'<td colspan=2><span class="custom" style="display:none;"><input id="pbCustomImage" type="text"/><br></span></td></tr>' +
		'<tr><td colspan=3 height=30><div id="pbar"><br><br></div></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 setupProgressBar(){
		var f, selected, cellvalue,
			fb = $('#facebox');
		if (!fb.find('.enterProgressBar').length) { return; }
		fb
			.addClass('forum-mod')
			.css('z-index', 999) // one less than the tooltip
			.find('.scbutton').bind('click', function(){
				if ($(this).is('.close')) {
					$(document).trigger('close.facebox');
				} else {
					saveProgressBar();
				}
			});

		// Adds more image bar options
		$.each(o.images, function(text,val){
			$('#pbBarImage').append( $('<option></option>').val(val).html(text) );
		});

		// Set selected progress bar image
		$('#pbBarImage option').each(function(){
			if ($(this).html() === o.selectedBar) {
				$(this).attr('selected','selected');
			}
		});
		$('#pbar').html(updateProgressbar());

		f = $.farbtastic('#picker');
		cellvalue = "";
		$('#picker').addClass('dim');
		$('.colorwell')
			.each(function(){
				f.linkTo(this);
				$(this).addClass('dim');
			})
			.blur(function(){
				$(this).addClass('dim');
				$('#picker').addClass('dim');
				if ($(this).val() !== cellvalue) {
					$('#pbar').html(updateProgressbar());
				}
			})
			.focus(function(){
				if (selected) { $(selected).addClass('dim').removeClass('colorwell-selected'); }
				f.linkTo(this);
				$('#picker').removeClass('dim');
				$(selected = this).removeClass('dim').addClass('colorwell-selected');
				cellvalue = $(this).val();
			});

			$('#pbBorderType, #pbTitle, #pbPercent, #pbBorderImageColor, #pbBorderSize, #pbBarImage, #pbCustomImage').change(function(){
				$('#pbar').html(updateProgressbar());
			});
	}

	function updateProgressbar(){
		var tmp, pbtitle, pbpercent, pbbrdr, pbbrdrSize, pbbarColor, pbtxtColor, pbbar, pbbarimg, pbcover, pbborder, pbtxtadj,
		// *** Type ***
		pbtype = parseInt($("#pbBorderType").val(),10);

		$("#pbBorderColor, #pbBorderSize")[pbtype > 1 ? "show" : "hide"]();
		$("#pbBorderImageColor")[pbtype > 1  ? "hide" : "show"]();

		// *** Title ***
		tmp = $("#pbTitle").val();
		pbtitle = (tmp === "") ? "" : "<b>" + tmp + "</b><br>";

		// *** Percent ***
		pbpercent = $("#pbPercent").val().replace(/\%/,'') + "%";
		if (!/^((100)|(\d{0,2}))?\%$/.test(pbpercent)){
			youMissed("#pbPercent","Please enter a value between 0 and 100");
			return;
		}
		$("#pbPercent").attr("value",pbpercent);
		$("#facebox .errBox").html(''); // clear error

		pbbrdr = $("#pbBorder" + (pbtype === 1 ? "Image" : "") + "Color" ).val();
		if (pbtype === 0) { pbbrdr = "transparent"; }

		pbbarColor = gv('pbBarColor');
		pbtxtColor = gv('pbTextColor');

		// *** Bar Image ***
		pbbar = $("#pbBarImage").val();
		// no image
		pbbarimg = (pbbar == 0) ? "" : pbbar;
		// custom image
		if (pbbar == 1) {
			$('#facebox .custom').show();
			pbbarimg = $('#pbCustomImage').val();
			if(!/^(https?|ftp):\/\/.*$/i.test(pbbarimg)){
				youMissed("#pbCustomImage","Please enter a valid URL");
				return;
			}
		} else {
			$('#facebox .custom').hide();
		}

		// *** Border ***
		// no border
		if (pbtype > 1) {
			tmp = pbtitle + '<div style="height:15px;width:205px;border:' + pbbrdr + ' ' + $('#pbBorderSize option:selected').text() + 'px ' +
			$("#pbBorderType").find('option:selected').text().toLowerCase() + ';">' +
			'<div style="height:15px;text-align:right;background:#' + pbbarColor + ' url(' + pbbarimg +
			') center center;width:' + pbpercent + ';">' + '<span style="height:15px;font-size:14px;font-weight:bold;' +
			'position:relative;top:-.2em;color:#' + pbtxtColor + ';">' + pbpercent + '</span></div></div>';
		}
		// image border
		if (pbtype === 1) {
			pbborder = 'http://www.guildportal.com/Cargo/Mods/73/barbg-' + pbbrdr + '.png';
			pbcover = 'http://www.guildportal.com/Cargo/Mods/73/bgcover.png';
			// adjusts the percentage txt along with the bar
			pbtxtadj = 2 - parseInt(pbpercent, 10)*2;
			if ( pbtxtadj < -30 ) { pbtxtadj = -30; }
			if (parseInt(pbpercent,10) === 100) { pbtxtadj = -38; }
			tmp = pbtitle + '<div style="width:216px;height:25px;position:relative;background:url(' + pbborder + ') no-repeat 0 0;">' +
			'<span style="position:absolute;display:block;width:200px;height:15px;top:6px;left:8px;overflow:hidden;text-indent:' +
			pbtxtadj + 'px;background:#' + pbbarColor + ' url(' + pbbarimg + ') center center;">' +
			'<em style="position:absolute;display:block;width:200px;' +
			'height:15px;top:0px;background:url(' + pbcover + ') repeat-x 0 0;left:' + pbpercent + '">' +
			'<span style="position:absolute;display:block;top:-.2em;font-size:12pt;font-weight:bold;color:#' + pbtxtColor + ';">' +
			pbpercent + '</span></em></span></div>';
		}
		return tmp;
	}

	// get color hex value
	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,'');
	}

	// Save Progress Bar Embed
	function saveProgressBar(){
		var editor, j;
		$(document).trigger('close.facebox');
		tmp = updateProgressbar();
		if ($('#customModules').hasClass('richEditor')) {
			editor = $('[id$=txtEditor_internalEditor]').attr('id');
			$find( editor ).pasteHtml(tmp);
		} else {
			j = $("[id$=txtEditor_internalTextBox]");
			j.val ( j.val() + tmp );
		}
	}

	// Make sure the color code entered is valid
	function checkColor(n){
		if (typeof(n) === "undefined") { return true; }
		if (!/^(#[\da-fA-F]{6}$)/.test(n)) { return true; }
		return false;
	}

	// Show error message
	function youMissed(iid,msg,nValue){
		if (typeof(nValue) !== "undefined") { $(iid).attr("value",nValue); }
		$("#facebox .errBox").html(" - " + msg);
		$(iid).focus();
	}

	// Callbacks for facebox
	$(document)
		.bind('reveal.facebox', function(){
			setupProgressBar();
		})
		.bind('afterClose.facebox', function() {
			$('#facebox').removeClass('forum-mod');
		});

};

})( jQuery );

