

















/*
* Create calender activities jsp gb
*/
(function($) {
$.ti.createCalendarActivity = {

	createActivity: function(dayGridPosition, activityDuration, currentActivityId, allActivityData, validDates) {

    		var data, activityClassName, gridActivity;

			// Append the start and end date div
			function addDateInfo() {
				var dateHTML =	$(['<div class="dateHighlightWrapper">',
									'<span class="dateHighlight">Inizio: ' + $.ti.utils.flipDate(data.actStartDate) + '</span>',
									'<span class="dateHighlight">Fine: ' + $.ti.utils.flipDate(data.actEndDate) + '</span>',
								'<div>'
								].join(''));
				$('.dayGridActivityWrapper', gridActivity).append(dateHTML);
			}


//     console.log(currentActivityId);
        var el = $('#' + currentActivityId);
//        console.log(el);
        var rel = el.attr('rel');

//        console.log('El: ' + el);
//        console.log('Rel: ' + rel);
// 		  console.log('called 1');
//        data.actCategory = 'Accommodation';
/*
        if (el !== null && el.length > 0)
        {
            if (rel !== null)
            {
           // console.log('called');
           // alert('called as');
                var item = $('#' + rel).closest('li');
                data = item.data('data');

            }
        }
*/
			// Store the activity data abject temporarily
		//data = $('#' + $('#' + currentActivityId).attr('rel')).closest('li').data('data');

     data = allActivityData;
    	//console.log('data id is:'+ data.id);
         if(data.id == undefined) {
      		 data = $('#' + $('#' + currentActivityId).attr('rel')).closest('li').data('data');
        // console.log('called for this onet');
        //  data = allActivityData;
		  }

	//	 data.id = allActivityData.id;
	//     data.actCategory = allActivityData.actCategory;
    //    console.log(data);

//		alert(typeof(data.actCategory));


//        if (!data || typeof(data.actCategory) === 'undefined')
 //       {
//        	data.actCategory = "empty";
//            if (console)
//            {
//               console.warn("data is null or no actCategory when creating activity");
//                console.log(data);
//            }
//
//            return;
//      }


        	// Create classname
          // alert('data category is: ' + data.actCategory);


//            console.log(data.actCategory);


            activityClassName = $.ti.utils.makeClassName(data.actCategory);
//console.log('set 1');
            //activityClassName = 'Accommodation';
            //alert('called');
			// create activity element
			gridActivity = $(['<div id="' + dayGridPosition + 'Activity" rel="' + data.id + '" class="dayGridActivity activity' + activityClassName + '">',
									'<div class="dayGridActivityWrapper clearfix">',
										'<span class="category"></span>',
										'<div class="dayGridActivityContent">',
											'<h6 class="activityHeading"></h6>',
										'</div>',
									'</div>',
								'</div>'
							].join(''));
			//console.log(gridActivity);
//console.log('set 2');
			// Add delete span if not a reviewer
			if($.ti.tripData.trip.role !== 'R') {
				$('.dayGridActivityWrapper', gridActivity).prepend($('<span class="dayGridActivityClose"></span>'));
			}

			// Check for user generated activities
			if(data.actCategory === 'User Generated') {
				// Switch to the user generated class
				$('.dayGridActivityWrapper', gridActivity).removeClass('dayGridActivityWrapper').addClass('dayGridActivityWrapperUserGenerated')
					.append($('<span class="showDetails" rel="' + currentActivityId + '">Informazioni utili</span>'));
			} else if(validDates === true) {
				// Append the show details span for non user generated items
				$('.dayGridActivityWrapper', gridActivity).append($('<span class="showDetails" rel="' + currentActivityId + '">Informazioni utili</span>'));
			}
//console.log('set 3');
			// Check for errored activities
			if(validDates === false) {
				$('.dayGridActivityWrapper', gridActivity).addClass('invalid');
				$('.category', gridActivity).addClass('invalid');
				$.ti.createTripCalendar.hasErrors = true;
			} else {

				// If not errored add category class - name created from actCategory in data object
				$('.category', gridActivity).addClass($.ti.utils.makeClassName(data.actCategory));
			}
//console.log('set 3b');
			// Append heading
			$.ti.recalculateCalendarActivities.calculateHeader(gridActivity, activityDuration, data);
//console.log('set 5');
//'set point here'
//'set point here'
			// Check activity duration
			if(activityDuration > 1) {
				gridActivity.width($.ti.createTripCalendar.activityWidth + ($.ti.createTripCalendar.activityWidthMultiple * (activityDuration -1)));
			} else {
				gridActivity.width($.ti.createTripCalendar.activityWidth);
			}

			// Check for start or end dates and add to item if present
			if(data.actStartDate) {
				addDateInfo();
			}

			// Set selected states
			$.ti.createCalendarActivity.toggleSelected(dayGridPosition, activityDuration, true);

			// Remove paragraph text from accommodation grid
			if($('#' + dayGridPosition).hasClass('dayGridAccommodation')) {
				$('p', '#' + dayGridPosition).remove();
			}

			$('#' + dayGridPosition).append(gridActivity);

			if(validDates === true) {
				// Ensure user is not reviewer
				if($.ti.tripData.trip.role !== 'R') {
					$.ti.createCalendarActivity.makeResizable(gridActivity);
					$.ti.createCalendarActivity.makeDraggable(gridActivity);
				}
			}
//console.log('set 6');
//make draggable all activities - added to make all activities on the panel draggable
            $.ti.createCalendarActivity.makeResizable(gridActivity);
			$.ti.createCalendarActivity.makeDraggable(gridActivity);
//console.log('set 7');
			$('#' + dayGridPosition + 'Date').animate({"opacity": 0});

			// Remove dummy activities from calendar
			if ($.ti.createTripCalendar.hasDummyActivities) {
				$('.dummyActivity', '#calendarDays').remove();
				$.ti.createTripCalendar.hasDummyActivities = false;
			}
//console.log('set end');

	},

	createDummyActivities: function() {
		function addDummyActivity(duration, day, row, msg, category) {
			var dummyActivity = $('<p class="dummyActivity">'+msg+'<span class="category"></span></p>');
			if (category) dummyActivity.find('span.category').addClass(category);

			// Check activity duration
            // (The + 12 below is because we're now styling padding left & right to be 6px on these elements - we
            // need to subtract 16 pixels here to keep them aligned to the calendar grid...)
			if(duration > 1) {
				dummyActivity.width($.ti.createTripCalendar.activityWidth + ($.ti.createTripCalendar.activityWidthMultiple * (duration -1)) - (2 + 12));
			} else {
				dummyActivity.width($.ti.createTripCalendar.activityWidth - (2 + 12));
			}
			//dummyActivity.css('opacity', 0.5);

			$('#d'+day+'r'+row).append(dummyActivity);
		};
		if (!$('.dummyActivity', '#calendarDays').length) {
			addDummyActivity(1, 1, 1, 'Seleziona e trascina l&#39;alloggio qui');
			addDummyActivity(1, 1, 3, 'Seleziona e trascina le attività qui', 'Activities');
			addDummyActivity(1, 1, 5, 'Selezione a trascina per aggiungere delle opzioni', 'UserGenerated');
			addDummyActivity(3, 3, 1, 'Trascina per estendere la durata del tuo soggiorno ');
			addDummyActivity(1, 3, 3, 'Selezione a trascina per aggiungere delle opzioni', 'UserGenerated');
			addDummyActivity(1, 3, 5, 'Seleziona e trascina le attività qui', 'Activities');
			addDummyActivity(2, 4, 2, 'Seleziona e trascina le attività qui', 'Activities');

		}
	},

	makeDraggable: function(activity) {
		$(activity).draggable({

			containment: '#calender',

			zIndex: '9500',

			start: function(event, ui) {
				// Get draggables parent
				var startLocation = $(ui.helper).parent();
				// Append the instructional paragraph to accommodation slot
				if($(startLocation).hasClass('dayGridAccommodation')) {
					$.ti.createCalendarActivity.setInstruction(startLocation);
				}
				// Toggle date highlighting
				$.ti.createCalendarActivity.toggleDateHighlight(this);
			},

			stop: function(event, ui) {
				// Toggle date highlighting
				$.ti.createCalendarActivity.toggleDateHighlight(this);

                // save the update..
		        $.ti.ajax.postData('/it/trip/', $.ti.tripData);
			},

			cursorAt: {
				top: 5,
				left: 5
			}
		});
	},

	makeResizable: function(activity) {
		$(activity).resizable({
			maxWidth: $.ti.createTripCalendar.activityWidth + ($.ti.createTripCalendar.activityWidth*6),

			start: function(event, ui) {
				var duration, reference;

				function setMaxWidth(duration) {
					var length = $.ti.createTripCalendar.activityWidth + ($.ti.createTripCalendar.activityWidthMultiple * (duration -1));
					$(activity).resizable( "option", "maxWidth", length);
				}

				function checkBlockers(future) {
					var direction, startPoint, row, count, days, endPoint;

					days = $.ti.createTripCalendar.currentView.firstDay + 6;

					// determine start point
					startPoint = $.ti.utils.getDay(reference);
					row = $.ti.utils.getRow(reference);

					endPoint = startPoint + duration;
					if(future) {
						if(startPoint + (duration -1) === days) {
							setMaxWidth(duration);
						} else {
							for(count = (startPoint + duration); count <= days; count += 1) {
								if($('#d' + count + 'r' + row).hasClass('dayGridSelected')) {
									endPoint = count;
									break;
								} else {
									endPoint = days + 1;
								}
							}
							setMaxWidth((endPoint - startPoint));
						}
					} else {
						if(startPoint === $.ti.createTripCalendar.currentView.firstDay) {
							setMaxWidth(duration);
						} else {
							for(count = (startPoint -1); count >= $.ti.createTripCalendar.currentView.firstDay; count -= 1) {
								if($('#d' + count + 'r' + row).hasClass('dayGridSelected')) {
									endPoint = count;
									break;
								} else {
									endPoint = $.ti.createTripCalendar.currentView.firstDay - 1;
								}
							}
							setMaxWidth((startPoint - endPoint) + (duration -1));
						}
					}

				}

				// Get initial grid reference of draggable
				reference = $(ui.originalElement).parent().attr('id');

				if($('#' + reference).hasClass('dayGridAccommodation')) {
					$.ti.createCalendarActivity.setInstruction('#' + reference);
				}

				// Get current duration of draggable
				duration = $.ti.createCalendarActivity.getDuration(ui.originalSize.width);

				// Checkblockers call will pass "true" if dragging east into "future" - false if dragging "west" into past
				// Do the IE event origin method
				if(event.srcElement) {
					checkBlockers($(event.srcElement).hasClass('ui-resizable-e'));
					// Or do the normal method
				} else {
					checkBlockers($(event.originalEvent.originalTarget).hasClass('ui-resizable-e'));
				}
			},

			resize: function(event, ui) {
				var oldDuration = $.ti.createCalendarActivity.getDuration(ui.originalSize.width);
				var newDuration = $.ti.createCalendarActivity.getDuration(ui.size.width);

                if (oldDuration != newDuration)
				    $.ti.recalculateCalendarActivities.calculateHeader(this, newDuration);
			},

			stop: function(event, ui) {
				var width, oldDuration, newDuration, target, reference;

				// Checks which element in the grid the activity should be appended to
				function getNewTarget(resizable) {
					var difference, oldDay, newDay, container;

					difference = newDuration - oldDuration;
					oldDay = $.ti.utils.getDay($(ui.element).attr('id'));
					newDay = oldDay - difference;

					container = $(resizable).parent().attr('id');
					container = container.replace('d' + oldDay, 'd' + newDay);

					return container;
				}

				// Calculate old activity duration
				oldDuration = $.ti.createCalendarActivity.getDuration(ui.originalSize.width);

				// Calculate new duration based on target width
				newDuration = $.ti.createCalendarActivity.getDuration(ui.size.width);

				// Remove old selected states
				reference = $(ui.originalElement).attr('id');
				$.ti.createCalendarActivity.toggleSelected(reference, oldDuration, false);

				// Calculate width to fit grid items
				width = $.ti.createTripCalendar.activityWidth + ($.ti.createTripCalendar.activityWidthMultiple * (newDuration -1));

				// Set activity width and reset position
				$(this).css({
					"position": "relative",
					"width": width,
					"left": 0,
					"top": 0
				});

				// Has anything actually changed?
				if(oldDuration !== newDuration) {
					// Detect if it was a left side resize
					if(ui.position.left !== ui.originalPosition.left) {
						// Get new grid target location
						target = getNewTarget(this);

						if($('#' + target).hasClass('dayGridAccommodation')) {
							$('p', '#' + target).remove();
						}
						// If so append activity to the new target grid item
						$('#' + target).append(this);
						// Update tripData with the data reference
						$.ti.recalculateCalendarActivities.moveActivity(target, this);
						// And update the activity id for new grid reference
						$(this).attr('id', target + 'Activity');
					} else {
						if($(ui.element).parent().hasClass('dayGridAccommodation')) {
							$(ui.element).prev('p').remove();
						}
					}
					// Update tripData with new activity duration
					$.ti.recalculateCalendarActivities.resizeActivity(this, oldDuration, newDuration);

					// Add new selected states
					reference = $(ui.originalElement).attr('id');
					$.ti.createCalendarActivity.toggleSelected(reference, newDuration, true);

                    // save the update...
		            $.ti.ajax.postData('/it/trip/', $.ti.tripData);
				}

			},

			minWidth: $.ti.createTripCalendar.activityWidth,

			handles: 'e,w'
		});
	},

	getDuration: function(width) {
		var duration;
		duration = Math.round((width - $.ti.createTripCalendar.activityWidth) / $.ti.createTripCalendar.activityWidthMultiple) + 1;
		return duration;
	},

	// Returns a grid fitting width based on the current width
	getWidth: function(width) {
		var duration;
		if(width <= $.ti.createTripCalendar.activityWidth) {
			return $.ti.createTripCalendar.activityWidth;
		} else {
			duration = Math.round((width - $.ti.createTripCalendar.activityWidth) / $.ti.createTripCalendar.activityWidthMultiple);
			width = $.ti.createTripCalendar.activityWidth + (duration * $.ti.createTripCalendar.activityWidthMultiple);
			return width;
		}
	},

	// Set up calender activity events
	events: function() {
		// Remove activity from calender event
		$('.dayGridActivityClose', '#calendarDays').live('click.deleteActivity', function() {
			$.ti.createCalendarActivity.deleteActivity($(this).closest('.dayGridActivity'));
		});
		// Show activity details event
		$('.showDetails', '#calendarDays').live('click.showDetails', function () {
			// The "rel" tag from "this" contains the id of the original item
			// Send the parent li of that id (which has the attached data) to the showDetails function
			$.ti.bag.showDetails($('#' + $(this).attr('rel')).closest('li'));
		});
	},

	deleteActivity: function(activity) {
		var duration, day, row, count, position, activityId;

		day = $.ti.utils.getDay($(activity).parent().attr('id'));
		row = $.ti.utils.getRow($(activity).parent().attr('id'));

		position = 'd' + day + 'r' + row;

		duration = Math.floor($(activity).width() / $.ti.createTripCalendar.activityWidth);

		// Check for and remove selected and hover class for activities wider than one day
		if(duration > 1) {
			for(count = 1; count <= duration; count += 1) {
				$('#d' + day + 'r' + row).removeClass('dayGridSelected dropHover');
				day += 1;
			}
		}
		// Clear selected and hover classes for target grid point
		$(activity).parent().removeClass('dayGridSelected dropHover');

		// Delete grid reference in tripData object
		$.ti.recalculateCalendarActivities.deleteActivity($(activity).attr('rel'), position + '_' + duration);

		// Add paragraph text for accommodation grid
		if($('#'+position).hasClass('dayGridAccommodation')) {
			this.setInstruction('#'+position);
		}

		$(activity).remove();
	},

	// Toggle selected state for grid item
	// Receives reference in format dXrX
	// Recieve duration (number of days/grid items)
	toggleSelected: function(reference, duration, addOrRemove) {
		var count, day, row;

		day = $.ti.utils.getDay(reference);
		row = $.ti.utils.getRow(reference);

		for(count = 0; count < duration; count += 1) {
			$('#d' + day + 'r' + row).toggleClass('dayGridSelected', addOrRemove);
			day += 1;
		}
	},

	// Toggle in and out activity title vs date information if present
	toggleDateHighlight: function(activity) {
		if($('.dateHighlightWrapper', activity)) {
			//$('.activityHeading', activity).animate({'opacity': 'toggle'}, 700);
			//$('.dateHighlightWrapper', activity).animate({'opacity': 'toggle'}, 700);
		}
	},

	// Replaces accommodation grid instruction for removed activities
	setInstruction: function(dayGrid){
		$('p', dayGrid).remove();
		$(dayGrid).prepend('<p>Seleziona e trascina l&#39;alloggio qui</p>');
	}

};

})(jQuery);
