/************************************************************************
rock-amazon.js
Interface to Amazon ECS 4 webservices (REST style)
Depends on: 
            prototype.js, scriptaculous/builder.js, jmaki.js
            rock.js, rock-utils.js 

Data is displayed in result area, which is identified by "div.resultArea".
Above the result area is the pagination control, which is identified by
"div.controlBar div.paginationControl".
*************************************************************************/
 
// define namespaces
rock.namespace("rock.amazon");

rock.amazon.awsUrl = "http://ecs.amazonaws.com/onca/xml?Service=AWSECommerceService&AWSAccessKeyId=0S33MY2B8FTCSTENX2R2&AssociateTag=unimerse-20&"; // note: this should be the same as defined in xhp.json

rock.amazon.logUrl = function(method, params){
     var url = rock.amazon.awsUrl + params;
     jmaki.log("rock-amazon.js/" + method + ": amazon url= " + url);
}

rock.amazon.getResultArea = function(){
    var resultArea;
    var elems = $$('div.resultArea'); 
    if(elems && elems.length > 0){
	resultArea = elems[0];
    }
    return resultArea;
}

rock.amazon.getPaginationControl = function(){
    var pagCtrl;
    var elems = $$('div.controlBar div.paginationControl'); 
    if(elems && elems.length > 0){
	pagCtrl = elems[0];
    }
    return resultArea;
}

/**
 * Category map: key: category name, value: an object which has property value - 
 * search index, and property nodeId - BrowseNodeId.
 */
rock.amazon.getSearchIndex = function(category, categoryMap){
	var searchIndex = 'Electronics';
	if(categoryMap[category]){
		searchIndex = categoryMap[category].value;
	}
	return searchIndex;
}

/**
 * Register the behavior of showing item detail.
 */
rock.amazon.registerShowItemDetail = function(xhpUrl, targetElement){
  $$(".showItemDetail").each(function(element){
	    element.onclick = function(){
		var itemId = this.getAttribute("itemId");
		jmaki.log("rock-amazon.js/registerShowItemDetail/onclick: show item detail, itemId= " + itemId);
		rock.amazon.itemLookup(itemId, 
				       xhpUrl, 
				       function(req){ //onSuccess
    jmaki.log("rock-amazon.js/registerShowItemDetail/onItemLookupCompleted: response= " + req.responseText);
    var response = rock.util.JsonUtil.toObject(req.responseText);

    if(response.errors && response.errors.length > 0){
	jmaki.log("rock-amazon.js/registerShowItemDetail/onItemLookupCompleted: response has errors.");
	rock.amazon.Items.insertErrors(response.errors, targetElement);
    }else{
	if(response.items && response.items.length > 0){
	    var itemDetailTbl = rock.amazon.Items.detailItem2table(response.items[0]);
	    var resultArea = rock.amazon.getResultArea();
	    if(resultArea == null){
		resultArea = targetElement;
	    }
	    rock.util.DomUtil.replaceChildren(resultArea, itemDetailTbl);

	    // register behavior: make link popup
	    rock_newWindow.init();
	}else{
	    rock.showErrorMsg("Item not found. Item ID: " + itemId, targetElement);
	}
    }
				       },
				       function(req){ //onFailure
					   var msg = "Http error: Status " + req.status + " " + 
					       req.statusText + " " + req.responseText;
					   rock.showErrorMsg(msg, targetElement);
				       },
				       function(req, exception){ //onException
					   var msg = "Application exception: " + exception.message;
					   rock.showErrorMsg(msg, targetElement);
				       });
		return false;
	    };
	});
}


/*====================================================================
   browseNodeLookup: Get subcatories (BrowseNode)

   data = {
          nodeId: BrowseNodeId, // subcategory node id
	  category: browseCategoryLabel, // category
	  categoryMap: rootCategories,
	  service: service url, // xhp's url
	  onSuccess: onBrowseNodeLookupCompleted, //callback function
	  onFailure: onBrowseNodeLookupFailed,  //callback function
	  onException: onBrowseNodeLookupException //callback function
      }
 =====================================================================*/
rock.amazon.browseNodeLookup = function(data){
    var params = "Operation=BrowseNodeLookup&ResponseGroup=BrowseNodeInfo&BrowseNodeId=" + 
                 data.nodeId;        
    var url = data.service + "?key=amazon-browsenodelookup&urlparams=" + encodeURIComponent(params);
    jmaki.log("rock-amazon.js/browseNodeLookup: xhp url= " + url);
    rock.amazon.logUrl("browseNodeLookup", params);

    new Ajax.Request( 
       url, 
       {method: 'get', 
	onSuccess: data.onSuccess,
	onFailure: data.onFailure,	
	onException: data.onException		         
       });
}

/*====================================================================
   keywordSearch: item search by Keywords in a category (SearchIndex)

   data = {
      	category: category //SearchIndex
      	keywords: keywords, 
      	service:  serviceUrl, // xhp url
      	itemPage: pageNumber
      }
 =====================================================================*/
rock.amazon.keywordSearch = function(data, targetContainer, redisplayPagination){
    var category = data.category;
    var keywords = data.keywords;
    var service = data.service;
    // published events
    var topicOnPagination = "/rock/amazon/keywordSearch/onPagination";

    var itemPage = 1;
    if(data.itemPage){
	    itemPage = data.itemPage;
    }

    var drawPagControl = false;
    if(redisplayPagination){
	    drawPagControl = redisplayPagination;
    }

    var targetElement = targetContainer;
    if(!drawPagControl){
	    targetElement = targetContainer.lastChild;
	    if(!targetElement){
		    targetElement = targetContainer;
	    }
    }
		
    // do itemSearch by keywords in a given category (SearchIndex)
    var params = "Operation=ItemSearch&ResponseGroup=Medium,Offers&SearchIndex=" + 
    			 category + "&Keywords=" + keywords +
    			 "&ItemPage=" + itemPage;      
    var url = service + "?key=amazon-itemsearch&urlparams=" + encodeURIComponent(params);        
    jmaki.log("rock-amazon.js/itemSearchByKeywords: xhp url= " + url);
    rock.amazon.logUrl("itemSearchByKeywords", params);
    
    // making ajax call
    rock.util.DomUtil.removeAllChildren(targetElement);
    rock.showLoadingMsg("Searching...", targetElement);
    new Ajax.Request( 
    	url, 
        {    method: 'get', 
	     onSuccess: function(req) {	
	    	jmaki.log("rock-amazon.js/itemSearchByKeywords: search completed. responseText= " + req.responseText);
		rock.hideLoadingMsg(targetElement);	    	
	    	
	     	// convert responseText to json
	        var response = eval("(" + req.responseText + ")");

	        if(response.errors && response.errors.length > 0){
		    jmaki.log("rock-amazon.js/itemSearchByKeywords: response has errors.");
	            rock.amazon.Items.insertErrors(response.errors, targetElement);
	        }else{
		    if(drawPagControl){
			var totalPages = response.totalPages;
			var totalItems = response.totalItems;
			var pagCtrl = new rock.pagination.PaginationControl(itemPage, totalPages, totalItems, data, topicOnPagination);
			targetElement.appendChild(pagCtrl);
		    }

		    if(response.items && response.items.length > 0){
			var table = rock.amazon.Items.toTwoColumnTable(response.items); 

			if(drawPagControl){
			    targetElement.appendChild(Builder.node('div', {className: 'resultArea'}, [table]));
			}else{
			    rock.util.DomUtil.replaceChildren(targetElement, table);
			}

			// register behavior: show item detail
			rock.amazon.registerShowItemDetail(service, targetElement);

			// add behavior: every a.newWindow will open a new window on click
			rock_newWindow.init();
		    }	        
	        }		
	      },
	      onFailure: function(req) {
		jmaki.log("rock-amazon.js/itemSearchByKeywords: onFailure");
		rock.hideLoadingMsg(targetElement);
   		var msg = "Http error: Status " + req.status + " " + 
       			   req.statusText + " - " + req.responseText;
		rock.showErrorMsg(msg, targetElement);
   	      },
	
	      onException: function(req, exception) {
		jmaki.log("rock-amazon.js/itemSearchByKeywords: onException");
		rock.hideLoadingMsg(targetElement);
   		var msg = "Application exception: " + exception.message; 
		rock.showErrorMsg(msg, targetElement);
   	      }		         
	});   
}
		
/*=============================================================
   browseNodeSearch: item search by BrowseNode in a given 
   category (SearchIndex)

   data = {
       nodeId:      nodeId,  //amazon BrowseNode ID
       category:    browseCategoryLabel, // amazon SearchIndex
       categoryMap: rootCategories,
       itemPage:    pageNumber //page nbr in the result set
   }
 ==============================================================*/		
rock.amazon.browseNodeSearch = function(data, targetContainer, redisplayPagination){
    var searchIndex = rock.amazon.getSearchIndex(data.category, data.categoryMap);
    var browseNodeId = data.nodeId;	

    //published events
    var topicOnPagination = "/rock/amazon/browseNodeSearch/onPagination";
    var topicOnSort = "rock/amazon/browseNodeSearch/onSort";
    /*
    var sortControlConfig = {
	 sortLabel: 'Sort:',
	 options: [
	   {label: 'Bestselling',
	    value:'salesrank'},
	   {label: 'Price Low to High',
	    value:'price'},
	       {label: 'Price High to Low',
	    value:'-price'}     
	 ]
       };
    */	
    var itemPage = 1;
    if(data.itemPage){
	    itemPage = data.itemPage;
    }

    var drawPagControl = false;
    if(redisplayPagination){
	    drawPagControl = redisplayPagination;
    }

    var targetElement = targetContainer;
    if(!drawPagControl){
	jmaki.log("rock-amazon.js/browseNodeSearch: not redrawing pag ctrl. set targetElement as last child.");
	targetElement = targetContainer.lastChild;
        if(!targetElement){
	    targetElement = targetContainer;
	}
    }
		
    // do itemSearch by BrowseNode in a given category (SearchIndex)
    var params = "Operation=ItemSearch&SearchIndex=" + searchIndex + 
    		"&ResponseGroup=Medium,Offers&BrowseNode=" + browseNodeId + 
    		"&ItemPage=" + itemPage;     
    var xhpUrl = jmaki.webRoot + "/xhp";
    var url = xhpUrl + "?key=amazon-itemsearch&urlparams=" + encodeURIComponent(params);
    jmaki.log("rock-amazon.js/itemSearchByBrowseNode: xhp url= " + url);
    rock.amazon.logUrl("itemSearchByBrowseNode", params);
	
    // making ajax call
    rock.util.DomUtil.removeAllChildren(targetElement);
    rock.showLoadingMsg('Loading...', targetElement);
    new Ajax.Request( 
    	url, 
        {method: 'get', 
	     onSuccess: function(req){
	     	jmaki.log('rock-amazon.js/itemSearchByBrowseNode: search completed, ' + req.responseText);
		rock.hideLoadingMsg(targetElement);

	     	// convert responseText to json
	        var response = eval("(" + req.responseText + ")");     
   
	        if(response.errors && response.errors.length > 0){
		    jmaki.log("rock-amazon.js/itemSearchByBrowseNode: response has errors.");
	            rock.amazon.Items.insertErrors(response.errors, targetElement);
	        }else{
		    if(drawPagControl){
			// create pagination control
			var totalPages = response.totalPages;
			var totalItems = response.totalItems;
			jmaki.log("rock-amazon.js/itemSearchByBrowseNode: redrawing pag ctrl. create pag ctl.");
			var pagCtrl = new rock.pagination.PaginationControl(itemPage, totalPages, totalItems, data, topicOnPagination);		        	

			// create sort control
			//var sortCtrl = new rock.ui.SortControl(sortControlConfig, topicOnSort);

			// create control bar
			var controlBar = Builder.node('div', {className: 'controlBar'});
			controlBar.appendChild(pagCtrl);
			//controlBar.appendChild(sortCtrl);

			targetElement.appendChild(controlBar);		        	
		    }

		    if(response.items && response.items.length > 0){
			var table = rock.amazon.Items.toTwoColumnTable(response.items); 

			if(drawPagControl){
			    jmaki.log("rock-amazon.js/itemSearchByBrowseNode: redrawing pag ctrl. appending table");
			    targetElement.appendChild(Builder.node('div', {className: 'resultArea'}, [ table ]));
			}else{
			    jmaki.log("rock-amazon.js/itemSearchByBrowseNode: not redrawing pag ctrl, replacing old table");
			    rock.util.DomUtil.replaceChildren(targetElement, table);
			}

			// register behavior: show item detail
			rock.amazon.registerShowItemDetail(xhpUrl, targetElement);

			// add behavior: every a.newWindow will open a new window on click
			rock_newWindow.init();
		    }		        	
       		}
	     },
	     onFailure: function(req) {
		jmaki.log("rock-amazon.js/itemSearchByBrowseNode: onFailure");
		rock.hideLoadingMsg(targetElement);
   		var msg = "Http error: Status " + req.status + " " + 
       			  req.statusText + " - " + req.responseText;
       		rock.showErrorMsg(msg, targetElement);
   	     },	
	     onException: function(req, exception) {
		jmaki.log("rock-amazon.js/itemSearchByBrowseNode: onException");
		rock.hideLoadingMsg(targetElement);
   		var msg = "Application exception: " + exception.message; 
       		rock.showErrorMsg(msg, targetElement);
   	     }		         
	 });
}
	
	
/*====================================================================
                itemLookup: Get item detail info
 =====================================================================*/
rock.amazon.itemLookup = function(itemId, xhpUrl, onSuccess, onFailure, onException){
    var params = "Operation=ItemLookup&ItemId=" + itemId + "&ResponseGroup=Large";
    var url = xhpUrl + "?key=amazon-itemlookup&urlparams=" + encodeURIComponent(params);
    jmaki.log("rock-amazon.js/itemLookup: xhp url= " + url);
    rock.amazon.logUrl("itemLookup", params);

    new Ajax.Request( 
       url, 
       {method: 'get', 
	onSuccess: onSuccess,
	onFailure: onFailure,	
	onException: onException		         
       });
}




/*================================================
   Class Items - a DOM util class for processing
   items JSON
 =================================================*/
rock.amazon.Items = {};
 
/**
 * Convert array of items to 2-column table
 */
rock.amazon.Items.toTwoColumnTable = function(items){
  jmaki.log("rock-amazon.js/rock.amazon.Items.toTwoColumnTable: convert items to DOM table.");
  var table = Builder.node('table');
  var tbody = Builder.node('tbody');
  table.appendChild(tbody);      

  var newRow = true;
  var row;
  var colIdx = 0;
  for(var i=0; i<items.length; ){
      var item = items[i];
      // skip item with bad data      
      if(!item.smallImageUrl ||
      	!item.url || !item.title ){
	  i++;
	  continue;
      } 

      //jmaki.log("rock-amazon.js/toTwoColumnTable: item.title= " + item.title);
      if(newRow){ // add a new row
	  row = Builder.node('tr');
	  tbody.appendChild(row); 
      }

      // convert the item into a DOM table
      var col = rock.amazon.Items.item2table(item);

      // push the column into the row
      row.appendChild(Builder.node('td', [ col ]));

      // update column index
      // column index is either 0 or 1
      colIdx = 1 - colIdx; 

      if(colIdx == 0){ // the row is all filled
	  newRow = true;
      }else{ // the row is not filled yet
	  newRow = false;
      }
      i++;
  }   
 
  return table;
}

/**
 * Convert an item object to table DOM element.
 */
rock.amazon.Items.item2table = function(item){
  var table = Builder.node('table');
  var tbody = Builder.node('tbody');
  table.appendChild(tbody);  
  var row = Builder.node('tr');
  tbody.appendChild(row);  
  
   // image column      
   var imgUrl, imgWidth, imgHeight, imgNode;
   if(item.smallImageUrl){
   	 imgUrl = item.smallImageUrl;
   	 imgWidth = item.smallImageWidth;
   	 imgHeight = item.smallImageHeight;
   }     
   /*if(item.mediumImageUrl){
   	 imgUrl = item.mediumImageUrl;
   	 imgWidth = item.mediumImageWidth*0.7;
   	 imgHeight = item.mediumImageHeight*0.7;
   }*/
   if(imgUrl && imgWidth && imgHeight){
   	 imgNode = Builder.node('img', {src:imgUrl, width:imgWidth, height:imgHeight, border:'0'});
   }else{
   	 imgNode = '';
   }

   var imgLink = Builder.node('a', {itemId:item.asin, className:'imgLink'}, [ imgNode ]);
   Element.addClassName(imgLink, "showItemDetail");
   row.appendChild(Builder.node('td', [ imgLink ]));
   //rock.debug.msg(item.smallImageWidth + ", " + item.smallImageHeight);
            
   // title, feature & other desc info column 
   var infoTbl = rock.amazon.Items.createItemInfoTable(item);   
   var td = Builder.node('td', {valign:'top', align:'left'}, [ 
   		infoTbl]);;	
   row.appendChild(td);    
              
  return table;	
}


/**
 * Convert a detail Item object to table DOM element.
 */
rock.amazon.Items.detailItem2table = function(item){
   var table = Builder.node('table');
   var tbody = Builder.node('tbody');
   table.appendChild(tbody);  
  
   var headerTbl = Builder.node('table');
   var headerTbody = Builder.node('tbody');
   headerTbl.appendChild(headerTbody);
   var headerRow = Builder.node('tr');
   headerTbody.appendChild(headerRow);

   // image column      
   var imgUrl, imgWidth, imgHeight, imgNode;
   if(item.mediumImageUrl){
   	 imgUrl = item.mediumImageUrl;
   	 imgWidth = item.mediumImageWidth;
   	 imgHeight = item.mediumImageHeight;
   }else if(item.smallImageUrl){
   	 imgUrl = item.smallImageUrl;
   	 imgWidth = item.smallImageWidth;
   	 imgHeight = item.smallImageHeight;
   } 
   if(imgUrl && imgWidth && imgHeight){
       imgNode = Builder.node('img', {src:imgUrl, width:imgWidth, height:imgHeight, border:'0'});
   }else{
       imgNode = '';
   }
   headerRow.appendChild(Builder.node('td', {valign:'top', align:'left'}, [
   	Builder.node('a', {href:item.url, className:'newWindow'}, [
   		imgNode
   	])
   ]));
   //rock.debug.msg(item.smallImageWidth + ", " + item.smallImageHeight);
            
   // title, feature & other desc info column 
   var infoTbl = rock.amazon.Items.createDetailItemInfoTable(item);   
   var td = Builder.node('td', [ 
				infoTbl
				 ]);	
   headerRow.appendChild(td);    

   // add header
   tbody.appendChild(Builder.node('tr', [ Builder.node('td', [ headerTbl ]) ] ));
   
   // product description
   if(item.productDescriptions && item.productDescriptions.length > 0){
       tbody.appendChild(Builder.node('tr', [ 
					     Builder.node('td', {className: 'largeFont1'}, [ 'Product Description' ])
					      ]));

       item.productDescriptions.each(function(desc){
	       if(desc.content){
		   var descTD = Builder.node('td');
		   descTD.innerHTML = desc.content;
		   var descTbl = Builder.node('table', [Builder.node('tbody', [Builder.node('tr', [ descTD ])])]);
		   tbody.appendChild(Builder.node('tr', [ Builder.node('td', [ descTbl ]) ]));
	       }
	   });
   }

   return table;	
}

/**
 * Get lowest offer with condition new.
 */
rock.amazon.Items.getLowestOfferConditionNew = function(item){
    var lowestOffer;
    if(item.offers && item.offers.offers && item.offers.offers.length > 0){
	$A(item.offers.offers).each(function(offer){
		if(offer.condition.toLowerCase() == 'new' && offer.price){
		    if(lowestOffer == null || lowestOffer.price > offer.price){
			lowestOffer = offer;
		    }
		}
	    });
    }
    return lowestOffer;
}

/**
 * Create a DOM element that briefly displays the item's 
 * title, price, manufacturer, etc.
 */ 
rock.amazon.Items.createItemInfoTable = function(item){
    var infoTbl = Builder.node('table', {className:'descTable'});
   var infoTblTbody = Builder.node('tbody');
   infoTbl.appendChild(infoTblTbody);

   // title
   var titleLabel = Builder.node('a', {itemId:item.asin, className:'link'}, item.title);
   Element.addClassName(titleLabel, "showItemDetail");
   var titleNode = Builder.node('td', [ titleLabel ]);
   infoTblTbody.appendChild(Builder.node('tr', [ titleNode ] ));

   // price
   var priceNode;
   if(item.listPrice == undefined){
       priceNode = [ Builder.node('td', '') ];
   }else{
       priceNode = [ Builder.node('td', item.listPrice) ];
       var lowestOffer = rock.amazon.Items.getLowestOfferConditionNew(item);
       if(lowestOffer && lowestOffer.price < item.listPrice){
	   priceNode = [
			Builder.node('td', [
					    Builder.node('del', item.listPrice), // crossed out
					    ' ', 
					    lowestOffer.price
					    ])];
       }
   }
   infoTblTbody.appendChild(Builder.node('tr', priceNode));

   // manufacturer
   if(item.manufacturer){
     infoTblTbody.appendChild(Builder.node('tr', [
     	Builder.node('td', 'Manufacturer: ' + item.manufacturer)
     ]));
   }    
   
   return infoTbl;
}

/**
 * Create a DOM element that displays the item detail info.
 */ 
rock.amazon.Items.createDetailItemInfoTable = function(item){
    var infoTbl = Builder.node('table', {className:'descTable'});
   var infoTblTbody = Builder.node('tbody');
   infoTbl.appendChild(infoTblTbody);

   // title
   var titleLabel = Builder.node('a', {href:item.url, className:'newWindow'}, item.title);
   Element.addClassName(titleLabel, "largeFont1");
   var titleNode = Builder.node('td', [ titleLabel ]);
   infoTblTbody.appendChild(Builder.node('tr', [ titleNode ] ));

   // price
   var listPriceNode, priceNode;
   if(item.listPrice == undefined){
       listPriceNode = Builder.node('td', ['']);
   }else{
       listPriceNode = Builder.node('td', ['List Price: ', item.listPrice ]);
       var lowestOffer = rock.amazon.Items.getLowestOfferConditionNew(item);
       if(lowestOffer && lowestOffer.price < item.listPrice){
	   listPriceNode = Builder.node('td', ['List Price: ',
					      Builder.node('del', [item.listPrice]), // crossed out
					      ]);
	   priceNode = Builder.node('td', [ 'Price: ', lowestOffer.price ]);
       }
   }
   infoTblTbody.appendChild(Builder.node('tr', [ listPriceNode ]));
   if(priceNode){
       infoTblTbody.appendChild(Builder.node('tr', [ priceNode ]));
   }

   // manufacturer
   if(item.manufacturer){
     infoTblTbody.appendChild(Builder.node('tr', [
     	Builder.node('td', 'Manufacturer: ' + item.manufacturer)
     ]));
   }    
   
   return infoTbl;
}

/*
 Convert JSON object items to table element with sortable markers.
 */
rock.amazon.Items.toSortableTable = function(items){
  var table = Builder.node('table', {className:'sortable'});
  var tbody = Builder.node('tbody');
  table.appendChild(tbody);    
  
  // header
  var tr = Builder.node('tr', {className:'header'});
  tr.appendChild(Builder.node('th', {className:'unsortable'}, 'Image'));  
  tr.appendChild(Builder.node('th', {className:'sortable'}, ' Product'));
  tr.appendChild(Builder.node('th', {align:'right'}, 'Price'));
  tbody.appendChild(tr);
      
  for(var i=0; i<items.length; i++){
      var item = items[i];  
      
      // skip bad data      
      if(!item.smallImageUrl ||
      	!item.url || !item.title || 
      	(!item.listPrice)){
      	continue;
      } 

      // image         
      tr.appendChild(Builder.node('td', {valign:'middle'}, [
      	Builder.node('a', {href:item.url}, [
      		Builder.node('img', {src:item.smallImageUrl})
      	])
      ]));
                  
      // title, feature & other desc info   
      var td = Builder.node('td', {valign:'top', align:'left'}); 
      var infoTbl = Builder.node('table', {className:'descTable'});
      var infoTblTbody = Builder.node('tbody', [
	      	Builder.node('tr', [
	      		Builder.node('td', [
	      			Builder.node('a', {href:item.url}, item.title)
	      		])
	      	])
	    ]);   
       // list price
      if(item.listPrice ){
        infoTblTbody.appendChild(Builder.node('tr', [
						     Builder.node('td', item.listPrice)
						     ]));
      } 
      // manufacturer
      if(item.manufacturer){
        infoTblTbody.appendChild(Builder.node('tr', [
        	Builder.node('td', 'Manufacturer:' + item.manufacturer)
        ]));
      }    
      infoTbl.appendChild(infoTblTbody);
      td.appendChild(infoTbl);	
      tr.appendChild(td);      
            
      // lowest price
      tr.appendChild(Builder.node('td', {valign:'top', align:'right'}, item.listPrice)); 
  }
 
  return table;
}

rock.amazon.Items.insertErrors = function(errors, container){
    if(errors && errors.length > 0){
	var msg = '';
	errors.each(function(error){
	    if(error && error.code && error.message){
		//msg += 'Error ' + error.code + ': ' + error.message + '<br>';	
	        msg += error.message + '<br>';	    
	    }
	});
	//jmaki.log("rock-amazon.js: Items.insertErrors: " + msg);
	rock.showErrorMsg(msg, container);
    }
} 

 
