jQuery(function($) {

    /**
     * menu
     */

    $('#menu ul ul').hide();
    $('#menu ul li').hover(
        function() {
            $(this).toggleClass('current');
            $('ul', this).show();
        },
        function() {
            $(this).toggleClass('current');
            $('ul', this).hide();
        }
    );

    /**
     * language select
     */

    $('#applicationLanguageChange a.lang, #indexLanguageChange a.lang').live('click', function() 
    {
        var lang = $(this).attr('rel');
        $.ajax({
            url: '/application/language',
            type: 'post',
            data: {lang: lang}
        });
        return false;
    });

    /**
     * sign up form
     *
     */

    $('#home-avatar').bind('edit', function(event, data) {
        $(this).val($.toJSON(data)).change();
    });

    $('#home-avatar').change(function() {
        var value = $(this).val();
        var frame = $('#avatar-frame').html('');

        if (value.length > 0) {
            var data = $.parseJSON(value);
            var img  = $('<img />').attr('src', data.url);

            if (data.url) {
                frame.append(img);
            }
        }
    }).change();

    $('#avatarupload').livequery('change', function() {
        $("#loading")
            .ajaxStart(function() {
                $(this).show();
            })
            .ajaxComplete(function() {
                $(this).hide();
            });
        $.ajaxFileUpload({
            url: '/account/upload',
            fileElementId: 'avatarupload',
            dataType: 'json',
            secureuri:false,
            success: function (data, status) {
                $(data).run();
            },
            error: function (data, status, e) {
                alert(e);
            }
        });
    });

    /**
     *  tabs
     *
     */

    $('div.tabs a').each(function() {
        if ($(this).attr('href') == location.pathname) {
            $(this).addClass('active');
        } else {
            $(this).removeClass('active');
        }
    });

    $('div.tabs.hashchange').each(function() {
        var tabs = $(this);

        $(window).hashchange(function() {
            var hash    = location.hash.replace(/#/, '');
            var content = $('#content');

            if (hash.length == 0) {
                hash = $('a:first', tabs).attr('href').replace(/#/, '');
                location.hash = hash;
            }

            $('form > dl.form > fieldset', content).hide();
            $('#fieldset-' + hash, content).show();
            $('li a.active', content).removeClass('active');
            $('li a[href="' + location.hash + '"]', content).addClass('active');
        }).hashchange();
    });

    $('div.tabs.hashchange').each(function() {
            var errors = $('ul.errors li:first');

            if (errors.length > 0) {
                var id = errors.parents('fieldset:last').attr('id').replace(/fieldset-/, '#');
                location.hash = id;
            }
    });

    $('form button.next').click(function() {
        var hash = location.hash.replace(/#/, '');
        hash = $('#fieldset-' + hash).next('fieldset').attr('id').replace(/fieldset-/, '#');
        location.hash = hash;
        return false;
    });

    /**
     * object details
     *
     */

    $('#imageThumbs img').hover(function() {
        $('#imageLarge img').attr('src', $(this).attr('src').replace(/_54x54/, '_w535'));
    });


    /**
     * index
     *
     */

    $('#indexWelcomeText').css('opacity', 0.9);
    $('#indexWelcomeText').each(function() {
        $('#menu').hide();
        $('#content').addClass('noauth');
    });
    $('#indexWelcomeText div.column').hover(function() {
        var column = $(this);
        var container = $('div.textContainer', column);
        var text = $('div.text', container);

        column.animate({'height': '320px'}).queue(function() {
            container.animate({height: '220px'}).queue(function() {
                text.fadeIn('fast').queue(function() {
                    $(text).dequeue();
                    $(column).dequeue();
                    $(container).dequeue();
                });
            });
        });
    }, function() {

    });
    //$('#indexWelcomeText div.column:first').hover();

    /**
     * filter form
     *
     */

    $('div.filter h3 a').click(function() {
        var container = $(this).closest('div.filter');
        var form = $('div.form', container);
        form.toggle();

        if (form.is(':visible')) {
            $(this).html($._('ausblenden'));
        } else {
            $(this).html($._('einblenden'));
        }
    });

    /**
     * wall
     *
     */

    $('#wall textarea').focus(function() {
        $('#wall div.footer').removeClass('hide');
        $(this).css('height', '66px');
    });
    $('#wall').bind('add', function(event, data) {
        $(this).clearForm();
        $(data.html).hide().prependTo('#wallEntries').slideDown('fast');
    });
    $('#wall').bind('comment', function(event, data) {
        var container = $('#wallentry' + data.entry, '#wallEntries');
        var position = $('div.wallCommentNew', container);
        $('div.wallComments:last textarea', container).next('div').hide();
        $('form', container).clearForm();
        $(data.html).hide().insertBefore(position).slideDown('fast');
    });
    $('#wall').bind('delete', function(event, data) {
        $(data.element, '#wallEntries').slideUp('fast', function() {
            $(this).remove();
        });
    });
    $('textarea.wallCommentNew').livequery(function() {
        $(this).focus(function() {
            $(this).next('div').show();
        });
    });

    /**
     * single file upload window (ajax)
     *
     */

    $('div.window input[type="file"]').livequery('change', function() {
        var elem = $(this);
        var form = elem.closest('form');
        var id   = elem.attr('id');
        var url  = form.attr('action');
        var win  = form.closest('div.window');

        win.uploading();

        $.ajaxFileUpload({
            url: url,
            fileElementId: id,
            secureuri: false,
            dataType: 'json',
            success: function (data, status) {
                win.stopUploading();
                $(data).run();
            },
            error: function (data, status, e) {
                win.stopUploading();
                console.debug(data, status, e);
                alert(e.message + "\n" + $.toJSON(data));
            }
        });
    });

    /**
     * updates or removes profile image / logo
     */

    $('#avatar').bind('edit', function(event, data) {
        $('img', this).attr('src', data.url);
    });
    $('#profileLogo').bind('delete', function(event, data) {
        $('img', this).fadeOut('fast', function() {
            $(this).remove();
        });
    });
    $('#profileLogo').bind('edit', function(event, data) {
        var img = $('img', this);

        if (!img.length) { // if no logo exists
            img = $('<img />').appendTo(this).load(function() {
                $(this).fadeIn('fast');
            });
        }

        img.attr('src', data.url);
    });

    /**
     * object form
     *
     */

    //makeSublist('child','grandsun', false, '');

    $('#attachmentResultImages').bind('add', function(event, params, data) {
        var span = $('<span />')
            .addClass('image')
            .appendTo(this);
        var input = $('<input type="hidden" />')
            .attr('name', params.element)
            .appendTo(span)
            .val($.toJSON(params));
        var anker = $('<a />')
            .attr('href', '#delete')
            .appendTo(span);
        var img = $("<img />")
            .hide()
            .load(function() {
                $(this).fadeIn('fast');
            })
            .appendTo(anker)
            .attr('src', params.url);
    });

    $('#attachmentResultImages a').live('click', function() {
        var title = $._('Möchten Sie das Bild wirklich löschen?');
        var result = window.confirm(title);
        if (result) {
            var span = $(this).closest('span').fadeOut('fast');
            var input = span.find('input');
            var data = $.parseJSON(input.val());
            data.status = 'delete';
            input.val($.toJSON(data));
        }
        return false;
    });


    $('#attachmentResultDocuments, #attachmentResultVideos').bind('add', function(event, params, data) {
        var div = $('<div />')
            .addClass('file')
            .appendTo(this);
        var input = $('<input type="hidden" />')
            .attr('name', params.element)
            .appendTo(div)
            .val($.toJSON(params));
        var anker = $('<a />')
            .attr('href', '#delete')
            .appendTo(div);
        var file = $("<span />")
            .html(params.name)
            .appendTo(anker);
    });

    $('#attachmentResultDocuments a, #attachmentResultVideos a').live('click', function() {
        var title = $._('Möchten Sie die Datei wirklich löschen?');
        var result = window.confirm(title);
        if (result) {
            var span = $(this).closest('div').fadeOut('fast');
            var input = span.find('input');
            var data = $.parseJSON(input.val());
            data.status = 'delete';
            input.val($.toJSON(data));
        }
        return false;
    });


    $('input.token').livequery(function() {
        var defaults = $.parseJSON($(this).val());
        $(this).val('').tokenInput("/messages/autocomplete", {
            hintText: $._("Tippen Sie den Namen ein..."),
            noResultsText: $._("Keinen Kontakt gefunden."),
            searchingText: $._("suchen..."),
            searchDelay: 300,
            minChars: 1,
	    prePopulate: defaults
        });
    });

    var geocoder;
    var map;

    $(document).ready(function() {
        $('div.map').each(function() {
            try {
                var coords = $(this).html().split(',');
                var latlng = new google.maps.LatLng(coords[0], coords[1]);
                var options = {
                  zoom: 14,
                  center: latlng,
                  mapTypeId: google.maps.MapTypeId.HYBRID
                };
                var map = new google.maps.Map($(this)[0], options);
                var marker = new google.maps.Marker({
                    position: latlng,
                    map: map
                });
            } catch(e) {
                alert(e.message);
            }
        });

        $('#mapsearch').each(function() {
            var urlPrefix = '/' + $(this).attr('class');
            var lat       = '47';
            var lng       = '10';
            var zoom      = 4;

            function attachWindow(marker, data) {
                google.maps.event.addListener(marker, 'click', function() {
                    $.ajax({
                        url: urlPrefix + '/info',
                        type: 'post',
                        data: data
                    });
                });
            }

            try {
                if (location.hash.length > 3) {
                    var defaults = location.hash.replace(/^#/, '').split(';');
                    lat  = defaults[0];
                    lng  = defaults[1];
                    zoom = parseInt(defaults[2]);
                }

                var options = {
                  zoom: zoom,
                  center: new google.maps.LatLng(lat, lng),
                  mapTypeId: google.maps.MapTypeId.TERRAIN
                };

                map = new google.maps.Map($(this)[0], options);
                geocoder = new google.maps.Geocoder();

                google.maps.event.addListener(map, 'idle', function() {
                    var hash = [map.getCenter().lat(), map.getCenter().lng(), map.getZoom()]
                    location.hash = hash.join(';');
                });

                $.getJSON(urlPrefix + '/coords', function(json) {
                    for (var i in json) {
                        var data = json[i];
                        //var icon = new google.maps.MarkerImage('/objects/marker/id/' + data.id, new google.maps.Size(20, 20));
                        var marker = new google.maps.Marker({
                            position: new google.maps.LatLng(data.lat, data.lng),
                            //icon: icon,
                            map: map
                        });

                        attachWindow(marker, data);
                    }
                });
            } catch(e) {
                alert(e.message);
            }
        });
    });

    $('#search').submit(function() {
        var input = $('input', this);
        var address = input.val();

        if (input.attr('title') == address) {
            return false;
        }

        geocoder.geocode({'address': address}, function(results, status) {
            if (status == google.maps.GeocoderStatus.OK) {
                map.setZoom(8);
                map.setCenter(results[0].geometry.location);
            } else {
                $.modal('alert', 'Unknown location: ' + address, false);
            }
        });
        return false;
    });




//(.send)
    $('#expose a:not').click(function() {
        var id     = $('#exposeId').val();
        var type   = $('#exposeType').val();
        var lang   = $('#exposeLanguage').val();
        var action = $(this).attr('class');

        if (action == 'send') {
            $.ajax({
                type: 'get',
                url: '/expose/send/id/' + id + '/lang/' + lang + '/action/' + action + '/type/' + type
            });
            return false;
        } else {
            location.href = '/expose/' + type + '/id/' + id + '/lang/' + lang + '/action/' + action;
        }

        return false;
    });


    $('#status').change(function() {
        var id = $('#dealId').val();
        $.ajax({
            type: 'get',
            url: '/deals/status/id/' + id + '/status/' + $(this).val()
        });
        $(this).val('');
    });




    $('input[title], textarea[title]').livequery(function() {
        if ($(this).val() === '') {
            $(this).addClass('inlineLabel');
            $(this).val($(this).attr('title'));
        }
        $(this).focus(function() {
            if ($(this).val() == $(this).attr('title')) {
                $(this).val('').removeClass('inlineLabel');
            }
        });
        $(this).blur(function() {
            if ($(this).val() === '') {
                $(this).val($(this).attr('title')).addClass('inlineLabel');
            }
        });
    });

    $('a.selectall').click(function() {
        $(this).closest('table').find('input').attr('checked', 'checked');
        return false;
    });
    $('a.deselectall').click(function() {
        $(this).closest('table').find('input').removeAttr('checked');
        return false;
    });
    $('a.deleteselected').click(function() {
        var values = [];
        var name = 'inbox';

        $(this).closest('table').find('input:checked').each(function() {
            values.push($(this).val());

            if ($(this).attr('name') == 'outbox[]') {
                name = 'outbox';
            }
        });

        if (values.length > 0) {
            $.modal('confirm', $(this).attr('title'), $(this).attr('href'), {ids: values, folder: name});
        }

        return false;
    });

    /*$('#comment').each(function() {
        $('> div.comment:first', this).fadeIn('slow');
    });*/

    $('#comment').each(function() {
        $(this).cycle({
            delay:  3000,
            speed:  500
        });
    });




    $('#groupImage, #groupLogo').bind('delete', function(event, data) {
        $('img', this).fadeOut('fast', function() {
            $(this).remove();
        });
    });
    $('#groupImage, #groupLogo').bind('edit', function(event, data) {
        var img = $('img', this);

        if (!img.length) { // if no logo exists
            img = $('<img />').appendTo(this).load(function() {
                $(this).fadeIn('fast');
            });
        }

        img.attr('src', data.url);
    });

    $('fieldset.propertygroup dl:not(:first)').hide().addClass('hide');
    $('fieldset.propertygroup ul.errors').closest('dl').show().removeClass('hide');
    $('fieldset.propertygroup h2').click(function() {
        var dl = $(this).next('dl');

        if (dl.is('.hide')) {
            $('fieldset.propertygroup dl:not(.hide)').slideUp('fast').addClass('hide');
            $(this).next('dl').slideDown('fast', function() {

                setTimeout(function() {
                    $.scrollTo(dl.closest('fieldset'), 500);
                }, 500);

            }).removeClass('hide');
        }
    });
    $('fieldset.propertygroup h2.legend').each(function() {
        $(this).html($(this).html() + ' »');
    })

    $('#numbers-price-value, #numbers-price-currency, #numbers-seller, #numbers-buyer, #numbers-provision-value, #numbers-provision-currency')
    .bind('change keyup', function() {
        var price = $('#numbers-price-value').val().parseFloat();
        var currency = $('#numbers-price-currency').val();
        var seller = $('#numbers-seller').val().parseFloat();
        var buyer = $('#numbers-buyer').val().parseFloat();
        var provision = $('#numbers-provision-value').val().parseFloat();
        var provisionCurrency = $('#numbers-provision-currency').val();

        var result = $('span.result, strong.result');
        var sum = $('#numbers-courtageSum');

        var provTotal = (price / 100 * (seller + buyer));
        var resultValue = $(provision).formatFloat(2, '.', ',') + " " + provisionCurrency.toUpperCase();

        if (provisionCurrency == 'per') {
            resultValue = $((provTotal / 100 * provision)).formatFloat(2, '.', ',') + " " + currency.toUpperCase();
        }

        sum.val($(provTotal).formatFloat(2, '.', ',') + " " + currency.toUpperCase());
        result.html(resultValue);
    });
    $('#numbers-price-value').change();


    /*
     * groups
     */

    $('#groupInviteWindow').livequery(function() {
        var container = $(this);

        $(this).bind('update', function(event, data) {
            //$('#groupPage').val(data.more);
            $('#groupPage').val(data.page);
            $('ul.users', this).html(data.html);

            if (data.more) {
                $('a.more', this).show();
            } else {
                $('a.more', this).hide();
            }

            $('ul.users li', this).each(function() {
                var id = '#user-elem-' + $(this).attr('id').replace(/^user-/, '');

                if ($(id).length > 0) {
                    $(this).click();
                }
            });
        }).bind('load', function() {
            var ids    = [];
            var id     = $('#groupId', this).val();
            var type   = $('#groupType', this).val();
            var page   = $('#groupPage', this).val();
            var input  = $('#searchbar input.search', this);
            var search = (input.val() == input.attr('title')) ? "" : input.val();

            $('input[name="users[]"]', this).each(function() {
                ids.push($(this).attr('value'));
            });

            $.ajax({
                url: '/groups/load/id/' + id,
                'type': 'post',
                'data': {
                    'type': type,
                    'search': search,
                    'page': page,
                    'ids': ids
                }
            });
        });

        $('div.content a', this).click(function() {
            var elem = $(this);

            if (elem.is('.all')) {
                $('#groupType', container).val('all');
                $('#groupPage', container).val('0');
                $('#searchbar input.search', container).val('').blur();
            } else if (elem.is('.selected')) {
                $('#groupType', container).val('selected');
                $('#groupPage', container).val('0');
                $('#searchbar input.search', container).val('').blur();
            } else if (elem.is('.more')) {
                var page = $('#groupPage', container).val();
                $('#groupPage', container).val(parseInt(page) + 1);
            }

            container.trigger('load');
        });

        $('ul.users li', this).live('click', function() {
            var elem  = $(this);
            var input = $('input', this);
            var id    = 'user-elem-' + elem.attr('id').replace(/^user-/, '');

            if (input.is(':checked')) {
                elem.removeClass('checked');
                input.removeAttr('checked');

                $('#' + id).remove();
            } else {
                elem.addClass('checked');
                input.attr('checked', 'checked');

                if ($('#' + id).length == 0) {
                    $('<input type="hidden" name="users[]" />')
                        .attr('id', id)
                        .attr('value', id.replace(/^user-elem-/, ''))
                        .appendTo('#groupInviteWindow form');
                }
            }

            $('a.selected span.result', container).html( $('input[name="users[]"]', container).length );

            return false;
        });

        $('ul.users input', this).live('click', function(event) {
            var input = $(this);

            setTimeout(function() {
                input.closest('li').click();
            }, 1);

            event.preventDefault();

            return false;
        });

        $('ul.users input', this).live('change', function() {
            if ($(this).is(':checked')) {
                $(this).removeAttr('checked');
            } else {
                $(this).attr('checked', 'checked');
            }
        });

        $('#searchbar input', this).bind('keyup', function() {
            var input   = $(this);
            var search  = (input.val() == input.attr('title')) ? "" : input.val();

            if (search.length > 0) {
                $('#groupPage', container).val('0');
                $('#groupType', container).val('search');
            } else {
                $('#groupPage', container).val('0');
                $('#groupType', container).val('all');
            }

            container.trigger('load');
        });

        $('textarea', this).blur();
    });


    /*
     * drafts
     */
    $('#drafts tbody tr').hover(function() {
        $(this).addClass('hover');
    }, function() {
        $(this).removeClass('hover');
    });
    $('#drafts tbody tr').click(function(event) {
        var id = $(this).attr('id');
        var number = $('p.number span.value', this).html();

        if ($(this).is('.selected')) {
            $('input', this).removeAttr('checked');
            $('option[value="'+id+'_'+number+'"]', '#selected').remove();
        } else {
            $('option[value="'+id+'_'+number+'"]', '#selected').remove();
            $('input', this).attr('checked', true);
            $('<option />').attr('value', id+'_'+number)
                           .html(number)
                           .attr('selected', 'selected')
                           .appendTo('#selected');
        }

        if ($(event.target).is('.action')) {
            return true;
        }

        $(this).toggleClass('selected');

        if ($(event.target).is('input')) {
            return true
        }

        return false;
    });
    $('#selected').each(function() {
        var value = $(this).val();

        if (value != null) {
            for (var i in value) {
                var id = value[i].match(/^([0-9]+)/)[0];
                $('#' + id).click();
            }
        }
    });
    $('#drafts a.selectall').click(function() {
        $(this).closest('table').find('tr:not(.selected)').click();
    });
    $('#drafts a.deselectall').click(function() {
        $(this).closest('table').find('tr.selected').click();
    });


    $('a.doTranslateCurrency').click(function() {
        $(this).css('font-weight', 'bold');
        $(this).siblings().css('font-weight', 'normal');

        var currency = $(this).attr('rel');

        $('.currency').each(function() {
            var data = $.parseJSON($(this).attr('data'));
            var value = $(data).attr(currency);

            $(this).html(value);
        });

        return false;
    });

});

