// keyboard.js
var keyboard = {
	up: 0,
	up1: 0,
	up2: 0,
	S: $('#message'),
	//funkcja wstawiajaca kod klawiatury w div o zadanym id
	generate: function(id){
		if ($('#'+id)){
			$('#'+id).html('<div class="k_pl fl"><input type="button" value="ą" /><input type="button" value="ć" /><input type="button" value="ę" /><div class="clr"></div><input type="button" value="ł" /><input type="button" value="ń" /><input type="button" value="ó" /><div class="clr"></div><input type="button" value="ś" /><input type="button" value="ż" /><input type="button" value="ź" /></div><div class="k_ru fl"><input type="button" value="й" /><input type="button" value="ц" /><input type="button" value="у" /><input type="button" value="к" /><input type="button" value="е" /><input type="button" value="н" /><input type="button" value="г" /><input type="button" value="ш" /><input type="button" value="щ" /><input type="button" value="з" /><input type="button" value="х" /><input type="button" value="ъ" /><div class="clr"></div><input type="button" value="ф" class="ml13" /><input type="button" value="ы" /><input type="button" value="в" /><input type="button" value="а" /><input type="button" value="п" /><input type="button" value="р" /><input type="button" value="о" /><input type="button" value="л" /><input type="button" value="д" /><input type="button" value="ж" /><input type="button" value="ё" /><div class="clr"></div><input type="button" value="э" class="ml20" /><input type="button" value="я" /><input type="button" value="ч" /><input type="button" value="с" /><input type="button" value="м" /><input type="button" value="и" /><input type="button" value="т" /><input type="button" value="ь" /><input type="button" value="б" /><input type="button" value="ю" /><div class="clr"></div><input type="button" class="space" value=" " /></div><div class="k_de fl"><input type="button" value="ä" class="ml20" /><div class="clr"></div><input type="button" value="ö" /><input type="button" value="ß" /><input type="button" value="ü" /></div><div class="k_spec fl"><input type="button" value="." /><input type="button" value="," /><input type="button" value="!" /><div class="clr"></div><input type="button" value="(" /><input type="button" value=")" /><input type="button" value="?" /><div class="clr"></div><input type="button" id="'+id+'caps" class="caps" value=""/></div>');
		}
	},
	//przekazanie duzej lub malej litery do dodania
	addLetter: function(elem,is_email)
	{
		upper = this.up1;
		if (is_email == 0){
			//utils.removeDefaultText($('#translate_text'));
			upper = this.up;
		}
		if (is_email == 2){
		    upper = this.up2;
	    }
		if (upper)
			this.A($(elem).val().toUpperCase(),is_email);
		else
			this.A($(elem).val(),is_email);
	},
	
	//wstawia literke w ospowiednie miejsce
	A: function(x,is_email)
	{
		D = document;
		if (is_email == 1){
			F = $('#message');
			S = this.S;
			range = this.range1;
		}
		else{
		    if (is_email == 2){
    			F = $('#dict_input');
    			S = F;
    			range = this.range2;
		        
		    }
		    else{
    			F = $('#translate_text');
    			S = F;
    			range = this.range;
		    }
		}
		if(S[0].selectionStart||S[0].selectionStart=='0'){
			var start = S[0].selectionStart+1;
			S.val(S.val().substring(0,S[0].selectionStart)+x+S.val().substring(S[0].selectionEnd,S.val().length));
			S.focus();
			S[0].setSelectionRange(start,start);
		} else if (D.selection){
			S.focus();
			if (!range)
				range = document.selection.createRange();
			range.text=x;
			range.collapse(true);
			range.select();
			S.focus();
		}
		else{
			F.val(F.val + x);
			F.focus();
		}
		if (is_email == 2){
		    $("#dict_input").keydown();
		}
	},
	show: function(elem)
	{
		$('#'+elem).slideToggle("slow");
	},
	
	//generowanie i wlaczanie funkcjonalnosci klawiatury.
	
	observe: function(){
		var keyboards = Array('translator_keyboard', 'email_keyboard');
		for (var j=0; j < keyboards.length; j++){
			if ($('#'+keyboards[j])){
				keyboard.generate(keyboards[j]);
				board = $('#'+keyboards[j]);
				keys = $('#'+keyboards[j]+' input');
				keys.each(
					function(){
						if (keyboards[j] == 'translator_keyboard')
							if (!this.id){
								$(this).click(function(){
									keyboard.addLetter(this,0);
								});
							}
							else{
								$(this).click(function(){
									if (keyboard.up == 1) keyboard.up = 0; else keyboard.up = 1; $('#keyboardcaps').toggleClass('active'); $('#translate_text').focus();
								});
							}
						else
							if (!this.id){
								$(this).click(function(){
									keyboard.addLetter(this,1);
								});
							}
							else{
								$(this).click(function(){
									if (keyboard.up1 == 1) keyboard.up1 = 0; else keyboard.up1 = 1; $('#email_keyboardcaps').toggleClass('active'); keyboard.S.focus();
								});
							}
					}
				);
			}
		}
		$('#translate_text').bind('click select keyup', function(){
			if (document.selection) keyboard.range = document.selection.createRange();
		});
		$('#message').bind('click select keyup', function(){
			if (document.selection) 
				keyboard.range1 = document.selection.createRange();
			keyboard.S = $('#message');
		});
		$('#Subject').bind('click select keyup', function(){
			if (document.selection) 
				keyboard.range1 = document.selection.createRange();
			keyboard.S = $('#Subject');
		});
		keyboard.S = $('#message');
	},
	observe_dict: function(){
	    $('#dict_keyboard input').each(function(){
	        $(this).click(function(){
				keyboard.addLetter(this,2);
			});
	    });
	    $('#dict_input').bind('click select keyup', function(){
			if (document.selection) keyboard.range2 = document.selection.createRange();
		});
	}
};

// dict.js
var dict = {
    insertOS: function()
	{
		if($.browser.msie){
			$("#dict_os").html('<div onclick="dict.showOS();" id="opensearchie"><b></b><a onclick="dict.showOS();" title="' /*+ msg.opensearch.add +*/+ '">' + /*msg.opensearch.add_to +*/ '</a></div>');
		}
		else{
			if($.browser.mozilla){
				$("#dict_os").html('<div id="opensearchff"><b></b><a onclick="dict.showOS();" title="Dodaj wyszukiwarki tłumaczące do swojej przeglądarki">Dodaj do</a></div>');
			}
		}
	},
	showOS: function()
	{
		$("#dictdialogOS").dialog({
			bgiframe: true,
			modal: true,
			width: 300,
			height: 'auto',
			resizable: false,
			overlay: {
				backgroundColor: '#000',
				opacity: 0.5
			},
			close: function() {
				$("#dictdialogOS").dialog("destroy");
				} 
		});
		$("#dictdialogOS").show();
		var bro;
		if (jQuery.browser.msie)
		    bro = 'ie';
		else
		    bro = 'ff';
		ga.trackEvent('Opensearch', 'dict-dodajdo', bro);
		//ga.trackPage('/opensearch/dodaj');
	},	
	OSall: function()
	{
		if ($('#OSall').html() == 'Zaznacz wszystkie'){
			$('#dictdialogOS .dictOS').attr('checked', true);
			$('#OSall').html('Odznacz wszystkie');
		}
		else{
			$('#dictdialogOS .dictOS').attr('checked', false);
			$('#OSall').html('Zaznacz wszystkie');
		}
	},
	addOS:function()
	{
	    
		var bro;
		if (jQuery.browser.msie)
		    bro = 'dodaneie';
		else
		    bro = 'dodaneff';
		$('#dictdialogOS .dictOS:checked').each(function(){
			var dir = $(this).val();
			window.external.AddSearchProvider('http://www.translatica.pl/dict_opensearch/get/dict' + dir + '.xml');
			ga.trackEvent('Opensearch', 'dict-' + bro, dir);
			$("#dictdialogOS").dialog("destroy");
		});
		
	},
	save_options: function()
	{
	    var show = $('input[name="show"]:checked').val();
	    var dir = $('input[name="dict_dir"]:checked').val();
	    $.cookie('dict_show', show, { path: '/', expires: 30 });
	    $.cookie('dict_dir', dir, { path: '/', expires: 30 });
            this.options_togle($('#options_link'));
	},
	check_options: function()
	{
	    var show = $.cookie('dict_show');
	    var dir = $.cookie('dict_dir', dir);
	    if (show){
	        $('input[name="show"][value="' + show + '"]').attr('checked', 'checked');
	    }
            else{
                $('input[name="show"][value="best"]').attr('checked', 'checked');
            }
	    if (dir){
	        $('input[name="dict_dir"][value="' + dir + '"]').attr('checked', 'checked');
	    }
            else{
                $('input[name="dict_dir"][value="all"]').attr('checked', 'checked');
            }
	},
	options_togle: function(elem)
	{
	    if($('#slownik-options').css('display') == 'none'){
	        $('#slownik-options').show();
	        $(elem).html('Ukryj opcje wyszukiwania');
	        $(elem).addClass('expand');
	    }
	    else{
	        $('#slownik-options').hide();
	        $(elem).html('Pokaż opcje wyszukiwania');
	        $(elem).removeClass('expand');
	    }
	},
	proposition_togle: function(elem)
	{
	    if($('#slownikpro-proposition-content').css('display') == 'none'){
	        $('#slownikpro-proposition-content').show();
	        $(elem).html('Ukryj nasze propozycje ciekawych haseł');
	        $(elem).addClass('expand');
	    }
	    else{
	        $('#slownikpro-proposition-content').hide();
	        $(elem).html('Pokaż nasze propozycje ciekawych haseł');
	        $(elem).removeClass('expand');
	    }
	},
	getDir: function()
	{
	    return $('input[name="dict_dir"]:checked').val();
	},
    ready: function()
    {
        $('#dictapi').validate({			
            rules: {
                'dict_input': {
                    required: true,
                    maxlength: 200
                }
            }
        }); 
        
        $('#dictapi').submit(
            function(){
                if (!$('#dictapi').valid()) return false;
                
                //ga.trackEvent('Slownik' , 'wielki-ang-online', 'szukaj'); 
                
                radio_val = $('input[name="dict_dir"]:checked').val();
                if (radio_val && radio_val != 'all'){
                    var location = dict.search_url[radio_val] + utils.URLEncode($('#dict_input').val()) + '/';
                }
                else{
                    var location = dict.search_url['all'] + utils.URLEncode($('#dict_input').val()) + '/';
                }
                var show = $('input[name="show"]:checked').val();
                if (show){
                    location += '?show=' + show;
                }
                document.location.href = location;
                return false;
            }
        );
        keyboard.observe_dict();
        dict.insertOS();
        $('.dict_info').easytooltip("dict_info");
        dict.check_options();
        
        $("#dict_input").autocomplete(dict.autocomplete_url, {
            minChars: 3,
            dataType: "json",
    		parse: function(data) {
    			return $.map(data, function(row) {
    				return {
    					data: row,
    					value: row.word,
    					result: row.word
    				}
    			});
    		},
    		formatItem: function(item) {
    			return '<span class="prop">' + item.word + '</span> <span class="lang">' + dict.autocomplete_dir[item.lang] + '</span><div class="clr"></div>';
    		},
    		scroll: false,
    		max: 5,
    		selectFirst: false,
    		extraParams: {
    		    dir: dict.getDir
    		}
        }).result(function(){$('#dictapi').submit()});
        $('input[name="dict_dir"]').click(function(){
            $("#dict_input").flushCache();
        });
    }
};


$(document).ready(function () {
    /* The base URL is about 100 characters long, so we
       have about 156 characters for the text, but we
       leave some margin. If the quoted text is shorter
       than this, we will use a GET request that should
       get cached. Otherwise we use a POST. */
    var SHORT_TEXT_LEN = 128;
    /* Don't allow translating texts longer than this. */
    var TEXT_LEN_LIMIT = 999;
    var TEXT_DEFAULT = 'Wpisz tekst do tłumaczenia';
    var $form = $('#translator form#text_form');
    var $text = $('#translator textarea#translate_text');
    var $resp = $('#translator textarea#tr_text_trgt');
    var $rdiv = $('#translator div#translator-result');
    var $wait = $('#translator div#translatica-wait');
    var $lang = $('#translator select#tr_text_lang');
    var $button = $('#translator input[type=button]')
    var last_text = '';
    var last_lang = '';

    function show(text) {
        $resp.val(text);
        $wait.hide();
    }

    function send() {
        if (last_text == $text.val() && last_lang == $lang.val()) {
            return;
        } else {
            last_text = $text.val();
            last_lang = $lang.val();
        }
        $wait.show();
        $rdiv.show();
        $resp.val('');
        var data = {
            tdir: $lang.val().replace('-', ''),
            query: $text.val(),
        };
        var method = 'POST';
        if (encodeURIComponent(data.query).length < SHORT_TEXT_LEN) {
            method = 'GET';
        }
        if (data.query === '' || data.query === TEXT_DEFAULT ) {
            show('Nie wpisano tekstu do tłumaczenia.');
            return;
        }
        if (data.query.length > TEXT_LEN_LIMIT) {
            show('Długość tekstu przekracza limit '+TEXT_LEN_LIMIT+' znaków.');
            return;
        }
        ga.trackEvent('Translator', 'txt', data.tdir); 
        $.ajax({
            data: data,
            dataType: 'text',
            type: method,
            url: '/Shiva/translator/translate',
            beforeSend: function(xhr) {
                xhr.setRequestHeader("Authorization", 
                    shiva_auth)
            },
            success: function(data, xhr) {
                show(data) 
            },
            error: function (xhr, msg, err) {
                show('Błąd komunikacji z serwisem.') 
            }
        });
    }

    $button.attr('onclick', null);
    $button.click(function (e) {
        e.preventDefault();
        send();
    });

    if ($text.val() !== TEXT_DEFAULT) {
        send();
    }
});

// translator.js
var translator = {
    ajax_url: '',
    default_text: '',
    switch_tabs: function(id_name) {
        $("#tabs_cont").children().each(function() {
            if ( $(this).attr('id') == id_name ) {
                $(this).show()
            }
            else {
                $(this).hide()
            }
        });
    },
    switch_email: function(id) {
        $("#email_div").children().each(function() {
            var this_id = $(this).attr('id');
            if ( this_id == id ) {
                $(this).show()
            }
            else {
                $(this).hide()
            }
        });
    },
    trans_text: function() {
        if ( $("#text_form").valid() == false) {
            return ;
        }

        $("#translator-result").show();
        var data = new Object();
        data['type'] = 'text';
        langs = $("#tr_text_lang :selected").val();
        data['src_lang'] = langs.split('-')[0];
        data['trgt_lang'] = langs.split('-')[1];
        data['text'] = $("#translate_text").val();
        data['translator'] = 'true';
		$("#translatica-wait").show();
		$("#tr_text_trgt").html('');
		
	ga.trackEvent('Translator', 'txt', data['src_lang']+data['trgt_lang']);
        $.ajax({
            type: 'POST',
            data: data,
            url: translator.ajax_url,
            success: function(msg) {
                $("#tr_text_trgt").html(msg);
				$("#translatica-wait").hide();
            }
        });
    },
    trans_email: function() {
        if ( $("#tr_trans_email").valid() == false) {
            return ;
        }
        $("#tr_email_trgt").show();

        var data = new Object();
        data['type'] = 'email';
        langs = $("#tr_email_lang :selected").val();
        data['src_lang'] = langs.split('-')[0];
        data['trgt_lang'] = langs.split('-')[1];
        data['title'] = $("#Subject").val();
        data['text'] = $("#message").val();
        data['translator'] = 'true';

        $.ajax({
            type: 'POST',
            data: data,
            url: translator.ajax_url,
            success: function(msg) {
                msg = msg.split(',');
                $("#email_title_trgt").val(msg[0]);
                $("#email_text_trgt").val(msg[1]);
            }
        });
    },
    send_email: function() {
        console.log($("#tr_email_data").valid());
        if ( $("#tr_email_data").valid() == false) {
            return ;
        }
        $("#tr_email_trgt").show();

        var data = new Object();
        data['type'] = 'send_email';
        data['sender'] = $("#email_sender").val();
        data['sender_address'] = $("#email_sender_address").val();
        data['recipient'] = $("#email_recipient").val();
        data['recipient_address'] = $("#email_recipient_address").val();
        data['translator'] = 'true';

        $.ajax({
            type: 'POBOST',
            data: data,
            url: translator.ajax_url,
            success: function(msg) {
                translator.switch_email('tr_email_res');
            }
        });
    },
    reset_email: function() {
        $("#tr_trans_email")[0].reset();
        $("#tr_email_trgt")[0].reset();
        $("#tr_email_data")[0].reset();
        $("#tr_email_trgt").hide();
        translator.switch_email('email_translation');
    },
    
    insertOS: function() {
	if($.browser.msie){
	    $("#translator_os").html('<div onclick="translator.showOS();" id="opensearchie"><b></b><a onclick="translator.showOS();" title="Dodaj wyszukiwarke do swojej przegladarki">Dodaj do</a></div>');
	}
        else{
	if($.browser.mozilla){
	    $("#translator_os").html('<div id="opensearchff"><b></b><a onclick="translator.showOS();" title="Dodaj wyszukwiarke do swojej przegladarki">Dodaj do</a></div>');
	    }
	}
    },
    
    
    showOS: function() {
	$("#dialogOS").dialog({
        bgiframe: true,
        modal: true,
	width: 300,  
        height: 'auto',  
        resizable: false,
        overlay: {   
        backgroundColor: '#000', 
        opacity: 0.5 
        },   
        close: function() {  
        $("#dialogOS").dialog("destroy");
        }
        });  
        $("#dialogOS").show();   
        var bro; 
        if (jQuery.browser.msie) 
        bro = 'ie';  
        else 
        bro = 'ff';  
        ga.trackEvent('Opensearch', 'dodajdo', bro); 
        //ga.trackPage('/opensearch/dodaj'); 
    },   
    
    
    
    
    addOS:function() 
    {
     
    var bro; 
    if (jQuery.browser.msie) 
    bro = 'dodaneie';
    else 
    bro = 'dodaneff';
    $('#dialogOS .OS:checked').each(function(){  
    var dir = $(this).val(); 
    window.external.AddSearchProvider('http://heweliusz.translatica.pl:5009/opensearch/get/' + dir + '.xml');   
    ga.trackEvent('Opensearch', bro, dir);   
    //ga.trackPage('/opensearch/dodane/' + dir); 
    $("#dialogOS").dialog("destroy");
    });  
     
    },   
    OSall: function()
    {
    $("INPUT[type='checkbox']").attr('checked', 'checked');
/*    if ($('#OSall').html() == msg.opensearch.check_all){ 
    $('#dialogOS .OS').attr('checked', true);
    $('#OSall').html(msg.opensearch.uncheck_all);
    }
    else{
    $('#dialogOS .OS').attr('checked', false);   
    $('#OSall').html(msg.opensearch.check_all);  
    } */
    },   
    
    
    validation: function(){
        $.validator.addMethod("notEqualTo", function(value, element, params) {
        	return value != params;
        }, "Please enter other value again.");

        var msg = new Object();
        msg.required = 'To pole jest wymagane';
        msg.email = 'To nie jest poprawny adres email';
        
        $('#text_form').validate({
            submitHandler: function(form) {
                $(form).ajaxSubmit();
            },
            rules: {
                'translate_text': {
                    required: true,
                    notEqualTo: translator.default_text
                }
            },
            messages: {
                'translate_text': msg.required
            },
            errorElement: "div"
        });
    
        $('#tr_trans_email').validate({
            rules: {
                'Subject': 'required',
                'message': 'required'
            },
            messages: {
                'Subject': msg.required,
                'message': msg.required
            },
            errorElement: "div"
        });
    
        $('#tr_email_data').validate({
            rules: {
                'email_sender': 'required',
                'email_sender_address': {
                    required: true,
                    email: true
                },
                'email_recipient': 'required',
                'email_recipient_address': {
                    required: true,
                    email: true
                }
            },
            messages: {
                'email_sender': msg.required,
                'email_sender_address': {
                    required: msg.required,
                    email: msg.email
                },
                'email_recipient': msg.required,
                'email_recipient_address': {
                    required: msg.required,
                    email: msg.email
                }
            },
            errorElement: "div"
        });
    }
};

// utils.js
var utils = {
	removed: Array(),
	removeDefaultText: function(element)
	{
		if (this.removed[element.id] == null) {
		    var val = $(element).val();
			$(element).val("");
			this.removed[element.id] = true;
			$(element).blur(function(){
			    if ($(this).val() == ""){
			        $(element).val(val);
			        utils.removed[element.id] = null;
			    }
			});
		}
	},
    // public method for url encoding
	URLEncode : function (string) {
		return escape(this._utf8_encode(string));
	},
 
	// public method for url decoding
	URLDecode : function (string) {
		return this._utf8_decode(unescape(string));
	},
 
	// private method for UTF-8 encoding
	_utf8_encode : function (string) {
		string = string.replace(/\r\n/g,"\n");
		var utftext = "";
 
		for (var n = 0; n < string.length; n++) {
 
			var c = string.charCodeAt(n);
 
			if (c != 37 && c != 47 && c != 35 && c != 49){ // escapowanie % i / i # i &
    			if (c < 128) {
    				utftext += String.fromCharCode(c);
    			}
    			else if((c > 127) && (c < 2048)) {
    				utftext += String.fromCharCode((c >> 6) | 192);
    				utftext += String.fromCharCode((c & 63) | 128);
    			}
    			else {
    				utftext += String.fromCharCode((c >> 12) | 224);
    				utftext += String.fromCharCode(((c >> 6) & 63) | 128);
    				utftext += String.fromCharCode((c & 63) | 128);
    			}
    			
		    }
 
		}
 
		return utftext;
	},
 
	// private method for UTF-8 decoding
	_utf8_decode : function (utftext) {
		var string = "";
		var i = 0;
		var c = c1 = c2 = 0;
 
		while ( i < utftext.length ) {
 
			c = utftext.charCodeAt(i);
 
			if (c < 128) {
				string += String.fromCharCode(c);
				i++;
			}
			else if((c > 191) && (c < 224)) {
				c2 = utftext.charCodeAt(i+1);
				string += String.fromCharCode(((c & 31) << 6) | (c2 & 63));
				i += 2;
			}
			else {
				c2 = utftext.charCodeAt(i+1);
				c3 = utftext.charCodeAt(i+2);
				string += String.fromCharCode(((c & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63));
				i += 3;
			}
 
		}
 
		return string;
	}
};

// /lib/easytooltip.js
jQuery.fn.easytooltip = function(id)
{
    if(!document.getElementById('tool_tip'))
    {
       $("body").append('<div id="tool_tip_action"></div>');
       $("#tool_tip_action").css({"background-color": "#ffffff", border: "1px solid #000", position: "absolute", "z-index": "1001", "display": "none"});
    }
    $("#" + id).hide();

        $(this).bind("mousemove", function(e)
        {
            $("#tool_tip_action").html($("#" + id).html()).css({"left": e.pageX + 20, "top" : e.pageY + 20}).show();
        }).bind("mouseout", function()
        {
            $("#tool_tip_action").hide().css({"left": 0, "top" : 0});
        });
}

