/**
 * @copyright	Copyright (C) 2005 - 2013 Open Source Matters, Inc. All rights reserved.
 * @license		GNU General Public License version 2 or later; see LICENSE.txt
 */

/**
 * Some state variables for the overrider
 */
Joomla.overrider = {
	states : {
		refreshing: false,
		refreshed: false,
		counter: 0,
		searchstring: '',
		searchtype: 'value'
	}
};

/**
 * Method for refreshing the database cache of known language strings via Ajax
 *
 * @return	void
 *
 * @since		2.5
 */
Joomla.overrider.refreshCache = function()
{
	var req = new Request.JSON({
		method: 'post',
		url: 'index.php?option=com_languages&task=strings.refresh&format=json',
		onRequest: function()
		{
			this.states.refreshing = true;
			document.id('refresh-status').reveal();
		}.bind(this),
		onSuccess: function(r)
		{
			if (r.error && r.message)
			{
				alert(r.message);
			}
			if (r.messages)
			{
				Joomla.renderMessages(r.messages);
			}
			document.id('refresh-status').dissolve();
			this.states.refreshing = false;
		}.bind(this),
		onFailure: function(xhr)
		{
			alert(Joomla.JText._('COM_LANGUAGES_VIEW_OVERRIDE_REQUEST_ERROR'));
			document.id('refresh-status').dissolve();
		}.bind(this),
		onError: function(text, error)
		{
			alert(error + "\n\n" + text);
			document.id('refresh-status').dissolve();
		}.bind(this)
	});
	req.post();
};

/**
 * Method for searching known language strings via Ajax
 *
 * @param		int		 	more	Determines the limit start of the results
 *
 * @return	void
 *
 * @since		2.5
 */
Joomla.overrider.searchStrings = function(more)
{
	// Prevent searching if the cache is refreshed at the moment
	if (this.states.refreshing)
	{
		return;
	}

	// Only update the used searchstring and searchtype if the search button
	// was used to start the search (that will be the case if 'more' is null)
	if (!more)
	{
		this.states.searchstring 	= document.id('jform_searchstring').value;
		this.states.searchtype		= 'value';
		if (document.id('jform_searchtype0').checked)
		{
			this.states.searchtype 	= 'constant';
		}
	}

	if (!this.states.searchstring)
	{
		document.id('jform_searchstring').addClass('invalid');

		return;
	}

	var req = new Request.JSON({
		method: 'post',
		url: 'index.php?option=com_languages&task=strings.search&format=json',
		onRequest: function()
		{
			if (more)
			{
				// If 'more' is greater than 0 we have already displayed some results for
				// the current searchstring, so display the spinner at the more link
				document.id('more-results').addClass('overrider-spinner');
			}
			else
			{
				// Otherwise it is a new searchstring and we have to remove all previous results first
				document.id('more-results').set('style', 'display:none;');
				var children = $$('#results-container div.language-results');
				children.destroy();
				document.id('results-container').addClass('overrider-spinner').reveal();
			}
		}.bind(this),
		onSuccess: function(r) {
			if (r.error && r.message)
			{
				alert(r.message);
			}
			if (r.messages)
			{
				Joomla.renderMessages(r.messages);
			}
			if(r.data)
			{
				if(r.data.results)
				{
					this.insertResults(r.data.results);
				}
				if(r.data.more)
				{
					// If there are more results than the sent ones
					// display the more link
					this.states.more = r.data.more;
					document.id('more-results').reveal();
				}
				else
				{
					document.id('more-results').set('style', 'display:none;');
				}
			}
			document.id('results-container').removeClass('overrider-spinner');
			document.id('more-results').removeClass('overrider-spinner');
		}.bind(this),
		onFailure: function(xhr)
		{
			alert(Joomla.JText._('COM_LANGUAGES_VIEW_OVERRIDE_REQUEST_ERROR'));
			document.id('results-container').removeClass('overrider-spinner');
			document.id('more-results').removeClass('overrider-spinner');
		}.bind(this),
		onError: function(text, error)
		{
			alert(error + "\n\n" + text);
			document.id('results-container').removeClass('overrider-spinner');
			document.id('more-results').removeClass('overrider-spinner');
		}.bind(this)
	});
	req.post('searchstring=' + this.states.searchstring + '&searchtype=' + this.states.searchtype + '&more=' + more);
};

/**
 * Method inserting the received results into the results container
 *
 * @param		array results An array of search result objects
 *
 * @return	void
 *
 * @since		2.5
 */
Joomla.overrider.insertResults = function(results)
{
	// For creating an individual ID for each result we use a counter
	this.states.counter = this.states.counter + 1;

	// Create a container into which all the results will be inserted
	var results_div = new Element('div', {
		id: 'language-results' + this.states.counter,
		'class': 'language-results',
		style: 'display:none;'
	});

	// Create some elements for each result and insert it into the container
	Array.each(results, function (item, index) {
		var div = new Element('div', {
			'class':	'result row' + index%2,
			onclick:	'Joomla.overrider.selectString(' + this.states.counter + index + ');',
		});
		var key = new Element('div', {
			id:				'override_key' + this.states.counter + index,
			'class':	'result-key',
			html:			item.constant,
			title:		item.file
		});
		key.inject(div);
		var string = new Element('div', {
			id:				'override_string' + this.states.counter + index,
			'class':	'result-string',
			html:			item.string
		});
		string.inject(div);
		div.inject(results_div);
	}, this);

	// If there aren't any results display an appropriate message
	if(!results.length)
	{
		var noresult = new Element('div', {
			html: Joomla.JText._('COM_LANGUAGES_VIEW_OVERRIDE_NO_RESULTS')
		});
		noresult.inject(results_div);
	}

	// Finally insert the container afore the more link and reveal it
	results_div.inject(document.id('more-results'), 'before');
	document.id('language-results' + this.states.counter).reveal();
};

/**
 * Inserts a specific constant/value pair into the form and scrolls the page back to the top
 *
 * @param		int		id	The ID of the element which was selected for insertion
 *
 * @return	void
 *
 * @since		2.5
 */
Joomla.overrider.selectString = function(id)
{
	document.id('jform_key').value = document.id('override_key' + id).get('html');
	document.id('jform_override').value = document.id('override_string' + id).get('html');
	new Fx.Scroll(window).toTop();
};