if (document && document.documentElement ) {
	document.documentElement.className += " js";
}

/*
 * Implementation script
 */
jQuery(function($){
	
	var jdoc = $(document);
	
	jdoc.find('.autosuggest').each(function(){
        var self = $(this) 
        , dataSrc = self.attr('data-suggestion-src');
        
        self.autoSuggest({
        	className: 'auto-suggestions',
            url: dataSrc,
            selectFirst: false,
            selectMandatory: false,
            size: 8,
            dataMapping: 'cities'
        });
        
    });
	
	jdoc.find('.tab-container').semanticTabs();
    
    /**Opens and closes panels
    $('.widget .panel-header')
    	.prepend('<span class="open-close" />')
    	.find('.open-close')
    	.click(function(e){
    		var self = $(this)
    		, panel = self.closest('.panel')
    		, isClosed = panel.hasClass('closed-panel');
    		
    		panel.find('.panel-body').slideToggle('fast', function(){
    			isClosed ? panel.removeClass('closed-panel') : panel.addClass('closed-panel');
    		});
    		
    	});
    */
    
    jdoc.find('.font-sizer').html("".concat(
		"<span class='normal active'>A</span>",
		"<span class='bigger'>A</span>",
		"<span class='biggest'>A</span>"
	)).fontSizer();
    
    /** Flash embedding code */
    jdoc.find('.flash-properties').each(function(){
    	var json = jQuery.parseJSON(this.innerHTML);
    	jQuery(this)
    		.prev('.media')
    		.flash(json[0], json[1]);
    });
    
    
    jdoc.find('.accordion').each(function(){
    	var self = $(this)
    	, open;
    	self.find('ul').hide();
    	self.delegate('li','click', function(e){
    		var me = $(this)
    		, child = $(this).find('ul')
    		, hasChild = !!child.length;
    		if(hasChild){
    			if(open !== this) {
    				$(open).removeClass('open').find('ul').slideUp('fast');
    			}
    			$(this).addClass('open').find('ul').slideDown('fast');
    			open = this;
    		}
    	});
    });
    
    jdoc.find('.community-map').each(function(){
    	
    	var self = $(this)
    	, defaultView = self.find('.default-view')
    	, lists = self.find('.listing');
    	
    	self.find('.dynamic-map').dynamicMap({
    		click: function(e){   
	    		e.preventDefault();
	    		defaultView.hide();
	    		var ref = this.title;
	    		lists.hide();
	    		self.find('.listing[data-id='+ref+']').show();
	    	}
    	});
    });
    
    jdoc.find('.dynamic-map').dynamicMap();
    
    /** Date Picker with synchronizing
     * 
     */
    jdoc.find('.date-pick').datePicker({
		clickInput: true
	}).bind("dpDisplayed",function(e,dp){
		if ( $(".layout").width() !== 960 ) {
			$(e.target).parent().after( dp );
			$(dp).find(".jCalendar .disabled").each(function(){
				var t = $(this);
				t.html( "<i>" + t.text() + "</i>" );
			});
		}
	});
    
    jdoc.find('#startDate').bind('dpClosed', function(e, selectedDates){
		var d = selectedDates[0];
		if (d) {
			d = new Date(d);
			$('#endDate').dpSetStartDate(d.addDays(0).asString());
		}
	});
    
    jdoc.find('#endDate').bind('dpClosed', function(e, selectedDates){
    	var d = selectedDates[0];
		if (d) {
			d = new Date(d);
			$('#startDate').dpSetEndDate(d.addDays(-1).asString());
		}
    });
	
    jdoc.find('.people .album').each(function(){
		var h = 0
		, row = []
		, people = $(this).find('.person')
		, len = people.length;
		people.each(function(i){
			h = Math.max(h, $(this).height());
			row.push(this);
			if((i+1) % 3 == 0 || (i+1 === len)){
				$(row).height(h);
				h = 0;
				row = [];
			}
		});
		
	});
	
	function eqPanels( cssExp ){
		var m = 0;
		jdoc.find( cssExp )
			.height('auto')
			.delay(10)
			.each(function(){
				var p = $( this );
				m = Math.max( p.height() , m );
			})
			.height( m )
		;
	}
	
	eqPanels( '.panel:not(.big) .scroll' );
	eqPanels( '.panel.big .scroll' );
	
	jdoc.bind("font-resize",function(e){
		eqPanels( '.panel:not(.big) .scroll' );
		eqPanels( '.panel.big .scroll' );
	});
	
	if(location.hash) {
		
		var title = unescape(location.hash.replace(/^#/,''));
		if(title){
			jdoc.find('ul.feed-list a').each(function(){
				if(this.name === title) {
					$(this.parentNode).addClass('hash-target');
				}
			});
		}
	}
	
	var eventForm = $('.eventform form').validate({
		rules: {
			startTime: /^(?:(?:[0-1]{0,1}\d|2[0-4]):[0-5]\d|\s?)$/,
			endTime: /^(?:(?:[0-1]{0,1}\d|2[0-4]):[0-5]\d|\s?)$/
		},
		messages: {
			price: "Getal met ',' toegestaan",
			startTime: "Uw begintijd is niet correct. Deze moet de volgende notatie hebben: bijv. 08:30 of 8:30",
			endTime: "Uw eindtijd is niet correct. Deze moet de volgende notatie hebben: bijv. 08:30 of 8:30",
			number: "Getal met '-' of ',' toegestaan",
			zipcode: "Voer postcode in (bijv. 1234AB)"
		}
	});
	
	eventForm.bind("invalid",function(e,result){
		var el = $( e.target )
		, msg = result.message || el.attr("title")
		, id = el.attr("name")
		, er = el.parent().find(".error")
		;
		if ( !er.length && msg ) {
			el.parent().prepend("<div class='error'></div>");
			er = el.parent().find(".error");
		}
		if ( msg ) {
			er.find("p[rel="+id+"]").remove();
			er.append("<p rel='"+id+"'>"+msg+"</p>");
		}
	});
	
	eventForm.bind("valid",function(e,result){
		var el = $( e.target )
		, id = el.attr("name")
		;
		$( e.target ).parent().find(".error p[rel="+id+"]").remove();
	});
	
	
	eventForm.find( "#city_id,#address_id" ).bind( "blur", function( e ){
		
		var geocoder = new GClientGeocoder()
		, city = eventForm.find( "#city_id" ).val() || ""
		, addressField = eventForm.find( "#address_id" )
		, address = addressField.val()
		, loc = address + ", " + city
		;
		
		function stopSubmit(e){
			e.preventDefault();
			return false;
		}
		
		function setValid( field ) {
			field.trigger( "valid", {valid:true} );
			field.removeClass( "invalid" );
			field.addClass( "valid" );
			field.attr( "title" , field.data('original-title') );
		}
		
		function setInvalid( field ) {
			field.trigger( "invalid",{
				valid: false,
				message: "Adres: '" + address + "' komt niet voor in " + city
			});
			field.removeClass( "valid" );
			field.addClass( "invalid" );
			field.attr( "title" , "Adres: '" + address + "' komt niet voor in " + city );
		}
		
		if ( !city || !address ) return; // let validator take care of this.
		
		eventForm.submit( stopSubmit );
		
		geocoder.getLocations( loc, function( res ) {
			
            if ( !res || res.Status.code != 200 ) {
            	
                setInvalid( addressField );
                
            } else {
            	
            	setValid( addressField );
                res = res.Placemark[0];
                jdoc.find("#latitude_id").val( res.Point.coordinates[ 1 ] );
                jdoc.find("#longitude_id").val( res.Point.coordinates[ 0 ] );
        		
            }
            
            eventForm.unbind( "submit", stopSubmit );
            
	    } );
		
		e.preventDefault();
		
	} );
	
	eventForm.find("#endDate,#startDate").attr("readOnly",true);
	
	jdoc.find('.eventform :input').tooltip({
		gravity:'n',
		fadeSpeed: 200,
		trigger: 'focus',
		backgroundColor: "#F60",
		opacity: 1
	});
	
	
	jdoc.find('.form-container').ajaxFormValidator({
		validateService: contextPath + '/.forms/nl'
	});
	
	jdoc.find('.event-calendar').each(function(){
		
		var self = $(this)
		, open = self.find('.open'); 
		
		self.delegate('.events>li:not(.open)', 'click', function(){
			if(open.length) {
				open.find('.detail').slideUp();
				open.find('.summary').slideDown();
				open.removeClass('open');
			}
			open = $(this);
			open.find('.detail').slideDown();
			open.find('.summary').slideUp();
			open.addClass('open');
		});
		
	});
	
	jdoc.find('form.search').validate({
		messages: {
			whowhat: "Zoekterm is verplicht",
			where: "Lokatie is verplicht"
		}
	}).delegate(":input","invalid",function( e ){
		
		var self = $( this );
		
		self.validationMessage( self.attr( "title" ) )
			.appendTo("body")
			.css( {
				left : self.offset().left - 4,
				top : self.offset().top + self.height() + 5
			} );
		
	}).delegate(":input","valid",function( e ){
		
		$(this).validationMessage().remove();
		
	});
	
	var onEditCallback = function(remaining){
		$(this).siblings('.charsRemaining').text("Characters remaining: " + remaining);

		if(remaining > 0){
			$(this).removeClass('limited');
		}
	};

	var onLimitCallback = function(){
		$(this).addClass('limited');
	};

	jdoc.find('textarea[maxlength]').limitMaxlength({
		onEdit: onEditCallback,
		onLimit: onLimitCallback
	});
	
	jdoc.find(".bookmark-page").bookmark();
	
});






