//////////////////// CONTENT EDITOR FUNCTIONS //////////////////
/// Delete event from the system.
function DeleteEvent(ID)
{
	if(!Confirm('warning_delete')) return;
	DeleteEventR(ID, RemoveEventFromList);
}

/// Remove event from event's list.
function RemoveEventFromList(error, ID)
{
	if(error <= 0) { // no error
		var node = document.getElementById('event_'+ID);
		if(node) {
			node.innerHTML = '';
			node.className += ' hidden';
		}
	}
}


/// Delete event. AJAX request.
/// Parameters:
///  ID: event ID
///  endcallback: this function will be called on the end
/// Required FORM variables: -
function DeleteEventR(ID, endcallback)
{
	var data = {};
	data.params = {};

	data.params.request = 'delete_event';
	data.params.ID = ID;
	data.params.session_id = user.session_id;
	data.callback = DeleteEventA;
	data.endcallback = endcallback;

	AJAXsendRequest(data);
}

/// Get list of events. AJAX answer.
//   data.xml: XML answer
function DeleteEventA(data)
{
	var rootNode = AJAXgetTag(data.xml, 'data');
	AJAXshowMessage(rootNode);

	// put events into the page
	if(AJAXgetAttributeValue(rootNode,'error') <= 0) {
		events[data.params.ID] = null;
		events_places[data.params.ID] = null;
		DeleteArrayItem(events._loaded, data.params.ID);
	}
	
	if(data.endcallback) data.endcallback.call(null, AJAXgetAttributeValue(rootNode,'error'), data.params.ID);
}


var edit_event = {};
/// Edit event.
/// Paremeters:
///  ID: event ID, -1 if new event
function EditEvent(ID)
{
	if(edit_event.ID) return;
	edit_event.ID = ID;
	
	if(ID != -1) {
		if(!events[ID]._detailed) GetEventR(ID, EditEventC);
		if(!events_places[ID]) GetPlacesForEventR(ID, EditEventC);
	}
	
	ShowAdminEdit(true, EditEventC);
	GetTemplateR('admin_edit_event', EditEventC);
}

var br_regexp = new RegExp(/\[br\]/ig);
/// Edit event. Callback.
function EditEventC()
{
	if(
		!templates.admin_edit_event || !background_faded ||
		(edit_event.ID != -1 && (!events[edit_event.ID]._detailed || !events_places[edit_event.ID]))
	) return;

	if(admin_edit.node) {	
		// existing event, put data into form
		if(edit_event.ID != -1) {
			edit_event = CopyHash(events[edit_event.ID]);
		}
		
		// new event defaults
		else {
			edit_event.name = '';
			edit_event.shortDescription = '';
			edit_event.description = '';
			edit_event.beginning = GetInput('date');
			edit_event.ending = '';
			edit_event.EVENTCATEGORIES_ID = GetInput('EVENTCATEGORIES_ID');
		}
	
		edit_event.shortDescription = edit_event.shortDescription.replace(br_regexp, "\r\n");
		edit_event.description = edit_event.description.replace(br_regexp, "\r\n");

		// beginning time
		if(edit_event.beginning.length) {
			var date = TimestampToJSDate(edit_event.beginning);
			edit_event.beginning_hour = date.getHours();
			if(edit_event.beginning_hour < 10) edit_event.beginning_hour = '0'+edit_event.beginning_hour;
			edit_event.beginning_minute = date.getMinutes();
			if(edit_event.beginning_minute < 10) edit_event.beginning_minute = '0'+edit_event.beginning_minute;
		} else {
			edit_event.beginning_hour = '';
			edit_event.beginning_minute = '';
		}

		// ending time
		if(edit_event.ending.length) {
			var date = TimestampToJSDate(edit_event.ending);
			edit_event.ending_hour = date.getHours();
			if(edit_event.ending_hour < 10) edit_event.ending_hour = '0'+edit_event.ending_hour;
			edit_event.ending_minute = date.getMinutes();
			if(edit_event.ending_minute < 10) edit_event.ending_minute = '0'+edit_event.ending_minute;
		} else {
			edit_event.ending_hour = '';
			edit_event.ending_minute = '';
		}

		admin_edit.node.innerHTML = InjectTemplate(edit_event, templates.admin_edit_event, true);

		// put days into <SELECT
		for(var i=0; i<festivaldays._loaded.length; i++) {
			var festivalday = festivaldays[festivaldays._loaded[i]];
			form.event_date.options[i] = new Option(TimestampToDate(festivalday.date), festivalday.date);
		}
		
		// put eventcategories into <SELECT
		for(var i=0; i<eventcategories._loaded.length; i++) {
			var evtcat = eventcategories[eventcategories._loaded[i]];
			form.event_category.options[i] = new Option(evtcat.name, evtcat.ID);
		}

		// put places into <SELECT
		for(var i=0; i<places._loaded.length; i++) {
			var placecat = places[places._loaded[i]];
			form.event_place.options[i] = new Option(placecat.city+' - '+placecat.name, placecat.ID);
		}
		
		if(edit_event.beginning.length) {
			// get date by remove hours/minutes from beginning time
			var date = TimestampToJSDate(edit_event.beginning);
			date.setHours(0);
			date.setMinutes(0);
			SetInput('event_date', JSDateToTimestamp(date));
		}

		// select category
		SetInput('event_category', edit_event.EVENTCATEGORIES_ID);
		
		// select place
		if(events_places[edit_event.ID] != null && events_places[edit_event.ID].length) {
			SetInput('event_place', events_places[edit_event.ID][0]);
		}
		
		// checks
		CallWidgetsCallback('event_beginning_hour','onkeyup');
		CallWidgetsCallback('event_beginning_minute','onkeyup');
		CallWidgetsCallback('event_name','onkeyup');
	}
}


/// Cancel event editing and close window.
function CancelEditEvent()
{
	edit_event = {};
	ShowAdminEdit(false);
}


var newline_regexp = new RegExp(/(\r\n|[\r\n])/g);
/// Update event (or create new one).
/// Parameters:
///  ID; event ID
///  endcallback:
function UpdateEvent(ID, endcallback)
{
	// check input fields
	if(
		!ok_regexp.test(form.event_name.className) ||
		!ok_regexp.test(form.event_beginning_hour.className) ||
		!ok_regexp.test(form.event_beginning_minute.className)
	) {
		ShowMessage('error_missing_required_fields');
		return;
	}

	if(!AJAXlock('UpdateEvent', true)) return; // lock

	// send data via AJAX
	var data = {};
	data.params = {};

	// update data.params
	if(ID == -1) data.params.FESTIVALS_ID = GetInput('FESTIVALS_ID'); // new event
	else data.params.ID = ID;
	data.params.lang = GetInput('lang');
	data.params.session_id = user.session_id;
	data.params.EVENTCATEGORIES_ID = GetInput('event_category');
	data.params.name = GetInput('event_name');
	data.params.shortDescription = GetInput('event_shortDescription').replace(newline_regexp,'[br]');
	if(data.params.shortDescription.length>254) data.params.shortDescription = data.params.shortDescription.substring(1,255);
	data.params.description = GetInput('event_description').replace(newline_regexp,'[br]');
	
	// beginning
	var date = TimestampToJSDate(GetInput('event_date'));
	date.setHours(GetInput('event_beginning_hour'));
	date.setMinutes(GetInput('event_beginning_minute'));
	data.params.beginning = JSDateToTimestamp(date);
	
	// ending
	if(InputLength('event_ending_hour') && InputLength('event_ending_minute')) {
		date.setHours(GetInput('event_ending_hour'));
		date.setMinutes(GetInput('event_ending_minute'));
		data.params.ending = JSDateToTimestamp(date);
	}

	if(ID == -1) data.params.request = 'add_event'; // new event
	else data.params.request = 'update_event';
	data.callback = UpdateEventA;
	data.endcallback = endcallback;
	
	AJAXsendRequest(data);
}

/// Send event's comment to the server via AJAX. Answer.
//   data.xml: XML answer
function UpdateEventA(data)
{
	var rootNode = AJAXgetTag(data.xml, 'data');
	AJAXshowMessage(rootNode);

	if(!AJAXlock('UpdateEvent', false)) return; // lock

	// put events into the page
	if(AJAXgetAttributeValue(rootNode,'error') <= 0) {
		var PLACES_ID = [GetInput('event_place')];
		
		// existing event
		if(data.params.request == 'update_event') {
			// update places only when its changed
			if(
				events_places[data.params.ID] && events_places[data.params.ID][0] && 
				GetInput('event_place') == events_places[data.params.ID][0]
			) 
				SetPlacesForEventA(data);
			else
				SetPlacesForEventR(data.params.ID, PLACES_ID, data.endcallback);
		}
		
		// new event
		else SetPlacesForEventR(AJAXgetAttributeValue(AJAXgetTag(rootNode, 'event'), 'ID'), PLACES_ID, data.endcallback);
	}
	else if(data.endcallback) data.endcallback.call(null, AJAXgetAttributeValue(rootNode,'error'));
}

/// Set places for event. AJAX request.
/// Parameters:
///  ID: event ID
///  PLACES_ID: places ID in an array
///  endcallback: this function will be called on the end
function SetPlacesForEventR(ID, PLACES_ID, endcallback)
{
	var data = {};
	data.params = {};

	if(!AJAXlock('SetPlacesForEvent', true)) return; // lock

	data.params.session_id = user.session_id;
	data.params.ID = ID;
	for(var k in PLACES_ID) data.params['PLACES_ID['+k+']'] = PLACES_ID[k];	
	data.params.request = 'set_places_for_event';
	
	data.callback = SetPlacesForEventA;
	data.endcallback = endcallback;

	AJAXsendRequest(data);
}

/// Get places for an event. AJAX answer.
//   data.xml: XML answer
function SetPlacesForEventA(data)
{
	var rootNode = AJAXgetTag(data.xml, 'data');
	AJAXshowMessage(rootNode);

	// put events into the page
	if(AJAXgetAttributeValue(rootNode,'error') <= 0) {
		edit_event = {};
		events_places[data.params.ID] = null;
		ShowAdminEdit(false);
		SearchEvents();
	}
	
	if(!AJAXlock('SetPlacesForEvent', false)) return; // lock
	if(data.endcallback) data.endcallback.call(null, AJAXgetAttributeValue(rootNode,'error'));
}


/// Delete media from event/festival.
function DeleteMedia(MEDIA_ID, EVENTS_ID, FESTIVALS_ID)
{
	if(!Confirm('warning_delete')) return;
	DeleteMediaR(MEDIA_ID, EVENTS_ID, FESTIVALS_ID, RemoveMediaFromList);
}

/// Remove event from event's list.
function RemoveMediaFromList(error, ID)
{
	if(error <= 0) { // no error
		var node = document.getElementById('media_'+ID);
		if(node) {
			node.innerHTML = '';
			node.className += ' hidden';
		}
	}
}


/// Delete media. AJAX request.
/// Parameters:
///  ID: media ID
///  endcallback: this function will be called on the end
/// Required FORM variables: -
function DeleteMediaR(ID, endcallback)
{
	var data = {};
	data.params = {};

	data.params.request = 'delete_media';
	data.params.ID = ID;
	data.params.EVENTS_ID = selected_event.ID;
	data.params.FESTIVALS_ID = '';
	data.params.session_id = user.session_id;
	data.callback = DeleteMediaA;
	data.endcallback = endcallback;

	AJAXsendRequest(data);
}

/// Delete media. AJAX answer.
//   data.xml: XML answer
function DeleteMediaA(data)
{
	var rootNode = AJAXgetTag(data.xml, 'data');
	AJAXshowMessage(rootNode);

	// put events into the page
	if(AJAXgetAttributeValue(rootNode,'error') <= 0) {
		ShowMediaTab(true);
	}
	
	if(data.endcallback) data.endcallback.call(null, AJAXgetAttributeValue(rootNode,'error'), data.params.ID);
}


function AddMedia()
{
	ShowAdminEdit(true, AddMediaC);
	GetTemplateR('admin_add_media', AddMediaC);
}


/// Add media. Callback.
function AddMediaC()
{
	if(!templates.admin_add_media || !background_faded) return;

	if(admin_edit.node) {
		var data = {};

		admin_edit.node.innerHTML = InjectTemplate({'EVENTS_ID': selected_event.ID}, templates.admin_add_media, true);
	}
}


/// Cancel event editing and close window.
function CancelAddMedia()
{
	if(uploading_media) return;
	ShowAdminEdit(false);
}

var mandatory_regexp = new RegExp('mandatory');
/// Set file upload status (enabled only for pictures.
function MediaTypeChanged()
{
	// picture (upload allowed)
	if(GetInput('media_type') == 1) {
		DisableInput('media_file', false);
		form.media_url.className = form.media_url.className.replace(mandatory_regexp,'');
	}
	
	// sound or video
	else {
		DisableInput('media_file', true);
		if(!mandatory_regexp.test(form.media_url.className)) form.media_url.className += ' mandatory';
	}
}

/// Save new media to the db. AJAX request.
var uploading_media = false;
function SaveNewMediaR()
{
	// check input fields
	if(mandatory_regexp.test(form.media_url.className) && !ok_regexp.test(form.media_url.className)) {
		ShowMessage('error_missing_required_fields');
		return;
	}
	
	SetInput('request', 'add_media');
	SetInput('session_id', user.session_id);
	
	uploading_media = true;
	var node = document.getElementById('uploading_media');
	if(node) node.className = 'admin_uploading_media_btn';
	
	form.submit();
}

/// Save new media to the db. AJAX answer.
function SaveNewMediaA(MEDIA_ID, error, message)
{
	/// stop uploading anim
	var node = document.getElementById('uploading_media');
	if(node) node.className = 'admin_ok_btn';
	uploading_media = false;
	
	if(message.length) ShowMessage(message);
	
	if(error == 0) {
		if(InputLength('EVENTS_ID') > 0) AddMediaForEventR(GetInput('EVENTS_ID'), [MEDIA_ID]);
		else {
			CancelAddMedia();
			ShowMediaTab(true);
		}
	}
	
	SetInput('request', '');
	SetInput('session_id', '');	
}

/// Add media for an event. AJAX request.
/// Parameters:
///  ID: event ID
///  MEDIA_ID: array of media ID
///  endcallback: this function will be called on the end
/// Required FORM variables: -
function AddMediaForEventR(ID, MEDIA_ID, endcallback)
{
	var data = {};
	data.params = {};

	data.params.ID = ID;
	for(var i=0; i<MEDIA_ID.length; i++) data.params['MEDIA_ID['+i+']'] = MEDIA_ID[i];

	data.params.request = 'add_media_for_event';
	data.params.session_id = user.session_id;
	data.callback = AddMediaForEventA;
	data.endcallback = endcallback;

	AJAXsendRequest(data);
}

/// Add media for an event. AJAX answer.
//   data.xml: XML answer
function AddMediaForEventA(data)
{
	var rootNode = AJAXgetTag(data.xml, 'data');
	AJAXshowMessage(rootNode);

	// put events into the page
	if(AJAXgetAttributeValue(rootNode,'error') <= 0) {
		CancelAddMedia();
		ShowMediaTab(true);
	}
	
	if(data.endcallback) data.endcallback.call(null, AJAXgetAttributeValue(rootNode,'error'), data.params.ID);
}

function SearchMediaForAddMedia()
{
	add_media_list = null;
	GetMediaR('', GetInput('media_type2'), GetInput('media_keywords2'), SearchMediaForAddMediaC);
	GetTemplateR('admin_add_media_list', SearchMediaForAddMediaC);
}

var add_media_list = null;
function SearchMediaForAddMediaC(error, media)
{
	if(media) add_media_list = media; // save media

	if(add_media_list && templates.admin_add_media_list) { // check result and template
		var html = '';
		for(var i=0;i<add_media_list._last_loaded.length; i++) {
			html += InjectTemplate(add_media_list[add_media_list._last_loaded[i]],templates.admin_add_media_list);
		}

		var node = document.getElementById('add_media_list');
		if(node) node.innerHTML = html;
	}
}

var selected_regexp = new RegExp('selected');
/// Select media, modify class name.
function SelectMedia(node, ID)
{
	if(selected_regexp.test(node.className)) {
		node.className = node.className.replace(selected_regexp,'');
		if(add_media_list && add_media_list[ID]) add_media_list[ID].selected = false;
	}
	else {
		node.className += ' selected';
		if(add_media_list && add_media_list[ID]) add_media_list[ID].selected = true;
	}
}

/// Add media for event from a list (contains media in the system).
function AddMediaForEventFromList()
{
	if(add_media_list) {
		var selectedIDs = [];
		var id = '';
		
		// gather selected media IDs
		for(var i=0; i<add_media_list._last_loaded.length; i++) {
			id = add_media_list._last_loaded[i];
			if(add_media_list[id].selected) selectedIDs.push(id);
		}
		
		AddMediaForEventR(GetInput('EVENTS_ID'), selectedIDs);
	}
}

