var op={
	iff:null,
	kid:111004,
	mode:'all',
	langs:['PL','DE'],//,'DE'],
	apage:1,
	allowedLangs:{
		'polskojęzyczne':'PL',
		'niemieckojęzyczne':'DE'
	},
	urlForMarks: '?WSfile=hotel_rating&view=opinion&format=json&hib_mode=hotel_rating',
	urlForDetailedMark: '?WSfile=hotel_rating&view=opinion_det&format=json&hib_mode=hotel_rating',
	data:{
		det_mark:{}
    },
    //	mainElementSelector : "#hib_right",
    isToolTipVisible:false,
    mainElement:null,
    modesTranslation:{
        pair:'Para',
        single:'Singiel',
        family:'Rodzina',
        friend:'Przyjaciele',
        all:'Wszyscy'
    },
    typesTranslation:{
        vacation:'Urlop',
        delegation:'Delegacja',
        wellnes:'Wellnes',
        ski:'Narty',
        other:'Inny'
    },
    // inicjalizacja wyświetlania opinii

    init:function(iff,el){
        this.iff = iff;
        this.mainElement = el;
        this.getData();
    },

    config:{
        mark_img:'',
        mark_img_width:80,
        show_detailed:'<span class="op02"><a href="#" onclick="return false;"><img src="hib/readComment.png" alt="" /></a></span>',
        structure:'<div class="op_title"></div><div class="langs"></div><ul class="op_menu"></ul><div class="op_marks"></div><div class="detailed"></div><div class="pager op_pager"></div>',
        structureError:'<div class="langs"></div>',
        op_navi:'<div class="op_navi"><a class="navi"><span>« poprzednia opinia</span></a><a class="navi active"><span>powrót</span></a><a class="navi"><span>następna opinia »</span></a></div>'

    },

    texts:{
        mark_tpl:'({mark})',
        recomended:'Polecany',
        notrecomended:'Niepolecany'
    },

    // pobranie danych do widoku listy opinii
    getData:function(){
        if (!this.data.marks) this.data.marks = {};
        $.getJSON( hib.config.connector + this.urlForMarks + '&kid='+this.kid+'&iff=' + this.iff + '&mode=' + this.mode+ '&lang='+ this.getLangs()+ '&apage='+ this.apage  , function(tmp){
            if (typeof tmp.details.type !== "undefined") {
                op.data.details = tmp.details;
                op.data.modes = tmp.details.type.split(',');
                op.data.modes.push('all');
                op.data.mark_headers = tmp.mark_headers;
                op.data.marks[op.mode] = tmp.marks;
                // wygenerowanie i wyświetlenie widoku pobranych danych
                op.showOpinion(false);
            } else {
                op.showOpinion(true);
            }
        });
    },

    // pobranie danych do szczegółowego widoku jednej opinii
    getDetailedData:function(){
        op.actual_mark_id = $(this).data('opinion');
        // jeżeli dane już są uniknięcie powtórnego pobierania
        if (!op.data.det_mark[op.actual_mark_id]){
            //			$.getJSON( hib.config.connector + op.urlForDetailedMark+ '&kid='+op.kid+'&iff=' + op.iff + '&mode=' + op.mode + '&mark_id=' + op.actual_mark_id+ '&lang='+ op.getLangs() , function(tmp){
            $.getJSON( hib.config.connector + op.urlForDetailedMark+ '&kid='+op.kid+'&iff=' + op.iff + '&mode=' + op.mode + '&n=' + op.actual_mark_id+ '&lang='+ op.getLangs() , function(tmp){
                op.data.det_mark[op.actual_mark_id] = {};
                op.data.det_mark[op.actual_mark_id].comments = tmp.comments;
                op.data.det_mark[op.actual_mark_id].details = tmp.details;
                op.data.det_mark[op.actual_mark_id].marks = tmp.marks;
                // wygenerowanie i wyświetlenie widoku pobranych danych
                op.showDetailedOpinion();
            });
        } else {
            op.showDetailedOpinion();
        }
    },

    getLangs:function(){
        var l='';
        for (var n in this.langs){
            if(this.langs[n]!='') l+=this.langs[n]+'|';
        }
        return l.slice(0,-1);
    },

    createStructure:function(error){
        if (error) {
            this.mainElement.html(this.config.structureError);
        } else {
            this.mainElement.html(this.config.structure);
        }
        $('div.detailed').hide();
    },

    showMenu:function(){
        var out='';

        for (var n in this.data.modes){
            if (this.modesTranslation[this.data.modes[n]]) {
                out+= '<li' + ((this.data.modes[n]==op.mode)?' class="selected"':'') + '><span>'+this.modesTranslation[this.data.modes[n]]+'</span></li>';
            }
        }
        $('ul.op_menu').html(out);

        for (var n in this.data.modes){
            $($('ul.op_menu').selector+' li:eq('+n+')').data('op_mode',this.data.modes[n]).click(function(){
                op.apage = 1;
                op.mode = $(this).data('op_mode');
                op.getData();
            });
        }
    },

    showLangs:function(){
        var out='';
        for (var n in this.allowedLangs){
            if (jQuery.inArray(this.allowedLangs[n], this.langs)==-1) {
                out+='<img src="'+ hib.pfadImages +'/flags/inactive_flag_'+this.allowedLangs[n].toLowerCase()+'.png" alt="'+this.allowedLangs[n].toUpperCase()+'"';
                out+=' class="inactive" title="pokaż '+n+' opisy"';
            } else {
                out+='<img src="'+ hib.pfadImages +'/flags/flag_'+this.allowedLangs[n].toLowerCase()+'.png" alt="'+this.allowedLangs[n].toUpperCase()+'"';
                out+='title="ukryj '+n+' opisy"';
            }
            out+=' />';
        }
        $('div.langs').html(out);
        $('div.langs img').click(function(){
            op.apage = 1;
            // wyjście jeżeli kliknięto na jedyną aktywną flagę
            if (($('div.langs img').length - $('div.langs img.inactive').length)==1 && !$(this).hasClass('inactive')) return;

            //var clickedEl =  $(this);
            var clickedLang = $(this).attr('alt');
            var i=jQuery.inArray(clickedLang, op.langs);
                        //clickedEl.toggleClass( 'inactive' );
            if (i==-1) { // ustawienie tablicy do pierwotnych wartości ponieważ kolejność jest ważna
                op.langs = ['PL','DE'];
            } else { // usunięcie elementu z tablicy
                op.langs.splice(i,1);
            }
            op.getData();

        });
    },

    showHeaders:function(){
        if (!this.data.mark_headers) return
        var out=[];
        var headers = this.data.mark_headers;

        var num=0;
        for (var n in headers){
            if ( ( headers[n].type == this.mode || this.mode=='all' ) && num<10 ){
                var markval = headers[n].avg;
                out.push ( '<div class="opinionHeaders">');
                out.push('<h3>'+unescape(headers[n].title)+'</h3>' );
                out.push( '<p class="op01">');
                    out.push('Dodał: '+headers[n].signature+' ('+headers[n].fill_form_date+') <br />');
                    out.push(((headers[n].summary!='')?(unescape(headers[n].summary.substr(0,180))+'... '):''));
                out.push('</p>' );
                out.push(this.config.show_detailed);
                out.push( this.drawMarkLine( markval, 'średnia ocena użytkownika') )
                //out.push( '<p class="summary">'+((headers[n].summary!='')?(unescape(headers[n].summary.substr(0,180))+'... '):'')+this.config.show_detailed+'</p>' );
                //out.push( (headers[n].recomended==1)?this.texts.recomended:this.texts.notrecomended  );
                
                out.push( '</div>' );
                num++;
            }
        }
        $('div.detailed').after(out.join(''));




        for (var n in headers){
            //$($('div.op_marks_list').selector+' .opinion h1:eq('+n+')').data('opinion',headers[n].mark_id).click(op.getDetailedData);
            $('.opinionHeaders .op02:eq('+n+')').data('opinion',(this.apage-1)*10+parseInt(n)).live('click', op.getDetailedData );
        }

        //var ilosc = this.countVisibleOpinions();
        //if (ilosc>10) {

        if (this.data.details.oceny>10) {
            var op_pager = new pager( this.data.details.oceny, this.apage-1, 10,$('div.op_pager:eq(0)').get(0));
            with (op_pager) {
                nextLink='<u><span>następne</span></u>';
                prevLink='<u><span>poprzednie</span></u>';
                fieldTpl='<span>{val}</span>';
                onclick = function(a){
                    op.changePage(a)
                };
                majorElement = '';
                minorElement = 'a';
                draw();
                }
        }
    },
    // zmiana aktualnej strony listy opinii
    changePage:function( a ){
        op.apage = a / 10 + 1;
        op.getData();
    },

    countVisibleOpinions:function(){
        var c=0;
        for (var i in this.data.mark_headers){
            var h = this.data.mark_headers[i];
            if ((h.type == this.mode || this.mode=='all' ) && $.inArray( h.lang, this.langs )!=-1) c++;
        }
        return c;
    },

    // wyświetlanie widoku listy opinii
    showOpinion:function(error){
        $('div.hopinios').html('');
        this.createStructure(error);
        if (error) {
            this.showLangs();
            $('div.langs').after('<p class="nodataerror">Brak polskich opinii.</p>');
        } else {
            var h = this.showMarks( this.data.marks[this.mode] );
            $('div.op_marks').html( h );
            this.showAdditionalMark();
            this.attachMarksToolTip( this.data.marks[this.mode], '.op_marks div.mark_line' );
            this.showMenu();
            this.showHeaders();
            this.showLangs();
        }
        hib.fitHeight();
    },

    showAdditionalMark:function(){

        var out = ['<div class="op_details">'];
        out.push( this.drawMarkLine( this.data.details.srednia , '<strong>Średnia ocena hotelu</strong>' ));
        //		out.push( this.drawMarkLine( this.evalAverageMark(this.data.modes[this.mode]) , 'Średnia w kat. '+ this.modesTranslation[this.mode] ));
        out.push( '<div class="mark_line"><span>Liczba ocen:</span><div class="op_detail_spacer"><strong>' + this.data.details.oceny + '</strong></div></div>');
        out.push( '<div class="mark_line"><span>% rekomendacji:</span><div class="op_detail_spacer"><strong>' + this.data.details.poleca_proc + ' %</strong></div></div>');
        out.push('</div>');
        $('div.op_marks').after(out.join(''));
    },

    // wyświetlanie widoku szczegółowego jednej opinii
    showDetailedOpinion:function(){
        // ukrywanie divów z poprzedniego widoku
        // odsłanianie z bierzącego
        $('div.detailed').show();
        $('.langs, .opinionHeaders, .op_title, .op_details, .op_menu, .op_marks, .op_pager').hide( );

        // inicjalizacja zmiennych
        var out = [this.config.op_navi];
        var additional = '';
        var d = this.data.det_mark[ this.actual_mark_id];

        out.push('<h1>' + unescape(d.details.title) + '</h1>');
        out.push('<h2>Ocena wystawiona przez: ' + unescape(d.details.signature) + '</h2>' );
        out.push('<div class="additionals"><div class="det2"><table>')
        out.push('<tr><th>Data wystawienia:</th><td>'+d.details.fill_form_date+'</td></tr>')
        out.push('<tr><th>Rodzaj podróży:</th><td>'+this.typesTranslation[d.details.typ]+'</td></tr>')
        out.push('<tr><th>Podróż jako:</th><td>'+this.modesTranslation[d.details.type]+'</td></tr>');
        out.push('<tr><th>Wiek:</th><td>'+((d.details.age_range[0]=='>')?'>70':d.details.age_range.substr(0,2)+'-'+d.details.age_range.substr(2,4))+' lat</td></tr>');
        out.push('<tr><th>Rekomendacja:</th><td>'+((d.details.recomended)?'TAK':'NIE')+'</td></tr>');

        out.push('</table>')
        out.push(this.showMarks( d.marks ));
        out.push('</div>')

        // generowanie komentarzy gościa hotelowego
        if (d.details.summary!='') additional+='<h2>Ogólnie:</h2><p>'+d.details.summary+'</p>';
        for (var n=0; n<d.comments.length; n++){
            if (d.comments[n]!='' && d.comments[n]!='Dodaj swój komentarz' && this.marks[n+1]) {
                additional+='<h2>'+this.marks[n+1].name+':</h2><p>'+unescape(d.comments[n])+'</p>';
            }
        }
        if (d.details.directions!='') additional+='<h2>Wskazówki:</h2><p>'+unescape(d.details.directions)+'</p>';
        if (additional!='') out.push('<h1>Dodatkowe komentarze</h1>'+unescape(additional)+'</div>');

        // wyświetlanie danych
        $('div.detailed').html(out.join(''));

        // podłączenie obsługi ToolTip'a
        this.attachMarksToolTip(d.marks, '.additionals .op_marks_cloud div.mark_line');

        // podłączenie obsługi linków nawigacyjnych
        if ( op.actual_mark_id < op.data.details.oceny - 1 ) {
            $('.op_navi .navi:eq(2)').data('opinion',op.actual_mark_id+1).click(this.getDetailedData).addClass('active');
        }
        if ( op.actual_mark_id > 0 ) {
            $('.op_navi .navi:eq(0)').data('opinion',op.actual_mark_id-1).click(this.getDetailedData).addClass('active');
        }
        $('.op_navi span:eq(1)').click(this.exitDetailedOpinion);

        hib.fitHeight();
    },

    // przełączenie z widoku szczegółowego jednej opinii do widoku listy wszystkich opinii
    exitDetailedOpinion:function(){
        // zamknięcie ToolTipa
        op.closeToolTip();
        $('.langs, div.opinionHeaders, .op_title, .op_details, .op_menu, .op_marks, .op_pager').show();
        $('div.detailed').hide();
        hib.fitHeight();
    },

    attachMarksToolTip:function(m, el){

        var num=0;
        // podłączanie obsługi ToolTip'a do wszystkich elementów
        // przy ruszseniu myszką ToolTip należy przesunąć
        // w chwili pierwszego poruszenia myszką ToolTip należy wygenerować

        $(el).data('marks',m)
        .each(
            function(){
                this.id='m_'+(++num)+'_0'
            }
            )
        .mousemove(
            function( e ){
                // generowanie nowego ToolTipa
                if (op.isToolTipVisible==false){

                    // wstawienie ToolTipa do struktury dokumentu
                    $('.op_marks').after('<div id="op_cloud"><div class="rShadow"></div><div class="bShadow"></div><div class="rbShadow"></div></div>');
                    //var inner = ['<dl>'];

                    var inner = ['<div class="op_marks_cloud">'];
                    var cat_id = this.id.substr(2,1);
                    var mark_data = $(this).data('marks');

                    // generowanie zawartości
                    for (n in op.marks[cat_id].details){
                        inner.push(op.drawMarkLine( mark_data['m_'+cat_id+'_'+n], op.marks[cat_id].details[n] ));
                    }
                    inner.push('</div>');

                    // wypełnienie elementu zawartością
                    $('#op_cloud .rShadow').html( inner.join('') );

                    // ustawienie znacznika wskazującego, że ToolTip jest widoczny
                    op.isToolTipVisible=true;
                }

                // po każdym poruszeniu myszą korekta położenia
                op.moveToolTip(e.pageX+10,e.pageY+10);
            }
            ).mouseout(
            // zamknięcie ToolTipa w chwili opuszczenia obszaru do którego jest podłączony
            op.closeToolTip
            );
    },

    moveToolTip:function(x,y){
                $('#op_cloud').css({'left':x,'top':y});
    },

    drawMark:function(mark_val){
        return '<img class="opinion_bar_hib" style="background-position:' + (100 - (mark_val * 100 / 6)) + '% 0;" src="' + hib.pfadImages + '/maska.gif" />' + op.texts.mark_tpl.replace('{mark}', mark_val );
    },

    // buduje pełną linijkę oceny (nazwa, wskaźnik, ocena liczbowo)
    drawMarkLine:function(mark_val, mark_title ){
        return '<div class="mark_line"><span>'+mark_title+'</span>' + ((mark_val)? this.drawMark(mark_val) : 'brak oceny' ) + '</div>';
    },

    closeToolTip:function(){
        $('#op_cloud').remove();
        op.isToolTipVisible=false;
    },

    showMarks:function(hopinions){
        var inner = ['<div class="op_marks_cloud">'];
        for (var b in this.marks) {
            inner.push( this.drawMarkLine( hopinions['m_'+this.marks[b].db_cat+'_0'], this.marks[b].name ) );
        }
        inner.push('</div>');
        return inner.join('');
    },

    marks:{
        1:{
            name:'Hotel',
            db_cat:'1',
            page:2,
            details:{
                '1':'Czystość',
                '2':'Polecany dla rodziny',
                '3':'Polecany dla pary',
                '4':'Polecany dla singli',
                '5':'Polecany dla grupy',
                '6':'Godny polecenia',
                '0':'Ogólna ocena'
            }
        },
        2:{
            name:'Pokoje',
            db_cat:'2',
            page:2,
            details:{
                '1':'Czystość',
                '2':'Wielkość pokoju',
                '3':'Wyposażenie',
                '4':'Łazienka',
                '5':'Wystrój',
                '0':'Ogólna ocena'
            }
        },
        3:{
            name:'Obsługa',
            db_cat:'3',
            page:3,
            details:{
                '1':'Serwis hotelowy',
                '2':'Polskojęzyczny',
                '3':'Recepcja',
                '0':'Ogólna ocena'
            }
        },
        4:{
            name:'Położenie',
            db_cat:'4',
            page:3,
            details:{
                '1':'Odległość od plaży',
                '2':'Odległość od lotniska',
                '3':'Dostępność sklepów',
                '4':'Restauracje',
                '5':'Imprezy',
                '6':'Czas wolny',
                '0':'Ogólna ocena'
            }
        },
        5:{
            name:'Jedzenie',
            db_cat:'5',
            page:4,
            details:{
                '1':'Czystość',
                '2':'Wyżywienie',
                '3':'Napoje',
                '4':'All Inclusive',
                '0':'Ogólna ocena'
            }
        },
        6:{
            name:'Sport',
            db_cat:'6',
            page:4,
            details:{
                '1':'Możliwość upr. sportu',
                '2':'Sprzęt sportowy',
                '3':'Animacje',
                '4':'Tenis',
                '5':'Pole golfowe',
                '6':'Fitness',
                '0':'Ogólna ocena'
            }
        },
        7:{
            name:'Plaża',
            db_cat:'7',
            page:5,
            details:{
                '1':'Łatwość dotarcia',
                '2':'Wielkość',
                '3':'Wyposażenie',
                '4':'Gastronomia',
                '5':'Możliwość upr. sportu',
                '0':'Ogólna ocena'
            }
        },
        8:{
            name:'Basen',
            db_cat:'8',
            page:5,
            details:{
                '1':'Czystość',
                '2':'Wielkość',
                '3':'Godny polecenia',
                '4':'Zjeżdżalnia',
                '0':'Ogólna ocena'
            }
        },
        9:{
            name:'Rodzinny',
            db_cat:'9',
            page:6,
            details:{
                '1':'Animacje dla dzieci',
                '2':'Wyżywienie dla dzieci',
                '3':'Basen dla dzieci',
                '4':'Opieka nad dziećmi',
                '5':'Plac zabaw',
                '0':'Ogólna ocena'
            }
        }
    }
}
