1jQuery(function(){
2    'use strict';
3
4    var $farmsync = jQuery('#plugin__farmsync');
5
6    var resolveConflict = function($elem) {
7        $elem.closest('div.li').find('table.diff').hide();
8
9        var $conflicts = $elem.closest('div.result').find('h2 span');
10        $conflicts.html(Number($conflicts.html()) - 1);
11        if (Number($conflicts.html()) === 0) $elem.closest('div.result').switchClass('withconflicts','noconflicts');
12        $elem.html('<span>'+ LANG.plugins.farmsync['done'] +'</span>');
13    };
14
15    $farmsync.find('div.progress').slideUp();
16    $farmsync.find('span.progress').click(function() {
17        $farmsync.find('div.progress').slideToggle();
18    });
19
20    $farmsync.find('select.make_chosen').chosen().change(function() {
21        var $this = jQuery(this);
22        $this.trigger('chosen:updated');
23        $this.val();
24        $farmsync.find('input[type="checkbox"]').prop('disabled', false);
25        $farmsync.find('input[type="checkbox"][name="farmsync-animals['+$this.val()+']"]').prop('disabled', true).prop('checked', false);
26    }).change();
27
28    $farmsync.find('div.result h2').click(function (event) {
29        jQuery(this).next('div').slideToggle()
30    });
31
32    $farmsync.find('a.show_noconflicts').click(function (event) {
33        jQuery(this).next('ul').slideToggle();
34    });
35
36    $farmsync.find('form button[name=diff]').click(function (event) {
37        event.stopPropagation();
38        event.preventDefault();
39
40        if ( jQuery(this).closest('div.li').find('table.diff').length ) {
41            jQuery(this).closest('div.li').find('table.diff').toggle();
42            return;
43        }
44
45        var $this = jQuery(this);
46        var sectok = $this.parent('form').find('input[name="sectok"]').val();
47        var animal = $this.parent('form').data('animal');
48        var page = $this.parent('form').data('page');
49        var source = jQuery('#results').data('source');
50
51        jQuery.post(
52            DOKU_BASE + 'lib/exe/ajax.php',
53            {
54                call: 'plugin_farmsync',
55                'farmsync-source': source,
56                'farmsync-animal': animal,
57                'farmsync-page': page,
58                'farmsync-action': 'diff',
59                'sectok': sectok
60            }
61        ).done(function (data, textStatus, jqXHR) {
62            $this.closest('div.li').append(data);
63            $this.closest('div.li').find('table.diff').show()
64        }).fail(function (jqXHR, textStatus, errorThrown) {
65            $this.closest('div.li').append('<span>Failure! ' + textStatus + ' ' + errorThrown + '</span>');
66            console.dir(jqXHR);
67        });
68    });
69
70    $farmsync.find('form button[name=theirs]').click(function(event){
71        var $this = jQuery(this);
72        var animal = $this.parent('form').data('animal');
73        var page = $this.parent('form').data('page');
74        resolveConflict($this.parent('form'));
75    });
76    $farmsync.find('form button[name=override]').click(function(event) {
77        event.stopPropagation();
78        event.preventDefault();
79        var $this = jQuery(this);
80        var animal = $this.parent('form').data('animal');
81        var page = $this.parent('form').data('page');
82        var type = $this.parent('form').data('type') || 'page';
83        var sectok = $this.parent('form').find('input[name="sectok"]').val();
84        var source = jQuery('#results').data('source');
85        jQuery.post(
86            DOKU_BASE + 'lib/exe/ajax.php',
87            {
88                call: 'plugin_farmsync',
89                'farmsync-source': source,
90                'farmsync-animal': animal,
91                'farmsync-page': page,
92                'farmsync-action': 'overwrite',
93                'farmsync-type': type,
94                'sectok': sectok
95            }
96        ).done(function (data, textStatus, jqXHR) {
97            resolveConflict($this.parent('form'));
98        }).fail(function (jqXHR, textStatus, errorThrown) {
99            $this.replaceWith('<span>Failure! ' + textStatus + ' ' + errorThrown + '</span><div>' + jqXHR.responseText + '</div>');
100            console.dir(jqXHR);
101        });
102        jQuery('form[data-animal="' + animal + '"][data-page="' + page + '"] button').hide();
103    });
104
105    var scrollToConflict = function ($event) {
106        var line = Number(jQuery(this).data('line'));
107        var $form = jQuery(this).closest('form');
108        $form.find('textarea[name=editarea]').scrollToLine(line);
109        generateConflictLinks($form);
110    };
111
112    var scrollToFirstConflict = function (element) {
113        var $elem = jQuery(element);
114        var lines = $elem.closest('form').find('textarea[name=editarea]').val().split("\n");
115        for (var index = 0; index < lines.length; index += 1) {
116            if (lines[index].substring(0,'✎———————'.length) == '✎———————') {
117                $elem.scrollToLine(index);
118                break;
119            }
120        }
121    };
122
123    var generateConflictLinks = function ($form) {
124        var lines = $form.find('textarea[name=editarea]').val().split("\n");
125        var conflicts = [];
126        $form.find('.conflictlist ol').html('');
127        for (var index = 0; index < lines.length; index += 1) {
128            if (lines[index].substring(0,'✎———————'.length) == '✎———————') {
129                conflicts.push(index);
130                var link = jQuery('<li class="conflict" data-line="'+index+'"></li>').text(lines[index+1].substring(0,40)+'...');
131                $form.find('.conflictlist ol').append(link.click(scrollToConflict));
132            }
133        }
134    };
135
136    $farmsync.find('form button[name=edit]').click(function(event) {
137        event.stopPropagation();
138        event.preventDefault();
139        var $form = jQuery(this).parent('form');
140        $form.find('button[name=theirs],button[name=override],button[name=edit]').hide();
141        $form.find('div.editconflict').show();
142        generateConflictLinks($form);
143        scrollToFirstConflict($form.find('textarea[name=editarea]'));
144        $form.find('button[name=save],button[name=cancel]').show();
145    });
146
147    $farmsync.find('form button[name=cancel]').click(function(event) {
148        event.stopPropagation();
149        event.preventDefault();
150        var $form = jQuery(this).parent('form');
151        $form.find('button[name=theirs],button[name=override],button[name=edit]').show();
152        $form.find('div.editconflict').hide();
153        $form.find('textarea[name=editarea]').val($form.find('textarea[name=backup]').val());
154        $form.find('button[name=save],button[name=cancel]').hide();
155    });
156
157    $farmsync.find('form button[name=save]').click(function(event) {
158        event.stopPropagation();
159        event.preventDefault();
160        var $form = jQuery(this).parent('form');
161        var $content = $form.find('textarea[name=editarea]').val();
162        if ($content.indexOf("✎———————") !== -1 ) {
163            scrollToFirstConflict($form.find('textarea[name=editarea]'));
164            alert('There are still unresolved conflicts left');
165            return;
166        }
167        var animal = $form.data('animal');
168        var page = $form.data('page');
169        var type = $this.parent('form').data('type') || 'page';
170        var sectok = $form.find('input[name="sectok"]').val();
171        var source = jQuery('#results').data('source');
172        jQuery.post(
173            DOKU_BASE + 'lib/exe/ajax.php',
174            {
175                call: 'plugin_farmsync',
176                'farmsync-source': source,
177                'farmsync-animal': animal,
178                'farmsync-page': page,
179                'farmsync-action': 'overwrite',
180                'farmsync-content': $content,
181                'farmsync-type': type,
182                'sectok': sectok
183            }
184        ).done(function (data, textStatus, jqXHR) {
185            resolveConflict($form);
186        }).fail(function (jqXHR, textStatus, errorThrown) {
187            $form.replaceWith('<span>Failure! ' + textStatus + ' ' + errorThrown + '</span>');
188            console.dir(jqXHR);
189        });
190        $form.find('textarea[name=editarea]').hide();
191        $form.find('button[name=save],button[name=cancel]').hide();
192    });
193});
194