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 cookie_boxes = ['run', 'private', 'syntax'];
var queueApplManager = $.manageAjax.create('queueApplManager', {queue: true});
var statusCodes = {};

var loader_img = '<img src="/gfx/loader.gif"/>';

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

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
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){
    				var loader = '<img src="/gfx/loader.gif"/>';
    				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');
            }
    });
}


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 ){
    						$("#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( $("#in_" + $link.attr('inouterr_id') ).css('display') == 'block' ){
			//$(this).removeClass('inout_link_enabled');
			$("#viewhide_"+$link.attr('inouterr_id')).html('show');
		} else {
			//$(this).addClass('inout_link_enabled');
			$("#viewhide_"+$link.attr('inouterr_id')).html('hide');
		}
		$("#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_"+$link.attr('inouterr_id')).html('hide');
		$("#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_"+$link.attr('inouterr_id')).html('show');
		$("#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;
	});
}

$(document).ready(function(){
	
	$("#main_form").attr("action", "/ideone/Index/submit/");
	$("#js_required").hide();
	
	// 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();
	    }
	});
	*/
	
	// dla rozwijanego menu, które nie działa pod IE
	/*
	$('#menu-help-link').menu({ 
		content: $('#menu-help-root').html(), // grab content from this page
		showSpeed: 100,
		callerOnState: '',
		loadingState: '',
		linkHover: '',
		linkHoverSecondary: '',
		width: 70
	});
	*/

	// input link na stronie głównej
	$("#input_link").bind('click', function(){
		// pasuje fold
		$("#input_box").toggle('normal');
		$("#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();
		}
	});
	
	$("#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();
		}
	});
	
	// 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('hide ' + loader_img);
		
		queueApplManager.add({
        	type: "GET",
            url: url,
            //dataType: 'json',
            success: function(data){
        		if( data == 'ok' ){
        			$(link).hide('slow');
        			if( $(link).hasClass('doHide') ){
        				doHide(link);
        			}
        		} else {
        			this.error(1,1,1);
        		}
        	},
            error: function(err,a,b){
        		alert('communication error');
				$(link).html('hide');
            }
        });
		
		return false;
	};
	$('.ajax_link').bind('click', 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;
	});
		
});