/**
 * ./out/lascana/src/lca_detailPicturesSlider.class.js
 * @author Bjoern Simon Lange <bjoern.lange@twt.de>, 17.11.09
 * @param Integer iStartPicture Das uebergebene Startbild welches auf jeden Fall angezeigt wird und somit als Fallback genutzt werden kann.
 * @param Object oChangedElement Das Bildelement in dem das Bild gewechselt werden soll.
 * @param String sImageBasePath Basis-Pfad fuer Bilder falls diese ohne geladen werden.
 * @package out
 * @subpackage lascana
 * @version $id$
 */

/**
 * Bildwechsler fuer die Detailseite.
 * @author Bjoern Simon Lange <bjoern.lange@twt.de>, 17.11.09
 * @author Pascal Streichert <pascal.streichert@twt.de>, 06.01.10
 * @param Integer iStartPicture Das uebergebene Startbild welches auf jeden Fall angezeigt wird und somit als Fallback genutzt werden kann.
 * @param Object oChangedElement Das Bildelement in dem das Bild gewechselt werden soll.
 * @param String sImageBasePath Basis-Pfad fuer Bilder falls diese ohne geladen werden.
 * @package out
 * @subpackage lascana
 * @version $id$
 */
function LCA_DetailPicturesSlider(iStartPicture, oChangedElement, sImageBasePath, oArrowBack, oArrowFor)
{
	/**
	 * Die Bilddaten, Keys sind die Bildnummern aus OXID. Values sind der Bildpfad mit oder ohne Basis-URL.
	 * @access private
	 * @var Array|null
	 */
	var aData = null;

	/**
	 * Die aktuelle Position als interner Zeiger welches Bild als naechstes kommen kann.
	 * @access private
	 * @var Integer
	 */
	var iActualPosition = -1;

	/**
	 * Das uebergebene Startbild welches auf jeden Fall angezeigt wird und somit als Fallback genutzt werden kann.
	 * @access private
	 * @var Integer
	 */
	var iStart = iStartPicture;

	/**
	 * Gibt an ab welchem oxpic Bilder geladen werden, und dem Daten-Array uebergeben werden sollen.
	 * @access public
	 * @var Integer
	 */
	this.iControlNumber = 7;

	/**
	 * Das Bildelement in dem das Bild gewechselt werden soll.
	 * @access private
	 * @var Object
	 */
	var oElement = oChangedElement;

	/**
	 * Basispfad fuer Bilder falls keine kompletten Pfade uebergeben wurden.
	 * @access private
	 * @var String
	 */
	var sBasePath = sImageBasePath;

	/**
	 * Elemente die beim Wechsel der Bilddaten ein- oder
	 * ausgeblendet werden sollen.
	 * @access private
	 * @var Array
	 */
	var aTriggerElements = new Array(oArrowBack, oArrowFor);

	/**
	 * Das Objekt selbst.
	 * @access private
	 * @var LCA_DetailPicturesSlider
	 */
	var oSelf = this;

	/**
	 * Style fuer aktivierte Slider-Elemente.
	 * @access private
	 * @var String
	 */
	var sEnabledStyle = new String('');

	/**
	 * Style fuer deaktivierte Slider-Elemente.
	 * @access private
	 * @var String
	 */
	var sDisabledStyle = new String('');

	/* Konstruktor Start. */
	oArrowBack.click(function(oEvent)
	{
		oSelf.backward();
		oEvent.preventDefault();
	});
	oArrowFor.click(function(oEvent)
	{
		oSelf.forward();
		oEvent.preventDefault();
	});
	/* Konstruktor Ende start. */

	/**
	 * Setzt den Aktiv-Style fuer Slider-Elemente.
	 * @access public
	 * @param String Zu setzender Style.
	 * @return void
	 */
	this.setEnabledStyle = function(sStyle)
	{
		sEnabledStyle = sStyle;
	};

	/**
	 * Setzt den Inaktiv-Style fuer Slider-Elemente.
	 * @access public
	 * @param String Zu setzender Style.
	 * @return void
	 */
	this.setDisabledStyle = function(sStyle)
	{
		sDisabledStyle = sStyle;
	};

	/**
	 * Springt im Kreis drehend ein Bild zurueck falls eines vorhanden ist.
	 * @access public
	 * @return void
	 */
	this.backward = function()
	{
		var iFirst = findFirstFilled();

		if (iActualPosition == -1)
		{
			iActualPosition = this.iControlNumber;
		} // if

		var iNext = iActualPosition - 1;

		if (iNext < iFirst)
		{
			iNext = findLastFilled();
		} // if

		iActualPosition = iNext;

		oElement.attr('src', aData[iActualPosition]);
	}; // function

	/**
	 * Wechselt die Bilddaten und saeubert falls noetig die Key-Namen.
	 * Zusaetzlich wird der Status der Slider-Elemente aktualisiert.
	 * @access public
	 * @param Object|string mJsonData Entweder ein evaluiertes JSON oder dessen String!
	 * @return void
	 */
	this.changeImageData = function(mJsonData)
	{
		aData = getCleanedData((typeof mJsonData === 'string') ? $.evalJSON(mJsonData) : mJsonData);

		if (iActualPosition == -1)
		{
			iActualPosition = iStart;
		} // if

		iPicCount = aData.length - this.iControlNumber;
		setElementState(iPicCount);
	}; // function

	/**
	 * Setzt in Abhaengigkeit von der Bilder-Anzahl den Style
	 * der Slider-Elemente auf aktiv oder inaktiv.
	 * @access private
	 * @param Integer iPicCount Anzahl der gefundenen Bilder.
	 * @return void
	 */
	var setElementState = function(iPicCount)
	{
		if(iPicCount > 1)
		{
			sStyle = sEnabledStyle;
		}
		else
		{
			sStyle = sDisabledStyle;
		} // if

		for(var i in aTriggerElements)
		{
			$(aTriggerElements[i]).attr("style", sStyle);
		} // for
	}; // function

	/**
	 * Iteriert durch das Array und versucht das erste gefuellte Element zu finden, Fallback ist das uebergebene Startbild.
	 * @access private
	 * @return Integer
	 */
	var findFirstFilled = function()
	{
		var iLength = aData.length;

		for (iRound = 0; iRound < iLength; iRound++)
		{
			if (aData[iRound])
			{
				return iRound;
			} // if
		} // for

		return iStart;
	}; // function

	/**
	 * Iteriert durch das Array und versucht das letzte gefuellte Element zu finden, Fallback ist das uebergebene Startbild.
	 * @access private
	 * @return Integer
	 */
	var findLastFilled = function()
	{
		var iLength = aData.length;

		for (iRound = iLength; iRound >= 0; --iRound)
		{
			if (aData[iRound])
			{
				return iRound;
			} // if
		} // for

		return iStart;
	}; // function

	/**
	 * Spring falls vorhanden kreis-drehend zum naechsten Bild.
	 * @access public
	 * @return void
	 */
	this.forward = function()
	{
		var iNextPosition = iActualPosition + 1;

		if (iActualPosition == -1)
		{
			iActualPosition = (this.iControlNumber + 1);
		} // if
		else if (iNextPosition >= aData.length)
		{
			iActualPosition = findFirstFilled();
		} // if
		else
		{
			iActualPosition = iNextPosition;
		} // else

		var sData = aData[iActualPosition];

		if (!sData)
		{
			iActualPosition = findFirstFilled();
			sData           = aData[iActualPosition];
		} // if

		if (iActualPosition)
		{
			oElement.attr('src', sData);
		} // if
	}; // function

	/**
	 * Erstellt aus dem uebergebenen JSON mit String-Keys ein sauberes Array von Bildnamen per Key-Definition.
	 * @access private
	 * @param Object oJsonData
	 * @return Array
	 */
	var getCleanedData = function(oJsonData)
	{
		var aCopy = new Array();

		for (mRound in oJsonData)
		{
			var mValue = oJsonData[mRound];

			if (mValue && ((parseInt(mRound) == mRound) || (mRound.indexOf('oxarticles__oxpic') !== -1)))
			{
				var iRound = mRound.replace(/oxarticles__oxpic/g, "");

				if (iRound < oSelf.iControlNumber)
				{
					continue;
				} // if

				if (sBasePath && (mValue.indexOf('http://') == -1))
				{
					mValue = sBasePath + mValue;
				} // if

				aCopy[iRound] = mValue;
			} // if
		} // for

		return aCopy;
	}; // function
} // class