var lang_map = {
	1:			"cpp",		// C++
	27:			"cpp",		// C#
	10:			"java",		// Java
	11:			"c",		// C
	34:			"c",		// C99 strict
	29:			"php",		// PHP
	4:			"python",	// Python
	2:			"pas",		// Pascal
	22:			"pas",		// Pascal
	17:			"ruby",		// Ruby
	3:			"perl",		// Perl
	12:			"brainfuck"	// Brainf**k
};


var queueApplManager = $.manageAjax.create('queueApplManager', {queue: true});
var statusCodes = {};

var loader_img = '<img src="/gfx/loader.gif"/>';
var ok_img = '<img src="/gfx/ok.png" style="height: 10px;" />';

function masstestGetStatus(id) {
	queueApplManager.add({
        url: "/masstest/status/" + id + "/",
        dataType: 'html',
        success: function(data) {
			$('#solutions').html(data);
			bindHighLightRows();
			bindClickableRows();
			setTimeout("masstestGetStatus(" + id + ")", 4000);
        }
	});
}

function loadEditor(){
	var lang_id = $("#lang").val();
	var syn = "basic";

	if( lang_map[lang_id] != undefined ){
		syn = lang_map[lang_id];
	}
	
	editAreaLoader.init({
        id: "file" // id of the textarea to transform              
        ,start_highlight: true  // if start with highlight
        ,allow_resize: "both"
        ,allow_toggle: false
        //,word_wrap: true
        ,language: "en"
        ,syntax: syn 
		,font_size: "8"
        ,syntax_selection_allow: "basic,brainfuck,c,cpp,java,pas,perl,php,python,ruby,sql"
        	,toolbar: " ideone_send, search, go_to_line, fullscreen, |, undo, redo, |, select_font,syntax_selection,|, change_smooth_selection, highlight, reset_highlight, word_wrap, |, help"
        ,plugins: "ideone"
	});
	
	$("#syntax").attr('checked', true);
}

function unloadEditor(){
	editAreaLoader.delete_instance('file');
	$("#syntax").attr('checked', false);
	//$("#file").indent();
}


// sprawdzanie statusu zgłoszenia zgłoszonego ze strony view
function load2(solution_link, lp){
    var status_code = statusCodes[solution_link]; //$('#status_code').val();
    if( status_code == undefined ){
    	return;
    }
	if( status_code == 0 ){
		return;
	}
	
	$("#li_"+solution_link).html(loader_img + ' Loading...');
    
	queueApplManager.add({
            type: "POST",
            url: "/ideone/Index/view/id/"+solution_link+"/ajax/1/lp/"+lp,
            dataType: 'json',
            success: function(data){
    				if( data.status == 0 ){
    					$("#li_"+solution_link).html(data.inouterr);
    					bindInOutErrLinks();
    					$("#view_numbers").html(
    						"<a class=\"inouterr_number_link\" href=\"#li_"
    						+ solution_link + "\">#<span style=\"font-size:6px;\"> </span>"
    						+ lp + "</a> "
    						+ $("#view_numbers").html()
    					);
    					$("#view_numbers").show('fast');
    					bindClickNumberLinks();
    					$("#li_"+solution_link+" a.inout_link").click(); // pokazanie bloku
    					var link = "";
    					// aktualizacja dat zgłoszeń potomnych
    					for(link in data.dates) {
    						$("#li_" + link + " span.date_span").html( data.dates[link] );
    					}
    					// aktualizacja daty zgłoszenia głównego (na dole)
    					$("#li_" + $('#solution_link').val() + " span.date_span").html( data.parent_date );
    					// aktualizacja daty zgłoszenia głównego (u góry)
    					$("#solution_date").html( data.parent_date );
    				} else {
    					$("#li_"+solution_link).html( $("#li_"+solution_link).html()+data.html );
    				}
    				statusCodes[solution_link] = data.status;
					setTimeout("load2('"+solution_link+"', "+lp+");", 1000);
            },
            error: function(err,a,b){
            		$("#li_"+solution_link).html('Error, please refresh the page');
            		$("#new_item").show('fast');
            }
    });
}


// standardowe sprawdzanie statusu po wejściu na stronę zgłoszenia
function load(){

    var solution_link = $('#solution_link').val();
    var status_code = $('#status_code').val();
    
    if( status_code == undefined ){
    	return;
    }
	if( status_code == 0 ){
		return;
	}
	
	$("#li_"+solution_link).html('<img src="/gfx/loader.gif"/> Loading... ');
    
	queueApplManager.add({
            type: "POST",
            url: "/ideone/Index/view/id/"+solution_link+"/ajax/1/lp/1",
            dataType: 'json',
            success: function(data){
    				if( data.status == 0 ){
    					$("#li_"+solution_link).html(data.inouterr);
    					bindInOutErrLinks();
    					if( data.result == 12 || data.result == 13 || data.result == 15 || data.result == 17 ){
    						$("#new_item").show('fast');
    					}
    					if( data.any_cmperr ){
    						//$("#err>pre").html(data.cmperr); // (wiele:) tę linijkę zamieniłem na dwie poniższe z powodu IE8 (po stronie serwera też się trochę zmieniło (obsługa za pomocą ideone/view_cmperr.html))
    						$("#err").html("");	// (wiele:) bez tej linijki IE8 będzie miał problemy
    						$("#err").html(data.cmperr);
    						$("#err").show('fast');
    					}
    					$("#li_"+solution_link+" a.inout_link").click(); // pokazanie bloku
    				}
    				else {
	    				$("#li_"+solution_link).html( $("#li_"+solution_link).html() + data.html);
    				}
    				$('#status_code').attr('value', data.status);
					setTimeout(load, 1000);
            },
            error: function(err,a,b){
            		$("#status_desc_1").html('ER');
            }
    });
}

function bindInOutErrLinks(){
	$(".inout_link").unbind('click');
	$(".inout_link").bind('click', function(){
		setInOutErrVisibility($(this), 'toggle');
		return false;
	});
}

/**
 * @param link: hide link
 * @return
 */
function doHide(link){
	$(link).parent().addClass('private');
	$(link).parent().children('span.private').show('slow');
	return false;
}

/**
 * @param what: toggle | show | hide
 */
function setInOutErrVisibility($link, what) {

	if(what == 'toggle') {
		if( $("#info_" + $link.attr('inouterr_id') ).css('display') == 'block' ){
			//$(this).removeClass('inout_link_enabled');
			$("#viewhide_show_"+$link.attr('inouterr_id')).show();
			$("#viewhide_hide_"+$link.attr('inouterr_id')).hide();
		} else {
			//$(this).addClass('inout_link_enabled');
			$("#viewhide_show_"+$link.attr('inouterr_id')).hide();
			$("#viewhide_hide_"+$link.attr('inouterr_id')).show();
		}
		$("#in_" + $link.attr('inouterr_id') ).toggle();
		$("#out_" + $link.attr('inouterr_id') ).toggle();
		$("#err_" + $link.attr('inouterr_id') ).toggle();
		$("#info_" + $link.attr('inouterr_id') ).toggle();
	}
	else if(what == 'show') {
		$("#viewhide_show_"+$link.attr('inouterr_id')).hide();
		$("#viewhide_hide_"+$link.attr('inouterr_id')).show();
		$("#in_" + $link.attr('inouterr_id') ).show();
		$("#out_" + $link.attr('inouterr_id') ).show();
		$("#err_" + $link.attr('inouterr_id') ).show();
		$("#info_" + $link.attr('inouterr_id') ).show();
	}
	else if(what == 'hide') {
		$("#viewhide_show_"+$link.attr('inouterr_id')).show();
		$("#viewhide_hide_"+$link.attr('inouterr_id')).hide();
		$("#in_" + $link.attr('inouterr_id') ).hide();
		$("#out_" + $link.attr('inouterr_id') ).hide();
		$("#err_" + $link.attr('inouterr_id') ).hide();
		$("#info_" + $link.attr('inouterr_id') ).hide();
	}
	
	return false;
}


function bindClickNumberLinks() {
	$(".inouterr_number_link").unbind("click");
	$(".inouterr_number_link").bind("click", function() {
		var id = $(this).attr('href');
		setInOutErrVisibility($(id + " a.inout_link"), 'show');
		return true;
	});
}


function insertTemplateOrSample(what) {
	
	var langId = $('#lang').val();
	var solId = 0;
	
	if(what == 'template') {
		solId = langs_properties[langId]['template_sol_id'];
	}
	else if(what == 'sample') {
		solId = langs_properties[langId]['sample_sol_id'];
	}
	else if(what == 'userstemplate') {
		solId = langs_properties[langId]['users_template_sol_id'];
	}
	
	if(solId == 0) {
		return;
	}
	
	$('#insert-loader').show();
	queueApplManager.add({
            type: 'POST',
            url: '/insert/' + what + '/' + solId + '/',
            dataType: 'json',
            success: function(data){;
					var isEditorOn = $('#syntax').attr('checked');
					// poniższe zakomentowane, bo przy wyświetlaniu sample Brainfucka edytor powoduje błędy
					/*if(isEditorOn) {
						editAreaLoader.setValue('file', '');
						editAreaLoader.setValue('file', data.source);
					}
					else {
						$('#file').val(data.source);
					}*/
					if(isEditorOn) {
						unloadEditor();
					}
					$('#file').val(data.source);
					if(isEditorOn) {
						loadEditor();
					}
					if(what == 'sample' || what == 'userstemplate') {
						var isInputVisible = $('#input_box').is(':visible');
						if(!isInputVisible) {
							$('#input_link').click();
						}
						$('#input').val(data.input);
					}
					else {
						$('#input').val('');
					}
					$('#insert-loader').hide();
            },
            error: function(err,a,b){
            		alert("Error occured");
            }
    });
}



function bindHighLightRows() {

	// podświetlanie wierszy w manage samples i w masstest
	$('.manage-samples-table tr.highlight-row, .masstest-table tr.highlight-row').bind('mouseover', function() {
		$(this).addClass('highlighted-row');
	});
	$('.manage-samples-table tr.highlight-row, .masstest-table tr.highlight-row').bind('mouseout', function() {
		$(this).removeClass('highlighted-row');
	});
}

function bindClickableRows() {
	$('.masstest-table tr.clickable-row').bind('click', function() {
		window.open($(this).attr('href'));
	});
}

function openNewMasstest() {
	var chkgrp = $("#chkgrp").val();
	window.open("/masstest/execute/chkgrp/" + chkgrp + "/");
}

function set_user_settings_cookie(name, val) {
	$.cookie(name, val, { expires: 180 } );
}

$(document).ready(function(){
	
	$("#main_form").attr("action", "/ideone/Index/submit/");
	$("#js_required").hide();
	$("#Run").bind('click', function(){
		$("#main_form").attr("action", "/ideone/Interactive/submit/");
		return true;
	});
	
	$("a[rel^='prettyPhoto']").prettyPhoto({
		default_height: 600
	});
	
	// IE: http://freecode-freecode.blogspot.com/2007/06/how-to-catch-tab-key-press-with.html
	// pozwala pisac taby do textarea
	$('#file').keypress(function (e) {
	    if (e.keyCode == 9) {
	    	var myValue = "\t";
	    	var startPos = this.selectionStart;
	    	var endPos = this.selectionEnd;
	    	var scrollTop = this.scrollTop;
	    	this.value = this.value.substring(0, startPos) + myValue + this.value.substring(endPos,this.value.length);
	    	this.focus();
	    	this.selectionStart = startPos + myValue.length;
	    	this.selectionEnd = startPos + myValue.length;
	    	this.scrollTop = scrollTop;
	    	e.preventDefault();
	    }
	});

	// input link na stronie głównej
	$("#input_link").bind('click', function(){
		// pasuje fold
		$("#input_box").toggle('fold');
		$("#welcome_message").toggle('fold');
		return false;
	});
	// new input na stronie zgłoszenia
	$("#new_input").bind('click', function(){
		$("#new_item_in").toggle('fast');
		return false;
	});
	$("#select_all_langs").bind('click', function(){
		var i = 1;
		$(".lang_item").each(function(i, el){
			el.checked = !el.checked;
		});
		return false;
	});
	// wysłanie nowego zgłoszenia ze strony starego zgłoszenia
	$("#new_submit").bind('click', function(){
		var lp = 1+parseInt($("#max_number").attr('value'));
		$("#max_number").attr('value', lp);
		queueApplManager.add({
        	type: "POST",
            url: $("#new_item_form").attr('value'),
            data: {'input': $("#in_new").val()},
            dataType: 'json',
            success: function(data){
        		if( data['status'] == 'ok' ){
        			$('#new_item').after("<li id='li_"+data.link+"' class='li_inouterr'>New submission...</li>");
					$('#new_item_in').toggle('fast');
					$("#in_new").attr('value', '');
					statusCodes[data.link] = -1;
					load2(data.link, lp);
        		} else {
        			alert('Application error.')
        			$("#new_item").show('fast');
        		}
        	},
            error: function(err,a,b){
				alert("Communication error.");
				$("#new_item").show('fast');
            }
        });
		
		return false;
	});
	
	// obsługa pokazywania in/out/err na stronie zgłoszenia
	bindInOutErrLinks();
	
	// prezentacja linku na stronie view
	$("#link_presentation").bind("focus", function() {
		this.select();
	});
	$("#link_presentation").bind("click", function() {
		this.select();
	});
	

	
	$("#syntax").bind('click', function(){
		if( $("#syntax").attr('checked') ){
			loadEditor();
		} else {
			unloadEditor();
		}
	});
	
	if( $("#syntax").attr('checked') ) {
		loadEditor();
	}
	
	$("#lang").bind('change', function(){
		var lang_id = $("#lang").val();
		// obsługa edytora
		if (typeof lang_map[lang_id] != "undefined") {
			if( window.frames['frame_file'] != undefined ){
				window.frames['frame_file'].document.getElementById('syntax_selection').value = lang_map[lang_id];
				window.frames['frame_file'].editArea.execCommand('change_syntax', lang_map[lang_id]);
			}
		} else {
			if( window.frames['frame_file'] != undefined ){
				window.frames['frame_file'].document.getElementById('syntax_selection').value = "basic";
				window.frames['frame_file'].editArea.execCommand('change_syntax', lang_map[lang_id]);
			}
		}
		
		// włączanie / wyłączanie przycisku	"run code"
		if(langs_properties[lang_id]["runnable"] == 1) {
			$("#run_div").show();
		}
		else {
			$("#run_div").hide();
		}
		
		// włączanie / wyłączanie wstawiania przykładów / wzorców
		var template_sol_id = langs_properties[lang_id]["template_sol_id"];
		var sample_sol_id = langs_properties[lang_id]["sample_sol_id"];
		var users_template_sol_id = langs_properties[lang_id]["users_template_sol_id"];
		
		if(template_sol_id > 0 || sample_sol_id > 0 || users_template_sol_id > 0) {
			$("#insert-part-or").css('display', 'inline');
			$("#insert-part-insert").css('display', 'inline');
			if(template_sol_id > 0)
				$("#insert-part-template").css('display', 'inline');
			else
				$("#insert-part-template").css('display', 'none');
			
			if(template_sol_id > 0 && sample_sol_id > 0)
				$("#insert-part-or2").css('display', 'inline');
			else
				$("#insert-part-or2").css('display', 'none');
			
			if(sample_sol_id > 0)
				$("#insert-part-sample").css('display', 'inline');
			else
				$("#insert-part-sample").css('display', 'none');
			
			if(users_template_sol_id > 0) {
				if(template_sol_id > 0 || sample_sol_id > 0)
					$("#insert-part-or3").css('display', 'inline');
				else
					$("#insert-part-or3").css('display', 'none');
				
				$("#insert-part-users-template").css('display', 'inline');
			}
			else {
				$("#insert-part-or3").css('display', 'none');
				$("#insert-part-users-template").css('display', 'none');
			}
		}
		else {
			$("#insert-part-or").css('display', 'none');
			$("#insert-part-insert").css('display', 'none');
			$("#insert-part-template").css('display', 'none');
			$("#insert-part-or2").css('display', 'none');
			$("#insert-part-sample").css('display', 'none');
			$("#insert-part-or3").css('display', 'none');
			$("#insert-part-users-template").css('display', 'none');
		}
	});
	
	// wywołujemy zdarzenie zmiany, żeby m.in. pole "run code" zostało ukryte jeśli trzeba
	$("#lang").change();
	
	$("#view_showall").bind("click", function() {
		$(".inout_link").each(function() {
			setInOutErrVisibility($(this), 'show');
		});
		return false;
	});
	
	$("#view_hideall").bind("click", function() {
		$(".inout_link").each(function() {
			setInOutErrVisibility($(this), 'hide');
		});
		return false;
	});
	
	$(".sample_langs_link").bind("click", function() {
		$($(this).attr('href')).effect('highlight', {color: '#83B943'}, 'slow');
		return true;
	});
	
	bindClickNumberLinks();
	
	load();
	
	
	// obsluga linków ajaxowych
	function ajax_link_function(){
		var url = this.href;
		var link = this;
		$(link).html('loading... ' + loader_img);
		
		queueApplManager.add({
        	type: "GET",
            url: url,
            //dataType: 'json',
            success: function(data){
        		if( data == 'ok' ){
        			$(link).hide('fast');
        			if( $(link).hasClass('doHide') ){
        				doHide(link);
        			}
        		} else {
        			this.error(data,1,1);
        		}
        	},
            error: function(err,a,b){
        		alert('error occured: \n' + err);
				$(link).html('action failed');
            }
        });
		
		return false;
	};
	$('.ajax_link').bind('click', ajax_link_function); 
	
	function simple_ajax_link_function(){
		var url = this.href;
		var link = this;
		var label = $(link).html();
		$(link).html('hide ' + loader_img);
		
		queueApplManager.add({
        	type: "GET",
            url: url,
            success: function(data){
        		if( data == 'ok' ){
        			$(link).html(label+' ' + ok_img);
        		} else {
        			this.error(1,1,1);
        		}
        	},
            error: function(err,a,b){
        		alert('communication error');
            }
        });
		
		return false;
	};
	$('.simple_ajax_link').bind('click', simple_ajax_link_function); 
	
	// zmiana jezyka
	//$("#language_box").bind('click', function(){
	//	$.facebox('something cool');
	//	return false;
	//});
	$("a[rel*=facebox]").facebox(); 
	
	$("#toggle_adv_search").bind('click', function(){
		$("#adv_search").toggle('fast');
		return false;
	});
	
	$("#insert-template-link").bind('click', function() {
		insertTemplateOrSample('template');
		return false;
	});
	
	$("#insert-sample-link").bind('click', function() {
		insertTemplateOrSample('sample');
		return false;
	});
	
	$("#insert-users-template-link").bind('click', function() {
		insertTemplateOrSample('userstemplate');
		return false;
	});
	
	$("#new-masstest-link").bind('click', function() {
		openNewMasstest();
		return false;
	});
	
	$("#index_chk_visibility_private").bind('click', function() {
		if( $(this).attr('checked') ) {
			$("#index_hidden_visibility_public").val(0);
		}
		else {
			$("#index_hidden_visibility_public").val(1);
		}
	});
	
	bindHighLightRows();
});