<!--
// COMMON data handler, gui independent functions.
var languages = {};
var cities = {};
var festivaldays = {};
var templates = {};
var eventcategories = {};
var events = {};
var events_places = {};
var events_comments = {};
var events_media = {};
var places = {};
var comments = {};
var user = {rights: 0}; // authenticated user

/// Get a HTML template from the server. REQUEST.
/// Parameters:
///  filename: template name (without .html and directory)
///  endcallback: function will be called after template loaded
function GetTemplateR(filename, endcallback)
{
	/// if template already loaded, return
	if(templates[filename]) {
		endcallback.call(null);
		return;
	}
	
	var data = {};
	data.params = {};
	InputsToParams(form, ['path'], data.params);

	data.params.request = 'get_template';
	data.params.filename = filename;
	data.callback = GetTemplateA;
	data.endcallback = endcallback;

	AJAXsendRequest(data);
}

/// Get a HTML template from the server. ANSWER.
function GetTemplateA(data)
{
	var rootNode = AJAXgetTag(data.xml, 'data');
	AJAXshowMessage(rootNode);
	
	// extract html and put into "templates" hash
	if(AJAXgetAttributeValue(rootNode,'error') <= 0) {
		var lines = data.text.split("\n");
		var template = '';
		for(var i=2;i+2<lines.length;i++) template += lines[i]+"\n";
		templates[data.params.filename] = template;
	}

	if(data.endcallback) data.endcallback.call(null, AJAXgetAttributeValue(rootNode,'error'));
}


/// Cache XML in an JS hash.
function XMLIntoHash(root, name, indexname, target)
{
	if(!target) { // new empty hash
		target = {};
		target._loaded = [];
	}
	else if(!target._loaded) target._loaded = [];
	target._last_loaded = [];
	
	if(!root) return target; // check valid XML node
	
	var node = AJAXgetTag(root, name);
	while(node) {
		var hash = AJAXgetAttributesAsHash(node, name);
		if(target[hash[indexname]] == null) { // new index
			target._loaded.push(hash[indexname]);
			target[hash[indexname]] = hash;
		}
		target._last_loaded.push(hash[indexname]);
		node = AJAXgetNextTag(node);
	}
	
	return target;
}


/// Get texts for the given language. AJAX request.
/// Parameters:
///  endcallback: this function will be called on the end
/// Required FORM variables: lang
function GetTextsR(endcallback)
{
	var data = {};
	data.params = {};
	InputsToParams(form, ['lang'], data.params);

	data.params.request = 'get_texts';
	data.callback = GetTextsA;
	data.endcallback = endcallback;

	dictionary._loaded = false;
	AJAXsendRequest(data);
}

/// Get texts for the given language. AJAX answer.
//   data.xml: XML answer
function GetTextsA(data)
{
	var rootNode = AJAXgetTag(data.xml, 'data');
	AJAXshowMessage(rootNode);
	
	// put texts into the html code
	if(AJAXgetAttributeValue(rootNode,'error') <= 0) {
		dictionary = XMLIntoHash(rootNode, 'text', 'textID');
	}

	if(data.endcallback) data.endcallback.call(null, AJAXgetAttributeValue(rootNode,'error'));
}


/// Get list of languages. AJAX request.
/// Parameters:
///  endcallback: this function will be called on the end
/// Required FORM variables: -
function GetLanguagesR(endcallback) {
	var data = {};
	data.params = {};

	data.params.request = 'get_languages';
	data.callback = GetLanguagesA;
	data.endcallback = endcallback;

	languages._loaded = false;
	AJAXsendRequest(data);
}

/// Get list of languages. AJAX answer.
//   data.xml: XML answer
function GetLanguagesA(data)
{
	var rootNode = AJAXgetTag(data.xml, 'data');
	AJAXshowMessage(rootNode);
	
	// put texts into the html code
	if(AJAXgetAttributeValue(rootNode,'error') <= 0) {
		languages = XMLIntoHash(rootNode, 'language', 'ID');
	}

	if(data.endcallback) data.endcallback.call(null, AJAXgetAttributeValue(rootNode,'error'));
}



/// Get days of the festival. AJAX request.
/// Required FORM variables: lang, FESTIVALS_ID
function GetFestivalDaysR(endcallback)
{
	var data = {};
	data.params = {};
	InputsToParams(form, ['lang','FESTIVALS_ID'], data.params);

	data.params.request = 'get_festivaldays';
	data.callback = GetFestivalDaysA;
	data.endcallback = endcallback;

	festivaldays._loaded = false;
	AJAXsendRequest(data);
}

/// Get days of the festival. AJAX answer.
///   data.xml: XML answer
function GetFestivalDaysA(data)
{
	var rootNode = AJAXgetTag(data.xml, 'data');
	AJAXshowMessage(rootNode);
	
	// put texts into the html code
	if(AJAXgetAttributeValue(rootNode,'error') <= 0) {
		festivaldays = XMLIntoHash(rootNode, 'festivalday', 'date');
	}
	
	if(data.endcallback) data.endcallback.call(null, AJAXgetAttributeValue(rootNode,'error'));
}


/// Get list of cities. AJAX request.
/// Required FORM variables: -
function GetCitiesR(endcallback) {	
	var data = {};
	data.params = {};

	data.params.request = 'get_cities';
	data.callback = GetCitiesA;
	data.endcallback = endcallback;

	cities._loaded = false;
	AJAXsendRequest(data);
}

/// Get list of Cities. AJAX answer.
//   data.xml: XML answer
function GetCitiesA(data)
{
	var rootNode = AJAXgetTag(data.xml, 'data');
	AJAXshowMessage(rootNode);
	
	// put texts into the html code
	if(AJAXgetAttributeValue(rootNode,'error') <= 0) {
		cities = XMLIntoHash(rootNode, 'place', 'city');
	}
	
	if(data.endcallback) data.endcallback.call(null, AJAXgetAttributeValue(rootNode,'error'));
}


/// Get list of event categories. AJAX request.
/// Required FORM variables: lang
function GetEventcategoriesR(endcallback) {
	var data = {};
	data.params = {};

	InputsToParams(form, ['lang'], data.params);
	data.params.request = 'get_eventcategories';
	data.callback = GetEventcategoriesA;
	data.endcallback = endcallback;

	eventcategories._loaded = false;
	AJAXsendRequest(data);
}

/// Get list of event categories. AJAX answer.
//   data.xml: XML answer
function GetEventcategoriesA(data)
{
	var rootNode = AJAXgetTag(data.xml, 'data');
	AJAXshowMessage(rootNode);
	
	// put texts into the html code
	if(AJAXgetAttributeValue(rootNode,'error') <= 0) {
		eventcategories = XMLIntoHash(rootNode, 'eventcategory', 'ID');
	}
	
	if(data.endcallback) data.endcallback.call(null, AJAXgetAttributeValue(rootNode,'error'));
}


/// Get places for an event. AJAX request.
/// Parameters:
///  EVENTS_ID: event ID (optional, null for every places)
///  endcallback: this function will be called on the end
/// Required FORM variables: lang
function GetPlacesForEventR(EVENTS_ID, endcallback)
{
	var data = {};
	data.params = {};

	data.params.request = 'get_places';
	if(EVENTS_ID != null) data.params.EVENTS_ID = EVENTS_ID;
	data.callback = GetPlacesForEventA;
	data.endcallback = endcallback;

//	places._loaded = false;
	AJAXsendRequest(data);
}

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

	// put events into the page
	if(AJAXgetAttributeValue(rootNode,'error') <= 0) {
		places = XMLIntoHash(rootNode, 'place', 'ID', places);
		if(data.params.EVENTS_ID != null) events_places[data.params.EVENTS_ID] = places._last_loaded;
	}
	
	if(data.endcallback) data.endcallback.call(null, AJAXgetAttributeValue(rootNode,'error'));
}


/// Get place detailed information. AJAX request.
/// Parameters:
///  ID: place ID
///  endcallback: this function will be called on the end
/// Required FORM variables: lang
function GetPlaceR(ID, endcallback)
{
	var data = {};
	data.params = {};

	data.params.request = 'get_place';
	data.params.ID = ID;
	data.callback = GetPlaceA;
	data.endcallback = endcallback;

	AJAXsendRequest(data);
}

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

	// put events into the page
	if(AJAXgetAttributeValue(rootNode,'error') <= 0) {
		var placeNode = AJAXgetTag(rootNode, 'place');
		if (placeNode) {
			places[data.params.ID] = AJAXgetAttributesAsHash(placeNode);
			places[data.params.ID]._detailed = true;
		}
	}
	
	if(data.endcallback) data.endcallback.call(null, AJAXgetAttributeValue(rootNode,'error'));
}


/// Get comments for an event. AJAX request.
/// Parameters:
///  EVENTS_ID: event ID
///  endcallback: this function will be called on the end
/// Required FORM variables: lang
function GetCommentsForEventR(EVENTS_ID, endcallback)
{
	var data = {};
	data.params = {};

	data.params.request = 'get_comments';
	data.params.targetID = EVENTS_ID;
	data.params.targetType = 3;
	data.callback = GetCommentsForEventA;
	data.endcallback = endcallback;

	AJAXsendRequest(data);
}

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

	// put events into the page
	if(AJAXgetAttributeValue(rootNode,'error') <= 0) {
		comments = XMLIntoHash(rootNode, 'comment', 'ID', comments);
		events_comments[data.params.targetID] = comments._last_loaded;
	}
	
	if(data.endcallback) data.endcallback.call(null, AJAXgetAttributeValue(rootNode,'error'));
}


/// Get list of events. AJAX request.
/// Parameters:
///  endcallback: this function will be called on the end
/// Required FORM variables: lang, FESTIVALS_ID, date, city, EVENTCATEGORIES_ID, keywords
function GetEventsR(endcallback) {
	var data = {};
	data.params = {};

	InputsToParams(form, ['lang','FESTIVALS_ID','date','city','EVENTCATEGORIES_ID','keywords'], data.params);
	data.params.request = 'get_events';
	data.callback = GetEventsA;
	data.endcallback = endcallback;

	events._loaded = false;
	AJAXsendRequest(data);
}

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

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



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

	InputsToParams(form, ['lang'], data.params);
	data.params.request = 'get_event';
	data.params.ID = ID;
	data.callback = GetEventA;
	data.endcallback = endcallback;

	AJAXsendRequest(data);
}

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

	// put events into the page
	if(AJAXgetAttributeValue(rootNode,'error') <= 0) {
		var eventNode = AJAXgetTag(rootNode, 'event');
		if(eventNode) {
			events[data.params.ID] = AJAXgetAttributesAsHash(eventNode);
			events[data.params.ID]._detailed = true;
		}
	}
	
	if(data.endcallback) data.endcallback.call(null, AJAXgetAttributeValue(rootNode,'error'));
}


/// Get media. AJAX request.
/// Parameters:
///  EVENTS_ID: event ID (optional, null for every places)
///  endcallback: this function will be called on the end
/// Required FORM variables: lang
function GetMediaR(EVENTS_ID, type, keywords, endcallback)
{
	var data = {};
	data.params = {};
	InputsToParams(form, ['lang'], data.params);

	data.params.request = 'get_media';
	data.params.FESTIVALS_ID = GetInput('FESTIVALS_ID');
	if(EVENTS_ID != null) {
		data.params.EVENTS_ID = EVENTS_ID;
		data.params.type = type;
		data.params.keywords = keywords;
		events_media[EVENTS_ID] = null;
	}
	data.callback = GetMediaA;
	data.endcallback = endcallback;

	AJAXsendRequest(data);
}

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

	// put events into the page
	if(AJAXgetAttributeValue(rootNode,'error') <= 0) {
		media = XMLIntoHash(rootNode, 'media', 'ID');
		if(data.params.EVENTS_ID) events_media[data.params.EVENTS_ID] = media;
	}

	if(data.endcallback) data.endcallback.call(null, AJAXgetAttributeValue(rootNode,'error'), media);
}

//-->
