/* Copyright (c) 2009 Brandon Aaron (http://brandonaaron.net)
 * Dual licensed under the MIT (http://www.opensource.org/licenses/mit-license.php)
 * and GPL (http://www.opensource.org/licenses/gpl-license.php) licenses.
 * Thanks to: http://adomas.org/javascript-mouse-wheel/ for some pointers.
 * Thanks to: Mathias Bank(http://www.mathias-bank.de) for a scope bug fix.
 *
 * Version: 3.0.2
 * 
 * Requires: 1.2.2+
 */
(function(c){var a=["DOMMouseScroll","mousewheel"];c.event.special.mousewheel={setup:function(){if(this.addEventListener){for(var d=a.length;d;){this.addEventListener(a[--d],b,false)}}else{this.onmousewheel=b}},teardown:function(){if(this.removeEventListener){for(var d=a.length;d;){this.removeEventListener(a[--d],b,false)}}else{this.onmousewheel=null}}};c.fn.extend({mousewheel:function(d){return d?this.bind("mousewheel",d):this.trigger("mousewheel")},unmousewheel:function(d){return this.unbind("mousewheel",d)}});function b(f){var d=[].slice.call(arguments,1),g=0,e=true;f=c.event.fix(f||window.event);f.type="mousewheel";if(f.wheelDelta){g=f.wheelDelta/120}if(f.detail){g=-f.detail/3}d.unshift(f,g);return c.event.handle.apply(this,d)}})(jQuery);




var doluseek = new Object();
var towns = 0;
var timer = true;



$(function () {
      $("#Loading").html("Requesting data");
      getgetrequests();
      $.post("ajax/gettowns.php", getgetrequests(),
                function(data){
                       $('head').append('<style>' + data.css + '</style>');
                       $('#zoom').append(data.townhtml.replace(/&lt;/g,'<').replace(/&gt;/g,'>').replace(/&quot;/g,"'"));
                       $("#selectclan").append(data.clanhtml.replace(/&lt;/g,'<').replace(/&gt;/g,'>').replace(/&quot;/g,"'"));
                       doluseek.info = data.javascript;
                       $("#Loading").html("Processing data");
                       goto(doluseek.loaded);
            }, "json");
});

doluseek.loaded = function(){
            doluseek.map.init();
            doluseek.map.initimportantevents();
            doluseek.map.initevents();
            doluseek.gui.init();
            $("#Loading").hide();
}

var goto = function(fn){
      setTimeout(fn,1);
};
var getgetrequests = function(){
      var get = document.location.search,
          ret = {},
          split = get.replace('?', '').split('&'),
          i = split.length,help;
      while (i--){
         help = split[i].split('=');
         ret[help[0]] = help[1];
      }   
      return ret;
};


doluseek.gui = {

       'elements'        : { 
               'infostack'      : "",
               'zoomval'        : "",
               'Xval'           : "",
               'Yval'           : "",
               'playersearch'   : ""
       },               
        
       'init'            : function(){ 
               $("#zoomval").change(   function(){doluseek.map.zoomadjustments();});
               $("#Xval").change(      function(){doluseek.map.zoomadjustments();});
               $("#Yval").change(      function(){doluseek.map.zoomadjustments();});
               $('#playerval').change( function(){doluseek.gui.getidfromnameselection();});
               $("#searchclan").change(function(){doluseek.gui.searchclan();});
               $('#selectclan').selectable({stop: function(){return doluseek.gui.changeclansshown();}}); 
               $('#clanselectoropener').click(doluseek.gui.clanopener);
               $('#selectorwrapper').accordion({active: 1, animated: false, header: '.accordionheader',autoHeight:false});
               
       },

       'getinfoontown'   : function(town){
               var $arr     = town[0].id.split("-");
               var playerid = $arr[0].substr(1);
               var townid   = $arr[1];
               var clanid   = town.parent()[0].id.substr(4);
               var towninfo = new Object();
               towninfo.playername  = doluseek.info.players[playerid].n;
               towninfo.playerscore = doluseek.info.players[playerid].s;
               towninfo.townname    = doluseek.info.towns[townid].n;
               towninfo.townscore   = doluseek.info.towns[townid].s;
               towninfo.townX       = doluseek.info.towns[townid].X;
               towninfo.townY       = doluseek.info.towns[townid].Y;
               towninfo.clanname    = doluseek.info.clans[clanid].n;
               towninfo.clanscore   = doluseek.info.clans[clanid].s;
               return towninfo;
       },  

       'changeclansshown' : function(){

              if ($(' #selectclan10000000 ').hasClass('ui-selected')){
                     $("#zoom").children(":hidden").show();
                     return false;
              }; 
              if ($('#selectclan10000001').hasClass('ui-selected')){
                     $("#zoom").children(":hidden").show();
                     $('#clan0').hide();
                     return false;
              };   
              var $i = "";
             var $txt = "#onnozelaardasnietbelangrijk"; 
             $('#selectclan').children(":not(#selectclan10000000,#selectclan10000001)").filter(".ui-selected").each(function () {
                    $i = parseInt(this.id.substr(10));
                    $txt = $txt + ',#clan'+$i;
             });
            $("#zoom").children(":not(#xaxis,#yaxis)").filter(":not(" + $txt + ")").filter(":visible").hide();
            $($txt+ ":hidden").show();
            return false; 

       },  

       'getidfromnameselection' :function() {
            var $playername=$("#playerval").val().toLowerCase();
            $(".town").removeClass("selected");
            if ($playername==""){return false};

            $.each(doluseek.info.players,function(id,values){
                   if (values.n.toLowerCase().match($playername)){
                       $("div[id ^='T" + id + "-']").addClass("selected");
                   }
            }); 

            $.each(doluseek.info.towns,function(id,values){
                   if (values.n.toLowerCase().match($playername)){
                       $("div[id $='-" + id + "']").addClass("selected");
                   }  
            });
/*
            $.post("ajax/test.php", { 'playername' : $playername },
                function(data){
                     $.each(data.ids,function(){
                           $("#" + this).addClass("selected");
                     });
            }, "json");
*/        },

        'searchclan'  : function() {
            var $clanname = $("#searchclan").val().toLowerCase();
            $("#selectclan li").show();
            if ($clanname==""){return false};
            $("#selectclan li").filter(":not(#selectclan10000000,#selectclan10000001)").filter(":not(.ui-selected)").each(function(){
                  if (!$(this).html().toLowerCase().match($clanname)){
                        $(this).hide();
                  }
            });
        },
        
        'clanopener' : function() {
            if ($("#clanselector").hasClass("hidden")){
                  $("#clanselector").removeClass("hidden");
            } else {
                  $("#clanselector").addClass("hidden");
            };
        }
      
       
}

doluseek.map = {
         'width'          : 0,  
         'height'         : 0,
         'zoom100pc'      : 0,

         'zoom'           : 0,
         'Xvalue'         : 0,
         'Yvalue'         : 0,

         'towninfoofselectedtown' : {
               'playername':"",
               'townname':"",
               'townX':0,
               'townY':0
         },      

         'init'                : function(){
               $("#clanselector").addClass("hidden");
               doluseek.map.mapcalculations();
               doluseek.map.zoomadjustments();
         },

         'initimportantevents' : function(){
               // important events so these come just after the init
               $(window).resize(       function(){doluseek.map.mapcalculations();doluseek.map.zoomadjustments();});

         },

         'initevents' : function(){
               $("#zoom").live("mouseover",function(e){ 
                                if( $(e.target).hasClass("town")){
                                      $('#selectorwrapper').accordion( 'activate' , 1 );
                                      e.stopPropagation();
                                      var towninfo = doluseek.gui.getinfoontown($(e.target));
                                      doluseek.map.showinfoontown(towninfo);
                                      return false;
                                }
               });
               $(".town").live("dblclick",function(e){
                                var towninfo = doluseek.gui.getinfoontown($(e.target));
                                window.open(doluseek.info.url +'#' + towninfo.townX + ',' +  towninfo.townY);
               });
               $(".town").live("click",function(e){
                                var towninfo = doluseek.gui.getinfoontown($(e.target));
                                doluseek.map.selectedtown(towninfo);
               });
               $("#zoom").draggable({ cursor: 'pointer',  
                                scroll: false, 
                                cancel: ".town", 
                                drag: function() {
                                      $('#selectorwrapper').accordion( 'activate' , 0 );
                                      var $left  = parseInt($("#zoom").css('left'));
                                      var $top   = parseInt($("#zoom").css('top'));
                                      var $zoom  = Math.round(parseInt($("#zoomval").val()))/100;
                                      var $width = doluseek.map.zoom100pc*$zoom;
                                      var maxsize = doluseek.info.maxsize;
                                      $("#Yval").val(parseInt(($top - (doluseek.map.height - $width)/2)/(doluseek.map.zoom100pc/2 * $zoom)*maxsize));
                                      $("#Xval").val(parseInt(-($left - (doluseek.map.width - $width)/2)/(doluseek.map.zoom100pc/2 * $zoom)*maxsize));
                                },
                                stop: function() {
                                      var $left  = parseInt($("#zoom").css('left'));
                                      var $top   = parseInt($("#zoom").css('top'));
                                      var $zoom  = Math.round(parseInt($("#zoomval").val()))/100;
                                      var $width = doluseek.map.zoom100pc*$zoom;
                                      var maxsize = doluseek.info.maxsize;
                                      $("#Yval").val(parseInt(($top - (doluseek.map.height - $width)/2)/(doluseek.map.zoom100pc/2 * $zoom)*maxsize));
                                      $("#Xval").val(parseInt(-($left - (doluseek.map.width - $width)/2)/(doluseek.map.zoom100pc/2 * $zoom)*maxsize));
                                      doluseek.map.zoomadjustments();
				       }
              }).bind('mousewheel',function(event, delta) {
                                 var dir = delta > 0 ? 1.1 : 0.9;
                                 $("#zoomval").val($("#zoomval").val()*dir);
                                 doluseek.map.zoomadjustments();
                                 return false;
             });;
          },
         
         'mapcalculations'    : function(){
               var width  = doluseek.map.width          = $(document.body).width() - 201;
               var height = doluseek.map.height         = $(document.body).height() - 117;
               $("#mapholder").height(height).width(width);
               $("#selectorwrapper").height(height);
               doluseek.map.zoom100pc      = Math.min(width,height);
         },

         'zoomadjustments'   : function(){
              doluseek.map.zoom        = Math.round(parseInt($("#zoomval").val()))/100;
              doluseek.map.Yvalue      = Math.round(parseInt($("#Yval").val()));
              doluseek.map.Xvalue      = -Math.round(parseInt($("#Xval").val()));
              var maxsize              = doluseek.info.maxsize;
              var $wandh               =  doluseek.map.zoom100pc * doluseek.map.zoom;
              var $offsetw             = (doluseek.map.width  - doluseek.map.zoom100pc*doluseek.map.zoom)/2;
              var $offseth             = (doluseek.map.height - doluseek.map.zoom100pc*doluseek.map.zoom)/2;
              var $left                = $offsetw  + doluseek.map.zoom100pc/2 * doluseek.map.zoom * doluseek.map.Xvalue/maxsize;
              var $top                 = $offseth  + doluseek.map.zoom100pc/2 * doluseek.map.zoom * doluseek.map.Yvalue/maxsize;
              $("#zoom").css({'left'   : $left      + 'px',
                              'top'    : $top       + 'px',
                              'width'  : $wandh     + 'px',
                              'height' : $wandh     + 'px',
                              'display': 'block'});
        },
         
        'showinfoontown'    : function(towninfo){

             var Xdifference = towninfo.townX-doluseek.map.towninfoofselectedtown.townX;
             var Ydifference = towninfo.townY-doluseek.map.towninfoofselectedtown.townY;
             var $L = Math.sqrt(Math.pow(Xdifference,2 ) + Math.pow(Ydifference,2)) / 10;
             var $shownormalspeed = $L*doluseek.info.speedunits;
             var $showhorsespeed = $shownormalspeed / 3;
             $("#showname").text( 'playername: '       + towninfo.playername);
             $("#showtown").text( 'townname: '         + towninfo.townname);
             $("#showclan").text( 'clan: '             + towninfo.clanname);
             $("#showscore").text('score: '            + towninfo.townscore);
             $("#showplace").text('X: '                + towninfo.townX        + '  Y: ' +  towninfo.townY);
             $("#showL").text('L: ' + $L);
             var $hours = parseInt($shownormalspeed/3600);
             var $minutes = parseInt(($shownormalspeed - $hours*3600)/60);
             var $seconds = parseInt($shownormalspeed - $hours*3600 - $minutes*60);
             $("#shownormalspeed").text('time: ' + $hours + 'h' + $minutes + 'm' + $seconds + 's');
             var $hours = parseInt($showhorsespeed/3600);
             var $minutes = parseInt(($showhorsespeed - $hours*3600)/60);
             var $seconds = parseInt($showhorsespeed - $hours*3600 - $minutes*60);
             $("#showhorsespeed").text('horsetime: ' + $hours + 'h' + $minutes + 'm' + $seconds + 's');

        },
        
        'selectedtown'       : function(towninfo){
             doluseek.map.towninfoofselectedtown = towninfo;
        }
        

} 
   
