// What to do when a new nutshell is created
var new_nutshell_callback = function(s) {
	// Hide delete/clone forms
	$('.btn-delete, .btn-clone', s).prev().hide().find('input[name=_destination]').remove();
	// Hide delete attachment forms
	$('.deletable-image form', s).hide().after("<div class='btn-delete-attachment' title='Delete Attachment'></div>").find('input[name=_destination]').remove();
	// Quick updates from nutshell
	$('.nutshell *[name^=model]', s).change(function() {
	  var arr = $(this).attr('id').split('-');
		var update_url = cms_path+'/'+arr[1]+'/'+arr[0]
		$.ajax({
			url: update_url, 
			data: $(this).parents('form').serialize(),
			type: 'PUT'
		});
	});
	// Scene selector
	var selectable_scene = $('.mapolygon-me');
	$('.nutshell', s).hover(function() {
	  var $this = $(this);
	  if ($this.data().sceneSelectorCoordinates!='' && selectable_scene.data().dots=='') selectable_scene.trigger('show.mapolygon', [$this.data().sceneSelectorCoordinates.split(',')]);
	}, function() {
	  var $this = $(this);
	  if ($(this).data().sceneSelectorCoordinates!='' && selectable_scene.data().dots=='') selectable_scene.trigger('reset.mapolygon');
	});
};

var new_nut_tree_callback = function(s) {
  var $$ = $(s);
  
  var search_opts = {
	  onAfter: function() {
	    if ($('.search input[type=search]', s).val()=='') {
	      $('.sortable-handle', s).show();
	    } else {
	      $('.sortable-handle', s).hide();
	    }
	  }
	}
	var qs = $('.search input[type=search]', s).quicksearch($$.find(".nutshell"), search_opts);
	$$.data('quicksearch', qs);
  
  // Drop from minilist
  var tree = $('.nut-tree', s);
  tree.droppable({
    accept: '.minilist li',
		drop: function( e, ui ) {
			var id = ui.draggable.attr('id').substring(5);
			var params_sample = ui.draggable.parents('.many-to-many-picker').attr('rel');
			var params = params_sample + id;
			var path = cms_path + '/' + this.id;
			$.post(path, params, function() {
			  $$.trigger('reload_nut_tree.cms');
			  ui.draggable.css({opacity: 0.5});
			  //ui.draggable.addClass('selected');
			});
		}
	});
  
  // Sortable
	$('.sortable', s).sortable({
		stop: function() { $.ajax({
			url: $(this).attr('rel'), 
			data: $(this).sortable('serialize'),
			type: 'PUT'
		});
		},
		items: '.nutshell',
		handle:'.sortable-handle'
	});
  
  new_nutshell_callback(s);
};

// What to do when a new slide is pushed on the stack
var pushstack_callback = function(s, reloading) {
	var $$ = $(s);
	
	// Bind Return callbacks
	// unless it's a reload
	if (!reloading) {
		$$
		.bind('reload.cms', function() {
			$$.find('.slide-inner').load($$.data('reload_path'), function() {
				pushstack_callback(s,true);
				$$.scrollTop($$.data('scrolltop'));
			});
		})
		.bind('reload_nut_tree.cms', function() {
		  $.get($$.data('reload_path'), function(data) {
		    $$.find('.nut-tree').html($("<div>"+data+"</div>").find('.nut-tree').html());
		    new_nut_tree_callback(s);
				$$.scrollTop($$.data('scrolltop'));
		  });
		})
		.bind('register_return.cms', function(e,launcher,cb) {
			$$.data('cb',cb).data('cb_launcher',launcher).data('scrolltop', $$.scrollTop());
		})
		.bind('clean_return.cms', function() {
			$$.removeData('cb').removeData('cb_launcher');
		})
		.bind('return.cms', function(e,data) {
			$$.scrollTop($$.data('scrolltop'));
			var cb = $$.data('cb');
			var cb_launcher = $$.data('cb_launcher');
			if (cb) cb($$,cb_launcher,data);
			$$.trigger('clean_return.cms');
			$$.removeData('scrolltop'); // Seperated because the cancel button should trigger the scrolltop
			$$.data('quicksearch').cache();
		});
	}
	
	// HTML EDITOR
	// textarea tag needs to be specified because the iframe copy the class, so we need to avoid endless nesting
	$('textarea.underwood_editor', s).underwood({sanitize: false}).hide();
	$('textarea.underwood_editor_full', s).underwood({toolbar: 'title paragraph bold italic link mailto unlink image source', sanitize: false}).hide();
	$('textarea.underwood_editor_no_title', s).underwood({toolbar: 'bold italic link mailto unlink source', sanitize: false}).hide();
	
	// Permalink dropdowns
	$('.permalink-dropdown', s).change(function() {
		var $select = $(this);
		$select.parent().find('input').val($select.val());
	});
	
	// Date/Time pickers
	$('.datepicker', s).datepicker({dateFormat: 'yy-mm-dd'});
	$('.timepicker', s).timepicker({showSecond: true,timeFormat: 'hh:mm:ss'});
	$('.datetimepicker', s).datetimepicker({showSecond: true,dateFormat: 'yy-mm-dd',timeFormat: 'hh:mm:ss'});
	
	// Multiple select with asmSelect
	$(".asm-select", s).asmSelect({ sortable: true });
	
	// Back btn
	if ($$.is('.inserted-slide')) {
		// var commands = $$.find('.nut-tree-commands');
		//    if (commands.size()>0) {
		//      commands.prepend("<a class='pop-stack btn btn-back' href='javascript:;' title='Back'></a>");
		//    } else {
		//      $$.find('.slide-inner').prepend("<div class='nut-tree-commands'><a class='pop-stack btn btn-back cancel' href='javascript:;' title='Back'></a></div>");
		//    }
		$$.find('.slide-inner').prepend("<a class='pop-stack top-pop-stack' href='javascript:;'>"+ $$.prev().find('.slide-title > span').text() +"<span>go back up<span class='btn btn-back'></span></span></a>");
	}
	
	// Reload btn
	$('.btn-reload', s).click(function() {
		$$.trigger('reload.cms');
		return false;
	});
	
	// JS Search
	$('.search :submit', s).hide();
	$('.search', s).submit(function() { return false; });
	
	// Minilist
	$('.many-to-many-picker .minilist-wrapper', s).frise()
	.bind('fix_width.cms', function() {
	  var $this = $(this);
	  var ul = $this.children(':first');
	  var elts = $this.find('li:visible');
	  var elt = ul.children(':first');
	  var gutter = parseInt(elt.css('margin-right'));
	  var w = elts.size() * elt.width() + elts.size() * gutter;
	  ul.width(w);
	})
	.trigger('fix_width.cms');
  $('.many-to-many-picker .minilist-wrapper li', s).draggable({
   appendTo: 'body',
   //axis: "y",
   revert: 'invalid', // when not dropped, the item will revert back to its initial position
   helper: function(e) { return $("<div class='minilist-dragged'>"+$(this).html()+"</div>") },
   cursor: "move"
  });
	
	//Minilist quicksearch
	search_opts = {
	  onAfter: function() {
	    $('.many-to-many-picker .minilist-wrapper', s).trigger('fix_width.cms');
	  }
	}
	$('.minisearch', s).quicksearch($$.find(".minilist li"), search_opts);
	
	// Scene selector
	var selectable_scene = $('.mapolygon-me', s);
	selectable_scene.mapolygon(function(data,img) {
	  if (data.length>0) $('.scene-selector-toolbar',s).fadeIn();
	});
	$('.reset-mapolygon', s).click(function() {
	  selectable_scene.trigger('reset.mapolygon');
	  $('.scene-selector-toolbar',s).fadeOut();
	});
	$('.save-mapolygon', s).click(function() {
	  this.href = this.href+selectable_scene.data().dots.join(',');
	});
	
	// Ajaxify forms
	if ($$.is('.inserted-slide')) {
		$$.find('input[name=_destination]').remove();
		$f = $$.find(':submit').parents('form').not('.search');
		$f.filter('.backend-form').has(':submit[value=SAVE]').append(" or <a href='javascript:;' class='pop-stack cancel'>CANCEL</a>");
		$f.submit(function() { // Model form or search
			var $form = $(this);
			$form.find(':submit').prop('disabled',true).after("<img src='"+cms_path+"/_static/img/small-loader.gif' />");
			$form.ajaxSubmit({
				success: function(data) {
					if (data=='OK' || !!data.match(/\bOK\b/i)) { // Success
            console.log('data ok');
						$slides.trigger('pop.cms', [data]);
					} else {
            console.log('data not ok');
						$$.children().html(data);
            // if ($form.is('.search')) {
            //  var url = $form.attr('action') + ($form.attr('action').indexOf('?')+1 ? '&' : '?') + $form.serialize();
            //  $$.data('reload_path', url);
            // }
						pushstack_callback($$);
					}
				}
			});
			return false;
		});
	}
	
	new_nut_tree_callback(s);
	
	// Custom
	if (typeof custom_pushstack_callback == 'function') custom_pushstack_callback(s); // Write this method in order to add some custom editors
};

// Return callbacks
var form_callback = function(slide,launcher,data) {
	var $slide = $(slide);
	var $launcher = $(launcher);
	var $data = $(data);
	if ($launcher.is('.btn-edit')) {
		$launcher.parents('.nutshell').before($data).remove();
	} else {
		$('.nut-tree', slide).prepend($data);
	}
	new_nutshell_callback($data);
	//$data.hide().fadeIn('slow'); // Fucks the fact that scroll is getting to its prev position
};

var default_callback = function(slide,launcher,data) {
	// Just reload the slide until a better callback is created
	$(slide).trigger('reload.cms');
};

$(function() {
	
	// Stack
	$slides = $('#slides');
	$slides
	.bind('push.cms', function(e, data, url) {
		var last = $("<div class='slide inserted-slide'><div class='slide-inner'>"+data+"</div></div>").appendTo($(this));
		last.data('reload_path', url);
		var previous = last.prev();
		$slides.animate({top: -$(window).height()+'px'}, function() {
			previous.hide();
			$slides.css({top: '0px'});
			pushstack_callback(last);
		});
	})
	.bind('pop.cms', function(e, data) {
		var last = $('.inserted-slide:last');
		last.fadeOut('fast', function() {
			var called = last.prev().show();
			last.remove();
			$slides.css({top: -$(window).height()+'px'});
			$slides.animate({top: '0px'}, function() {
				called.trigger('return.cms', [data]);
			});
		});
	});
	
	// Links pushing stack
	$('a.push-stack').live('click', function(e) {
		var cb = $(this).is('.sublist-link') ? default_callback : default_callback; // will change in time
		$(this).parents('.slide').trigger('register_return.cms', [this,cb]);
		var url = this.href.replace(/(_no_wrap=true|_destination=[^&]*)/g, '');
		$.get(url, function(data) {
			$slides.trigger('push.cms', [data, url]);
		});
		return false;
	});
	
	// Links Pop Stack without callback
	$('.pop-stack').live('click', function() { 
		if ($(this).is('.cancel')) $(this).parents('.slide').prev().trigger('clean_return.cms');; 
		$slides.trigger('pop.cms'); 
		return false;
	});
	
	// Ajax delete
	$('.btn-delete').live('click', function() {
		if (confirm('This action is irreversible. Are you sure you want to delete this entry ?')) {
			var $btn = $(this);
			var $form = $btn.prev();
			$.ajax({
				url: $form.attr('action'), 
				data: $form.serialize(),
				type: 'DELETE',
				success: function() { $btn.parents('.nutshell').fadeOut(function() { $(this).remove(); }); }
			});
		}
	});
	
	// Ajax delete attachment
	$('.btn-delete-attachment').live('click', function() {
		if (confirm('This action is irreversible. Are you sure you want to delete this attachment ?')) {
			var $btn = $(this);
			var $form = $btn.prev();
			$.ajax({
				url: $form.attr('action'), 
				data: $form.serialize(),
				type: 'PUT',
				success: function() { $btn.parents('.deletable-image').fadeOut(); }
			});
		}
	});
	
	// Ajax clone
	$('.btn-clone').live('click', function() {
    if (confirm('This will create a new entry with similar values. Do you want to proceed ?')) {
  		var $btn = $(this);
  		var $form = $btn.prev();
  		var $slide = $btn.parents('.slide')
  		$.post($form.attr('action'), $form.serialize(), function(data) {
  			if (data=='OK') {
  				$slide.trigger('reload.cms');
  				if ($btn.parents('.sortable').size()==0) $slide.animate({ scrollTop: $slide.height() });
  			}
  		});
    }
	});
	
	pushstack_callback($('#content').data('reload_path', document.location.href));
	
	// Tooltips
	$.speechify({
		backgroundColor: '#00ABC4', 
		color: 'black',
		'border-radius': '0px', 
		'-moz-border-radius': '0px',
		'-webkit-border-radius': '0px',
		'-webkit-box-shadow': '0px 0px 5px rgba(0,0,0,0.5)'
	});
});