if (typeof YAHOO.youporn.categoryvoting === 'undefined') {
	YAHOO.youporn.categoryvoting = {};
}

YAHOO.youporn.categoryvoting.clickHandler = function(ev) {
	if (YAHOO.youporn.categoryvoting.timeOut) {
		clearTimeout(YAHOO.youporn.categoryvoting.timeOut);
	}
	var el = YAHOO.util.Event.getTarget(ev);
	switch (el.nodeName.toUpperCase()) {
	case 'H3':
		YAHOO.youporn.categoryvoting.toggleModule();
		break;
	case 'LI':
		YAHOO.youporn.categoryvoting.toggleCategory(ev);
		break;
	case 'SPAN':
		YAHOO.youporn.categoryvoting.handleSpan(ev);
		break;
	case 'BUTTON':
		YAHOO.youporn.categoryvoting.handleButton(ev);
		break;
	}
	YAHOO.youporn.categoryvoting.timeOut = setTimeout(function(){
		if (YAHOO.util.Dom.hasClass(document.getElementById('category-voting'), 'module-open')) {
			YAHOO.youporn.categoryvoting.toggleModule();
		}
	}, 60000);
}

YAHOO.youporn.categoryvoting.toggleModule = function() {
	var el = document.getElementById('category-voting');
	if (!YAHOO.util.Dom.hasClass(el, 'module-open') && !YAHOO.util.Dom.hasClass(el, 'module-finished')) {
		YAHOO.util.Dom.addClass(el, 'module-open');
		YAHOO.youporn.categoryvoting.callBeacon('3');
	} else if (!YAHOO.util.Dom.hasClass(el, 'module-finished')) {
		YAHOO.util.Dom.removeClass(el, 'module-open');
		YAHOO.youporn.categoryvoting.callBeacon('4');
	}
}

YAHOO.youporn.categoryvoting.toggleCategory = function(ev) {
	var el = YAHOO.util.Event.getTarget(ev);
	var cat = el.id.substr(4);
	var parentId = el.parentNode.id;
	var otherList = '';
	var match = '';
	var act = '';
	switch (parentId) {
	case 'categories-suggested':
		if (document.getElementById('categories-all')) {
			otherList = document.getElementById('categories-all');
		}
		break;
	case 'categories-all':
		if (document.getElementById('categories-suggested')) {
			otherList = document.getElementById('categories-suggested');
		}
		break;
	}
	if (otherList) {
		var listItems = otherList.getElementsByTagName('LI');
		for (var i = 0; i < listItems.length; i += 1) {
			if (listItems[i].id.substr(4) === el.id.substr(4)){
				match = listItems[i];
				break;
			}
		}
	}
	if (YAHOO.util.Dom.hasClass(el, 'selected')) {
		YAHOO.util.Dom.removeClass(el, 'selected');
		if (match) {
			YAHOO.util.Dom.removeClass(match, 'selected');
		}
		act = '1';
	} else {
		YAHOO.util.Dom.addClass(el, 'selected');
		if (match) {
			YAHOO.util.Dom.addClass(match, 'selected');
		}
		act = '0';
	}
	YAHOO.youporn.categoryvoting.callBeacon(act, cat);
	YAHOO.youporn.categoryvoting.hasVoted = true;
}

YAHOO.youporn.categoryvoting.handleSpan = function(ev) {
	var el = YAHOO.util.Event.getTarget(ev);
	var suggest = document.getElementById('category-voting-buttons');
	switch (el.id) {
	case 'category-voting-suggest-text':
		YAHOO.youporn.categoryvoting.openSuggest();
		break;
	case 'category-voting-suggest-cancel':
		YAHOO.youporn.categoryvoting.closeSuggest();
		break;
	}
}

YAHOO.youporn.categoryvoting.openSuggest = function() {
	var el = document.getElementById('category-voting-buttons');
	if (!YAHOO.util.Dom.hasClass(el, 'suggest-open') && !YAHOO.util.Dom.hasClass(el, 'suggest-finished')) {
		YAHOO.util.Dom.addClass(el, 'suggest-open');
	}
}

YAHOO.youporn.categoryvoting.closeSuggest = function() {
	var el = document.getElementById('category-voting-buttons');
	YAHOO.util.Dom.removeClass(el, 'suggest-open');
}

YAHOO.youporn.categoryvoting.handleButton = function(ev) {
	var el = YAHOO.util.Event.getTarget(ev);
	switch (el.id) {
	case 'category-voting-save-button':
		YAHOO.youporn.categoryvoting.done();
		break;
	case 'category-voting-suggest-button':
		YAHOO.youporn.categoryvoting.suggestCategory();
		break;
	}
}

YAHOO.youporn.categoryvoting.done = function() {
	var el = document.getElementById('category-voting');
	if (YAHOO.youporn.categoryvoting.hasVoted) {
		document.getElementById('category-voting-heading').innerHTML = 'Thank you for your help!';
		YAHOO.util.Dom.addClass(el, 'module-finished');
	} else {
		YAHOO.util.Dom.removeClass(el, 'module-open');
	}
	YAHOO.youporn.categoryvoting.callBeacon('2');
}

YAHOO.youporn.categoryvoting.suggestCategory = function() {
	var el = document.getElementById('category-voting-buttons');
	var str = document.getElementById('category-voting-suggest-input').value;
	if (str) {
		YAHOO.youporn.categoryvoting.closeSuggest();
		YAHOO.util.Dom.addClass(el, 'suggest-finished');
		document.getElementById('category-voting-suggest-text').innerHTML = 'Thank you for your suggestion!';
		YAHOO.youporn.categoryvoting.callBeacon('5', '', str);
	} else {
		alert('Please enter a suggested category first.');
	}

}

YAHOO.youporn.categoryvoting.callBeacon = function(act, cat, str) {
	var baseUrl = "http://beacon.youporn.com/blank.gif";
	var mode = "mode=category";
	var vid = 'vid=' + YAHOO.youporn.video_id;
	var action = 'action=' + act;
	var urlParams = [mode, vid, action];
	var url = baseUrl + '?' + urlParams.join('&');
	if (cat) {
		url += '&cat=' + cat;
	} else if (str) {
		url += '&catname=' + encodeURI(str);
	}
	beacon = new Image();
	beacon.src = url;
}

if (document.getElementById('category-voting')) { // if category voting module exsits initialize event listeners
	YAHOO.util.Event.on('category-voting', 'click', YAHOO.youporn.categoryvoting.clickHandler); // capture all clicks in module
	YAHOO.youporn.categoryvoting.hasVoted = false;
}