//Javascript (jquery) functions common to many areas of TEV

/*
----------------------------------------------------------------------------------
makeFancyButtons()
Replaces any inputs with class '.btn' with nicer-looking divs
----------------------------------------------------------------------------------
*/

function makeFancyButtons() {
	
	//replace any inputs with class '.btn' with fancier divs
	$('input.btn').each(function() {
		$(this).after('<div class="'+$(this).attr('class')+'"><div>'+$(this).attr('value')+'</div></div>');
		$(this).remove();				
	});
	
	//a centering algorithm for floated-left buttons
	$('div.btn').each(function() {
		if ($(this).hasClass('center')) {
			var parentWidth = $(this).parents('div').width() - 16;
			var thisWidth = $(this).width();
			var leftMargin = ((parentWidth/2) - (thisWidth/2));
			$(this).css('margin-left',leftMargin + 'px');
		}
	});
	
}

/*
----------------------------------------------------------------------------------
tevLogout()
Universal logout function, takes care of main TEV, phpbb3, and Wordpress logouts
----------------------------------------------------------------------------------
*/

function tevLogout(callback) {
	
	//main TEV logout
	$.post('/includes/ajax.php',{action: "unsetLogin"},function(){
		//show the login box again from ajax.php's loginMessage()
		$.post('/includes/ajax.php',{action: "loginMessage", showLogin: "true"},function(html) {
			$('#loginBox').fadeOut('fast',function() {
				$('#loginBox').html(html);
				makeFancyButtons();
			});
			$('#loginBox').fadeIn('slow');
		});
	});
	
	//phpbb3 logout
	$.post('/includes/ajax.php',{action: "getPhpbbSessionID"},function(sessID) {
	
		$.get('/phpbb3/ucp.php',{mode: "logout", sid: sessID});
		
	});
	
	//any possible wordpress logins need to be logged out, too
	$.post('/wordpress/',{TEVlogout: "true"});
	
	//place a callback function after all ajax events have completed
	if (arguments.length == 1)
		return new callback;

}

/*
----------------------------------------------------------------------------------
rtrim()
A clone of php's rtrim from the php2js project
Credit: http://kevin.vanzonneveld.net/techblog/article/javascript_equivalent_for_phps_rtrim/
----------------------------------------------------------------------------------
*/

function rtrim ( str, charlist ) {
    // http://kevin.vanzonneveld.net
    // +   original by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
    // +      input by: Erkekjetter
    // +   improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
    // +   bugfixed by: Onno Marsman
    // *     example 1: rtrim('    Kevin van Zonneveld    ');
    // *     returns 1: '    Kevin van Zonneveld'
 
    charlist = !charlist ? ' \s\xA0' : (charlist+'').replace(/([\[\]\(\)\.\?\/\*\{\}\+\$\^\:])/g, '\$1');
    var re = new RegExp('[' + charlist + ']+$', 'g');
    return (str+'').replace(re, '');
}

/*
----------------------------------------------------------------------------------
get_html_translation_table()
A clone of php's get_html_translation_table from the php2js project
Credit: http://kevin.vanzonneveld.net/techblog/article/javascript_equivalent_for_phps_get_html_translation_table/
----------------------------------------------------------------------------------
*/

function get_html_translation_table(table, quote_style) {
    // http://kevin.vanzonneveld.net
    // +   original by: Philip Peterson
    // +    revised by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
    // +   bugfixed by: noname
    // %          note: It has been decided that we're not going to add global
    // %          note: dependencies to php.js. Meaning the constants are not
    // %          note: real constants, but strings instead. integers are also supported if someone
    // %          note: chooses to create the constants themselves.
    // %          note: Table from http://www.the-art-of-web.com/html/character-codes/
    // *     example 1: get_html_translation_table('HTML_SPECIALCHARS');
    // *     returns 1: {'"': '&quot;', '&': '&amp;', '<': '&lt;', '>': '&gt;'}
    
    var entities = {}, histogram = {}, decimal = 0, symbol = '';
    var constMappingTable = {}, constMappingQuoteStyle = {};
    var useTable = {}, useQuoteStyle = {};
    
    useTable      = (table ? table.toUpperCase() : 'HTML_SPECIALCHARS');
    useQuoteStyle = (quote_style ? quote_style.toUpperCase() : 'ENT_COMPAT');
    
    // Translate arguments
    constMappingTable[0]      = 'HTML_SPECIALCHARS';
    constMappingTable[1]      = 'HTML_ENTITIES';
    constMappingQuoteStyle[0] = 'ENT_NOQUOTES';
    constMappingQuoteStyle[2] = 'ENT_COMPAT';
    constMappingQuoteStyle[3] = 'ENT_QUOTES';
    
    // Map numbers to strings for compatibilty with PHP constants
    if (!isNaN(useTable)) {
        useTable = constMappingTable[useTable];
    }
    if (!isNaN(useQuoteStyle)) {
        useQuoteStyle = constMappingQuoteStyle[useQuoteStyle];
    }
    
    if (useQuoteStyle != 'ENT_NOQUOTES') {
        entities['34'] = '&quot;';
    }
 
    if (useQuoteStyle == 'ENT_QUOTES') {
        entities['39'] = '&#039;';
    }
 
    if (useTable == 'HTML_SPECIALCHARS') {
        // ascii decimals for better compatibility
        entities['38'] = '&amp;';
        entities['60'] = '&lt;';
        entities['62'] = '&gt;';
    } else if (useTable == 'HTML_ENTITIES') {
        // ascii decimals for better compatibility
      entities['38']  = '&amp;';
      entities['60']  = '&lt;';
      entities['62']  = '&gt;';
      entities['160'] = '&nbsp;';
      entities['161'] = '&iexcl;';
      entities['162'] = '&cent;';
      entities['163'] = '&pound;';
      entities['164'] = '&curren;';
      entities['165'] = '&yen;';
      entities['166'] = '&brvbar;';
      entities['167'] = '&sect;';
      entities['168'] = '&uml;';
      entities['169'] = '&copy;';
      entities['170'] = '&ordf;';
      entities['171'] = '&laquo;';
      entities['172'] = '&not;';
      entities['173'] = '&shy;';
      entities['174'] = '&reg;';
      entities['175'] = '&macr;';
      entities['176'] = '&deg;';
      entities['177'] = '&plusmn;';
      entities['178'] = '&sup2;';
      entities['179'] = '&sup3;';
      entities['180'] = '&acute;';
      entities['181'] = '&micro;';
      entities['182'] = '&para;';
      entities['183'] = '&middot;';
      entities['184'] = '&cedil;';
      entities['185'] = '&sup1;';
      entities['186'] = '&ordm;';
      entities['187'] = '&raquo;';
      entities['188'] = '&frac14;';
      entities['189'] = '&frac12;';
      entities['190'] = '&frac34;';
      entities['191'] = '&iquest;';
      entities['192'] = '&Agrave;';
      entities['193'] = '&Aacute;';
      entities['194'] = '&Acirc;';
      entities['195'] = '&Atilde;';
      entities['196'] = '&Auml;';
      entities['197'] = '&Aring;';
      entities['198'] = '&AElig;';
      entities['199'] = '&Ccedil;';
      entities['200'] = '&Egrave;';
      entities['201'] = '&Eacute;';
      entities['202'] = '&Ecirc;';
      entities['203'] = '&Euml;';
      entities['204'] = '&Igrave;';
      entities['205'] = '&Iacute;';
      entities['206'] = '&Icirc;';
      entities['207'] = '&Iuml;';
      entities['208'] = '&ETH;';
      entities['209'] = '&Ntilde;';
      entities['210'] = '&Ograve;';
      entities['211'] = '&Oacute;';
      entities['212'] = '&Ocirc;';
      entities['213'] = '&Otilde;';
      entities['214'] = '&Ouml;';
      entities['215'] = '&times;';
      entities['216'] = '&Oslash;';
      entities['217'] = '&Ugrave;';
      entities['218'] = '&Uacute;';
      entities['219'] = '&Ucirc;';
      entities['220'] = '&Uuml;';
      entities['221'] = '&Yacute;';
      entities['222'] = '&THORN;';
      entities['223'] = '&szlig;';
      entities['224'] = '&agrave;';
      entities['225'] = '&aacute;';
      entities['226'] = '&acirc;';
      entities['227'] = '&atilde;';
      entities['228'] = '&auml;';
      entities['229'] = '&aring;';
      entities['230'] = '&aelig;';
      entities['231'] = '&ccedil;';
      entities['232'] = '&egrave;';
      entities['233'] = '&eacute;';
      entities['234'] = '&ecirc;';
      entities['235'] = '&euml;';
      entities['236'] = '&igrave;';
      entities['237'] = '&iacute;';
      entities['238'] = '&icirc;';
      entities['239'] = '&iuml;';
      entities['240'] = '&eth;';
      entities['241'] = '&ntilde;';
      entities['242'] = '&ograve;';
      entities['243'] = '&oacute;';
      entities['244'] = '&ocirc;';
      entities['245'] = '&otilde;';
      entities['246'] = '&ouml;';
      entities['247'] = '&divide;';
      entities['248'] = '&oslash;';
      entities['249'] = '&ugrave;';
      entities['250'] = '&uacute;';
      entities['251'] = '&ucirc;';
      entities['252'] = '&uuml;';
      entities['253'] = '&yacute;';
      entities['254'] = '&thorn;';
      entities['255'] = '&yuml;';
    } else {
        throw Error("Table: "+useTable+' not supported');
        return false;
    }
    
    // ascii decimals to real symbols
    for (decimal in entities) {
        symbol = String.fromCharCode(decimal)
        histogram[symbol] = entities[decimal];
    }
    
    return histogram;
}

/*
----------------------------------------------------------------------------------
html_entity_decode()
A clone of php's html_entity_decode from the php2js project
Credit: http://kevin.vanzonneveld.net/techblog/article/javascript_equivalent_for_phps_html_entity_decode/
----------------------------------------------------------------------------------
*/

function html_entity_decode( string, quote_style ) {
    // http://kevin.vanzonneveld.net
    // +   original by: john (http://www.jd-tech.net)
    // +      input by: ger
    // +   improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
    // +    revised by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
    // +   bugfixed by: Onno Marsman
    // +   improved by: marc andreu
    // +    revised by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
    // -    depends on: get_html_translation_table
    // *     example 1: html_entity_decode('Kevin &amp; van Zonneveld');
    // *     returns 1: 'Kevin & van Zonneveld'
    // *     example 2: html_entity_decode('&amp;lt;');
    // *     returns 2: '&lt;'
 
    var histogram = {}, symbol = '', tmp_str = '', entity = '';
    tmp_str = string.toString();
    
    if (false === (histogram = get_html_translation_table('HTML_ENTITIES', quote_style))) {
        return false;
    }
 
    // &amp; must be the last character when decoding!
    delete(histogram['&']);
    histogram['&'] = '&amp;';
 
    for (symbol in histogram) {
        entity = histogram[symbol];
        tmp_str = tmp_str.split(entity).join(symbol);
    }
    
    return tmp_str;
}


/*
----------------------------------------------------------------------------------
explode()
A clone of php's explode() from the php2js project
Credit: http://kevin.vanzonneveld.net/techblog/article/javascript_equivalent_for_phps_explode/
----------------------------------------------------------------------------------
*/


function explode( delimiter, string, limit ) {
    // http://kevin.vanzonneveld.net
    // +     original by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
    // +     improved by: kenneth
    // +     improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
    // +     improved by: d3x
    // +     bugfixed by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
    // *     example 1: explode(' ', 'Kevin van Zonneveld');
    // *     returns 1: {0: 'Kevin', 1: 'van', 2: 'Zonneveld'}
    // *     example 2: explode('=', 'a=bc=d', 2);
    // *     returns 2: ['a', 'bc=d']
 
    var emptyArray = { 0: '' };
    
    // third argument is not required
    if ( arguments.length < 2
        || typeof arguments[0] == 'undefined'
        || typeof arguments[1] == 'undefined' )
    {
        return null;
    }
 
    if ( delimiter === ''
        || delimiter === false
        || delimiter === null )
    {
        return false;
    }
 
    if ( typeof delimiter == 'function'
        || typeof delimiter == 'object'
        || typeof string == 'function'
        || typeof string == 'object' )
    {
        return emptyArray;
    }
 
    if ( delimiter === true ) {
        delimiter = '1';
    }
    
    if (!limit) {
        return string.toString().split(delimiter.toString());
    } else {
        // support for limit argument
        var splitted = string.toString().split(delimiter.toString());
        var partA = splitted.splice(0, limit - 1);
        var partB = splitted.join(delimiter.toString());
        partA.push(partB);
        return partA;
    }
}


/*
----------------------------------------------------------------------------------
for the signup form and Add a Profile form (in admin area)
set the createProfile form validation rules using jquery.validate plugin	
----------------------------------------------------------------------------------
*/
$('form#createProfile').livequery(function() {
	var createProfileValidator = $('form#createProfile').validate({	
		wrapper: 'h4',
		rules: {
			firstname: {
				required: true
			},
			lastname: {
				required: true
			},
			nickname: {
				required: true,
				remote: '/includes/ajax.php?action=checkNickname',
				minlength: 5
			},
			address1: {
				required: true
			},
			address2: {
				required: false
			},
			city: {
				required: true
			},
			zip: {
				required: true,
				digits: true
			},
			password2: {
				required: true,
				equalTo: '#password'
			},
			phone: {
				digits: false,
				minlength: 10,
				maxlength: 12
			},
			phoneExt: {
				digits: true
			},
			terms: {
				required: true
			},
			email: {
				required: true,
				email: true
			}
		},
		messages: {
			email: 'Not a valid email.',
			terms: 'You must agree to the terms and conditions.',
			phone: 'Please enter 10 digits only, no parentheses',
			password2: {
				equalTo: 'Passwords do not match.'
			},
			nickname: {
				remote: 'This nickname appears to be taken.  Try something else.',
				minlength: 'Try to make your nickname more than 5 characters.'
			}
			
		}
	});
});


/*
----------------------------------------------------------------------------------
for the edit profile form and the edit profile form under "Find Users" (in admin area)
set the editProfile form validation rules using jquery.validate plugin	
actually the same rules as the above ones, except for password (changing it) isn't required,
	and checknickname won't report that their old nickname is taken (even though it is, BY THEM)
----------------------------------------------------------------------------------
*/
$('form#editProfile').livequery(function() {
	var editProfileValidator = $('form#editProfile').validate({	
		wrapper: 'h4',
		rules: {
			firstname: {
				required: true
			},
			lastname: {
				required: true
			},
			nickname: {
				required: true,
				remote: '/includes/ajax.php?action=checkNickname&oldnick='+$('#oldNickname').val(),
				minlength: 5
			},
			address1: {
				required: true
			},
			address2: {
				required: false
			},
			city: {
				required: true
			},
			zip: {
				required: true,
				digits: true
			},
			password2: {
				equalTo: "#password"
			},
			phone: {
				digits: true,
				minlength: 10,
				maxlength: 10
			},
			phoneExt: {
				digits: true
			},
			email: {
				required: true,
				email: true
			}
		},
		messages: {
			email: 'Not a valid email.',
			phone: 'Please enter 10 digits only, no dashes or parentheses',
			password2: {
				equalTo: 'Passwords do not match.'
			},
			nickname: {
				remote: 'This nickname appears to be taken.  Try something else.',
				minlength: 'Try to make your nickname more than 5 characters.'
			}
			
		}
	});
});
