/*----------------------------------------------------------------------------
------------------------------------------------------------------------------
                                                                     PM.Offers
                                                                   engine v1.1
------------------------------------------------------------------------------*/
/**
 * Outils pour la gestion et l'affichage du comparateur et des annonces Google.
 * @base PM
 */
PM.Offers = {}

/**
 * Set an Ajax request or write a javascript tag to get
 * partner offers and display it using options given
 *
 * @param url     ervice url
 * @param params  string (Ajax mode only) or array of params to give to the url (cid, rskw,...)
 * @param mode    either PM.Offers.Mode.Ajax or PM.Offers.Mode.SCRIPT
 * @param options usefull options for displaying ads (contains div id, templates,...)
 *
 * @base PM.Offers
 */
 
PM.Offers.get = function(url, params, mode, options) {
  
  switch(mode) {
    // SCRIPT TAG Mode (ie. Google AFC)
    case PM.Offers.Mode.SCRIPT:
      
      // register options as a global variable
      // that means only one script request can be done in a page
      pm_offers_options = options;
      
      for (key in params) {
        var evalExpr = key + " = '" + params[key] + "'";
        eval(evalExpr);
      }
		  
		  document.write('<script type="text/javascript" src="' + url + '"></script>');
      
      break;
    // AJAX Mode (ie. Kelkoo, AFS)
    case PM.Offers.Mode.AJAX:
    default:
      var url_params = "?";

      if (typeof(params) == "string") {
        url_params = params;
      }
      else {
  		  var i = 0;
  		  for (key in params) {
  		    if (i > 0) url_params += "&";
  		  	url_params += key + "=" + params[key];
  		  	i++;
  		  }
      }
		  
      PM.Ajax.request(url+url_params, PM.Offers.display, options);
      break;
  }
}

/**
 * Display offers in the target div using options provided
 *
 * @param options object containing everything needed, from XmlHttpObject to target divs
 *
 * @base PM.Offers
 */
PM.Offers.display = function(options) {
  if(options.XmlHttpObject) {
    var offersArray = options.parseFunction.apply(null, [options.XmlHttpObject.responseXML]);
  } else {
    var offersArray = options.parseFunction.apply(null, [options.responseObject]);
  }
  
  if (options.xiti) { // garde fou
    // publisher
    var publisher_tag = 'PUB-[' + options.xiti.campaign+ ']-[' + options.xiti.family + ']-[' + offersArray.length +']-{{format}}-0-[' + options.xiti.pageType + ']-[' + options.xiti.announcer + ']';
  }
  
  var ads_counter = 0;
  for (i = 0; i < options.templates.length; i++) {
    var template = options.templates[i];
    var divContent = "";
    
    var lineContent = "";
    var j;
    // maxPerLine special case
    if ((offersArray.length - ads_counter) >= options.minNums[i] && (offersArray.length - ads_counter) > 0) {
      if (template.maxPerLine && (offersArray.length - ads_counter) > template.maxPerLine && (offersArray.length - ads_counter) % (options.maxNums[i]/template.maxPerLine) == 0) {
        var newMax = offersArray.length / (options.maxNums[i]/template.maxPerLine);
        if (newMax < template.maxPerLine) template.maxPerLine = newMax;
      }
      for (j = 0; j < options.maxNums[i] && ads_counter < offersArray.length; j++, ads_counter++) {
        var offerElt = template.element;
        var offer = offersArray[ads_counter];
        for (g = 0; g < offer.length; g++) {
          offerElt = PM.Util.variableReplace(offerElt, offer[g][0], offer[g][1]);
        }
        // lastContent special case (different class,...)
        if (template.lastContent) {
          if (j == options.maxNums[i]-1 || ads_counter == offersArray.length - 1) {
            offerElt = PM.Util.variableReplace(offerElt, "lastContent", template.lastContent);
          } else {
            offerElt = PM.Util.variableReplace(offerElt, "lastContent", "");
          }
        }
        
        if (template.maxPerLine) { // means that we have to worry about columns
          lineContent += offerElt;
          if(((j+1) % template.maxPerLine) == 0) {
            divContent += PM.Util.variableReplace(template.line, "line", lineContent);
            lineContent = "";
          }
        } else {
  	      divContent += offerElt;
  	    }
      }
      if (lineContent != "") { // complete the line with empty elements
        while (j % template.maxPerLine != 0) {
          lineContent += template.emptyElement;
        	j++;
        }
        divContent += PM.Util.variableReplace(template.line, "line", lineContent);
      }
      
      var offersBody = template.body;
      divContent = PM.Util.variableReplace(offersBody, "content", divContent);
      
      // tracking et tags XiTi
      if (options.xiti) {
        var temp_format = template.format? template.format: "wide"; // si pas de format, wide par défaut.
        divContent = PM.Util.variableReplace(divContent, "tk", " onclick=\"xt_ad('" + PM.Util.variableReplace(publisher_tag, "format", temp_format) + "'); xt_med('F','39','" + options.xiti.tag + "');\"");
      }
      else divContent = PM.Util.variableReplace(divContent, "tk", "");

      if(options.params && template.customContent)
        divContent = template.customContent(divContent, options.params, offersArray);
      
      document.getElementById(options.targets[i]).innerHTML = divContent;
    }
  }

  // L'affichage de la page est modifié. On appelle l'événement Redraw
  PM.Event.eventReached(PM.Event.Type.REDRAW);

  // tag d'impression publisher
  if(options.xiti) {
    var date = new Date();
    // préparation des tags XiTi    
    var im_pub_url = "http://logc11.xiti.com/get.ad?xts=" + options.xiti.level1;
    im_pub_url += "&ati=" + PM.Util.variableReplace(publisher_tag, "format", "wide");
    im_pub_url += "&type=AT&rn=" + date.getHours()+"x"+date.getMinutes()+"x"+date.getSeconds();
    
    PM.Image.load(im_pub_url);
  }
  
}

PM.Offers.Mode = {
  AJAX:   0,
  SCRIPT: 1
}

/**
 * Offers Parsers object
 *
 * @base PM.Offers
 */
PM.Offers.Parsers = {}


/**
 * Offers templates declaration
 *
 * @base PM.Offers
 */
PM.Offers.Templates = {}
PM.Offers.Util = {}

PM.Offers.Util.calculatePaginationRewrite = function(adsPerPage) {
  // We use FAST navigation position modulo adsPerPage
  var currentPage = 1;
  try {
     var loc = unescape(window.location.href);
  } catch (ex) {
    // Location.toString exception
    return 1;
  }
  var tokens = loc.split('/');
  
  for (var k = 0; k < tokens.length; ++k) {
    var token = tokens[k];
    if ('pos' == unescape(token) && null != tokens[k+1]) {
      currPage = parseInt(unescape(tokens[k+1]));
      currPage = Math.round(currPage  / adsPerPage + 1);
      if (null != currPage && currPage > 1)
        currentPage = currPage;
    }
  }
  return currentPage;
}

PM.Offers.Util.getPageType = function(isNavigation, isSearch) {
  if (isNavigation) {
    if (isSearch) {
      return "NavigationRecherche";
    }
    return "Navigation";
  } else if (isSearch) {
    return "RechercheGlobale";
  }
  return "FicheProduit";
}

PM.Offers.Util.getFamily = function(family) {
  var familyName = '';
  if (family && family != "") {
    familyName = PM.Offers.Util.getFamilyFormat(family, PM.Offers.Util.FamilyType.XITI);
  } else {
    familyName = 'Toutes';
  }
  
  return familyName;
}

PM.Offers.Util.FamilyType = {
  CHANNEL: 1,
  XITI: 2
}

PM.Offers.Util.getFamilyFormat = function(family, familyType) {
  var res = '';
  var isChannel = (familyType == PM.Offers.Util.FamilyType.CHANNEL);
  switch (family) {
    case 'books':
      res = (isChannel)? 'es_libros': 'Livres';
      break;
    case 'music':
      res = (isChannel)? 'es_musica': 'Musique';
      break;
    case 'games':
      res = (isChannel)? 'es_videojuegos': 'JeuxVideo';
      break;
    case 'video':
      res = (isChannel)? 'es_dvd': 'Video';
      break;
    case 'baby':
      res = (isChannel)? '': 'Enfant';
      break;  
    case 'hifi':
      res = (isChannel)? 'es_imagen': 'ImageSon';
      break;  
    case 'computer':
      res = (isChannel)? 'es_informatica': 'Informatique';
      break;  
    case 'sport':
      res = (isChannel)? '': 'Sport';
      break;  
    case 'white':
      res = (isChannel)? 'es_hogar': 'Maison';
      break;  
    case 'clothing':
      res = (isChannel)? '': 'Mode';
      break;  
    case 'electronics':
      res = (isChannel)? 'es_telefonos': 'TelephonesPDA';
      break;  
    case 'wine':
      res = (isChannel)? '': 'Vin';
      break;
    case 'vehicle':
      res = (isChannel)? '': 'Automobile';
      break;
  }
  return res;
}

var agressiveMktCodes = [];

PM.Offers.Util.getChannel = function(family, isNavigation, locationAlias) {

  var _channel;
  var _layout;
  if (family && family != "") {
    if (isNavigation || locationAlias) {
      if (family == 'vehicle' && (locationAlias == 'MARKET_PRICE_NAVIGATION' || locationAlias == 'POWER_NAVIGATION%%R-AUTO-MOTO')) {
        _layout = 'formulaire';
      } else {
        _layout = isNavigation ? 'navigation' : '';
      }
    }

    _channel = PM.Offers.Util.getFamilyFormat(family, PM.Offers.Util.FamilyType.CHANNEL);
  } else {
    _channel = 'es_globale';
  }
  var _TParameter = PM.Util.getInterrogationUrlParam('t|tracking');
  if (_TParameter) {
    // on recherche parmis les différents codes de tracking de agressiveMktCodes
    for (i = 0; i < agressiveMktCodes.length; i++) {
      if (_TParameter == agressiveMktCodes[i]) {
        _channel = 'agressive-marketing';
        break;
      }
    }
  }

  return (_layout ? _layout + ' ' : '') + _channel;
}

PM.Offers.Util.getCategoryId = function(family) {
  var _catid;
  if (family && family != "") {

    switch (family) {
      case 'books':
        _catid = 190;
        break;
      case 'music':
        _catid = 278;
        break;
      case 'games':
        _catid = 169;
        break;
      case 'video':
        _catid = 219;
        break;
      case 'hifi':
        _catid = 91;
        break;
      case 'computer':
        _catid = 71;
        break;
      case 'electronics':
        _catid = 4966;
        break;
      case 'white':
        _catid = 65;
        break;
      default:
        _catid = '';
    }
  } else {
    _catid = '';
  }

  return _catid;
}

PM.Offers.Util.familyArray = {
   "books": "Libros",
   "music": "Musica",
   "games": "Videojuegos",
   "video": "DVD",
   "hifi": "Mp3",
   "computer": "Informatica",
   "electronics": "Telefono movil",
   "white": "Hogar"
}
/**
 * Google AFC specific parser
 *
 * @base PM.Offers.Parsers
 */
PM.Offers.Parsers.google_afc = function(resObj) {
  var resOffers = new Array();
  
  for (i = 0; i < resObj.length; i++) {
    var offer = resObj[i];
    resOffers[resOffers.length] = [["url", offer.url], ["visible_url", offer.visible_url], ["line1", offer.line1], ["line2", offer.line2], ["line3", offer.line3]];
  }
  
  return resOffers;
}

/**
 * Google AFS specific parser
 *
 * @base PM.Offers.Parsers
 */
PM.Offers.Parsers.google_afs = function(xmlDoc) {
  var resOffers = new Array();
  
  var globalContent = xmlDoc.firstChild;
  while(globalContent.nodeType != 1) {
    globalContent = globalContent.nextSibling;
  }

  // we check if the result is fine
  if(globalContent.nodeName != "GSP") {
    return resOffers;
  }
  
  var offers = globalContent.getElementsByTagName("AD");
  for (i = 0; i < offers.length; i++) {
    var offer = offers[i];
    
    var offer_url = offer.getAttribute("url");
    var offer_visible_url = offer.getAttribute("visible_url");
    var offer_line1_tag = offer.getElementsByTagName("LINE1");
    var offer_line1 = offer_line1_tag[0].firstChild.nodeValue;
    var offer_line2_tag = offer.getElementsByTagName("LINE2");
    var offer_line2 = offer_line2_tag[0].firstChild.nodeValue;
    var offer_line3_tag = offer.getElementsByTagName("LINE3");
    var offer_line3 = offer_line3_tag[0].firstChild.nodeValue;
    
    resOffers[resOffers.length] = [["url", offer_url], ["visible_url", offer_visible_url], ["line1", offer_line1], ["line2", offer_line2], ["line3", offer_line3]];
  }
  
  return resOffers;
}

// google adsense for content callback function
google_ad_request_done = function(google_ads) {
  pm_offers_options.responseObject = google_ads;
	PM.Offers.display(pm_offers_options);
}

/**
 * Codigo Barras specific parser
 *
 * @base PM.Offers.Parsers
 */
PM.Offers.Parsers.codigo_barras = function(xmlDoc) {
  var resOffers = new Array();
  
  var globalContent = xmlDoc.firstChild;
  while(globalContent.nodeType != 1) {
    globalContent = globalContent.nextSibling;
  }
  
  // we check if the result is fine
  if(globalContent.nodeName != "RESULTADOSBUSQUEDA") {
    return resOffers;
  }
  
  var offers = globalContent.getElementsByTagName("PRODUCTO");
  
  for (i = 0; i < offers.length; i++) {
    var offer = offers[i];
    
    var offer_price_tags = offer.getElementsByTagName("PRECIO");
    var offer_price = offer_price_tags[0].firstChild.nodeValue;
    var offer_url_tags = offer.getElementsByTagName("LINK");
    var offer_url = offer_url_tags[0].firstChild.nodeValue;
    var offer_image_tags = offer.getElementsByTagName("IMAGEN");
    var offer_image_tag = offer_image_tags[0].firstChild.nodeValue;
    var scriptRegExp = 'src=\"([^\"]*)\"';
    var matchOne = new RegExp(scriptRegExp, 'i');
    var offer_image_array = offer_image_tag.match(matchOne);
    var offer_image = "";
    if (offer_image_array) {
      offer_image = offer_image_array[1];
    } else {
      offer_image = 'http://pan.priceminister.es/res/pic/1/www/www/29330/image_not_available.gif';
    }
      
    var offer_title_tags = offer.getElementsByTagName("TITULO");
    var offer_title = offer_title_tags[0].firstChild.nodeValue;
    var offer_brand_tags = offer.getElementsByTagName("MARCA");
    var offer_brand = offer_brand_tags[0].firstChild.nodeValue;
    var offer_model_tags = offer.getElementsByTagName("MODELO");
    var offer_model = offer_model_tags[0].firstChild.nodeValue;
    var offer_label = offer_title + " " + offer_brand + " " + offer_model;
    resOffers[resOffers.length] = [["url", offer_url], ["label", offer_label], ["price", offer_price], ["image", offer_image]];
  }
  
  return resOffers;
}
