/**
 * Holds global js functions
 *
 * @author      Jan Krause <jk@gameswelt.de>
 * @author      Damian Senn <ds@adfinis.com>
 */
;(function($, window, GW, undefined){

$(function($){
	var $subMenu           = $('#subMenu'),
	    $topMenu           = $('#topMenu'),
	    defaultHtmlContent = $subMenu.html();

	/**
	 * Sets the current menu point
	 *
	 * @author      Jan Krause <jk@gameswelt.de>
	 * @author      Damian Senn <ds@adfinis.com>
	 * @param       jQuery $selected
	 * @return      void
	 */
	function setMenuPoint($selected){
		var menuPoints       = GW.Navigation,
		    currentMenuPoint = menuPoints[$selected.attr('id')],
		    subMenuPoints    = currentMenuPoint.subNavigation;

		$subMenu.empty();
		for(var i = 0, menuLength = subMenuPoints.length;i < menuLength;i++){
			var subMenuPoint  = subMenuPoints[i],
			    $subMenuPoint = $('<li><a href="'+ subMenuPoint.url +'">'+ subMenuPoint.title +'</a></li>');

			if(typeof subMenuPoint.target !== 'undefined')
				$subMenuPoint.find('a').attr('target', subMenuPoint.target);

			$subMenu.append($subMenuPoint);
		}

		var $next = $selected.next('li');
		if ($next.length) {
			if ($next.hasClass('menuTopSelected')) {
				$selected.addClass('menuTopHoverNextActive');
			}
			else {
				$selected.addClass('menuTopHover');
			}
		}
		else {
			$selected.addClass('menuTopHover');
		}

		var $prev = $selected.prev('li');
		if ($prev.length) {
			if ($prev.hasClass('menuTopSelected')) {
				$prev.addClass('menuTopHoverPrevActive');
			}
			else {
				$prev.addClass('menuTopPrevHover');
			}
		}

	}

	$('#baseMenu').mouseleave(function(e){
		$topMenu.children('li').removeClass('menuTopPrevHover menuTopHover menuTopHoverNextActive menuTopHoverPrevActive');

		var $selected = $('.menuTopSelected');

		if($selected.length){
			setMenuPoint($selected);
		}

		$subMenu.html(defaultHtmlContent);
	});

	$topMenu.children('li').mouseover(function(e){
		$topMenu.children('li').removeClass('menuTopPrevHover menuTopHover menuTopHoverNextActive menuTopHoverPrevActive');

		setMenuPoint($(this));
	});

	// handle fields with a default value
	$('.defaultValue').addClass('defaultValueFormat').live({
		focusout: function() {
			var $this = $(this);

			if ($this.val() == '') {
				$this.val(this.defaultValue);
				$this.addClass('defaultValueFormat');
			}
		},
		focus: function() {
			var $this = $(this);

			if (this.defaultValue == $this.val()) {
				$this.val('');
				$this.removeClass('defaultValueFormat');
			}
		}
	});

	GW.Captcha = { 'reload': reloadCaptcha };
	function reloadCaptcha() {
		if (typeof Recaptcha != 'undefined') {
			Recaptcha.reload()
		}
		else {
			// add random get parameter to prevent caching
			$('.captchaImage').attr('src', '/captcha/picture.php?t=' + Math.random());
		}
	}

	$('.captchaImage, .reloadCaptchaImage').live('click', function(e){
		e.preventDefault();

		reloadCaptcha();
	});

	$('form.hasCaptcha').one('focusin', reloadCaptcha);

	// platform selection
	$('#miscSubMenuToggleButton').click(function(e){
		e.preventDefault();
		$('#miscSubMenu ul').slideToggle('fast');
	});

	// toggle boxes
	$('.toggleBox').each(function(i, el){
		var $toggleBox = $(el);

		$toggleBox.find('.toggleBoxAreas > li').each(function(i, el){
			var $li         = $(el),
			    r           = /(\d*)\-(\d*)$/.exec($li.attr('id')),
			    toggleBoxID = r[1],
			    tabID       = r[2];

			$li.find('a').click(function(e){
				e.preventDefault();
				var $tabContents = $toggleBox.find('.toggleBoxMainContent > div'),
				    $tabContent  = $toggleBox.find('#toggleBoxSubContent-'+ toggleBoxID +'-'+ tabID);

				$toggleBox.find('.toggleBoxAreas > li').attr('class', 'toggleBoxTab');
				$li.attr('class', 'toggleBoxTabActive');
				/**
				 * @todo by ds: add an class to the active tab and fade only the
				 * active tab out, then fade the new tab in the fadeOut callback
				 * in; this should fix a bug if you're clicking the "link tabs"
				 * too fast and end up with multiple tab contents showing up.
				 */
				$tabContents.fadeOut(250);
				setTimeout(function(){
					$tabContent.fadeIn(250);
				},300);
			});
		});
	});

	// keep login checkbox
	$('.loginFormElements .keepLoginLink, .loginFormElements #keepLoginPic').click(function(e){
		e.preventDefault();
		var $keepLogin = $('#keepLogin');

		if($keepLogin.val() == 0){
			$keepLogin.val(1);
			$('#keepLoginPic').attr('src', GW.Theme.generic +'/images/basePage/checked.png');
		}
		else {
			$keepLogin.val(0);
			$('#keepLoginPic').attr('src', GW.Theme.generic +'/images/basePage/unchecked.png');
		}
	});
});

// Validate functions for registering, profile page, password change etc.
(function($, GW, undefined){

var path   = GW.Theme.path +'/images/myGameswelt/'
  , ok     = path +'ok.png'
  , nok    = path +'nok.png'
  , blank  = path +'clear.png'
  , colors = {
    	blank: '#fff',
    	ok:    '#8ccf68',
    	nok:   '#f46700'
  }
;

$(function($) {
	GW.checkPassword  = createValidator($('#password1, #password2'));
	GW.checkBirthday  = createValidator($('#birthday_day, #birthday_month, #birthday_year'));
	GW.checkEMail     = createValidator($('#email'));
	GW.checkNickName  = createValidator($('#nick_name'));
	GW.checkFirstName = createValidator($('#first_name'), false);
	GW.checkLastName  = createValidator($('#last_name'),  false);
	GW.checkCountry   = createValidator($('#country_id'), false);
})

/**
 * Creates a validate function for the given jQuery objects
 *
 * @author        Damian Senn <ds@adfinis.com>
 * @param         {jQuery}  $elements
 * @param         {Boolean} ajax
 * @returns       {Function}
 */
function createValidator($elements, ajax) {
	//$elements.bind({ 'change': validate /*, 'blur': validate*/ });
	$elements.change(validate);

	return validate;

	function validate() {
		var values = {};

		$elements.each(function(){
			values[this.name] = $(this).val();
		});

		for(var i in values) {
			if(!values.hasOwnProperty(i)) continue;

			if(!values[i]) {
				$elements.css('background', colors.blank).next('img').attr('src', blank);

				return;
			}
		}

		if(ajax === undefined || ajax) {
			$.post('/ajax/ajaxRegistrationCheck.php', values, function(data) {
				$elements.css('background',       data.error ? colors.nok : colors.ok)
				         .next('img').attr({
							 src: data.error ? nok : ok,
							 title: data.error ? data.message : ''
						 })
			}, 'json');
		}
		else {
			$elements.css('background', colors.ok).next('img').attr('src', ok);
		}
	};
}

})($, GW);

// Email encoding - shoul be refactored
var g_base64_table = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';

function base64_decode(encStr){
	var bits;
	var decOut = '';
	var i = 0;

	for(; i < encStr.length; i += 4){
		bits = (g_base64_table.indexOf(encStr.charAt(i))     & 0xFF) << 18 |
		       (g_base64_table.indexOf(encStr.charAt(i + 1)) & 0xFF) << 12 |
		       (g_base64_table.indexOf(encStr.charAt(i + 2)) & 0xFF) <<  6 |
		       (g_base64_table.indexOf(encStr.charAt(i + 3)) & 0xFF);

		decOut += String.fromCharCode((bits & 0xFF0000) >> 16, (bits & 0xFF00) >> 8, bits & 0xFF);
	}

	if(encStr.charCodeAt(i - 2) == 61)
		return(decOut.substring(0, decOut.length - 2));
	else if(encStr.charCodeAt(i - 1) == 61)
		return(decOut.substring(0, decOut.length - 1));
	else
		return(decOut);
}

window.print_mail_link = function(addr, title, tagparm){
	addr = base64_decode(addr);

	var decoded = "";
	var len = addr.length;
	var i   = 0;

	for (i = 0; i < len; i++) {
		decoded += String.fromCharCode(addr.charCodeAt(i) ^ 156);
	}

	if (title == null || title == '') {
		title = decoded;
	}

	decoded = decoded.replace(/</g, '&lt;');
	decoded = decoded.replace(/>/g, '&gt;');

	title = title.replace(/</g, '&lt;');
	title = title.replace(/>/g, '&gt;');

	document.write('<a ' + tagparm + ' hr' + 'ef="mai' + 'lto' + ':' + decoded + '">' + title + '</a>');
}

/**
 * download popup is still used by video pages
 */
window.openDownloadsPopup = function(downloadFileItemId, filename, width, height){
	// if no width and height defined, use the default values
	width  = width  || 740;
	height = height || 315;

	window.open('/downloads/popup/gameswelt/' + downloadFileItemId + '-' + filename, 'gameswelt_dl_', 'toolbar=no,location=no,status=no,menubar=no,scrollbars=no,top=200,left=200,width='+ width +',height='+ height +',resizable=no');
};

})(jQuery, window, GW)

