function log(e)
{
  //return false;
  if(typeof(console)=='object') console.log(e);
  //else alert(e);
};


function heightsEqualizer(elements, rwdl){
    var self = this;
    self.elements = elements;
    self.rwdl = typeof rwdl != 'undefined' ? rwdl : false;

    self.equalize = function(){
        var max = 0;
        $(self.elements).each(function(){
            if ($(this).css('min-height', '0').height('auto').height() > max) {
                max = $(this).height();
            }
        });
        if ($.browser.msie && parseInt($.browser.version) < 7) {
            $(self.elements).height(max + 'px');
        }
        else {
            $(self.elements).css('min-height', max + 'px');
        }
    }

    self.equalize();

    if (self.rwdl) {
        self.timer = window.setInterval(function(){
            try {
                self.equalize
            }
            catch (e) {
            }
        }, 50);
        $(window).load(function(){
            window.clearInterval(self.timer);
        });
    }
};



/**
 * Google maps class
 */
var gmap = {
	// PINS DEFINITIONS
	pins: {
	  container: {
	    image: 'pin-container.png',
	    width: 38,
	    height: 53
	  },
	  seat: {
	    image: 'pin-seat.png',
	    width: 22,
	    height: 30
	  },
	  trash: {
	    image: 'pin-trash.png',
	    width: 22,
	    height: 30
	  }
	},

	// Filtering
	init: function(){
		var finputs = $('#servicesMapFilter input');
		finputs.change(function(){
			var show = [];
			finputs.each(function(){
				if($(this).is(':checked'))
				{
				  show[show.length] = $(this).attr('name');
				}
			});
		  gmap.redraw(show)
		});
		finputs.each(function(){
			if($(this).is(':checked'))
			{
			  gmap.show[gmap.show.length] = $(this).attr('name');
			}
		});
		// Click on list
		$('.servicesList a[rel*=spot]').click(function(){
			var dt = $(this).attr('rel').match(/spot\[([^\]]+)\]\[(\d+)\]/);
			var group = dt[1];
			var id = dt[2];
			var index = gmap.findById(id);
			var found = false;
			var delay = 0;
			var i;
			// If group is invisible, show group and redraw map
			for(i=0; i<gmap.show.length; i++)
			{
			  if(gmap.show[i]==group)
			  {
			    found = true;
			    break;
			  }
			}
			if(!found)
			{
			  gmap.show[gmap.show.length] = group;
			  $('#servicesMapFilter input[name='+group+']').attr('checked', true);
	  		gmap.showMaps();
				delay = 300;
			}
			window.setTimeout(function(){
				// Focus on spot
				gmap.focus(null, index);
			}, delay);
			return false;
		});
	},
	/**
	 * Push map data into stack
	 * @param {Object} id
	 * @param {Object} lat
	 * @param {Object} lon
	 * @param {Object} markerTitle
	 * @param {Object} address
	 * @param {Object} zoom
	 */
	push: function(id, lat, lon, markerTitle, address, zoom){
		var mdata = {
			id: id,
			lat: lat,
			lon: lon,
			markerTitle: markerTitle,
			address: address,
			zoom: zoom
		};
		gmap.stack[gmap.stack.length] = mdata;
		return mdata;
	},
	/**
	 * Show map
	 * @param {Object} id
	 * @param {Object} lat
	 * @param {Object} lon
	 * @param {Object} markerTitle
	 * @param {Object} zoom
	 */
	showMaps: function(){
		if (typeof(google) == 'undefined')
			return false;
		for (var i = 0; i < gmap.stack.length; i++)
		{
			var mdata = gmap.stack[i];
			gmap.placeMap(gmap.stack[i]);
		};
	},
	placeMap: function(mdata){
		var myLatlng = new google.maps.LatLng(mdata.lat, mdata.lon);
		var myOptions = {
			zoom: mdata.zoom ? mdata.zoom : 14,
			center: myLatlng,
			mapTypeId: google.maps.MapTypeId.ROADMAP
		}
		gmap.ngmap = new google.maps.Map(document.getElementById(mdata.id), myOptions);
		if( mdata.markerTitle )
		{
			var marker = new google.maps.Marker({
				position: myLatlng,
				map: gmap.ngmap,
				title: mdata.markerTitle
			});
		}
		gmap.showPlaces();
	},
	isGroupVisible: function(group){
		var i;
	  for(i=0; i<gmap.show.length; i++)
	  {
	  	if(group==gmap.show[i])
	  	{
	  	  return true;
	  	}
	  }
	  return false;
	},
	showPlaces: function(){
	  // Groups
	  var groupi;
	  var gi = 0;
	  for(groupi in gmap.places)
	  {
	    var group = gmap.places[groupi];
		  // Filtering
		  var visible = gmap.isGroupVisible(group.id);
	    // Spots in group
	    var spoti;
	    for(spoti = 0; spoti < group.spots.length; spoti++)
	    {
	      var spot = group.spots[spoti];
	      // Create custom marker
	      var image = new google.maps.MarkerImage('/images/'+gmap.pins[group.id].image,
		      new google.maps.Size(gmap.pins[group.id].width, gmap.pins[group.id].height),
		      new google.maps.Point(0,0),
		      new google.maps.Point(gmap.pins[group.id].width/2, gmap.pins[group.id].height)
				);
				// Create info window
        var infowindow = new google.maps.InfoWindow({
				    content: '<div class="mapiw"><p class="header '+group.id+'">'+group.header+'</p><p class="addr">'+spot.title+'</p><p>'+spot.desc+'</p></div>'
				});
				// Create location
				var myLatlng = new google.maps.LatLng(spot.lat, spot.lon);
				// Create marker
	      var marker =  new google.maps.Marker({
					position: myLatlng,
					map: gmap.ngmap,
					title: spot.title,
					icon: image,
					visible: visible
				});
				// Push data to stack
				gmap.pstack[gi] = {
				  spot: spot,
				  infowindow: infowindow,
				  marker: marker,
				  group: group.id
				};
				// Onclick event
				google.maps.event.addListener(gmap.pstack[gi].marker, 'click', function() {
				  gmap.focus(this, null);
				});
				gi++;
	    }
	  }
	},
	redraw: function(show){
	  gmap.show = show;
	  gmap.showMaps();
	},
	focus: function(marker, forceindex) {
    var markerindex = -1;
    // Find right marker index and close all windows
    var i;
    var place;
    for(i=0; i<gmap.pstack.length; i++)
    {
    	place = gmap.pstack[i];
      if(typeof place.marker != 'undefined' &&place.marker == marker)
      {
        markerindex = i;
        //break;
      }
      if(typeof place.infowindow != 'undefined')
      {
	      place.infowindow.close();
      }
    }
    // Force marker index
    if(forceindex!==null)
    {
      markerindex = forceindex;
    }
    // Show infowindow
    if( markerindex >= 0 && typeof gmap.pstack[markerindex].marker != 'undefined' )
    {
    	gmap.pstack[markerindex].infowindow.open(gmap.ngmap, gmap.pstack[markerindex].marker);
    }
  },
  findById: function(id){
  	var i=0;
    for(i; i<gmap.pstack.length; i++)
    {
      if(gmap.pstack[i].spot.id==id)
      {
				return i;
      }
    }
    return null;
  },
	stack: [],
	show: [],
	places: [],
	pstack: []
};

var advClasses = {
	init: function()
	{
	  advClasses.html();
	  advClasses.tables();
	  //advClasses.external();
	},
	tables: function()
	{
	  $('tr:odd').addClass('odd');
	  $('tr:even').addClass('even');
	},
	html: function()
	{
    for (var bname in $.browser)
		{
        if (bname == 'version')
        {
        	var ver = parseInt($.browser[bname]);
				}
				else
				{
        	var bodyclass = bname;
        }
    }
    $('html').addClass(bodyclass);
    $('html').addClass(bodyclass+'-'+ver);
	},
	external: function()
	{
	  $('#content a[href^="http"]:not([href*='+window.location.host+'])').filter(function(){ return !$(this).find('img').length }).addClass('external');
	}
};

function refreshCalendar()
{
	var dtp = $( "#datepicker" );
	var api = dtp.data('datepicker');
	if(typeof api!='undefined')
	{
		// Get events
		$.ajax({
		  url: '/ajax-calendar',
		  dataType: 'json',
		  data: {
				day: api.selectedDay,
				month: api.selectedMonth + 1,
				year: api.selectedYear
			},
			success: function(data){

				if(data.length)
				{
				  // Create and append table
					var table = '';
					table += '<div id="list-calendar-wrap"><table class="list-calendar">';
					var i;
					var event;
					var dtptds = dtp.find('.ui-datepicker-calendar td');
					for(i=0; i<data.length; i++)
					{
					  event = data[i];
					  table += '<tr><td class="date"><strong>'+event.day+'.'+event.month+'.</strong><span class="forBlind">'+event.year+'</span></td><td><h4>'+event.title+'</h4>'+event.info+'</td></tr>';
					  // Highlight day in datepicker
					  dtptds.each(function(){
					    if($(this).text() == event.day){
					      $(this).addClass('event');
					    }
						});
					}
					table += '</table></div>';
					$('#calendarPlaceholder').html(table);
					$('#calendarPlaceholder').find('tr:even').addClass('even');
				}else
				{
	                $('#calendarPlaceholder').html('');


	            }
			}
		});
	}

	
}


$(document).ready(function() {

	advClasses.init();

	/*********************** Obecne funkce - formulare **********************/
	$(".link-newwin").attr('target','_blank');

	$('input[type=text]').focus(function(event){if ($(this).attr('value') == $(this).attr('title')) {$(this).attr('value','');}});
	$('input[type=text]').blur(function(event) {if ($(this).attr('value') == '') {$(this).attr('value',$(this).attr('title'));}});	

	$('textarea').focus(function(event){if ($(this).attr('value') == $(this).attr('title')) {$(this).attr('value','');}});	
	$('textarea').blur(function(event) {if ($(this).attr('value') == '') {$(this).attr('value',$(this).attr('title'));}});

	/*********************** Fonty **********************/
	if (Cufon && Cufon.replace) {
		Cufon.replace('h1,.cufon,.hc-top h2 strong, .hc-top strong.title, .hc-top h2 span, .hc-gray strong.title, .maps strong.title, #guidepost .lineA', { fontFamily: 'Myriad Pro Bold' });
		Cufon.replace('#guidepost .lineB', { fontFamily: 'Myriad Pro' });
	}

	/***********************  Rozbalovani a sbalovani menu **********************/
	jQuery('.list-contacts a').click(function() {
		if ($(this).hasClass('selected')) {
			$(this).removeClass('selected')
			$(this).next().slideUp('fast');		
		} else {
			$(this).addClass('selected');
			$(this).next().slideDown('slow');		
		}
		return false;
	});

	jQuery('.list-contacts .contact-item').slideUp('fast');	

	jQuery('#menu-left a.ico').click(function() {		
		if ($(this).parent().hasClass('opened')) {
			$(this).next().slideUp('slow',function() {$(this).parent().removeClass('opened')});
			
		} else {
			$(this).parent().addClass('opened');
			$(this).next().slideDown('slow');		
		}
		return false;
	});

	jQuery('#menu-left ul').filter(function(){
		var active = $(this).find('.active');
		active.parents('li').addClass('opened');
		return !active.length;
	}).hide();

	jQuery('.list-contacts li:even').addClass('even');
	
	$( "#datepicker" ).datepicker({
    onChangeMonthYear: function(){ refreshCalendar(); }
	});
	refreshCalendar();
	
	$('.servicesList').each(function(){
		new heightsEqualizer( $(this).find('.col'), false);
	});
	$('.galleryRow').each(function(){
		new heightsEqualizer( $(this).find('.gallery'), false);
	});
	$('.animationRow').each(function(){
		new heightsEqualizer( $(this).find('.animation'), false);
	});
	
 	new heightsEqualizer('#guidepost .description', false);
 	new heightsEqualizer('.hc-top .list-links', false);

	$('.gallery .title a').click(function(){
		$(this).parents('.gallery').find('.picture a').trigger('click');
		return false;
	});

  $("a.lightbox").fancybox();
  
  // ****************************

  var textarea = $('#requestForm_descrption');
  if(textarea.length)
  {
	  var note = $('#requestForm_descrption').siblings('.note');
	  var maxCount = note.find('.max');
	  var currentCount = note.find('.current');
	  var overWarn = note.find('.over');
		var maxLen = 1800;
		maxCount.text(maxLen);
		function checkText(){
		  var len = maxLen - textarea.attr('value').length;
		  currentCount.text( len );
		  if(len < 0)
		  {
		    overWarn.text('Překročen délka, text bude zkrácen!');
		  }
			else
			{
		    overWarn.text('');
			}
		}
		textarea.bind('keyup blur focus', checkText);
	checkText();
	}
  
	
});

window.onload = function(){
	if (typeof(gmap) != 'undefined')
	{
		gmap.init();
		gmap.showMaps();
	}
};
