String.prototype.escapeHTML = function ()  {                                       
    return(                                                                 
        this.replace(/&/g,'&amp;').                                         
            replace(/>/g,'&gt;').                                           
            replace(/</g,'&lt;').                                           
            replace(/"/g,'&quot;')                                         
    );                                                                     
};
var AHBase = {
		
	initDraggables: function() {
		$('img.bonus_subhome:first').before('<form style="position: absolute;" action="/bsl/addText" method="post" class="shopform"><input type="hidden" value="BNS" name="sourceCode"><input type="hidden" value="'+$('img.bonus_subhome:first').attr('alt')+'" name="text"></form>');
		$('form.shopform').each(function(){
			var form = this;
			makeDraggable($(this).parents('*:has(p img):first').find('h3, p img'), form);
			$(this).submit(function(){
				var text = $('input[name=text]', this).val();
				var item = addProduct(text);
				$.ajax({
					data: $(this).serialize(),
					url: $(this).attr('action'),
					type: $(this).attr('method'),
					complete: function(){
						item.removeClass('processing');
					},
					async: false
				});
				return false;
			});
		});
		$('form#recept_to_shoplist').each(function(){
			var form = this;
			makeDraggable($(this).find('h1, p.photo img'), form);
		});
	

		function makeDraggable(item, form) {
			item.each(function(){
				this.form = form;
				var left = 50;
				var top = 50;
				
				if (this.tagName != 'IMG') {
					left = 10;
					top = 10;
				}
				
				$(this).draggable({
					helper: 'clone',
					appendTo: 'body',
					cursorAt: {cursor: 'move', left: left, top: top},
					zIndex: 2000,
					start: function(e, ui){
						$(ui.helper).addClass('content_drag content_drag_shoplist_item shoplist_item hover').css({left: 0, top: 0});
						$('#tertiary').css('zIndex','1000');
						$('body').addClass('dragging');
					},
					drag: function(e, ui){
						var offsetTop = 0;
						offsetTop = $('#tertiary_droppable_inner').offset() ? $('#tertiary_droppable_inner').offset().top : offsetTop;
						$('#tertiary_droppable_inner').css({backgroundPosition: '50% '+(e.pageY-parseInt(offsetTop)+ui.helper.height())+'px'});
					},
					stop: function(e,ui){
						$('body').removeClass('dragging');
					}
				});
			}).css({cursor: 'move'});
		}
		$('#tertiary, #shoplist, #cookbook_sidebar_container').droppable({
			greedy: true,
			hoverClass: 'drag_hover',
			drop: function(e, ui) {
				if (this.id != 'cookbook_sidebar_container') processDrop(e,ui);
				else cookbookDrop();
			},
			accept: '*:not(li)'
			
		});

		function processDrop(e,ui) {
			var item = ui.draggable;
			var form = item[0].form;
			if (!form) return;
			$(form).submit();
		}
		
		function insertNewItem(item, text, sourceCode, position){
			data = {text: text, sourceCode: sourceCode};
			if (position) data.position = position;
			var url = '/bsl/addText';
			$.ajax({
				data: data,
				url: url,
				type: 'POST',
				complete: function(){
					item.removeClass('processing');
				},
				async: false
			});
		}
		function updateItem(item, text, position){
			data = {text: text, position: position};
			var url = '/bsl/updateItemText';
			$.ajax({
				data: data,
				url: url,
				type: 'POST',
				complete: function(){
					item.removeClass('processing');
				},
				async: false
			});
		}

		function deleteItem(position){
			data = {position: position};
			var url = '/bsl/deleteItem';
			$.ajax({
				data: data,
				url: url,
				type: 'POST',
				complete: function(){
					
				},
				async: false
			});
		}
		
		function reorder(indices) {
			var qstr = 'order='+indices.join('&order=');
			$.ajax({
				data: qstr,
				type: 'POST',
				url: '/bsl/reorder',
				complete: function(){
					// item.removeClass('processing');
				},
				async: false
			});
		}
		
		function addProduct(text,cssClass,before) {
			var insertedItem = '<li style="display: none;" class="shoplist_li new_inserted_item '+((cssClass)?cssClass:'')+'"><a class="insert" href="#" title="Regel invoegen"><span></span></a><a title="Regel bewerken" href="#" class="edit"></a><a title="Regel verwijderen" href="#" class="delete"></a><span class="item"><input type="text" value="'+text+'" maxlength="100" class="shoplist_item_text_new"/><span class="clone">'+text.escapeHTML()+'</span></span><span class="blur">Ok</span></li>';
			if ($('#shoplist_items').size()==0) {
				$('#shoplist_fieldset').prepend('<ul class="shoplist_items" id="shoplist_items"></ul>');
				initSortable();
				$('#shoplist_empty').hide();
			}
			if (before) $(before).before(insertedItem);
			else $('#shoplist_items').append(insertedItem);
			if (before) $('#shoplist_items .new_inserted_item a.edit').click();
			var newitem = $('#shoplist_items .new_inserted_item'); 
			newitem.slideDown('fast').removeClass('new_inserted_item').addClass('processing');
			reorderItems();
			$('#shoplist_items li span').attr('unselectable','on');
			return newitem;
			
		}
		
		function reorderItems(){
			$('#shoplist_items li:not(.ui-sortable-helper)').each(function(i,li){
				$(li).attr('index',i);
			});	
		}
		
		function resetItems() {
			$('#shoplist_items li.editing').each(function(){
				var li = $(this);
				if (li.find('span.clone').text()=='') {
					$(li).slideUp('slow',function(){$(this).remove();});
					return false;
				}
				li.removeClass('editing');
				li.find('span.clone').show();
				li.find('input[type=text]').val(li.find('span.clone').text()).hide();
				li.find('span.blur').css({visibility: 'hidden'});
				li.find('span.item').removeClass('hover');
				li.find('a.edit, a.delete').css({visibility: 'hidden'});
			});
		}

		$('li.shoplist_li span.item').live('mouseover',function(){
			$('#shoplist_items a.edit, #shoplist_items a.delete, #shoplist_items a.to_recipe').css({visibility: 'hidden'});
			$(this).addClass('hover');
			$('a.edit, a.delete, a.to_recipe',this.parentNode).css({visibility: 'visible'});
		}).live('mouseout',function(e){
			if (e.relatedTarget && (e.relatedTarget.tagName == 'A')) return false;
			$(this).removeClass('hover');
			$('a.edit, a.delete, a.to_recipe',this.parentNode).css({visibility: 'hidden'});
		});
		
		$('#shoplist_items a.edit, #shoplist_items a.delete, #shoplist_items a.insert').live('click',function(){
			var li = $(this).parents('li:first');
			var deletedItem = li;
			resetItems();
			reorderItems();
			if ($(this).hasClass('delete')) {
				if (li.attr('class').match(/type_R/)) {
					if (!this.confirmed) {
						deleteRecipeBox(this);
						return;
					}
					else {
						var ref = $(li).attr('class').match(/(reference_.*)\b/);
						if (ref && ref[1]) {
							deletedItem = $('li.'+ref[1]);
						}
					}
				}
				deleteItem($(li).attr('index'));
				deletedItem.slideUp('slow',function(){
					$(this).remove();
					reorderItems();
				});
			}
			else if ($(this).hasClass('edit')) {
				$(li).addClass('editing');
				$(li).find('input[type=text]').show().focus();
				$(li).find('span.blur').css({visibility: 'visible'});
				$(li).find('span.clone').hide();
			}
			else if ($(this).hasClass('insert')) {
				var newitem = addProduct('','',li);
				$(newitem).find('input[type=text]').focus();
				
			}
			return false;
		});
		
		$('#shoplist_items li span.item').live('dblclick',function(){
			var li = $(this).parents('li:first');
			resetItems();
			$(li).addClass('editing');
			$(li).find('input[type=text]').show().focus();
			$(li).find('span.blur').css({visibility: 'visible'});
			$(li).find('span.clone').hide();
		});
		
		$('#shoplist_items span.blur').live('click',function(){
			reorderItems();
			var insertedItem = false;
			var li = $(this).parents('li:first');
			if ($.trim(li.find('input[type=text]').val())!='') {
				if (li.find('span.clone').html()=='') {
					insertedItem = true;
				}
				$(this).css({visibility: 'hidden'});
				li.find('span.clone').show().html(li.find('input[type=text]').val());
				li.find('input[type=text]').hide();
				if (!insertedItem) updateItem(li,li.find('input[type=text]').val(),li.attr('index'));
				else insertNewItem(li,li.find('input[type=text]').val(),'TXT',li.attr('index'));
			}
			else resetItems();
		});
		
		$('#shoplist_items input[type=text]').live('keydown',function(e){
			var input = this;
			switch(e.keyCode) {
				case 13:
					e.stopPropagation();
					$(input).parents('li:first').find('span.blur').click();
					break;
				case 27:
					resetItems();
					break;
			}
		});
		
		$('#shoplist_item_new button').click(function(){
			var newItem = $(this).parent().find('input[type=text]').val();
			resetItems();
			if ($.trim(newItem)!='') {
				var item = addProduct(newItem);
				insertNewItem(item, newItem, 'TXT');
				$(this).parent().find('input[type=text]').val('');
				
			}
			return false;
		});
		
		function deleteRecipeBox(obj) {
			 var clearDialog = new AHDialog();
		      clearDialog.addText("Wilt u dit recept met alle bijbehorende ingredi\u00EBnten verwijderen?");
		      clearDialog.addTitle("Recept verwijderen");
		      clearDialog.addAction("Ja",function(){
		        obj.confirmed = true;
				$(obj).click();
		        clearDialog.destroy();
		      });
		      clearDialog.addDestroyer("Nee");
		      clearDialog.build();
		}
		
		$('#shoplist_clear a').click(function(){
			 	var button = this;
		        var clearDialog = new AHDialog();
		        clearDialog.addText("Wilt u uw Boodschappenlijst leegmaken en alle ingredi\u00EBnten en recepten verwijderen?");
		        clearDialog.addTitle("Mijn Boodschappenlijst leegmaken");
		        clearDialog.addAction("Ja",function(){},button.href);
		        clearDialog.addDestroyer("Nee");
		        clearDialog.build();
		        return false;
		});
		
		function initSortable() {
			$('#shoplist_items').sortable({
				delay: 500,
				start: function(){
					resetItems();
					$('#tertiary').css('zIndex','1000');
					$('body').css({overflowX: 'hidden'});
				},
				update: function(e, ui){
					if (ui.item.hasClass('type_R')) {
						var ref = ui.item.attr('class').match(/(reference_.*)\b/);
						if (ref && ref[1]) {
							ui.item.after($('li.'+ref[1]+':not(.type_R)'));
						}
					}
					var indices = [];
					$('li:not(.ui-sortable-placeholder)', this).each(function(i,li){
						indices.push($(li).attr('index'));
					});
					reorder(indices);
					reorderItems();
					$('body').css({overflowX: 'auto'});
				}
			});
			
			$('#shoplist_items li span').attr('unselectable','on');
		}
		initSortable();
		reorderItems();
		$('body').ajaxSend(function(){
			$('body').addClass('wait');
		});
		$('body').ajaxStop(function(){
			$('body').removeClass('wait');
		});
	}
}

$(document).ready(function(){
	AHBase.initDraggables();	
});