__LAST_SUBMIT_FORM = false;

function bindForms() {
    $('.ajaxforms form .edit-link').unbind('click');
    $('.ajaxforms form .edit-link').bind('click', function(event) {
	event.preventDefault();
	toggleEditForm(event);
    });
    $('.ajaxforms form .cancel').unbind('click');
    $('.ajaxforms form .cancel').bind('click', function(event) {
	event.preventDefault();
	toggleEditForm(event);
    });
    $('.ajaxforms form .delete').unbind('click');
    $('.ajaxforms form .delete').bind('click', function(event) {
	event.preventDefault();
	deleteForm(event);
    });
    $('.ajaxforms form .submit').unbind('click');
    $('.ajaxforms form .submit').bind('click', function(event) {
	event.preventDefault();
	submitForm(event);
    });

	
    $('.ajaxforms form .field .richtext:not(.richeditor)').each(function(){
	$(this).tinymce({
	    // Location of TinyMCE script
	    // auto resize buggie! for now not using it
	    script_url : BASE_URL+'/scripts/tiny_mce/tiny_mce.js',
	    mode:"textareas",
	    apply_source_formatting : true,
	    cleanup_on_startup : true,
	    auto_reset_designmode : true,
	    plugins : "paste",
	    //plugins : "paste,autoresize",
	    paste_strip_class_attributes : true,
	    paste_remove_spans:true,
	    paste_remove_styles:true,
	    paste_create_paragraphs : false,
	    theme : "advanced",
	    theme_advanced_toolbar_location : "top",
	    theme_advanced_toolbar_align : "left",
	    theme_advanced_buttons1 : "bold,italic,underline,strikethrough,|,bullist,numlist,separator,outdent,indent,separator,undo,redo,separator",
	    theme_advanced_buttons2 : "",
	    theme_advanced_buttons3 : "",
	    width:'96%',
	    height:'300'
	});
	$(this).addClass('richeditor');
    });

    $('.ajaxforms form .btnAddressLookup').unbind('click');
    $('.ajaxforms form .field .googlemapslookup').each(function(){
	var map_canvas = $(this).find('.map_canvas');
	$(this).find('.btnAddressLookup').bind('click', function(event) {
	    map = new GMap2(map_canvas[0]);
	    map.clearOverlays();
	    geocoder = new GClientGeocoder();
	    var input = $(this).parent().find('.inputAddressLookup');
	    if (input.val().length>0)
	    {
		geocoder.getLocations(input.val(), showAddress);
	    }
	});
	$(this).bind("keydown", function(event) {
	    if (event.keyCode == 13) {
		event.preventDefault();
		$(this).find('.btnAddressLookup').trigger('click');
	    }
	});

    });
}

function toggleEditForm(event) {
    var form = $(event.target).parents('form:eq(0)');
    form.toggleClass('in-edit-mode');
    var buttons = form.find('.buttons');
	
    clearErrors(form);

    var target = form.parents('.target-edit:eq(0)');
    if (target.length == 0) {
	target = form.parents('.target-add:eq(0)');
    }

    // capture the return key
    form.bind("keydown", function(event) {
	if (event.keyCode == 13) {
	    form.ajaxSubmit(options);
	    event.preventDefault();
	}
    });
    buttons.toggleClass('hidden');
    form.find('.field .input').toggleClass('hidden');
    $('.ajaxforms form .field .input.googlemapslookup').each(function()
    {
	if (!$(this).hasClass('hidden'))
	{
	    $(this).find('.btnAddressLookup').trigger('click');
	}
    });
}

function clearErrors(form)
{
    //remove old errors if there are any
    form.find('.field .errormsg').remove();
    form.find('.field .input .error').removeClass('error');
}

function submitForm(event) {
    var event = event;
    var form = $(event.target).parents('form:eq(0)');
    var target = form.parents('.target:eq(0)');
    $(event.target).fadeOut();
    __LAST_SUBMIT_FORM = form;
	
    $.post(form.attr('action'), form.serialize(), function(response) {
	try {
	    var errors = JSON.parse(response);
	    $(event.target).fadeIn();
	    processErrors(errors);
	}
	catch(e){
	    target.replaceWith(response);
	    bindForms();
	    var form = target.find('form');
	    if (form.length > 0) {
		target.parent().prepend('<div class="target-add hidden"></div>');
		target.removeClass('target-add');
		target.addClass('target-edit');
	    }
	}
    });
    return false;
}

function processErrors(data)
{
    if (!__LAST_SUBMIT_FORM)
    {
	return false;
    }
    /* remove old errors */
    __LAST_SUBMIT_FORM.find('.field .errormsg').remove();
	
    $.each(data.errors, function(inputname, errors){
	var selector = "input[name='"+inputname+"'],select[name='"+inputname+"'],textarea[name='"+inputname+"']";
	var input = __LAST_SUBMIT_FORM.find(selector);
	var field = input.parents('.field:eq(0)');
	if (errors.length>0)
	{
	    var errormsg = jQuery('<div>').addClass('errormsg').addClass('hidden');
	    field.prepend(errormsg);
	    $.each(errors, function(i){
		var errorType = errors[i];
		var errorMessage = data.messages[inputname][errorType];
		var message = jQuery('<div>').addClass('message error').text(errorMessage);
		//message.css('margin-left', field.find('.input:eq(0)').css('margin-left'));
		errormsg.append(message);
	    });
	    errormsg.slideToggle("fast");
	    input.addClass('error');
	}
	else
	{
	    input.removeClass('error');
	}
    });
}

function deleteForm(event) {
    if (confirm('Huidige item verwijderen ?')) {
	var form = $(event.target).parents('form:eq(0)');
	var target = form.parents('.target:eq(0)');
	var identifier = form.find('.field .identifier');
	var idName = identifier.attr('name');
	var idVal = identifier.val();
	var url = form.attr('action');
	form.find('.edit-link').trigger('click');
		
	var params = {};
	params[idName] = idVal;
	params['delete'] = true;
		
	$.ajax( {
	    type : "POST",
	    url : form.attr('action'),
	    data : params,
	    success : function(msg) {
		target.slideUp(1000, function() {
		    target.remove();
		});
	    }
	});
    }
    ;
    return false;
}

function toggleAddForm(file, type) {
    var target = $('.'+type+' .new' );
    if (target.children().length == 0)
    {
	var target = $('.'+type+':first' );
	newtarget = jQuery('<div>').addClass('new');
	target.prepend(newtarget);
	newtarget.load(file, function (responseText, textStatus, XMLHttpRequest){
	    var tmp = $(this);
	    tmp.children(':first').prependTo(tmp.parent());
	    var newitem = tmp.parent().children(':first');
	    tmp.remove();

	    newitem.addClass('hidden');
	    newitem.addClass('new');
			
	    bindForms();
	    var form = newitem.find('form');
	    var btnCancel = form.find('.cancel');
	    var btnDelete = form.find('.delete');
	
	    form.find('.edit-link').trigger('click');
	    form.find('.edit-link').addClass('hidden');
	
	    btnDelete.addClass('hidden');
	    btnCancel.unbind('click');
	    btnCancel.bind('click', function(event){
		newitem.slideToggle("fast");
	    });
	    newitem.slideToggle("fast");
	});
    }
    else
    {
	target.slideToggle("fast");
    }
}

function addRow(file, type)
{
    var target = $('.'+type+':first' );
    newtarget = jQuery('<div>');
    target.prepend(newtarget);
    newtarget.load(file, function (responseText, textStatus, XMLHttpRequest){
	var tmp = $(this);
	tmp.children(':first').prependTo(tmp.parent());
	var newitem = tmp.parent().children(':first');
	tmp.remove();

	newitem.addClass('hidden');
	newitem.slideToggle("fast");
    });
}

function callbackDeleteRows(response)
{
	
    selectors = $.map(response, function(el,i){
	return '.row#row_'+el;
    });
    var toBeRemoved = $(selectors.join(','));
    toBeRemoved.remove();
	
	
}

function postForm(action, formId, callback)
{
    var form = $('#'+formId);
    $.post(action, form.serialize(), callback, 'json');
}

/* todo: this should be relative to the current map */
function showAddress(response) {
    map.clearOverlays();
    if (!response || response.Status.code != 200) {
	alert("Status Code:" + response.Status.code);
    } else {
	var formattedAddress = '';
	var Place = response.Placemark[0];
	if (Place)
	{
	    var point = new GLatLng(Place.Point.coordinates[1],Place.Point.coordinates[0]);
	    var Latitude = Place.Point.coordinates[1];
	    var Longitude = Place.Point.coordinates[0];
	    $('#hiddenLatitude').val(Latitude);
	    $('#hiddenLongitude').val(Longitude);
	    var AddressDetails = Place.AddressDetails;
	    var Country = AddressDetails.Country;
	    var CountryName = Country.CountryName;
	    formattedAddress += CountryName;
	    $('#hiddenCountry').val(CountryName);

	    var AdministrativeArea = AddressDetails.Country.AdministrativeArea;
	    if (AdministrativeArea)
	    {
		var ProvinceName = AdministrativeArea.AdministrativeAreaName;
		formattedAddress += ', ' +ProvinceName;
		$('#hiddenProvince').val(ProvinceName);
		var Locality = AdministrativeArea.Locality;
		var CityName = Locality.LocalityName;
		$('#hiddenCity').val(CityName);
		formattedAddress += ', ' +CityName;
		var DependentLocality = Locality.DependentLocality;
		if (DependentLocality && DependentLocality.PostalCode)
		{
		    var PostalCode = DependentLocality.PostalCode;
		    var PostalCodeNumber = PostalCode.PostalCodeNumber;
		    $('#hiddenPostalcode').val(PostalCodeNumber);
		}
		if (AdministrativeArea.Locality && AdministrativeArea.Locality.PostalCode)
		{
		    var PostalCode = AdministrativeArea.Locality.PostalCode;
		    var PostalCodeNumber = PostalCode.PostalCodeNumber;
		    $('#hiddenPostalcode').val(PostalCodeNumber);
		}
	    }
	    marker = new GMarker(point);
	    map.setCenter(point,14);
	    map.addOverlay(marker);
	    marker.openInfoWindowHtml('<b>Locatie:</b><br />' + formattedAddress);
	    $('#hiddenFormattedAddress').val(formattedAddress);
	}

    }
}

function getLocations(address)
{
    geocoder.getLocations(address, showAddress);
}