/**
 * @author protom
 */

if(_)
{
	_.templateSettings = 
	{
		interpolate : /\{\{(.+?)\}\}/g
	};
}

if(!protom)
{
    var protom = {};
}

protom.logEnabled = true;

protom.log = function(message)
{
    if(protom.logEnabled && window.console)
    {
	console.debug(message);
    }

}

protom.sendPostJson = function(callback, href)
{
    var postData = {
	'format':'json'
    };
    $j.post(href, postData, callback, 'json');
}

protom.postAdd = function()
{
    protom.sendPostJson(protom.itemAdded, this.href);
    return false;
}

protom.postRemove = function()
{
    protom.sendPostJson(protom.itemRemoved, this.href);
    return false;
}

protom.postSort = function()
{
    var href = this.href;
    protom.sendPostJson(function(){protom.itemSorted(href)}, this.href);
    return false;
}

protom.setupAvailableItems = function()
{
    $j('.leftBox .addButton').bind('click', protom.postAdd);
};

protom.setupSelectedItems = function()
{
    $j('.rightBox .removeButton').bind('click', protom.postRemove);
    $j('.rightBox .sortUpButton').bind('click', protom.postSort);
    $j('.rightBox .sortDownButton').bind('click', protom.postSort);
}

protom.itemAdded = function(result)
{
    var url = $j('#art_'+result.articleId+' .addButton').attr('href');
    var removeUrl = url.replace('addarticle', 'removearticle');
    var sortUrl = url.replace('addarticle', 'sortarticle');
	
    $j('#art_'+result.articleId+' .buttons').append(' <a href="'+sortUrl+'&direction=up" class="button sortUpButton"><span class="tooltip" >nach oben</span></a> <a href="'+sortUrl+'&direction=down" class="button sortDownButton"><span class="tooltip" >nach unten</span></a>');
    $j('#art_'+result.articleId+' .addButton').attr('href', removeUrl).removeClass('addButton').addClass('removeButton');
    $j('#art_'+result.articleId+' .tooltip').text('entfernen');
	
    $j('.rightBox .boxitems ul').append($j('#art_'+result.articleId).remove());
    $j('#art_'+result.articleId+' .removeButton').bind('click', protom.postRemove);
    $j('#art_'+result.articleId+' .sortUpButton').bind('click', protom.postSort);
    $j('#art_'+result.articleId+' .sortDownButton').bind('click', protom.postSort);
}

protom.itemRemoved = function(result)
{
    $j('#art_'+result.articleId+' .sortUpButton').remove();
    $j('#art_'+result.articleId+' .sortDownButton').remove();
	
    $j('#art_'+result.articleId+' .removeButton').attr('href', function(){
	return this.href.replace('removearticle', 'addarticle');
    }).removeClass('removeButton').addClass('addButton');
    $j('#art_'+result.articleId+' .tooltip').text('hinzufuegen')
	
	
    $j('.leftBox .boxitems ul').append($j('#art_'+result.articleId).remove());
    $j('#art_'+result.articleId+' a').bind('click', protom.postAdd);
}

protom.itemSorted = function(result)
{
    var url = result.substring(0, result.indexOf('?', 0)).replace('sortarticle', 'article');
    $j('.rightBox').load(url+'?output=fragment&requested=rightBox', protom.setupSelectedItems);
}

protom.handleFilterForm = function(event)
{
    var form = document.getElementById('searchForm');
    var data = {
	'page' : form.page.value,
	'searchterm' : form.searchterm.value,
	'startdate' : form.startdate.value,
	'limit' : form.limit.value,
	'platform' : form.platform.value,
	'output' : 'fragment',
	'requested' : 'leftBox'
    };
	
    if(event.target.id === 'next')
    {
	data.page = Number(data.page) + 1;
	form.page.value = data.page;
	form.previous.disabled = false;
    }
    else if(event.target.id === 'previous' && data.page > 1)
    {
	data.page = Number(data.page) - 1;
	form.page.value = data.page;
		
    }
    if(form.page.value <= 1)
    {
	form.page.value = 1;
	form.previous.disabled = true;
    }
	
    $j('.leftBox .boxitems').load(form.action, data, protom.setupAvailableItems);
}


protom.setupFilterForm = function(initValues)
{
    var searchTimer;
	
    $j('#filterButton').bind('click', function(event){
	protom.handleFilterForm(event);
	return false;
    }).hide();
	
    $j('#previous').bind('click', function(event){
	protom.handleFilterForm(event);
    });
	
    $j('#next').bind('click', function(event){
	protom.handleFilterForm(event);
    });
	
    $j('#limit').bind('change', protom.handleFilterForm);
	
    $j('#platform').bind('change', protom.handleFilterForm);
	
    $j('#startdate').bind('change', protom.handleFilterForm);
	
    $j('#searchterm').bind('focus', function(){
	$j(this).bind('keyup', function(event){
	    clearTimeout(searchTimer);
	    searchTimer = setTimeout(protom.handleFilterForm, '500', event);
	});
    });
	
    $j('#searchterm').bind('blur', function(){
	$j(this).unbind('keyup', protom.handleFilterForm);
    });
	
}

protom.setupLeadArticleEditor = function()
{
    var editorLoaded = false;
    $j('#leadArticleButton').bind('click', function()
    {
	var labelOpen = 'Leitartikel bearbeiten';
	var labelClose = 'Leitartikel schliessen';
	var label = ($j(this).html() == labelOpen) ? labelClose : labelOpen;

	if( ! editorLoaded)
	{
	    $j('#leadArticleContainer').load(this.href, function()
	    {
		$j('#editorialEditor').hide();
		editorLoaded = true;

		$j('#articleForm').bind('submit', function()
		{
		    protom.form.post('#articleForm', '#leadArticleContainer');
		    return false;
		});
	    });
	}
	else
	{
	    $j('#editorialEditor').toggle();
	    $j('#leadArticleContainer').toggle();
	}
	$j(this).html(label);
	return false;
    });
}

protom.setupDomainSelect = function()
{
    $j('#domain_id').bind('change', function(event){
	$j.getJSON('/tools/newslettermanager/getdomainplatform/?format=json&domain='+this.value, null, function(result){
	    $j('#plattform_id').attr('value', result.platformId);
	})
		
    });
}

protom.initAdminLayout = function()
{
    var oMenuBar = new YAHOO.widget.MenuBar("plattformMenu", {
	hidedelay: 750
    });
    oMenuBar.render();
}

/**
 * adds a newsletter to a recipient
 */
protom.addNewsletterRecipient = function()
{
	
    };

/**
 * stornos a newsletter of a recipient
 */
protom.stornoNewsletterRecipient = function()
{
	
    }

/**
 * sets up checkboxes in newsletter recipient editor
 */
protom.setupNewsletterCheckboxes = function()
{
    var recipient = protom.recipient;
	
    $j('#available input').bind('change', function(){
	if(this.checked)
	{
	    protom.sendPostJson(protom.editNewsletterResulthandler, '/tools/newslettermanager/addrecipient?newsletter='+protom.getNewsletterId(this.id)+'&recipient='+recipient);
	    $j('#storno_'+protom.getNewsletterId(this.id)).attr('checked', '');
	}
	else
	{
	    protom.sendPostJson(protom.editNewsletterResulthandler, '/tools/newslettermanager/removerecipient?newsletter='+protom.getNewsletterId(this.id)+'&recipient='+recipient);
	    $j('#storno_'+protom.getNewsletterId(this.id)).attr('checked', 'checked');
	}
    });
	
    $j('#storno input').bind('change', function(){
	if(this.checked)
	{
	    protom.sendPostJson(protom.editNewsletterResulthandler, '/tools/newslettermanager/removerecipient?newsletter='+protom.getNewsletterId(this.id)+'&recipient='+recipient);
	    $j('#available_'+protom.getNewsletterId(this.id)).attr('disabled', 'disabled').attr('checked', '');
	}
	else
	{
	    protom.sendPostJson(protom.editNewsletterResulthandler, '/tools/newslettermanager/removestorno?newsletter='+protom.getNewsletterId(this.id)+'&recipient='+recipient);
	    $j('#available_'+protom.getNewsletterId(this.id)).attr('disabled', '').attr('checked', 'checked');
	}
    });
}

protom.getNewsletterId = function(id)
{
    id = id.substring(id.indexOf('_')+1, id.length);
    return id;
}

protom.editNewsletterResulthandler = function(result)
{
	try
	{
		console.log(result);
	}
	catch(e)
	{
		
	}
}

protom.setupAutoCompleteFormElement = function(selector, url)
{
    $j(selector).autocomplete(
	url,
	{
	    dataType	: "json",

	    parse		: function(data)
	    {
		return $j.map(data, function(row) {
		    return {
			data: row,
			value: row.name,
			result: row.name
		    }
		});
	    },

	    formatItem: function(item)
	    {
		return item['name'] + ' ('+item.value+')';
	    }
	}
	).result(

	function(event, item)
	{
	    $j(selector+'_dbid').val(item.value);
	}
    );
};

/**
 *
 * form elements for backend
 *
 */
protom.formElements = {};


/**
 *
 * tinyMCE setup
 *
 */
protom.formElements.setupRichTextEditor = function(element)
{
    protom.log('protom.formElements.setupRichTextEditor()');
    try
    {
	tinyMCE.init(
	{
	    mode : 'exact',
	    theme: 'advanced',
	    elements: element,
	    skin : "o2k7",
	    language : "de",

	    plugins : "safari,style,layer,table,save,advlink,searchreplace,print,contextmenu,paste,fullscreen,noneditable,nonbreaking,xhtmlxtras,inlinepopups",
		
		theme_advanced_buttons1 : "bold,italic,underline,|,justifyleft,justifycenter,justifyright,justifyfull,|,fontselect,fontsizeselect,|,forecolor,backcolor,|,removeformat,visualaid,fullscreen,nonbreaking,styleprops,code,|,undo,redo",
        theme_advanced_buttons2 : "copy,paste,pastetext,pasteword,|,search,replace,|,bullist,numlist,|,outdent,indent,|,link,unlink,image,cleanup,|,tablecontrols",
        theme_advanced_buttons3 : "",
        theme_advanced_buttons4 : "",

		theme_advanced_toolbar_location : "top",
	    theme_advanced_toolbar_align : "left",
	    theme_advanced_statusbar_location : "bottom",
	    theme_advanced_resizing : true,

	    content_css : "/js/protom/css/tinymce.css"
	}
	);
    }
    catch(e)
    {
		protom.log('Error setting up tinyMCE with exception: ' + e);
    }
}

protom.formElements.setupDatePickers = function( selector )
{
    protom.log('protom.formElements.setupDatePickers( ' + selector + ' )');

    selector = selector ? selector : '.datePicker';

    $j(selector).datepicker(
    {
	"dateFormat":"dd.mm.yy",
	"gotoCurrent":true,
	"monthNames":["Jänner","Februar","März","April","Mai","Juni","Juli","August","September","Oktober","November","Dezember"],
	"dayNamesMin":["So","Mo","Di","Mi","Do","Fr","Sa"]
    }
    );
};

protom.formElements.anwenderIdToggle = function()
{
    protom.log('protom.formElements.anwenderIdToggle()');

    var dropdownSelector =	'#metaData-bericht_typ_id';
    var labelSelector =		'#anwender-label';
    var textinputSelector = '#anwender-element';

    if($j(dropdownSelector).val() !== '2')
    {
	$j(labelSelector).hide();
	$j(textinputSelector).hide();
    }

    $j(dropdownSelector).bind('change', function(){
	protom.log('changed article type');
	if($j(dropdownSelector).val() === '2')
	{
	    $j(labelSelector).show();
	    $j(textinputSelector).show();
	}
	else
	{
	    $j(labelSelector).hide();
	    $j(textinputSelector).hide();
	}
    });
};

protom.formElements.setupSubmitButtons = function()
{
    protom.log( 'protom.formElements.setupSubmitButton()' );
    
    $j('#submitForm').each(function(){

	var formId = $j(this).parents('form').attr('id');
	var responseContainer = $j('#'+formId).parents('.tabPane');

	$j(this).bind('click', function(){
	   try
	    {
			protom.form.post('#'+formId, responseContainer);
	    }
	    catch(e)
	    {
			protom.log('Error posting the form with following message: ' + e);
	    }
	   return false;
	});
    });
}

protom.formElements.setupArticlePreviewButton = function()
{
	$j('#articlepreview').bind('click', function(event){
		event.preventDefault();
		var previewUrl = $j(this).attr('data-url');
		window.open(previewUrl + '?preview=1');
	});
}

protom.formElements.setup = function()
{
    protom.formElements.setupRichTextEditor('body');
    protom.formElements.setupDatePickers();
    protom.formElements.anwenderIdToggle();
    var responseContainer = $j('#submitForm').parents('.tabPane');
    protom.formElements.setupSubmitButtons('.ajaxForm', responseContainer);
	protom.formElements.setupArticlePreviewButton();
}


/**
 * contains core form functions
 */
protom.form = {};

protom.form.post = function(formSelector, responseContainer, action, callback)
{
    protom.log('protom.form.post(formSelector:' + formSelector + ', responseContainer:' + responseContainer + ', action:' + action + ', callback:' + callback + ')');

    if(!responseContainer || responseContainer.length < 1)
    {
		responseContainer = '.contentWrap';
    }

    if(!action)
    {
	action = $j(formSelector).attr('action');
    }

	if(tinyMCE)
	{
		tinyMCE.triggerSave();
	}
    $j(formSelector).ajaxSubmit(function(data)
    {
		$j(responseContainer).html(data);
		if(protom.dataTable.refreshTable)
		{
			protom.dataTable.refreshTable();
		}

		$j('.formInfo').hide();

		if(callback)
		{
			callback();
		}
    });

    $j('.formInfo').show();
}

protom.form.categoryEditor = function( selector )
{
	protom.log('protom.form.categoryEditor(' + selector + ')');
	var backendUrl = $j( '#categoryAdd' ).attr('action');
	protom.log(backendUrl);
	
	function setupCategoryEditor()
	{
		setupButtons();
		setupFilters();
	}

	function setupButtons()
	{
		$j( "#addCategoryButton" ).bind('click', addCategories);
		$j( "#removeCategoryButton" ).bind('click', removeCategories);
	}

	function setupFilters()
	{
		protom.log('protom.form.categoryEditor.setupFilters()');
		setupTagFilter();
		setupCategoryParserFilter();
	}

	function setupTagFilter()
	{
		$j('#tag').bind('change', function()
		{
			submitCategories(
				'#categoryFilterForm',
				null,
				{'tag' : $j(this).val()}
			);
		});
	}

	function setupCategoryParserFilter()
	{
		$j('#parseCategoryButton').bind('click', function(event)
		{
			event.preventDefault();
			submitCategories(
				'#categoryFilterForm',
				null,
				{'categoryParser' : true}
			);
		});
	}

	function addCategories( event )
	{
		protom.log('addCategories()');
		event.preventDefault();
		submitCategories('#categoryAdd', 'submitAdd');
	}

	function removeCategories( event )
	{
		protom.log('protom.form.categoryEditor.removeCategories()');
		event.preventDefault();
		submitCategories('#categoryRemove', 'submitRemove');
	}

	function submitCategories( formId, urlParam, getData )
	{
		var data = getData ? getData : {};
		if(urlParam)
		{
			data.urlParam = urlParam;
		}
		data.nolayout = true;

		$j(formId).ajaxSubmit(
		{
			success : function( response )
			{
				$j(formId).parents('.tabPane').html( response );
				$j('.formInfo').hide();
			},
			data : data,
			url : backendUrl
		});
		$j('.formInfo').show();
	}

	setupCategoryEditor();
}

protom.videoImportQueueEditor = function( editorId )
{
	var elem = $j($j('#'+editorId + ' ul')[0]);
	var loadingAnimation = $j($j('#'+editorId + ' .loadingAnimation')[0]);
	var template = _.template($j('#itemTemplate').html());
	var bottomOffset = 250;
	var currentPage = 3;
	var itemsPerPage = 5;
	var isLoading = false;
	var loadedItems = [];
	var allLoaded = false;
	var importAllButton = $j('#importAll');
	
	/**
	 * initializes the editor
	 */
	function init() {
		loadItems(itemsPerPage*currentPage, 1);
		initScroll();
		setupEventListener();
		
		importAllButton.hide();
	}
	
	/**
	 * renders and appends a single items
	 */
	function renderItem( data ) {
		elem.append(template(data));
	}
	
	/**
	 * renders and appends a list of items
	 */
	function renderItems( data ) {
		_.each(data.videos, function(item){
			renderItem(item);
		});
	}
	
	/**
	 * loads the video player for a given yt id
	 */
	function showVideoPlayer( youtubeId ) {
		if(loadedItems[youtubeId])
		{
			var item = loadedItems[youtubeId];
			
			swfobject.embedSWF(
				item.player_url, 
				item.youtube_id + 'Player', 
				"440", "330", "9.0.0", 
				null, {}, {wmode:"transparent"},{}
			);
		}
	}
	
	/**
	 * setup button event listeners
	 */
	function setupEventListener() {
		$j('.showVideo').live('click', function(event){
			event.preventDefault();
			var videoId = $j(this).attr('href');
			
			if($j('#' + videoId + 'Player').is(':visible') )
			{
				$j(this).addClass('play').removeClass('down');
				$j('#' + videoId + 'Player').hide();
			}
			else
			{
				$j(this).addClass('down').removeClass('play');
				showVideoPlayer(videoId);
			}
		});
		
		$j('.removeVideo').live('click', function(event){
			event.preventDefault();
			var id = $j(this).attr('href');
			removeItem(loadedItems[id]);
		});
		
		$j('.createArticle').live('click', function(event){
			event.preventDefault();
			var id = $j(this).attr('href');
			createArticle(loadedItems[id]);
		});
		
		$j('#channelId').bind('change', function(event){
			event.preventDefault();
			currentPage = 3;
			allLoaded = false;
			elem.html('');
			var channelId = $j(this).val();
			loadItems(itemsPerPage*currentPage, 1, channelId);
		});
		
		importAllButton.bind('click', function(event){
			event.preventDefault();
			var channelId = $j('#channelId').val();
			if(channelId && channelId != 0)
			{
				createChannelArticles(channelId);
			}
		});
	}
	
	/**
	 * loads the next limit items from db
	 */
	function loadItems( limit, page, channelId ) {
		
		if(allLoaded)
		{
			return;
		}
		
		channelId = channelId ? channelId : $j('#channelId').val();
		isLoading = true;
		loadingAnimation.show();
		
		$j.ajax({
			url:'/tools/ytimportqueue', 
			type:"GET",
			dataType: 'json',
			data:{
				limit: limit,
				page: page,
				format: 'json',
				channelId: channelId
			},
			success: function(data) {
				isLoading = false;
				loadingAnimation.hide();
				
				if(data.importAll)
				{
					importAllButton.show();
				}
				else
				{
					importAllButton.hide();
				}
				
				if(data.videos.length > 0)
				{
					_.each(data.videos, function(item){
						loadedItems[item.youtube_id] = item;
					});

					renderItems(data);
				}
				else
				{
					allLoaded = true;
				}
			}
		});
	}
	
	function removeItem( item ) {
		executeVideoAction(item, 'remove', function(data){
			if(data.status == 'OK')
			{	
				$j('#'+item.youtube_id).css('background-color', '#84ff87').slideUp('slow');
			}
		})
	}
	
	function createArticle( item ){
		executeVideoAction(item, 'createarticle', function(data){
			if(data.status == 'OK')
			{
				$j('#'+item.youtube_id).css('background-color', '#84ff87').slideUp('slow');
			}
		})
	}
	
	function createChannelArticles( channelId ){
		$j.ajax({
			url: '/tools/ytimportqueue/createchannelarticles/',
			type:'GET',
			dataType: 'json',
			data: {
				format: 'json',
				channelId: channelId
			},
			success: function(data){
				if(data.status == 'OK')
				{
					currentPage = 3;
					allLoaded = false;
					elem.html('');
					loadItems(itemsPerPage*currentPage, 1, channelId);
				}
			}
		});
	}
	
	function executeVideoAction( item, action, callback ){
		$j.ajax({
			url:'/tools/ytimportqueue/' + action, 
			type:"GET",
			dataType: 'json',
			data:{
				video: item.youtube_id,
				format: 'json'
			},
			success: callback
		});
	}

	/**
	 * initializes infinit scroll
	 */
	function initScroll() {
		$j(window).scroll(function() {
			if(isToLoad()) {
				currentPage++;
				loadItems(itemsPerPage, currentPage);
			}
		});
	}
	
	/**
	 * determines wether new items should be loaded depending on scroll position
	 */
	function isToLoad() {
		return ( ! isLoading) 
				&& ( ($j(document).height() - $j(window).height()) - $j(window).scrollTop() < bottomOffset );
	}
	
	init();
	return {
		loadItems: loadItems
	}
	
}


function ajaxVideoSubmit()
{
	jQuery.ready();
	jQuery.ajax({
		url:"/ajax/video/import", 
		type:"GET",
		data:{id:document.getElementById('youtubeId').value},
		success: function(result) {
			var video = eval('(' + result + ')');
			document.getElementById('video_id').value = video.video_id;
			document.getElementById('title').value = video.title;
			document.getElementById('intro').value = video.description;
			//document.getElementById('metaData-publish_date').value = video.published;
		}
	
		});
}
