// ############################################################################
// ######### NUMISMATIK SHOP ENGINE with AJAX                         #########
// ######### Copyright: SiteForce AG - 2008  Programming: fk@siteforce.de  ####
// ######### version: 29.01.2009 17:45 Uhr  						  #########
// ############################################################################

// ############################################################################
// ######################## SHOP ENGINE DEFINITIONS  ########################

//var gMode = "offline";
var gMode = "online";
var gLocaleString = "de_DE"; // ## used for Language switching

var gBrowser = getBrowser(); // ### check Browser
var gMagnifyWindow = null;

var requestProductListCount = 0; 	// ### AJAX counter of request requestProductListCount
var requestProductDetailsCount = 0; // ### AJAX counter of requestProductDetailsCount
// ##################################################################
// ################## GLOBAL VARIABLES   ############################
var gPRODUCTLIST = new Array(); // ## array of all gPRODUCT Items
var gPRODUCTLIST_counter = 0;
var gActualSelectedProduct = null; // ### global Object of actual selected product

var gRecursiveSmartBrowserColumnRebuild = 0; // ### global variable for number of columns of recursive smart browser rebuild
var gSelectedPrimaryPathElements = new Array();
// ##################################################################

var gScriptPath = "";
var gPaginationStart = null;
var gPaginationEnd = null;
var gPaginationNumberPerPage = 5; // ### defines the maximaql number of pages per page


var gSelectedPage = 1; // ### default selected page

var gFadeInTimeoutHandle = null; // ### time out handler of last fade out timeout
var gFadeOutTimeoutHandle = null; // ### time out handler of last fade in timeout

var virtualGroupId = "";

// ###############   initShop    ###############
function initShop() {

    // ##### INITIAL LOAD OF ROOT DATA FOR COLUMN 1  #####

	// #### PARSE QUERY STRING FOR DOIRECT PRODUCT CALL
	var queryString = document.location.search;
	if(queryString.length > 1){
		var queryArgumentArray = getQueryStringArgumentsArray();
		if (queryArgumentArray.productId) var productId = queryArgumentArray.productId;
		if (queryArgumentArray.productNumber) var productNumber = queryArgumentArray.productNumber;
		if (queryArgumentArray.virtualGroup) var virtualGroup = queryArgumentArray.virtualGroup;


		if(productId != null){
			directProductCall(productId);  // ### directProductCall
			switchShopStatus('details');
		}else if (productNumber != null){
			directCallProductDetail("productNumber", productNumber);  // ### directCallProductDetail
			switchShopStatus('details');
		}else if (virtualGroup !=null){
			//alert("virtualGroup is : "+virtualGroup);
			switchShopStatus('browser');
			updateMenuForVirtualGroup(virtualGroup);

			requestVirtualGroupId=virtualGroupId;
			requestActivatedSinceDays = null;
			requestOnlySpecials = null;

			initSmartBrowser();
			//shopMenuFilter('virtualGroup',virtualGroupId);
		}else {
			switchShopStatus('details');
		}

		//switchShopStatus('browser');
	} else {
    	switchShopStatus('browser');
    	initSmartBrowser();
    }

    //switchShopStatus('details');
}


// ############### checkNavigatingAway #################################
function checkNavigatingAway(link) {
	// ### call form Session bar links warenkorb and merkzettel ###
	//alert("checkNavigatingAway link " + link);
	document.location.href = link;

    return false;
}



// ############### shop menu filter functions - Start #################################

// ##### switch "condition1" for appending "condition2" as request parameter in requestQuery(see requestBrowserColData(...) in smartbrowser.js)
// ##### f.e.: if "condition1" is "virtualGroup", then "condition2" is virtualGroupId
// ##### f.e.: if "condition1" is "activatedSinceDays", then "condition2" is dayNumber

function shopMenuFilter(condition1, condition2) {
	switchShopStatus('browser'); //blinkt noch
	//alert("shopMenuFilter condition 1 : " + condition1 + " condition2 : " + condition2);

	var visibleStartCol = getVisibleStartCol();
	//alert("visibleStartCol: " + visibleStartCol);

	if(visibleStartCol > 0){
		var direction = visibleStartCol * -1;
		shiftProductGroupCols(direction);
		updateScrollButtonStatus();
	}

	//####  delete all existed data ####
	gDATA = new Array(); // ## array of all BROWSER Items
	gDATA_counter = 0;

	//#### delete column data, which was already shown in the smart browser ####
	//TODO need to test Ebene 3,4...x
	var numberUsedCols = getNumberUsedCols();
	for(var i=0; i<numberUsedCols; i++){
		resetColumn(i+1);
	}

	//clearProductDetails();

	//#### clear productGroupPath ####
	setInnerHtml('productGroupPath'," ");

	switch (condition1) {
		case "all":
			requestVirtualGroupId= null;
			requestActivatedSinceDays = null;
			requestOnlySpecials = null;
		break;
		case "virtualGroup":
			requestVirtualGroupId=condition2;
			requestActivatedSinceDays = null;
			requestOnlySpecials = null;
			break;
		case "activatedSinceDays":
			requestActivatedSinceDays = condition2;
			requestVirtualGroupId= null;
			requestOnlySpecials = null;
			break;
		case "onlySpecials":
			requestOnlySpecials = condition2;
			requestActivatedSinceDays = null;
			requestVirtualGroupId= null;
			break;
		default:
			requestVirtualGroupId= null;
			requestActivatedSinceDays = null;
			requestOnlySpecials = null;
		break;
	}


	var requestParentId = "root";
	var requestColNum = "1";

	//#### send AJAX request ####
	requestBrowserColData(requestColNum, requestParentId);
	gBROWSER_COL = new Array(); // ### reset COLS Array

}

// update selected li-anchor using class="selected"
function doMenuChange(anchorId){
	var ul = document.getElementById('filterList');
	var anchors = ul.getElementsByTagName('a');
	for (var i=0;i<anchors.length;i++){
		var anchor = anchors[i];

		//anchor.setAttribute("class","selected");  does not work in IE
		if(gBrowser == "Internet Explorer"){
			if(anchorId==anchor.getAttribute("id")){
				anchor.setAttribute("className", "selected");
			}else if (anchor.getAttribute("className")=="selected"){
				anchor.setAttribute("className","");
			}
		}else{
			if(anchorId==anchor.getAttribute("id")){
				anchor.setAttribute("class", "selected");
			}else if (anchor.getAttribute("class")=="selected"){
				anchor.setAttribute("class","");
			}
		}
	}
}

// update list-anchor css according to anchor text of VirtualGroup
function updateMenuForVirtualGroup(anchorTextValue){
	var ul = document.getElementById('filterList');
	var anchors = ul.getElementsByTagName('a');

	for (var i=0;i<anchors.length;i++){
		var anchor = anchors[i];

		var anchorText = anchor.childNodes[0].nodeValue;

		if(gBrowser == "Internet Explorer"){

			if(anchorText!=null&&anchorText.indexOf(anchorTextValue)>=0){
				virtualGroupId=anchor.getAttribute("id");
				anchor.setAttribute("className", "selected");
			}else if (anchor.getAttribute("className")=="selected"){
				anchor.setAttribute("className","");
			}
		}else{
			if(anchorText!=null&&anchorText.indexOf(anchorTextValue)>=0){
				virtualGroupId=anchor.getAttribute("id");
				anchor.setAttribute("class", "selected");
			}else if (anchor.getAttribute("class")=="selected"){
				anchor.setAttribute("class","");
			}
		}
	}
}

//############### shop menu filter functions - End #################################

// ###############   directProductCall    ###############
function directProductCall(productId) {
	switchShopStatus('details');
	setProgressIndicator('loadIndicator', 'on' , 'Cycle' ); // ### switch load Cycle indiciator on

	var productDetailRequestUrl = gBrowserColDataURL + '?shopId=numismatikShop&locale=' + gLocaleString + '&productId=' + productId;

	// #### SEND AJAX REQUEST FOR DIRECT PRODUCT CALL ####
	var requestType = 1; // ## 0 = GET, 1 = XML, 2 = POST
	requestProductDetailsCount ++; // ## requestProductListCount of this request, will be given to registered event handler onreadystatechange

	var requestURL = productDetailRequestUrl;
	var requestQuery = "";

	//alert("directProductCall requestURL: " + requestURL + "\nrequestQuery: " + requestQuery);
	sendAJAXRequest(requestURL , requestQuery , requestType, requestProductDetailsCount);

}

function directCallProductDetail(label, value) {
	switchShopStatus('details');
	setProgressIndicator('loadIndicator', 'on' , 'Cycle' ); // ### switch load Cycle indiciator on

	if(label == "productNumber"){
		var productDetailRequestUrl = gBrowserColDataURL + '?shopId=numismatikShop&locale=' + gLocaleString + '&productNumber=' + value;
	}else if (label == "productId") {
		var productDetailRequestUrl = gBrowserColDataURL + '?shopId=numismatikShop&locale=' + gLocaleString + '&productId=' + value;
	}

	// #### SEND AJAX REQUEST FOR DIRECT PRODUCT CALL ####
	var requestType = 1; // ## 0 = GET, 1 = XML, 2 = POST
	requestProductDetailsCount ++; // ## requestProductListCount of this request, will be given to registered event handler onreadystatechange

	var requestURL = productDetailRequestUrl;
	var requestQuery = "";

	//alert("directProductCall requestURL: " + requestURL + "\nrequestQuery: " + requestQuery);
	sendAJAXRequest(requestURL , requestQuery , requestType, requestProductDetailsCount);

}


// ################ drawPaginator #################
function drawPaginator(productCount, requestParentId, selectedPage){
	var maxPaginationButtons = 5;
	var leftRightOffset = 1;
	var labelString = "Seite:";

	if(productCount == null){var productCount = 0;}
	if(selectedPage == null){ var selectedPage = 1;} // ### if no page is slected default = 1

	var paginationArea = document.getElementById("paginationArea");
	if(paginationArea != null){

		displayElement("paginationArea", true);

		// #### remove Pagination buttons and label ####
		paginationArea.innerHTML = ""; // ### kill all inner HTML stuff
		var mColChildList = paginationArea.childNodes;
		var mDIVList = paginationArea.getElementsByTagName("span");

		// #### Fill List with Result Data ####
    	for(var n=0; n< mDIVList.length; n++) {
       		var divObject = mDIVList[n];
       		paginationArea.removeChild(divObject);
       	}

       	// #### create and fill new pagination Buttons ####
       	if(productCount > 0){
       		var paginationLabel = document.getElementById("paginationLabel");
			if(paginationLabel != null){
				paginationLabel.innerHTML = "" + labelString;
			} else {
				// ### create new DOM paginator element ####
				var spanElementId = "paginationLabel";
				var paginationLabel = createDOMElement("span" , paginationArea , labelString , "", spanElementId);
			}

			var paginationStepsize = gPaginationNumberPerPage;
       		var numberOfPages = Math.ceil(productCount / paginationStepsize) ;

       		// #### Create Pagination Buttons and Fill Paginator ####

    		var lastPaginator = 1;
    		for(var pageNum=1; pageNum <= numberOfPages; pageNum++) {
    			var addPaginationFlag = false;
    			// ###### PAGINATOR RULE ALGORITHM #########
    			if(pageNum == 1 ){addPaginationFlag = true;} // ### 1. rule - always show first page
    			if(pageNum == numberOfPages ){addPaginationFlag = true;} // ### 2. rule - always show last page
    			if(pageNum - selectedPage  >= (leftRightOffset * -1) && pageNum - selectedPage <= leftRightOffset ) {addPaginationFlag = true;} // ### 3. rule - alwas 2 before selcted and 2 after selected
    			if(pageNum <=  (maxPaginationButtons-1) && selectedPage <= (maxPaginationButtons - leftRightOffset - 1) ) {addPaginationFlag = true;} // ### 4. rule - always show first 6 if slected is <= 4
    			if(pageNum >=  numberOfPages - (maxPaginationButtons - 2) && selectedPage >= numberOfPages - 2  ) {addPaginationFlag = true;} // ### 5. rule - always show last 6 if slected is >= last - 2


    			if(addPaginationFlag == true) {
    				if( pageNum - lastPaginator > 1 ) {
    					var spacerElement = createDOMElement("span" , paginationArea , "..." , "paginationSpacer" , "spacer");
    				}

					var spanElementId = "paginatorSpan_" + pageNum;
					var styleClass = "paginationBtn"; // ##Default sytle
					var pageSelected = false;
					var paginatorNumberStr = "" + pageNum;

					var thisPageCalcEnd = (pageNum * paginationStepsize);
					var thisPageCalcStart = (thisPageCalcEnd - paginationStepsize) + 1;

					if(selectedPage == pageNum){
						var styleClass = "paginationBtnSelected";
						var pageSelected = true;
						var selectedPage = pageNum;
						var gSelectedPage = selectedPage;
					}

					//alert("styleClass: " + styleClass +  " actualPageCalcStart: " + actualPageCalcStart + "  actualPageCalcEnd: " + actualPageCalcEnd);

					// ### create new DOM paginator element ####
					var paginatorBtnElement = createDOMElement("span" , paginationArea , paginatorNumberStr , styleClass , spanElementId);
					paginatorBtnElement.setAttribute("spanElementId", spanElementId);
					paginatorBtnElement.setAttribute("pageNumber", pageNum);
					paginatorBtnElement.setAttribute("productCount", productCount);
					paginatorBtnElement.setAttribute("thisPageCalcStart", thisPageCalcStart);
					paginatorBtnElement.setAttribute("thisPageCalcEnd", thisPageCalcEnd);
					paginatorBtnElement.setAttribute("requestParentId", requestParentId);
					paginatorBtnElement.setAttribute("selectedPage", selectedPage);

					attachEventListener(paginatorBtnElement, "click", clickPaginationBtn, false); // ### attach Event Listener

					var lastPaginator = pageNum;
				}
			}
  		}
     }
}


// ###########   clickPaginationBtn #############
function clickPaginationBtn() {
		if (typeof this.event != "undefined"){
			var spanElementId = this.event.srcElement.spanElementId;
			var pageNumber = this.event.srcElement.pageNumber;
			var productCount = this.event.srcElement.productCount;
			var thisPageCalcStart = this.event.srcElement.thisPageCalcStart;
			var thisPageCalcEnd = this.event.srcElement.thisPageCalcEnd;
			var requestParentId = this.event.srcElement.requestParentId;
			var selectedPage = this.event.srcElement.selectedPage;
		} else {
			var spanElementId = this.getAttribute('spanElementId');
			var pageNumber = this.getAttribute('pageNumber');
			var productCount = this.getAttribute('productCount');
			var thisPageCalcStart = this.getAttribute('thisPageCalcStart');
			var thisPageCalcEnd = this.getAttribute('thisPageCalcEnd');
			var requestParentId = this.getAttribute('requestParentId');
			var selectedPage = this.getAttribute('selectedPage');

		}

		//alert("clickPaginationBtn pageNumber " + pageNumber + " selectedPage: " + selectedPage );
		gSelectedPage = pageNumber;
		drawPaginator(productCount, requestParentId, gSelectedPage);

		drawProductList(productCount, requestParentId, gSelectedPage);
}



// ################ stepProductBtn #################
function stepProductBtn(direction){
	clearProductDetails();

	var actualSelectedProductListItem = getActualProductListItem();
	updateActualSelectedString(); // ## upate actual selected string e.g. 1 von 20 Mnzen

	var newItemNumber = actualSelectedProductListItem + direction;
	if(newItemNumber >= gPRODUCTLIST.length){var newItemNumber = 0;}
	if(newItemNumber < 0){var newItemNumber = (gPRODUCTLIST.length - 1);}

	//alert("newItemNumber: " + newItemNumber);

	var newSelectedListObject = gPRODUCTLIST[newItemNumber];
	if(newSelectedListObject != null){
		var newPoductId = newSelectedListObject.id;
		if(newPoductId != null){
			requestProductDetails(newPoductId);
		}
	}

}



// ################ updateActualSelectedString #################
function updateActualSelectedString(){
	if(gPRODUCTLIST != null){
		var productListItemCount = gPRODUCTLIST.length;

		var actualSelectedProductListItem = getActualProductListItem() + 1;

		// #### hide/show step product buttons ####
		if(productListItemCount <= 1){
				visibilityElement('prevProductBtn', false);
				visibilityElement('nextProductBtn', false);
				visibilityElement('actualProductNumber', false);
		} else {
				visibilityElement('prevProductBtn', true);
				visibilityElement('nextProductBtn', true);
				visibilityElement('actualProductNumber', true);
		}

		if(productListItemCount > 1){
			//### plural coins ###
			var actualSelectedStr = actualSelectedProductListItem + " von " + productListItemCount + " M&uuml;nzen";
		} else {
			var actualSelectedStr = actualSelectedProductListItem + " von " + productListItemCount + " M&uuml;nze";
		}

		setInnerHtml('actualProductNumber', actualSelectedStr);
	}
}


// ################ getActualProductListItem #################
function getActualProductListItem(){
	var productListItem = 0; // ### default producList
	if(gPRODUCTLIST.length > 0){
		if(gActualSelectedProduct != null) {
			var selectedProductId = gActualSelectedProduct.id

			//###### FIND SELECTED PRODUCT LIST ITEM #####
			for(i=0; i< gPRODUCTLIST.length; i++){
				var checkObject = gPRODUCTLIST[i] ;
				var checkId = checkObject.id;

				if(selectedProductId == checkId) {
					var productListItem = i;
					break;
				}
			}
		}


	}
	return productListItem;
}



// ################ clearProductDetails #################
function clearProductDetails(){
	setInnerHtml('productDetailTitle', " ");
	setInnerHtml('productDetailStockListDescription', " ");
	setInnerHtml('modalWindowHeadline', " ");

	visibilityElement('productDetailsLeftArea', false);
	setInnerHtml('productDetailSummary', " ");

	setInnerHtml('productMintString', " ");
	setInnerHtml('productConditionString', " ");
	setInnerHtml('productKatalogString1', " ");
	setInnerHtml('productKatalogString2', " ");
	setInnerHtml('productNumber', " ");
	setInnerHtml('productDetailPrice', " ");
	setInnerHtml('productDetailTax', " ");
	setInnerHtml('productFineness', " ");
	setInnerHtml('productGrossWeight', " ");



	displayElement('productDetailListUL', false);

	var productDetailImageArea = document.getElementById("productDetailImageArea");
	if(productDetailImageArea != null){
		productDetailImageArea.style.backgroundImage = 'url()';
	}

	var magnifyImage = document.getElementById("magnifyImage");
	if(magnifyImage != null){
		magnifyImage.src = "";
	}


	//### hide Buttons ###
	displayElement('productDetailBuyBtn', false);
	displayElement('productDetailBookmarkBtn', false);
	displayElement('productDetailBackBtn', false);
	visibilityElement('productDetailHistoryBtn', false);

	//#### History Modal Window ####

	setInnerHtml('productHistoryTitle', " ");
	setInnerHtml('productHistoryStockListDescription', " ");

	var productHistoryImageArea = document.getElementById("productHistoryImageArea");
	if(productHistoryImageArea != null){
		productHistoryImageArea.style.backgroundImage = 'url()';
	}

	setInnerHtml('productHistorySummary', " ");
	setInnerHtml('productHistoryConditionString', " ");
	setInnerHtml('productHistoryText', " ");

	// ######### PRODUCT TYPE INDICATOR ##########
	var productTypeIndicatorDetails = document.getElementById("productTypeIndicatorDetails");
	if(productTypeIndicatorDetails != null){
		productTypeIndicatorDetails.className = "";
		visibilityElement('productTypeIndicatorDetails', false);
	}


}



// ################ renderProductDetails #################
function renderProductDetails(productObject){
	//alert("renderProductDetails productObject.name: " + productObject.name + " id: " + productObject.id + " parentId: " + productObject.parentId);

	gActualSelectedProduct = productObject; // ### set global Object of actual renderes Product Details
	updateActualSelectedString();

	setInnerHtml('productDetailTitle', productObject.name);
	setInnerHtml('productDetailStockListDescription', productObject.stockListDescription);

	// ######### PRODUCT HYPERLINK ##########
	var productDetailBuyBtnElement = document.getElementById("productDetailBuyBtn");
	if(productDetailBuyBtnElement != null){
		// ##### set productDetailBuyBtn href ######
		var productId= productObject.id;
		var productCount= 1;

		var shopingCartUrl = gContextPath + "/de_numismatik/numismatik_shop/warenkorb.html?action=addToShoppingCart&transactionType=buy&productId=" + productId + "&productCount=" + productCount;
		productDetailBuyBtnElement.href = shopingCartUrl;
	}


	// ######### BOOKMARK (MERKZETTEL) HYPERLINK ##########
	var productDetailBookmarkBtnElement = document.getElementById("productDetailBookmarkBtn");
	if(productDetailBookmarkBtnElement != null){
		// ##### set productDetailBookmarkBtnElement href ######
		var bookmarkUrl = gContextPath + "/de_numismatik/numismatik_shop.html?action=saveInBookmarkList&transactionType=buy&bookmarkListType=PRECIOUS_METAL_BOOKMARKS&productId=" + productId;
		productDetailBookmarkBtnElement.href = bookmarkUrl;
	}

	// ######### PRODUCT TYPE INDICATOR ##########
	var productTypeIndicatorDetails = document.getElementById("productTypeIndicatorDetails");
	if(productTypeIndicatorDetails != null){
		var productType= productObject.productType;

		productTypeIndicatorDetails.className = "";
		visibilityElement('productTypeIndicatorDetails', false);

		if(productType == "UNIQUE"){
			productTypeIndicatorDetails.className = "productTypeIndicatorUnique";
			var typeIndicatorInfoHref = gContextPath + "/de_numismatik/numismatik_shop/shop_popup/einzelstueck.html";
			productTypeIndicatorDetails.setAttribute("href", typeIndicatorInfoHref);

			var typeIndicatorInfoOnClick = "window.open(this.href,'','resizable=yes,location=no,menubar=no,scrollbars=yes,status=no,toolbar=no,fullscreen=no,dependent=no,width=850,height=850,status'); return false";
			productTypeIndicatorDetails.setAttribute("onClick", typeIndicatorInfoOnClick);

			var typeIndicatorTitle = "Bei dieser Mnze handelt es sich um ein Einzelstck...";
			productTypeIndicatorDetails.setAttribute("title", typeIndicatorTitle);

			visibilityElement('productTypeIndicatorDetails', true);
		}

		var lastDigit = productObject.productNumber.substr(productObject.productNumber.length-1,1);
		//alert(lastDigit);
		if(productType == "DIVERSE" || lastDigit != "5"){
			productTypeIndicatorDetails.className = "productTypeIndicatorDiverse";
			var typeIndicatorInfoHref = gContextPath + "/de_numismatik/numismatik_shop/shop_popup/diverse.html";
			productTypeIndicatorDetails.setAttribute("href", typeIndicatorInfoHref);

			var typeIndicatorInfoOnClick = "window.open(this.href,'','resizable=yes,location=no,menubar=no,scrollbars=yes,status=no,toolbar=no,fullscreen=no,dependent=no,width=850,height=850,status'); return false";
			productTypeIndicatorDetails.setAttribute("onClick", typeIndicatorInfoOnClick);


			var typeIndicatorTitle = "Von dieser Mnze gibt es diverse Stcke...";
			productTypeIndicatorDetails.setAttribute("title", typeIndicatorTitle);

			visibilityElement('productTypeIndicatorDetails', true);
		}

	}


	// ######### PRODUCT HISTORY MODAL WINDOW #####

	if(productObject.summary.length > 1){
		visibilityElement('productDetailsLeftArea', true);
		setInnerHtml('productDetailSummary', productObject.summary);
	} else {
		visibilityElement('productDetailsLeftArea', false);
		setInnerHtml('productDetailSummary', " ");
	}


	// #### compose Mint Year Start and Mint Year End String ####
	if(productObject.productMintYearStart.length > 1 && productObject.productMintYearEnd.length > 1 ){
		var productMintString = "von " + productObject.productMintYearStart + " bis " + productObject.productMintYearEnd;
	} else {
		var productMintString = "" + productObject.productMintYearStart;
	}
	setInnerHtml('productMintString', productMintString);


	// ####### Update condition LED indicator  #######
	var productConditionIndicatorElement = document.getElementById("productConditionIndicator");
	if(productConditionIndicatorElement != null){
		productConditionIndicatorElement.innerHTML = "";
		var verticalOffset = (productObject.productConditionValue * 10);
		productConditionIndicatorElement.style.backgroundPosition = '0px -' + verticalOffset + 'px'; // ### shift vertical offset of bgnd image
	}

	setInnerHtml('productConditionString', productObject.productConditionString);

	//### check and fill referenceCatalogStr1 wirh label ####
	if(productObject.referenceCatalogStr1.length > 1){
		setInnerHtml('productKatalogString1', productObject.referenceCatalogStr1);
		displayElement('productKatalogLabel1', true);
		displayElement('productKatalogString1', true);
	} else {
		setInnerHtml('productKatalogString1', "");
		displayElement('productKatalogLabel1', false);
		displayElement('productKatalogString1', false);
	}

	//### check and fill referenceCatalogStr2 wirh label ####
	if(productObject.referenceCatalogStr2.length > 1){
		setInnerHtml('productKatalogString2', productObject.referenceCatalogStr2);
		displayElement('productKatalogLabel2', true);
		displayElement('productKatalogString2', true);
	} else {
		setInnerHtml('productKatalogString2', "");
		displayElement('productKatalogLabel2', false);
		displayElement('productKatalogString2', false);
	}

	//### check and fill productNumber (Artikelnummer) with label ####
	if(productObject.productNumber.length > 1){
		setInnerHtml('productNumber', productObject.productNumber);
		displayElement('productNumberLabel', true);
		displayElement('productNumber', true);
	} else {
		setInnerHtml('productNumber', "");
		displayElement('productNumberLabel', false);
		displayElement('productNumber', false);
	}


	//### check and fill inventoryNumber (Lagernummer) with label ####
	if(productObject.inventoryNumber.length > 1){
		setInnerHtml('productInventoryNumber', productObject.inventoryNumber);
		displayElement('productInventoryNumberLabel', true);
		displayElement('productInventoryNumber', true);
	} else {
		setInnerHtml('productInventoryNumber', "");
		displayElement('productInventoryNumberLabel', false);
		displayElement('productInventoryNumber', false);
	}


	setInnerHtml('productDetailPrice', productObject.productPrice + " " + productObject.productPriceCurrency);

	setInnerHtml('productDetailTax', getTaxDisplayString(productObject.tax));



	if(productObject.fineness.length > 1 && !isNaN(parseFloat(productObject.fineness)) && parseFloat(productObject.fineness) > 0){
		setInnerHtml('productFineness', productObject.fineness );
		displayElement('productFinenessLabel', true);
		displayElement('productFineness', true);
	} else {
		displayElement('productFinenessLabel', false);
		displayElement('productFineness', false);
	}


	if(productObject.grossWeight.length > 1){
		setInnerHtml('productGrossWeight', productObject.grossWeight );
		displayElement('productGrossWeightLabel', true);
		displayElement('productGrossWeight', true);
	} else {
		displayElement('productGrossWeightLabel', false);
		displayElement('productGrossWeight', false);
	}

	displayElement('productDetailListUL', true);

	//############## PRODUCT IMAGE ###############
	var productDetailImageArea = document.getElementById("productDetailImageArea");
	if(productDetailImageArea != null){
		productDetailImageArea.style.backgroundImage = 'url(' + productObject.normalImage + ')';

		var hrefScript = "javascript:magnifyWindowOpen('" + productObject.thumbnailImage + "' , '" + (productObject.name).replace(/'/g,"\\'")  + "')";
		productDetailImageArea.setAttribute("href", hrefScript);


		var magnifyImage = document.getElementById("magnifyImage");
		if(magnifyImage != null){
			magnifyImage.src = productObject.bigImage; //## preload magnifyImage
		}
	}

	var specialMarking = document.getElementById("specialMarking");
	if(specialMarking!=null){
		var displayState = false;
		displayElement('specialMarking', false);
		if(productObject.isCurrentTopCoin=="yes"){
			specialMarking.className = "topCoinBigMarking";
			specialMarking.title = "Top Stck der Woche";
			var displayState = true;
		}else if(productObject.isCurrentShopSpecial=="yes"){
			specialMarking.className = "specialOfferBigMarking";
			specialMarking.title = "Sonderaktion";
			var displayState = true;
		}else if(productObject.virtualGroupsShortNameList.indexOf("Besser als vorz")>=0){
			specialMarking.className = "betterThanExcellentBigMarking";
			specialMarking.title = "Besser als vorzglich";
			var displayState = true;
		}

		if(displayState == true) {
			displayElement('specialMarking', true);
		}
	}

	//### show Buttons ###
	displayElement('productDetailBuyBtn', true);
	displayElement('productDetailBookmarkBtn', true);
	displayElement('productDetailBackBtn', true);


	if(productObject.history.length > 1){
		visibilityElement('productDetailHistoryBtn', true);
	} else {
		visibilityElement('productDetailHistoryBtn', false);
	}

	setProgressIndicator('loadIndicator', "off"); // ### switch load indiciator off


	// #### check for number of used columns of smart browser  ####
	var numberUsedCols = getNumberUsedCols();
	if(numberUsedCols < 1){
		// ### if numberUsedCols < 1 start recursive rebuilding of smart browser ###
		rebuildSmartBrowser(productObject);
	}



	<!-- #####  ProDG Stats web tools statistics hit counter code ####  -->
	//<script type="text/javascript" id="wa_u"></script>
	wa_account="8F8D90A0918A92968C";
	wa_location=101;
	wa_pageName=location.pathname + "/" + productObject.name;  // you can customize the page name here
	document.cookie='__support_check=1';
	wa_hp='http';
	wa_rf=document.referrer;
	wa_sr=window.location.search;
	wa_tz=new Date();
	if(location.href.substr(0,6).toLowerCase()=='https:')
	wa_hp='https';
	wa_data='&an='+escape(navigator.appName)+
		'&sr='+escape(wa_sr)+'&ck='+document.cookie.length+
		'&rf='+escape(wa_rf)+'&sl='+escape(navigator.systemLanguage)+
		'&av='+escape(navigator.appVersion)+'&l='+escape(navigator.language)+
		'&pf='+escape(navigator.platform)+'&pg='+escape(wa_pageName);
	wa_data=wa_data+'&cd='+ screen.colorDepth+'&rs='+escape(screen.width+ ' x '+screen.height)+ '&tz='+wa_tz.getTimezoneOffset()+'&je='+ navigator.javaEnabled();
	wa_img=new Image();
	wa_img.src=wa_hp+'://loc1.hitsprocessor.com/statistics.asp'+'?v=1&s='+wa_location+'&eacct='+wa_account+wa_data+'&tks='+wa_tz.getTime();
	//document.getElementById('wa_u').src=wa_hp+'://loc1.hitsprocessor.com/track.js';

	<!-- ##### End ProDG Stats statistics web tools hit counter code #### -->

}



// ################ rebuildSmartBrowser #################
function rebuildSmartBrowser(productObject){

		//ShowObjectProperties(productObject);
		//alert("rebuildSmartBrowser: " + productObject.parentId + " productPrimaryPath: " + productObject.productPrimaryPath);

		gActualSelectedProduct = productObject; // ### set global Object of actual renderes Product Details

		var productParentId = productObject.parentId;
		var productPrimaryPath = productObject.productPrimaryPath;

		var columnCount = 0;
		var productPrimaryPathElements = productPrimaryPath.split("::"); // ## split primary path
		var columnCount = productPrimaryPathElements.length;

		gSelectedPrimaryPathElements = productPrimaryPathElements;

		//ShowObjectProperties(gSelectedPrimaryPathElements);
		//alert("productParentId: " + productParentId + " columnCount : " + columnCount);
		//gRecursiveSmartBrowserColumnRebuild = columnCount + 1;

		gRecursiveSmartBrowserColumnRebuild = columnCount;

		// #### Reset Columns  ####
    	for(var n=0; n< gBROWSER_COL.length; n++) {
       		var BrowserColumnObject = gBROWSER_COL[n];
       		if (typeof BrowserColumnObject != "undefined"){
       			if(BrowserColumnObject != null){
       				if(BrowserColumnObject.colNum > columnCount) {
       					resetColumn(BrowserColumnObject.colNum);
       					gBROWSER_COL[n] = null;
       				}
       			}
       		}
       	}



		//### build dummy gBROWSER OBJECTS ####
		for(var i = gRecursiveSmartBrowserColumnRebuild; i > 0 ; i--){
			// ## BrowserColumn(parentId, colNum, selectedElementId, elementID);
 			var drawParentID = productParentId;
 			var colNum = i;
 			var selectedId = productParentId;

 			var mColItemAreaID = "Col" + colNum + "ItemArea";

 			var mColItemAreaElement = document.getElementById(mColItemAreaID);
 			if(mColItemAreaElement == null){ return; }

 			gBROWSER_COL[colNum] = new BrowserColumn(drawParentID, colNum, selectedId, mColItemAreaElement);

 			//ShowObjectProperties(gBROWSER_COL[colNum]);


 			//alert("mColItemAreaID: " + i + " " + mColItemAreaID);
 		}

 		//alert("gBROWSER_COL.length : " + gBROWSER_COL.length + " gRecursiveSmartBrowserColumnRebuild: " + gRecursiveSmartBrowserColumnRebuild);

 		//shiftProductGroupCols(gRecursiveSmartBrowserColumnRebuild);

		//alert("gBROWSER_COL : " + gBROWSER_COL.length);
		var requestColNum = gRecursiveSmartBrowserColumnRebuild;
		var requestParentId = productParentId;

		requestBrowserColData(requestColNum, requestParentId); // ### call smart browser
}


// ################ renderProductHistory #################
function renderProductHistory(){

	if(gActualSelectedProduct == null){return;}
	var productObject = gActualSelectedProduct;

	//alert("renderProductHistory productObject.name: " + productObject.name + " id: " + productObject.id);

	setInnerHtml('productHistoryTitle', productObject.name);
	setInnerHtml('productHistoryStockListDescription', productObject.stockListDescription);

	if(productObject.summary.length > 1){
		visibilityElement('productHistoryDetailsLeftArea', true);
		setInnerHtml('productHistorySummary', productObject.summary);
	} else {
		visibilityElement('productHistoryDetailsLeftArea', false);
		setInnerHtml('productHistorySummary', " ");
	}


	// ####### Update condition LED indicator  #######
	var productHistoryConditionIndicator = document.getElementById("productHistoryConditionIndicator");
	if(productHistoryConditionIndicator != null){
		productHistoryConditionIndicator.innerHTML = "";
		var verticalOffset = (productObject.productConditionValue * 10);
		productHistoryConditionIndicator.style.backgroundPosition = '0px -' + verticalOffset + 'px'; // ### shift vertical offset of bgnd image
	}

	setInnerHtml('productHistoryConditionString', productObject.productConditionString);

	//### check and fill referenceCatalogStr1 wirh label ####
	if(productObject.referenceCatalogStr1.length > 1){
		setInnerHtml('productHistoryKatalogString1', productObject.referenceCatalogStr1);
		displayElement('productHistoryKatalogLabel1', true);
		displayElement('productHistoryKatalogString1', true);
	} else {
		setInnerHtml('productKatalogString1', "");
		displayElement('productKatalogLabel1', false);
		displayElement('productKatalogString1', false);
	}

	//### check and fill referenceCatalogStr2 wirh label ####
	if(productObject.referenceCatalogStr2.length > 1){
		setInnerHtml('productHistoryKatalogString2', productObject.referenceCatalogStr2);
		displayElement('productHistoryKatalogLabel2', true);
		displayElement('productHistoryKatalogString2', true);
	} else {
		setInnerHtml('productHistoryKatalogString2', "");
		displayElement('productHistoryKatalogLabel2', false);
		displayElement('productHistoryKatalogString2', false);
	}


	//### check and fill History productNumber (Artikelnummer) with label ####
	if(productObject.productNumber.length > 1){
		setInnerHtml('productHistoryProductNumber', productObject.productNumber);
		displayElement('productHistoryProductNumberLabel', true);
		displayElement('productHistoryProductNumber', true);
	} else {
		setInnerHtml('productHistoryProductNumber', "");
		displayElement('productHistoryProductNumberLabel', false);
		displayElement('productHistoryProductNumber', false);
	}


	//### check and fill History inventoryNumber (Lagernummer) with label ####
	if(productObject.inventoryNumber.length > 1){
		setInnerHtml('productHistoryInventoryNumber', productObject.inventoryNumber);
		displayElement('productHistoryInventoryNumberLabel', true);
		displayElement('productHistoryInventoryNumber', true);
	} else {
		setInnerHtml('productHistoryInventoryNumber', "");
		displayElement('productHistoryInventoryNumberLabel', false);
		displayElement('productHistoryInventoryNumber', false);
	}


	setInnerHtml('productDetailPrice', productObject.productPrice + " " + productObject.productPriceCurrency);
	setInnerHtml('productDetailTax', productObject.tax);



	if(productObject.fineness.length > 1){
		setInnerHtml('productHistoryFineness', productObject.fineness );
		displayElement('productHistoryFinenessLabel', true);
		displayElement('productHistoryFineness', true);
	} else {
		displayElement('productHistoryFinenessLabel', false);
		displayElement('productHistoryFineness', false);
	}


	if(productObject.grossWeight.length > 1){
		setInnerHtml('productHistoryGrossWeight', productObject.grossWeight );
		displayElement('productHistoryGrossWeightLabel', true);
		displayElement('productHistoryGrossWeight', true);
	} else {
		displayElement('productHistoryGrossWeightLabel', false);
		displayElement('productHistoryGrossWeight', false);
	}

	displayElement('productHistoryDetailListUL', true);

	var productHistoryImageArea = document.getElementById("productHistoryImageArea");
	if(productHistoryImageArea != null){
		productHistoryImageArea.style.backgroundImage = 'url(' + productObject.normalImage + ')';
	}



	setInnerHtml('productHistoryText', productObject.history);

}

// ################ drawProductList #################
function drawProductList(productCount, requestParentId, selectedId){
	drawPaginator(productCount, requestParentId, selectedId); // ### update Paginator

	productListTeaserImage(false); // ### hide product List Teaser Image
	resetProductList();
	var productListScrollAreaElement = document.getElementById("productListScrollArea");
	if(productListScrollAreaElement == null){ return; }

	var resultList = new Array();
	var resultListCounter = 0;

	//###### GATHERING DATA OBJECTS FOR RESULT LIST #####
	for(i=0; i< gPRODUCTLIST.length; i++){
		// ### syntax name,count,parentId,id
		var mObject = gPRODUCTLIST[i] ;
		var parentId = mObject.parentId;

		if(parentId == requestParentId) {
			resultList[resultListCounter] = mObject;
			resultListCounter ++;
		}
	}


	//alert("drawProductList " + productCount + " requestParentId " + requestParentId + " resultListCounter: " + resultListCounter);


	var paginationStepsize = gPaginationNumberPerPage;
    var numberOfPages = Math.ceil(productCount / paginationStepsize) ;
    var itemListStart = (paginationStepsize * (gSelectedPage - 1)) ;
    var itemListEnd = itemListStart + paginationStepsize - 1

    //alert("itemListStart: " + itemListStart + " itemListEnd: " + itemListEnd);

	var displayDelay = 400; // ### dealy time in milliseconds for fade in
	var itemCounter = 0; // ### item counter for displayed list items

	// #### Fill List with Result Data ####
    for(var i=0; i<resultListCounter; i++) {

    	if(i >= itemListStart && i <= itemListEnd) {
		   var productObject = resultList[i];
		   var divElementId = "productDivElementId_" + itemCounter;

			var mStyleClass = "productItemDiv";

			// ### create new DOM List Item element ####
			var listDivElement = createDOMElement("div" , productListScrollAreaElement , '' , mStyleClass, divElementId);

			listDivElement.setAttribute("name", productObject.name);
			listDivElement.setAttribute("requestParentId", requestParentId);
			listDivElement.setAttribute("divElementId", divElementId);
			listDivElement.setAttribute("id", productObject.id);


			//attachEventListener(listDivElement, "click", clickProductListProductItem, false); // ### attach Event Listener

			// ###########  titleElement  ##############
			var productTitleStyleClass = "productListItemTitle";
			var productTitleElementId = "productTitle_" + itemCounter;
			var titleElement = createDOMElement("div" , listDivElement , productObject.name , productTitleStyleClass, productTitleElementId);


			// ###########  productListLeftDiv  ##############
			var productListLeftDivStyleClass = "productListLeftDiv";
			var productListLeftDivElementId = "productLeftDiv_" + i;
			var productListLefttDiv = createDOMElement("div" , listDivElement , "" , productListLeftDivStyleClass, productListLeftDivElementId);


			// ###########  imageSpanElement  ##############
			var imageStyleClass = "productListImage";
			var imageElementId = "productListImage" + itemCounter;
			var imageSpanElement = createDOMElement("span" , productListLefttDiv , '' , imageStyleClass, imageElementId);
			imageSpanElement.style.backgroundImage = 'url(' + productObject.thumbnailImage + ')';
			imageSpanElement.setAttribute("productId", productObject.id);

			attachEventListener(imageSpanElement, "click", clickProductListProductItem, false); // ### attach Event Listener


			// ###########  specialMarking Element  ##############
			var specialMarkingClass = "";
			var specialMarkingId = "specialMarking_"+itemCounter;
			var specialMarkingTitle ="";
			if(productObject.isCurrentTopCoin=="yes"){
				specialMarkingClass = "topCoinSmallMarking";
				specialMarkingTitle = "Top Coin der Woche";
			}else if(productObject.isCurrentShopSpecial=="yes"){
				specialMarkingClass = "specialOfferSmallMarking";
				specialMarkingTitle = "Sonderaktion";
			}else if(productObject.virtualGroupsShortNameList.indexOf("Besser als vorz")>=0){
				specialMarkingClass = "betterThanExcellentSmallMarking";
				specialMarkingTitle = "Besser als vorzüglich";
			}

			var specialMarkingDiv = createDOMElement("div" , productListLefttDiv , '' , specialMarkingClass, specialMarkingId);
			specialMarkingDiv.setAttribute("title", specialMarkingTitle);


			// ###########  productCondictionStringDiv  ##############
			var productConditionStringDivStyleClass = "productConditionStringDiv";
			var productConditionStringDivElementId = "productConditionStringDiv_" + itemCounter;
			var productConditionString = "Erhaltung: " + productObject.productConditionString;
			var productConditionStringDiv = createDOMElement("div",productListLefttDiv, productConditionString, productConditionStringDivStyleClass, productConditionStringDivElementId);


			// ###########  productListRightDiv  ##############
			var productListRightDivStyleClass = "productListRightDiv";
			var productListRightDivElementId = "productRightDiv_" + i;
			var productListRightDiv = createDOMElement("div" , listDivElement , "" , productListRightDivStyleClass, productListRightDivElementId);


			// ###########  productPriceDiv  ##############
			var productPriceDivStyleClass = "productPriceDiv";
			var productPriceDivElementId = "productPriceDiv_" + itemCounter;

			var priceString = productObject.productPrice + "&nbsp;" + productObject.productPriceCurrency;
			var productPriceDiv = createDOMElement("div" , productListRightDiv , priceString , productPriceDivStyleClass, productPriceDivElementId);

			// ###########  productTaxDiv  ##############
			var productTaxDivStyleClass = "productTaxDiv";
			var productTaxDivElementId = "productPriceDiv_" + itemCounter;

			var taxString = getTaxDisplayString(productObject.tax);
			var productTaxDiv = createDOMElement("div" , productListRightDiv , taxString , productTaxDivStyleClass, productTaxDivElementId);


			// ###########  productDetailsBtn  ##############
			var productDetailsBtnStyleClass = "productDetailsBtn";
			var productDetailsBtnElementId = "productDetailsBtn_" + itemCounter;
			var productDetailsBtn = createDOMElement("a" , productListRightDiv , "" , productDetailsBtnStyleClass, productDetailsBtnElementId);
			productDetailsBtn.setAttribute("productId", productObject.id);
			attachEventListener(productDetailsBtn, "click", clickProductListProductItem, false); // ### attach Event Listener
			attachEventListener(productDetailsBtn, "mouseover", mouseoverProductDetailsBtn, false); // ### attach Event Listener
			attachEventListener(productDetailsBtn, "mouseout", mouseoutProductDetailsBtn, false); // ### attach Event Listener



			// ###########  productCondictionIndicatorDiv  ##############
			var productConditionDivStyleClass = "productConditionLevel_" + productObject.productConditionValue;
			var productConditionDivElementId = "productConditionDiv_" + itemCounter;
			var productConditionDiv = createDOMElement("div" , productListRightDiv , " " , productConditionDivStyleClass, productConditionDivElementId);

			itemCounter ++; //## iterate item counter
    	}


	}

	//### Finaly decativate the progress indicator ###
	setProgressIndicator('loadIndicator', 'off' ); // ### switch load Cycle indiciator off
}


// ###########   clickProductListProductItem #############
function clickProductListProductItem() {
	if (typeof this.event != "undefined"){
		var name = this.event.srcElement.name;
		var requestParentId = this.event.srcElement.requestParentId;
		var divElementId = this.event.srcElement.divElementId;
		var id = this.event.srcElement.id;
		var productId = this.event.srcElement.productId;
	} else {
		var name = this.getAttribute('name');
		var requestParentId = this.getAttribute('requestParentId');
		var divElementId = this.getAttribute('divElementId');
		var id = this.getAttribute('id');
		var productId = this.getAttribute('productId');
	}

	requestProductDetails(productId);
}


// ###########   requestProductDetails #############
function requestProductDetails(productId) {
	switchShopStatus('details');
	setProgressIndicator('loadIndicator', 'on' , 'Cycle' ); // ### switch load Cycle indiciator on

	var productDetailRequestUrl = null;

	//###### FIND CLICKED PRODUCT OBJECT  #####
	for(i=0; i< gPRODUCTLIST.length; i++){
		// ### syntax name,count,parentId,id
		var mObject = gPRODUCTLIST[i] ;
		var checkProductId = mObject.id;

		if(checkProductId == productId) {
			var productDetailRequestUrl = mObject.link;
			break;
		}
	}



	// #### SEND AJAX REQUEST ####
	var requestType = 1; // ## 0 = GET, 1 = XML, 2 = POST
	requestProductDetailsCount ++; // ## requestProductListCount of this request, will be given to registered event handler onreadystatechange

	var productDetailRequestUrl = gBrowserColDataURL + '?shopId=numismatikShop&locale=' + gLocaleString + '&productId=' + productId;
	var requestURL = productDetailRequestUrl;
	var requestQuery = "";


	sendAJAXRequest(requestURL , requestQuery , requestType, requestProductDetailsCount);


}


// ###########   switchShopStatus #############
function switchShopStatus(status) {
	// #########  productDetailsArea   #########
	switch (status) {
  		case "browser":
  			clearProductDetails();//##reset Details fields
    		displayElement("productDetailsArea", false);
    		displayElement("productBrowserArea", true);
    		displayElement("paginationArea", true);

    		// var visibleStartCol = getVisibleStartCol();
//     		var numberUsedCols = getNumberUsedCols();
//     		if(numberUsedCols > gVisibleColumns){
//     			var targetShiftCol = (numberUsedCols - visibleStartCol) - gVisibleColumns + 1;
//     			//alert("visibleStartCol " + visibleStartCol + " numberUsedCols: " + numberUsedCols + " targetShiftCol: " + targetShiftCol);
//     			shiftProductGroupCols(targetShiftCol);
//     		}
    		break;
  		case "details":
  			clearProductDetails();//##reset Details fields
    		displayElement("productDetailsArea", true);
   		 	displayElement("productBrowserArea", false);
   		 	displayElement("paginationArea", false);
  			break;
  		default:
  			clearProductDetails();//##reset Details fields
			displayElement("productDetailsArea", false);
    		displayElement("productBrowserArea", true);
    		displayElement("paginationArea", true);
    		break;
	}

}


// ###########   mouseoverProductDetailsBtn #############
function mouseoverProductDetailsBtn() {
		if (typeof this.event != "undefined"){
			var name = this.event.srcElement.name;
			var requestParentId = this.event.srcElement.requestParentId;
			var divElementId = this.event.srcElement.divElementId;
			var id = this.event.srcElement.id;
		} else {
			var name = this.getAttribute('name');
			var requestParentId = this.getAttribute('requestParentId');
			var colNum = this.getAttribute('colNum');
			var divElementId = this.getAttribute('divElementId');
			var id = this.getAttribute('id');
		}


		//alert("mouseoverProductDetailsBtn id " + id );
		var element = document.getElementById(id);
		if(element != null){
			element.className = "productDetailsBtnRollover";
		}
}


// ###########   mouseoutProductDetailsBtn #############
function mouseoutProductDetailsBtn() {
		if (typeof this.event != "undefined"){
			var name = this.event.srcElement.name;
			var requestParentId = this.event.srcElement.requestParentId;
			var divElementId = this.event.srcElement.divElementId;
			var id = this.event.srcElement.id;
		} else {
			var name = this.getAttribute('name');
			var requestParentId = this.getAttribute('requestParentId');
			var colNum = this.getAttribute('colNum');
			var divElementId = this.getAttribute('divElementId');
			var id = this.getAttribute('id');
		}


		//alert("mouseoutProductDetailsBtn id " + id );
		var element = document.getElementById(id);
		if(element != null){
			element.className = "productDetailsBtn";
		}
}



// ################ resetProductList #################
function resetProductList(){
	var productListScrollArea = document.getElementById('productListScrollArea');

	if(productListScrollArea != null){
		productListScrollArea.innerHTML = ""; // ### kill all inner HTML stuff
		var mColChildList = productListScrollArea.childNodes;
		var mDIVList = productListScrollArea.getElementsByTagName("div");



		// #### Fill List with Result Data ####
    	for(var n=0; n< mDIVList.length; n++) {
       		var divObject = mDIVList[n];
       		productListScrollArea.removeChild(divObject);
       	}
     }
}


// ################ productListTeaserImage #################
function productListTeaserImage(displaystatus,displayImagePath){

	var productListTeaser = document.getElementById('productListTeaser');
	if(displaystatus == null) {var displaystatus = true; } // ### defautl display status is true

	if(productListTeaser != null){
		if(displaystatus == true){
			if(displayImagePath != null){
				if(displayImagePath.length > 1){
					productListTeaser.style.backgroundImage = 'url(' + displayImagePath + ')'; // ## switch productListTeaserImage
				}
			}
			productListTeaser.style.display = "block";
			displayElement("paginationArea", false);
		}

		if(displaystatus == false){
			productListTeaser.style.display = "none";
		}
     }
}




// ###########  processProductData  -  process ajax product data from server  ###########
function processProductData( xmlHttp, intID ){

 	// ### expected XML Atom Feed data structure for Numismatik Smart Browser Items ###

	// ### RSS FEED XML PARSER  ###
    //var data = xmlHttp.responseText;
    var data = xmlHttp.responseXML;

	if(data == null){return;} // ## strat XML parsing onyl if responseXML data is existing

    //##### XML ATOM FEED ROOT DATA    #####
	var feedRoot = data.getElementsByTagName('feed').item(0);
	var feedType = getXMLTagValue(feedRoot,'feedType');
    var requestParentId = getXMLTagValue(feedRoot,'requestParentId');

    // ### XML FEED Entry List ##############
    var productList = data.getElementsByTagName('product');

    //alert("processProductData: " + productList.length);

	// ########## PARSE entryList ITEMS  ###############

 	if(productList.length > 0) {
        //var lastItemIndex = productList.length;
        var lastItemIndex = 1; // ## process only the first entry

        for(var i=0; i<lastItemIndex; i++) {
        	var mItemObject = productList[i];
        	var title = getXMLTagValue(mItemObject,'title');
        	var namePart1 = getXMLTagValue(mItemObject,'namePart1');
			var namePart2 = getXMLTagValue(mItemObject,'namePart2');
			var namePart3 = getXMLTagValue(mItemObject,'namePart3');
			var namePart4 = getXMLTagValue(mItemObject,'namePart4');
				var name = namePart1 + " " + namePart2 + " " + namePart3 + " " + namePart4;

			var productType = getXMLTagValue(mItemObject,'numismaticProductType');
			var productPrimaryPath = getXMLTagValue(mItemObject,'productPrimaryPath');
			var productGroup = getXMLTagValue(mItemObject,'productGroup');
			var productNumber = getXMLTagValue(mItemObject,'productNumber'); // ### Artikelnummer
			var inventoryNumber = getXMLTagValue(mItemObject,'inventoryNumber'); // ### Lagernummer
			var partNumber = getXMLTagValue(mItemObject,'partNumber');
			var metal = getXMLTagValue(mItemObject,'metal');
			var fineness = getXMLTagValue(mItemObject,'weight');
			var grossWeight = getXMLTagValue(mItemObject,'grossWeight');
			var tax = getXMLTagValue(mItemObject,'tax');
			var inventoryCount = getXMLTagValue(mItemObject,'inventoryCount');
			var orderLimit = getXMLTagValue(mItemObject,'orderLimit');

			var productConditionKey = getXMLTagValue(mItemObject,'productConditionKey');
				var productConditionValue = getCondicitonValue(productConditionKey); // ## used foer condition LED

			var productConditionString = getXMLTagValue(mItemObject,'productCondition');
			var productConditionText = getXMLTagValue(mItemObject,'productConditionText');
				var productConditionStringComposing = productConditionString + " " + productConditionText;

			var productMintYearStart = getXMLTagValue(mItemObject,'productMintYearStart');
			var productMintYearEnd = getXMLTagValue(mItemObject,'productMintYearEnd');
			var productPrice = getXMLTagValue(mItemObject,'productPrice');
			var productPriceCurrency = getXMLTagValue(mItemObject,'productPriceCurrency');
			var referenceCatalog1 = getXMLTagValue(mItemObject,'referenceCatalog1');
			var referenceCatalogNumber1 = getXMLTagValue(mItemObject,'referenceCatalogNumber1');
				var referenceCatalogStr1 = referenceCatalog1 + " " + referenceCatalogNumber1;

			var referenceCatalog2 = getXMLTagValue(mItemObject,'referenceCatalog2');
			var referenceCatalogNumber2 = getXMLTagValue(mItemObject,'referenceCatalogNumber2');
				var referenceCatalogStr2 = referenceCatalog2 + " " + referenceCatalogNumber2;

			var summary = getXMLTagValue(mItemObject,'summary');
			var details = getXMLTagValue(mItemObject,'details');
			var history = getXMLTagValue(mItemObject,'history');

			var stockListDescription1 = getXMLTagValue(mItemObject,'stockListDescription1');
			var stockListDescription2 = getXMLTagValue(mItemObject,'stockListDescription2');
			var stockListDescription3 = getXMLTagValue(mItemObject,'stockListDescription3');
			var stockListDescription4 = getXMLTagValue(mItemObject,'stockListDescription4');
			var stockListDescription5 = getXMLTagValue(mItemObject,'stockListDescription5');
			var stockListDescription6 = getXMLTagValue(mItemObject,'stockListDescription6');

			var stockListDescription = stockListDescription1 + " " + stockListDescription2 + " " + stockListDescription3 + " " + stockListDescription4 + " " + stockListDescription5 + " " + stockListDescription6;

			var thumbnailImage = getXMLTagAttribute(mItemObject,'thumbnailImage' ,'href');
			if(thumbnailImage == "" || thumbnailImage == null){ // ## specual handling for thumbnail xml parsing bug
				var thumbnailImage = getXMLTagValue(mItemObject,'thumbnailImage');
			}

			var normalImage = getXMLTagAttribute(mItemObject,'normalImage' ,'href');
			var bigImage = getXMLTagAttribute(mItemObject,'bigImage' ,'href');

			var parentId = getXMLTagValue(mItemObject,'parentId');
			var id = getXMLTagValue(mItemObject,'id');
			var link = getXMLTagValue(mItemObject,'link');

			var isCurrentTopCoin = getXMLTagValue(mItemObject,'isCurrentTopCoin');
			var isCurrentShopSpecial = getXMLTagValue(mItemObject,'isCurrentShopSpecial');
			var virtualGroupsShortNameList = getXMLTagValue(mItemObject,'virtualGroupsShortNameList');

			//alert("isCurrentTopCoin: " + isCurrentTopCoin + " ||isCurrentShopSpecial: " + isCurrentShopSpecial + " ||virtualGroupsShortNameList: " + virtualGroupsShortNameList);
        	//alert("### \n title: " + title + "\n id: " + id + "\n thumbnailImage: " + thumbnailImage + "\n bigImage: " + bigImage);

        	// #######  create productObject #########
        	var productObject=new ProductItem(title,name,productType,productPrimaryPath,productGroup,productNumber,inventoryNumber,partNumber,metal,fineness,grossWeight,tax,inventoryCount,orderLimit,productConditionStringComposing,productConditionValue,productMintYearStart,productMintYearEnd,productPrice,productPriceCurrency,referenceCatalogStr1,referenceCatalogStr2,summary,details,history,stockListDescription,thumbnailImage,normalImage,bigImage,parentId,id,link,isCurrentTopCoin,isCurrentShopSpecial,virtualGroupsShortNameList);

        	 //############ Fianaly render product details ##########
        	renderProductDetails(productObject);

        }
     }
}


// ###########  processProductListBrowserData  -  process data from server  ###########
function processProductListBrowserData( data ){

	if(data == null){return;} // ## strat XML parsing onyl if responseXML data is existing

    // ### RESET gPRODUCTLIST ####
    gPRODUCTLIST = new Array(); // ## array of all gPRODUCT Items
	gPRODUCTLIST_counter = 0;

    //##### XML ATOM FEED ROOT DATA    #####
	var feedRoot = data.getElementsByTagName('feed').item(0);
	var feedType = getXMLTagValue(feedRoot,'feedType');
    var requestParentId = getXMLTagValue(feedRoot,'requestParentId');


    // ###### Product List ######
    var productList = data.getElementsByTagName('product');
	//alert("processProductListBrowserData : " + productList.length);

	// ########## PARSE entryList ITEMS  ###############
	var productCount = productList.length;

	//alert("processProductListBrowserData productCount: " + productCount + " requestParentId: " + requestParentId);

 	if(productList.length > 0) {
        var lastItemIndex = productList.length;
        //alert("processProductListBrowserData: " + lastItemIndex);
        for(var i=0; i<lastItemIndex; i++) {
        	var mItemObject = productList[i];
        	var title = getXMLTagValue(mItemObject,'title');
        	var namePart1 = getXMLTagValue(mItemObject,'namePart1');
			var namePart2 = getXMLTagValue(mItemObject,'namePart2');
			var namePart3 = getXMLTagValue(mItemObject,'namePart3');
			var namePart4 = getXMLTagValue(mItemObject,'namePart4');
				var name = namePart1 + " " + namePart2 + " " + namePart3 + " " + namePart4;

			var productType = getXMLTagValue(mItemObject,'numismaticProductType');
			var productPrimaryPath = getXMLTagValue(mItemObject,'productPrimaryPath');
			var productGroup = getXMLTagValue(mItemObject,'productGroup');
			var productNumber = getXMLTagValue(mItemObject,'productNumber'); // ### Artikelnummer
			var inventoryNumber = getXMLTagValue(mItemObject,'inventoryNumber'); // ### Lagernummer
			var partNumber = getXMLTagValue(mItemObject,'partNumber');
			var metal = getXMLTagValue(mItemObject,'metal');
			var fineness = getXMLTagValue(mItemObject,'weight');
			var grossWeight = getXMLTagValue(mItemObject,'grossWeight');
			var tax = getXMLTagValue(mItemObject,'tax');
			var inventoryCount = getXMLTagValue(mItemObject,'inventoryCount');
			var orderLimit = getXMLTagValue(mItemObject,'orderLimit');

			var productConditionKey = getXMLTagValue(mItemObject,'productConditionKey');
				var productConditionValue = getCondicitonValue(productConditionKey); // ## used foer condition LED

			var productConditionString = getXMLTagValue(mItemObject,'productCondition');
			var productConditionText = getXMLTagValue(mItemObject,'productConditionText');
				var productConditionStringComposing = productConditionString + " " + productConditionText;

			var productMintYearStart = getXMLTagValue(mItemObject,'productMintYearStart');
			var productMintYearEnd = getXMLTagValue(mItemObject,'productMintYearEnd');
			var productPrice = getXMLTagValue(mItemObject,'productPrice');
			var productPriceCurrency = getXMLTagValue(mItemObject,'productPriceCurrency');
			var referenceCatalog1 = getXMLTagValue(mItemObject,'referenceCatalog1');
			var referenceCatalogNumber1 = getXMLTagValue(mItemObject,'referenceCatalogNumber1');
				var referenceCatalogStr1 = referenceCatalog1 + " " + referenceCatalogNumber1;

			var referenceCatalog2 = getXMLTagValue(mItemObject,'referenceCatalog2');
			var referenceCatalogNumber2 = getXMLTagValue(mItemObject,'referenceCatalogNumber2');
				var referenceCatalogStr2 = referenceCatalog2 + " " + referenceCatalogNumber2;

			var summary = getXMLTagValue(mItemObject,'summary');
			var details = getXMLTagValue(mItemObject,'details');
			var history = getXMLTagValue(mItemObject,'history');

			var stockListDescription1 = getXMLTagValue(mItemObject,'stockListDescription1');
			var stockListDescription2 = getXMLTagValue(mItemObject,'stockListDescription2');
			var stockListDescription3 = getXMLTagValue(mItemObject,'stockListDescription3');
			var stockListDescription4 = getXMLTagValue(mItemObject,'stockListDescription4');
			var stockListDescription5 = getXMLTagValue(mItemObject,'stockListDescription5');
			var stockListDescription6 = getXMLTagValue(mItemObject,'stockListDescription6');

			var stockListDescription = stockListDescription1 + " " + stockListDescription2 + " " + stockListDescription3 + " " + stockListDescription4 + " " + stockListDescription5 + " " + stockListDescription6;


			var thumbnailImage = getXMLTagValue(mItemObject,'thumbnailImage');
			var normalImage = getXMLTagValue(mItemObject,'normalImage');
			var bigImage = getXMLTagValue(mItemObject,'bigImage');

			var parentId = getXMLTagValue(mItemObject,'parentId');
			var id = getXMLTagValue(mItemObject,'id');

			var link = getXMLTagValue(mItemObject,'link');

			var isCurrentTopCoin = getXMLTagValue(mItemObject,'isCurrentTopCoin');
			var isCurrentShopSpecial = getXMLTagValue(mItemObject,'isCurrentShopSpecial');
			var virtualGroupsShortNameList = getXMLTagValue(mItemObject,'virtualGroupsShortNameList');


			//alert("isCurrentTopCoin: " + isCurrentTopCoin + " ||isCurrentShopSpecial: " + isCurrentShopSpecial + " ||virtualGroupsShortNameList: " + virtualGroupsShortNameList);

        	//alert("title: " + title + " id: " + id + " thumbnailImage: " + thumbnailImage);

        	// #### CREATE Browser ITEM ######
        	var productObject=new ProductItem(title,name,productType,productPrimaryPath,productGroup,productNumber,inventoryNumber,partNumber,metal,fineness,grossWeight,tax,inventoryCount,orderLimit,productConditionStringComposing,productConditionValue,productMintYearStart,productMintYearEnd,productPrice,productPriceCurrency,referenceCatalogStr1,referenceCatalogStr2,summary,details,history,stockListDescription,thumbnailImage,normalImage,bigImage,parentId,id,link,isCurrentTopCoin,isCurrentShopSpecial,virtualGroupsShortNameList);
        }
     }

     if(parentId != null) {var requestParentId = parentId;}
    //############ Fianaly draw received data in product List ##########
   	drawProductList(productCount, requestParentId);
}


// #########################################################################
// #######################  ProductItem Object #############################
ProductItem = function(title,name,productType,productPrimaryPath,productGroup,productNumber,inventoryNumber,partNumber,metal,fineness,grossWeight,tax,inventoryCount,orderLimit,productConditionString,productConditionValue,productMintYearStart,productMintYearEnd,productPrice,productPriceCurrency,referenceCatalogStr1,referenceCatalogStr2,summary,details,history,stockListDescription,thumbnailImage,normalImage,bigImage,parentId,id,link,isCurrentTopCoin,isCurrentShopSpecial,virtualGroupsShortNameList) {

	this.title = title;
	this.name = name;
	this.productType = productType; // ## XML <numismaticProductType>  UNIQUE  DIVERSE
	this.productPrimaryPath = productPrimaryPath;
	this.productGroup = productGroup;
	this.productNumber = productNumber; // ### Artikelnummer
	this.inventoryNumber = inventoryNumber;  // ### Lagernummer
	this.partNumber = partNumber;
	this.metal = metal;
	this.fineness = fineness; // ## Feingewicht
	this.grossWeight = grossWeight; // ## Brutto Gewicht

	this.tax = tax;
	this.inventoryCount = inventoryCount;
	this.orderLimit = orderLimit;
	this.productConditionString = productConditionString;
	this.productConditionValue = productConditionValue;
	this.productMintYearStart = productMintYearStart;
	this.productMintYearEnd = productMintYearEnd;

	//if(productPrice.length < 1) {productPrice = "999,00";} // ## just for default debugging
	this.productPrice = productPrice;

	//if(productPriceCurrency.length < 1) {productPriceCurrency = "EUR";} // ## just for default debugging

	this.productPriceCurrency = productPriceCurrency;
	this.referenceCatalogStr1 = referenceCatalogStr1;
	this.referenceCatalogStr2 = referenceCatalogStr2;
	this.summary = summary;
	this.details = details;
	this.history = history;
	this.stockListDescription = stockListDescription;
	this.thumbnailImage = thumbnailImage;
	this.normalImage = normalImage;
	this.bigImage = bigImage;

	this.parentId = parentId;
	this.id = id;
	this.link = link;

	this.isCurrentTopCoin = isCurrentTopCoin;
	this.isCurrentShopSpecial = isCurrentShopSpecial;
	this.virtualGroupsShortNameList = virtualGroupsShortNameList;

	this.selected = null;

	// #### CHECK OBJECT EXISTING ALREADY ####
	var mObjectExistingItem = null;
	for(var mItem in gPRODUCTLIST){
		var checkEntry = gPRODUCTLIST[mItem];
		if(id == checkEntry.id) {
			var mObjectExistingItem = checkEntry.item;
			break;
		}
	}


	if(mObjectExistingItem == null) {
		this.item = gPRODUCTLIST_counter;
		gPRODUCTLIST[gPRODUCTLIST_counter] = this; // ## create news PRODUCT ITEM if not exsiting in Database
		gPRODUCTLIST_counter ++;  // ## Counter der Elemente

		return this;
	}
}

function getTaxDisplayString(taxValue) {
	if (taxValue == 'frei') {
		return "steuerfrei";
	}
	return "inkl. "+taxValue+" MwSt.";
}




