/**
 * Erzeugt ein neuen Transparenz-Kontroll f&uuml;r die Kartenansicht.
 * 
 * @class Ein Slider, mit dem der Benutzer den Transparenzgrad z.B. einer Karte setzen kann.
 * 
 * @extends IWControl
 * 
 * @param {IWMap}
 *            map Eine Referenz auf die Karte.
 * 
 * @param {String}
 *            GLOBAL_APP_URL Die globale URL der Anwendung.
 * 
 * @author Jan Oliver Zieger
 */
function IWOpacityControl(map, GLOBAL_APP_URL)
{
	IWControl.call(this, map, 'IWOpacityControl');

	// ********************************************************************
	// * Private attributes
	// ********************************************************************

	var self = this;
	var lowValue = 0;
	var highValue = 100;
	var maxSlide = 0;
	var sliderButtonWidth = 0;
	var currentOpacity = 100;
	var mouseAdapter = new IWMouseAdapter();
	var container = this.getContainer();

	// Wann soll die Karte neu gezeichnet werden? Nach dem Loslassen des Sliders (false) oder immer (true);
	var smoothSlideBool = false;
	var sliderImage = GLOBAL_APP_URL + 'img/opacity-slider.png';
	var sliderButtonImage = GLOBAL_APP_URL + 'img/opacity-sliderButton.png';
	var divSliderButton = null;
	var elementForOpacity = new Array();
	var elementForOpacityLastElement = new Array();

	var pack = new IWLanguagePack();
	pack.addLanguage(new IWLanguage('de', iwconst.LOCAL_APP_URL + 'lang/IWSliderControl.lang.de'));
	pack.addLanguage(new IWLanguage('en', iwconst.LOCAL_APP_URL + 'lang/IWSliderControl.lang.en'));
	pack.addLanguage(new IWLanguage('es', iwconst.LOCAL_APP_URL + 'lang/IWSliderControl.lang.es'));
	pack.addLanguage(new IWLanguage('tr', iwconst.LOCAL_APP_URL + 'lang/IWSliderControl.lang.tr'));
	pack.addLanguage(new IWLanguage('fr', iwconst.LOCAL_APP_URL + 'lang/IWSliderControl.lang.fr'));
	pack.addLanguage(new IWLanguage('it', iwconst.LOCAL_APP_URL + 'lang/IWSliderControl.lang.it'));

	IWMultiLanguageSupport.call(this, map, pack);

	/**
	 * Berechnet den aktuellen Prozentwert des Sliders [0.0 - 100.0].
	 * 
	 * @returns {Double} Der aktuelle Prozentwert.
	 */
	this.getValue = function()
	{
		var pixelWidth = parseInt(divSliderButton.style.left);
		var rangePercent = pixelWidth / maxSlide;
		var scaleRange = highValue - lowValue;
		return highValue - (scaleRange * rangePercent);
	};

	/**
	 * Bestimmt, wann der Transparenzwert gesetzt werden soll: Nach dem Loslassen des Sliders (false) oder immer (true).
	 * 
	 * @param {Boolean}
	 *            sSlideBool
	 * @return {Boolean} Der gesetzte Wert.
	 */
	this.smoothSlide = function(sSlideBool)
	{
		if (sSlideBool != null)
			smoothSlideBool = sSlideBool;
		else
			return smoothSlideBool;
	};

	/**
	 * F&uuml;gt dem Kontroll ein neues Element hinzu, von dem die Transparenz gesetzt werden soll.
	 * 
	 * @param elementID
	 *            Die ID des Elementds.
	 */
	this.addElementByID = function(elementID)
	{
		elementForOpacity.push(elementID);
	};

	/**
	 * Wird, nachdem das Kontroll gesetzt wurde, ausgef&uuml;hrt.
	 */
	this.afterAppend = function()
	{
		buildGUI();

		divSliderButton.style.left = maxSlide + 'px';

		this.loadLanguagePack(map.getOptions().getLanguage());
	};

	/**
	 * Zwingt das Kontroll, erneut den Transparenzgrad zu setzen.
	 */
	this.updateOpacity = function()
	{
		if (currentOpacity)
		{
			setOpacity(currentOpacity);
		}
	};

	/**
	 * R&uuml;ckgabe der String-Darstellung des Kontrolls.
	 * 
	 * @returns {String} Der Name der Klasse.
	 */
	this.toString = function()
	{
		return '[IWOpacityControl]';
	};

	/**
	 * Setzt den Transparenzgrad der gew&uuml;nschten Elemente. Erlaubte Werte sind [0.0 - 100.0].
	 * 
	 * 0.0 = transparent
	 * 
	 * 100.0 = sichtbar
	 * 
	 * @param {Double}
	 *            value Der aktuelle Prozentwert.
	 */
	function setOpacity(value)
	{
		currentOpacity = value;

		if (value >= 0 && value <= highValue)
		{
			for ( var i = 0; i < elementForOpacity.length; i++)
			{
				var el = document.getElementById(elementForOpacity[i]);
				setElementOpacity(el, value);
			}

			for ( var i = 0; i < elementForOpacityLastElement.length; i++)
			{
				var el = elementForOpacityLastElement[i];
				var lastChild = el.lastChild;

				if (lastChild != null && lastChild.id == "")
				{
					setElementOpacity(lastChild, value);
				}
			}
		}
	}

	/**
	 * Zur Fallunterscheidung der verschiedenen Browser.
	 * 
	 * @param el
	 * @param value
	 */
	function setElementOpacity(el, value)
	{
		if (el != null && el.style != null)
		{
			// Firefox
			if (el.style.opacity != null)
				el.style.opacity = value / highValue;

			// IE
			if (el.style.filter != null)
				el.style.filter = 'alpha(opacity:' + value + ')';
		}
	}

	function buildGUI()
	{
		// ********************************************************************
		// * Adds the slider background
		// ********************************************************************

		iw.backgroundImage(container, sliderImage);

		// ********************************************************************
		// * Adds the the slider button
		// ********************************************************************

		divSliderButton = iw.create('div');
		iw.append(container, divSliderButton);
		divSliderButton.className = 'button';

		iw.backgroundImage(divSliderButton, sliderButtonImage);

		zoomInHeight = 0;
		zoomClickHeight = 0;
		sliderButtonHeight = IWDOMHelper.getSize(divSliderButton, container).getWidth();

		// maxSlide = zoomClickHeight - sliderButtonHeight;

		maxSlide = 70 - sliderButtonHeight;

		IWEventManager.addDomListener(divSliderButton, 'onmousedown', function(event)
		{
			if (!event)
			{
				event = window.event;
			}

			if (event.cancelable)
			{
				event.preventDefault();
			}
			event.cancelBubble = false;
			event.returnValue = false;

			if (mouseAdapter.getButton(event) != IWButton.LEFT)
			{
				return;
			}

			var mousePositionXY = mouseAdapter.getPositionXY(event, container);
			var oldPosY = mousePositionXY.x;

			limitHigh = zoomInHeight;
			limitLow = maxSlide + zoomInHeight;

			var onMouseMoveListener = IWEventManager.addListener(document.body, 'onmousemove', function(event)
			{
				if (!event)
				{
					event = window.event;
				}

				var mousePositionXY = mouseAdapter.getPositionXY(event, container);
				var mouseOffsetY = mousePositionXY.x - oldPosY;
				oldPosY = mousePositionXY.x;

				if (event.cancelable)
				{
					event.preventDefault();
				}
				event.cancelBubble = false;
				event.returnValue = false;

				var x = Math.min(Math.max(parseInt(divSliderButton.style.left) + mouseOffsetY, limitHigh), limitLow);

				var oldValue = self.getValue();

				divSliderButton.style.left = x + 'px';

				var newValue = self.getValue();

				if (oldValue != newValue && self.smoothSlide())
				{
					setOpacity(highValue - self.getValue());
				}
			});

			var onMouseUpListener = IWEventManager.addListener(document.body, 'onmouseup', function(event)
			{
				if (!self.smoothSlide())
				{
					setOpacity(highValue - self.getValue());
				}
				IWEventManager.removeListener(onMouseMoveListener);
				IWEventManager.removeListener(onMouseUpListener);
			});
		});
	}

	this.setId('IWOpacityControl');
	container.className = 'IWOpacityControl';
}
