(function($){
    $.fn.reise1001=function(settings){
        //var config={'url':'http://192.168.0.101/1001reise/redaxo/redaxo/index.php?page=ic_gmaps&ajax=1'};
        var settings=$.extend({
            srv:        'http://ritzfritz.no-ip.info:9532', //absolute path to your website
            url:        'redaxo/index.php?page=ic_gmaps&subpage=ajax', //backend url
            loc:        '',
            mapTypeId:  google.maps.MapTypeId.ROADMAP,
            MCE:        [],
            mediaList:  '',
            iconContent:'',
            iconOptions:'',
            mapStyle:   [],
            getContent: '',
            contentTemp:{}

        },$.fn.reise1001.globme,settings)


        settings.loc=settings.srv+settings.url;
        this.each(function(){
            initGmaps(this);
        });


        var elem=this;
        var map;
        var markerArray=[];
        var markerArraySelected=[];
        var infoWindowArray=[];
        var contentTemplate=settings.contentTemp;

        getMarkers();



        $('#add_journey').live('click',function(){
            var ll=$(this).parent().find('input[name=latlng]').val();
            var marker=getMarkerByPosition(markerArray,ll);
            if(marker){
                pushArray(markerArraySelected,marker);
                var data={title:$('#loc_title').text(),foto:$('#tab_2 img:first').attr('src')};
                addJourney(marker,data)
                $('#journey_added').hide().fadeIn(800);
                disableAddJourney($(this));
            }
        })

        $('#remove_journey').live('click',function(){
            var ll=$(this).parent().find('input[name=latlng]').val();
            var marker=getMarkerByPosition(markerArraySelected,ll,true);
            if(marker){
                markerArraySelected.splice(marker,1);
                $(this).parent().parent().remove();
            }
        })

        $('#update_icons').click(function(){
            toggleButton($('#update_icons'));
            $('.icon_container').each(function(i){
                if($(this).find('input[name=icon_title]').val()){
                    var data={action:'update_icons','id':$(this).find('input[name=icon_id]').val(),'title':$(this).find('input[name=icon_title]').val(),'xpos':$(this).find('input[name=icon_xpos]').val(),'ypos':$(this).find('input[name=icon_ypos]').val()};
                    data=$.param(data);
                    ajxAction(data,'update_icons');
                }
            });
        })

        $('.kill_icon').click(function(){
            if(confirm('Wirklich Loeschen?')){
                var id=$(this).parent().find('input[name=icon_id]').val();
                var data={action:'delete_icon',id:id};
                data=$.param(data);
                ajxAction(data,'delete_icon');
                $(this).parent().fadeOut();
            }
        })

        $('#remove_all_icons').click(function(){
            hideIcons();
        });

        $('#remove_all_infowindows').click(function(){
            hideInfoWindows();
        });


        $('.gmaps_removeMarker').live('click',function(){
            hideIcons($(this).parent().find('input[name=latlng]').val());
            var ll=$(this).parent().find('input[name=latlng]').val();
            var marker=getMarkerByPosition(markerArray,ll);
            if(marker){
                var data={action:'delete_marker',id:markerArray[i].dbid}
                data=$.param(data);
                ajxAction(data,'delete_marker');
            }
        })

        $('.gmaps_saveMarker').live('click',function(){
            var ll=$(this).parent().find('input[name=latlng]').val();
            var marker=getMarkerByPosition(markerArray,ll);
            if(marker){
                var data={action:'save_marker',id:markerArray[i].dbid,lat:markerArray[i].lat,lng:markerArray[i].lng,title:$('input[name=gm_title]').val(),content:$('textarea[name=gm_content1]').val(),photos:$('#REX_MEDIALIST_1').val(),icons:getIconIds()}
                data=$.param(data);
                ajxAction(data,'save_marker');
            }
        })

        $('#tabNavi li a').live('click',function(){
            var elem=$(this).attr('href').slice(1);
            $(this).parent().parent().parent().find('.iwTab').hide();
            $('#'+elem).show();
            //alert(tinyMCE.init())
        })

        preventDefaultAction([$('#tabNavi li a'),$('.gmaps_removeMarker'),$('.gmaps_saveMarker'),$('#update_icons'),$('.kill_icon'),$('#add_journey'),$('#remove_journey')]);


        function disableAddJourney(e){
            e.attr('disabled','disabled');
            e.css('background-position','-212px -56px');
            e.css('cursor','default');
        }

        function getIconIds(){
            var values='';
            $('#icon_list form input[type=checkbox]:checked').each(function(i){
                values+=$(this).val()+',';
            })
            values=values.slice(0,-1);
            return values;
        }

        function toggleButton(btn){
            if(btn.attr('disabled')){
                btn.removeAttr('disabled');
            }else{
                btn.attr('disabled','disabled');
            }
        }

        function ajxAction(data,action){
            $('#preloader').show();
            $('#tab_1,#tab_2').hide();
            $.ajax({
                url:        settings.loc,
                type:       'GET',
                data:       data,
                dataType:   'json',
                success:    function(data){
                                afterAjx(data,action);
                                $('#preloader').hide();
                                $('#tab_1').show();
                            }
            })
        }

        function afterAjx(data,action){
            switch(action){
                case 'save_marker':
                    //alert(data);
                break;
                case 'place_marker':
                    if(data.result.length){
                        $.each(data.result,function(i,k){
                            ll=new google.maps.LatLng(k.lat,k.lng);
                            placeMarker(ll,k.lat,k.lng,k.id,k.title);
                        })
                    }
                break;
                case 'get_content':
                    getContentBE(data);
                break;
                case 'get_content_fe':
                    getContentFE(data);
                    //alert("content FE");
                break;
                case 'update_icons':
                    toggleButton($('#update_icons'));
                break;
            }
        }

        /*
         * rk: wenn true dann wird nur der schluessel ausgegeben
         **/
        function getMarkerByPosition(markerArr,pos,rk){
            for(i in markerArr){
                //alert(typeof(markerArr[i].position)+'=='+typeof(pos));
                if(markerArr[i].position.toString()==pos.toString()){
                    if(rk){
                        return i;
                    }
                    return markerArr[i];

                }
            }
            return false;
        }

        function getContentFE(data){
            var icons=data.result[0].icons.split(',');
            $('#loc_desc').text(data.result[0].text);
            $('#loc_title').text(data.result[0].title);
            if(!$('#add_journey').attr('id')){
                $('#iwWrapper').prepend(settings.contentTemp.addJourney);
            }

            var pos=new google.maps.LatLng(data.result[0].lat,data.result[0].lng);
            var m=getMarkerByPosition(markerArraySelected,pos);
            if(m){
                disableAddJourney($('#add_journey'));
            }


            //$('#REX_MEDIALIST_1').val(data.result[0].photos);
            if(icons.length){
                for(i=0;i<icons.length;i++){
                    $('.activity span input[name=activity_id]').each(function(){
                        if($(this).val()==icons[i]){
                            $(this).parent().css('display','block');
                        }
                    })
                }
            }

            if(data.result[0].photos){
                var pix=data.result[0].photos.split(",");
                var opt='';
                for(i=0;i<pix.length;i++){
                    opt+='<a class="jpic" href="'+settings.srv+'/index.php?rex_img_type=rex_resize&rex_img_file='+pix[i]+'"><img src="'+settings.srv+'index.php?rex_img_type=rex_crop_resize&rex_img_file='+pix[i]+'" /></a>';
                }
                $('#tab_2').prepend(opt);
                $('a.jpic').lightBox();
            }
            $('#preloader').hide();
            $('#tab_1').show();
        }

        function addJourney(marker,data){
            //settings.contentTemp.journeyTemp;
            var pic=settings.srv+'files/dummy_pic.gif';
            if(data.foto){
                pic=data.foto;
            }
            var str=settings.contentTemp.journeyTemp.replace(/_title_/g,data.title).replace(/_mid_/g,marker.dbid).replace(/_srcimg_/g,pic).replace(/_pos_/g,marker.position);
            $('#selected_journeys ul').append('<li>'+str+'</li>');
        }

        function getContentBE(data){
            var icons=data.result[0].icons.split(',');
            $('textarea[name=gm_content1]').val(data.result[0].text);
            $('input[name=gm_title]').val(data.result[0].title);
            $('#REX_MEDIALIST_1').val(data.result[0].photos);
            if(icons.length){
                for(i=0;i<icons.length;i++){
                    $('#icon_list input[name=place_activity]').each(function(){
                        if($(this).val()==icons[i]){
                            $(this).attr('checked','checked');
                        }
                    })
                }
            }
            if(data.result[0].photos){
                var pix=data.result[0].photos.split(",");
                var opt='';
                for(i=0;i<pix.length;i++){
                    opt+='<option value="'+pix[i]+'">'+pix[i]+'</option>'
                }
                $('#REX_MEDIALIST_SELECT_1').prepend(opt);
            }
            $('#preloader').hide();
            $('#tab_1').show();
        }

        function getMarkers(){
            ajxAction("action=place_marker",'place_marker');
        }

        function getMarkerContent(id,infowin){
            var data={action:settings.getContent,marker_id:id};
            $.param(data);
            google.maps.event.addListener(infowin,'domready',function(event){
                ajxAction(data,settings.getContent);
            })
        }

        function preventDefaultAction(elem){
            $(elem).each(function(i){
                elem[i].live('click',function(e){
                    e.preventDefault();
                })
            })
        }

        function hideIcons(icon){
            if(markerArray){
                for(i in markerArray){
                    if(icon){
                        if(markerArray[i].position==icon){
                            markerArray[i].setMap(null);
                            hideInfoWindows(icon);
                        }
                    }else{
                        markerArray[i].setMap(null);
                    }
                }
            }
        }

        function hideInfoWindows(infowin){
            if(infoWindowArray){
                for(i in infoWindowArray){
                    if(infowin){
                        if(infoWindowArray[i].position==infowin){
                            infoWindowArray[i].close();
                        }
                    }else{
                        infoWindowArray[i].close();
                    }
                }
            }
        }

        function pushArray(arr,v){
            return arr.push(v);
        }

        function initGmaps(elem){
            var latlng=new google.maps.LatLng(14.237, -4.576);
            var styledMapOptions = null;
            var mapType=new google.maps.StyledMapType(settings.mapStyle,styledMapOptions);

            var gmOptions={
                zoom:       3,
                center:     latlng,
                //mapTypeId:  settings.mapTypeId
                mapTypeControlOptions: {
                            mapTypeIds: [settings.mapTypeId,'r1001']
                }
            }
            map=new google.maps.Map(elem,gmOptions);
            map.mapTypes.set('r1001',mapType);
            map.setMapTypeId('r1001');
        };

        function initMarkerIcon(){
            //{iconFile:iconFile,iconSizeW:20,iconSizeH:20,iconOriginX:20,iconOriginY:20};
            var xpos=settings.iconOptions.iconOriginX;
            var ypos=settings.iconOptions.iconOriginY;
            var image=new google.maps.MarkerImage(settings.iconOptions.iconFile,
                                                  new google.maps.Size(settings.iconOptions.iconSizeW,settings.iconOptions.iconSizeH),
                                                  new google.maps.Point(xpos,ypos),
                                                  new google.maps.Point(40,65));
            return image;
        }

        function placeMarker(ll,lat,lon,dbid,title){
            var icon;
            if(typeof(settings.iconOptions)=='object'){
                icon=initMarkerIcon();
            }
            var marker=new google.maps.Marker({
                position: ll,
                map: map,
                lat: lat,
                lng: lon,
                dbid: dbid,
                icon: icon
                //title: markerArray.length.toString()
            })
            //markerArray.push(marker);
            pushArray(markerArray,marker);
            if(title){
                marker.setTitle(title);
            }else{
                marker.setTitle(markerArray.length.toString());
            }
            //TODO: Die der infowwindows groesse fixen
            var infowindow=new google.maps.InfoWindow({
                content:        '<div id="iwWrapper">'+contentTemplate['tabNavi']+'<br />'+contentTemplate['tabContent'].replace(/_srv_/g,settings.srv).replace(/pos/g,ll).replace(/inp_lat/g,lat).replace(/inp_lon/g,lon)+'<br />'+contentTemplate['removeMarker']+contentTemplate['saveMarker']+'</div>',
                size:           new google.maps.Size(400,300),
                position:       ll
            })

            infoWindowArray.push(infowindow);
            google.maps.event.addListener(marker,'click',function(event){
                hideInfoWindows();
                infowindow.open(map,marker);
                if(marker.dbid){
                    getMarkerContent(marker.dbid,infowindow);
                }
            })
            //debug output
            //scanArray();
        }

        function scanArray(){
            var output='';


            for(i=0;i<markerArray.length;i++){
                output+=markerArray[i].position+' - INFOWINDOW: <b>'+infoWindowArray[i].position+'</b><br />';
            }

            for(i=0;i<infoWindowArray.length;i++){
                //alert(infoWindowArray[i].position);
            }

            $('#debug1001').html(output);
        }
        if(settings.contentTemp.saveMarker!=''){
            google.maps.event.addListener(map,'click',function(event){
                placeMarker(event.latLng,event.latLng.lat(),event.latLng.lng());
            })
        }
    };
})(jQuery);

