If you have any question left, please drop a note with the discussion link of this page.

JavaScript Contextual Product Search with styles

From Wiki.zanox.com

Jump to: navigation, search

This is an example to show how to access the zanox Product Search Web Service with JavaScript and how to use styles. View demo.

Screenshot

Screenshot

Code

 
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
 <head>
  <title>zanox Web Services - Contextual Product Search</title>
 </head>
 <body>
  <div id="zxAdList"></div> <!-- // DIV HTML element to be filled with product information -->
  <script type="text/javascript" language="javascript" charset="utf-8">
 
 
// function to add scripts to html header
   function addScript(url) {
    var script = document.createElement('script');
// preventing caching of the Web Service call
    script.src = url + '&t=' + new Date().getMinutes();
    script.type = 'text/javascript';
    document.getElementsByTagName('head')[0].appendChild(script);
   }
 
// function to add styles to html header
   function addCSSRule (selectorText, declarations) {
    var styleSheet;
    if (document.styleSheets) {
     if (document.styleSheets.length === 0) {
      var styleElement;
      if (document.createElement && (styleElement = document.createElement('style'))) {
       styleElement.type = "text/css";
       document.getElementsByTagName('head')[0].appendChild(styleElement);
       styleSheet = styleElement.sheet;
      }
     }
     if (document.styleSheets.length > 0) {
      styleSheet = document.styleSheets[document.styleSheets.length - 1];
      if (styleSheet.insertRule) {
       styleSheet.insertRule( selectorText + ' { ' + declarations + ' }', styleSheet.cssRules.length );
      }
      else if (styleSheet.addRule) {
       styleSheet.addRule(selectorText, declarations);
      }
     }
    }
   }
 
// function for zanox product search
   function productSearch(version, applicationid, adspace, region, programs, minPrice, maxPrice, category, page, items, q, callback) {
    var url = 'http://api.zanox.com/json/' + version + '/products?applicationid=' + applicationid;
// adspace=null returns tracking links for all adspaces
    if (adspace) url += '&adspace=' + adspace;
// sales region; e.g. de, fr, it; null means "all countries"
    if (region) url += '&region=' + region;
// program ID
    if (programs) url += '&programs=' + programs;
// zanox product category ID; null means "all categories"
    if (category) url += '&category=' + category;
// search result is paged
    if (page) url += '&page=' + page;
// number of products per page
    if (items) url += '&items=' + items;
// minimum price
    if (minPrice) url += '&minPrice=' + minPrice;
// maximum price
    if (maxPrice) url += '&maxPrice=' + maxPrice;
// handler for the search result
    if (callback) url += '&callback=' + callback;
// search term
    if (q) url += '&q=' + q;
// adding script to html header
    addScript(url);
   }
 
// function for computing the search result
   function handler(data) {
    if (data.productsResult) {
     var productItems = data.productsResult.productItem;
// accessing the existing div element with the ID "zxAdList"
     var zxAdList = document.getElementById('zxAdList');
// looping through the product results
     for (var i = 0; i < productItems.length; i++) {
      var productItem = productItems[i];
      var link = '';
      if (productItem.url.adspace instanceof Array) {
// selecting tracking link related to the first adspace
      link = productItem.url.adspace[0].$;
      }
      else {
       link = productItem.url.adspace.$;
      }
// creating <div class="item"></div>
      var item = document.createElement("div");
      item.setAttribute("class","item");
      item.className = "item";
// creating <a href="product url" class="itemLink"></a>
      var itemLink = document.createElement("a");
      itemLink.setAttribute("href",link);
      itemLink.setAttribute("class","itemLink");
      itemLink.className = "itemLink";
// creating <div class="itemBox"></div>
      var itemBox = document.createElement("div");
      itemBox.setAttribute("class","itemBox");
      itemBox.className = "itemBox";
// creating <div class="itemImageBox">Image loading ...</div>
      var itemImageBox = document.createElement("div");
      itemImageBox.setAttribute("class","itemImageBox");
      itemImageBox.className = "itemImageBox";
// creating <img src="product image url" class="itemImage" alt="product name"/> 
      var itemImage = document.createElement("img");
// "No Image" image source
      var noImageSrc = "http://zac.zanox.com/images/no_image_carrousel.gif";
// testing if images source exists and is not empty
      try { 
       if (productItem.image.small && productItem.image.small != "undefined") {
        itemImage.setAttribute("src",productItem.image.small);
       } else {
        itemImage.setAttribute("src",noImageSrc);
       }
      } catch(e) { 
       itemImage.setAttribute("src",noImageSrc); 
      }
      itemImage.setAttribute("alt",productItem.name + " " + productItem.price.toFixed(2) + " " + productItem.currency);
      itemImage.setAttribute("title",productItem.name + " " + productItem.price.toFixed(2) + " " + productItem.currency);
      itemImage.setAttribute("id","itemImage"+i);
      itemImage.setAttribute("class","itemImage");
      itemImage.className = "itemImage";
// creating <span class="itemText"></span>
      var itemText = document.createElement("span");
      itemText.setAttribute("class","itemText");
      itemText.className = "itemText";
// creating <div class="itemName">product name</div>
      var itemName = document.createElement("div");
      itemName.innerHTML = productItem.name;
      itemName.setAttribute("class","itemName");
      itemName.className = "itemName";
// creating <div class="itemProgram">merchant name</div>
      var itemProgram = document.createElement("div");
      itemProgram.innerHTML = productItem.program.$;
      itemProgram.setAttribute("class","itemProgram");
      itemProgram.className = "itemProgram";
// creating <div class="itemPrice">amount currency</div>
      var itemPrice = document.createElement("div");
      itemPrice.innerHTML = productItem.price.toFixed(2) + "&nbsp;" + productItem.currency;
      itemPrice.setAttribute("class","itemPrice");
      itemPrice.className = "itemPrice";
// putting product information into container
      itemLink.appendChild(itemName);
      itemText.appendChild(itemLink);
      itemText.appendChild(itemProgram);
      itemText.appendChild(itemPrice);
      itemImageBox.appendChild(itemImage);
      itemBox.appendChild(itemImageBox);
      itemBox.appendChild(itemText);
      item.appendChild(itemBox);
      zxAdList.appendChild(item);
     }
    }
   }
 
// function to resize product images
   function imageResizeAfterLoading(n) {
    var itemImageID = "itemImage"+n;
// creating an image object to access dimensions
    thisItemImage = new Image();
// checking wether image is loaded or not
    if (document.getElementById(itemImageID) && document.getElementById(itemImageID).src) {
// transfering image source to our image object
     thisItemImage.src = document.getElementById(itemImageID).src;
// getting width and height
     var thisHeight = thisItemImage.height;
     var thisWidth = thisItemImage.width;
// checking wether image loading is finished or not
     if (thisHeight == 0 || thisWidth == 0) {
// recalling image resize function if image is not loaded yet
      window.setTimeout(function() { imageResizeAfterLoading(n); }, 10); 
     }
     var wmax = 57; // max width of image
     var hmax = 80; // max height of image
// computing ratio between real image size and maximum values
     var wrel = thisWidth / wmax;
     var hrel = thisHeight / hmax;
     if(thisItemImage.width > wmax || thisItemImage.height > wmax) {
      if(wrel > hrel) {
       thisrel = wrel;
      } else {
       thisrel = hrel;
      }
// resizing image
      document.getElementById(itemImageID).width = thisItemImage.width / thisrel;
      document.getElementById(itemImageID).height = thisItemImage.height / thisrel;
     }
    } else { 
    window.setTimeout(function() { imageResizeAfterLoading(n); }, 10);
    }
   }
 
// creating styles
  var zxAdList="";
  zxAdList +="margin:0 !important;";
  zxAdList +="padding:0px !important;";
  zxAdList +="border:0 !important;";
  zxAdList +="outline:0 !important;";
  zxAdList +="font-weight:inherit !important;";
  zxAdList +="font-style:inherit !important;";
  zxAdList +="vertical-align:baseline !important;";
  zxAdList +="text-decoration:none !important;";
  zxAdList +="color:#000000 !important;";
  zxAdList +="font-family:sans-serif !important;";
  zxAdList +="font-size:normal !important;";
  zxAdList +="width:220px !important;";
  zxAdList +="background-color:#dee4e8 !important;";
  zxAdList +="border:1px solid #999 !important;";
  zxAdList +="list-style:none !important;";
  addCSSRule(".zxAdList", zxAdList);
 
  var zxHeadline="";
  zxHeadline+="margin:0 !important;";
  zxHeadline+="padding:5px 5px 5px 5px !important;";
  zxHeadline+="border:0 !important;";
  zxHeadline+="outline:0 !important;";
  zxHeadline+="font-weight:inherit !important;";
  zxHeadline+="font-style:inherit !important;";
  zxHeadline+="vertical-align:baseline !important;";
  zxHeadline+="text-decoration:none;"
  zxHeadline+="color:#666;"
  zxHeadline+="font-family:Verdana !important;";
  zxHeadline+="font-size:middle !important;";
  zxHeadline+="font-weight:bold !important;";
  zxHeadline+="background:url(http://zac.zanox.com/images/contextsearch_bg.gif) !important;";
  zxHeadline+="background-repeat: no-repeat !important;";
  zxHeadline+="height:40px !important;";
  zxHeadline+="position:relative !important;";
  addCSSRule(".zxHeadline", zxHeadline)
 
  var itemLink="";
  itemLink+="margin:0 !important;";
  itemLink+="padding:0 !important;";
  itemLink+="border:0 !important;";
  itemLink+="outline:0 !important;";
  itemLink+="font-weight:inherit !important;";
  itemLink+="font-style:inherit !important;";
  itemLink+="vertical-align:baseline !important;";
  itemLink+="text-decoration:none !important;";
  itemLink+="color:#000000 !important;";
  itemLink+="font-family:sans-serif !important;";
  itemLink+="font-size:small !important;";
  itemLink+="position:relative !important;";
  addCSSRule(".itemLink", itemLink);
 
  var itemImageBox="";
  itemImageBox+="margin:5px !important;";
  itemImageBox+="padding:0 !important;";
  itemImageBox+="border:0 !important;";
  itemImageBox+="outline:0 !important;";
  itemImageBox+="font-weight:inherit !important;";
  itemImageBox+="font-style:inherit !important;";
  itemImageBox+="vertical-align:baseline !important;";
  itemImageBox+="text-decoration:none !important;";
  itemImageBox+="color:#000000 !important;";
  itemImageBox+="font-family:sans-serif !important;";
  itemImageBox+="font-size:small !important;";
  itemImageBox+="overflow:hidden !important;";
  itemImageBox+="width:57px !important;";
  itemImageBox+="height:80px !important;";
  itemImageBox+="position:relative !important;";
  addCSSRule(".itemImageBox", itemImageBox);
 
  var itemImage="";
  itemImage+="margin:0 !important;";
  itemImage+="padding:0 !important;";
  itemImage+="border:0 !important;";
  itemImage+="outline:0 !important;";
  itemImage+="overflow:hidden !important;";
  itemImage+="clip:rect(auto 57px 80px auto) !important;";
  itemImage+="position:absolute !important;";
  addCSSRule(".itemImage", itemImage);
 
  var itemText="";
  itemText+="margin:5px !important;";
  itemText+="padding:0 !important;";
  itemText+="border:0 !important;";
  itemText+="outline:0 !important;";
  itemText+="font-weight:inherit !important;";
  itemText+="font-style:inherit !important;";
  itemText+="vertical-align:baseline !important;";
  itemText+="text-decoration:none !important;";
  itemText+="color:#000000 !important;";
  itemText+="font-family:sans-serif !important;";
  itemText+="font-size:small !important;";
  itemText+="position:absolute !important;";
  itemText+="top:0px !important;";
  itemText+="left:62px !important;";
  itemText+="width:135px !important;";
  itemText+="background-color:#FFFFFF !important;";
  addCSSRule(".itemText", itemText);
 
  var itemName="";
  itemName+="margin:0 !important;";
  itemName+="padding:0 !important;";
  itemName+="border:0 !important;";
  itemName+="outline:0 !important;";
  itemName+="font-weight:inherit !important;";
  itemName+="font-style:inherit !important;";
  itemName+="vertical-align:baseline !important;";
  itemName+="text-decoration:underline !important;";
  itemName+="color:#ff9900 !important;";
  itemName+="font-family:sans-serif !important;";
  itemName+="font-size:small !important;";
  itemName+="position:relative !important;";
  addCSSRule(".itemName", itemName);
 
  var itemProgram="";
  itemProgram+="margin:0 !important;";
  itemProgram+="padding:5px 5px 5px 0px !important;";
  itemProgram+="border:0 !important;";
  itemProgram+="outline:0 !important;";
  itemProgram+="font-weight:inherit !important;";
  itemProgram+="font-style:inherit !important;";
  itemProgram+="vertical-align:baseline !important;";
  itemProgram+="text-decoration:none !important;";
  itemProgram+="color:#666 !important;";
  itemProgram+="font-family:sans-serif !important;";
  itemProgram+="font-size:smaller !important;";
  itemProgram+="position:relative !important;";
  addCSSRule(".itemProgram", itemProgram);
 
  var itemPrice="";
  itemPrice+="margin:0 !important;";
  itemPrice+="padding:0 !important;";
  itemPrice+="border:0 !important;";
  itemPrice+="outline:0 !important;";
  itemPrice+="font-weight:bold !important;";
  itemPrice+="font-style:inherit !important;";
  itemPrice+="vertical-align:baseline !important;";
  itemPrice+="text-decoration:none !important;";
  itemPrice+="color:#000000 !important;";
  itemPrice+="font-family:sans-serif !important;";
  itemPrice+="font-size:small !important;";
  itemPrice+="position:relative !important;";
  addCSSRule(".itemPrice", itemPrice);
 
  var item="";
  item+="margin:0px 5px 5px 5px !important;";
  item+="padding:0 !important;";
  item+="border:1px solid #999 !important;";
  item+="outline:0 !important;";
  item+="font-weight:inherit !important;";
  item+="font-style:inherit !important;";
  item+="vertical-align:baseline !important;";
  item+="text-decoration:none !important;";
  item+="color:#000000 !important;";
  item+="font-family:sans-serif !important;";
  item+="font-size:small !important;";
  item+="background-color:#FFFFFF !important;";
  item+="overflow:hidden !important;";
  item+="list-style: none !important;";
  item+="position:relative !important;";
  addCSSRule(".item", item);
 
  var itemBox="";
  itemBox+="margin:0 !important;";
  itemBox+="padding:0 !important;";
  itemBox+="border:0 !important;";
  itemBox+="outline:0 !important;";
  itemBox+="font-weight:inherit !important;";
  itemBox+="font-style:inherit !important;";
  itemBox+="vertical-align:baseline !important;";
  itemBox+="text-decoration:none !important;";
  itemBox+="color:#000000 !important;";
  itemBox+="font-family:sans-serif !important;";
  itemBox+="font-size:small !important;";
  itemBox+="background-color:#FFFFFF !important;";
  itemBox+="border-style:none !important;";
  itemBox+="overflow:hidden !important;";
  itemBox+="width:208px !important;";
  itemBox+="height:90px !important;";
  addCSSRule(".itemBox", itemBox);
 
  var ie7Fix="";
  ie7Fix+="margin:0 0 5px -6px;"
  addCSSRule("*+html .item", ie7Fix);
 
// accessing the existing div element with the ID "zxAdList"
  var zxAdList = document.getElementById('zxAdList');
// giving zxAdList a class for styling access
  zxAdList.setAttribute("class","zxAdList");
// IE Fix
  zxAdList.className = "zxAdList";
// creating <div class="zxHeadline">Headline</div>
  var zxHeadline = document.createElement("div");
  zxHeadline.setAttribute("class","zxHeadline");
  zxHeadline.className = "zxHeadline";
  zxHeadline.innerHTML = "zanox Web Services - Product Search";
  zxAdList.appendChild(zxHeadline);
 
// setting the search parameters
  myVersion=        '2009-02-01';
  myApplicationID=  'BE94C4947839E8AB4D67';
  myAdspace=        null;
  myRegion=         null;
  myPrograms=       null;
  myMinPrice=       null;
  myMaxPrice=       null;
  myCategory=       null;
  myPage=           0;
  myItems=          5;
  myQuery=          'wrangler';
  myCallback=       'handler';
 
// performing the zanox search
  productSearch(myVersion, myApplicationID, myAdspace, myRegion, myPrograms, myMinPrice, myMaxPrice, myCategory, myPage, myItems, myQuery, myCallback);
 
// resizing images of necessary
  for (var i=0;i<myItems;i++) {
   imageResizeAfterLoading(i);
  }
 
 </script>
</body>
</html>
 
Personal tools