var style_element = document.createElement("link");
style_element.setAttribute("type", "text/css");
style_element.setAttribute("rel", "stylesheet");
style_element.setAttribute("href", "http://mark.reevoo.com/stylesheets/reevoomark.css");
document.getElementsByTagName("head")[0].appendChild(style_element);

(function(){

  var ReevooMark = {};
  ReevooMark.Util = {};

ReevooMark.Util.body = function(){return document.getElementsByTagName("body")[0];};
ReevooMark.Util.html = function(){return document.getElementsByTagName("html")[0];};

ReevooMark.Util.add_class_name = function(el, name){
  el.className += " "+name;
};

ReevooMark.Util.remove_class_name = function(el, name){
  el.className = el.className.replace(new RegExp("(^| )"+name+"( |$)"), "");
};


ReevooMark.Util.hide = function(element){
  element.style.display = "none";
};

ReevooMark.Util.show = function(element, block_or_inline){
  element.style.display = (block_or_inline || "block");
};

ReevooMark.Util.query_string = function(object) {
  var query_string = [];
  for(key in object) {
    var value = object[key];
    if(typeof(value) == "function") { continue; }

    if(typeof(value) != "object" || typeof(value.length) != "number") {
      value = [value];
    }

    for(var i = 0; i < value.length; i++) {
      query_string.push(escape(key) + "=" + escape(value[i]));
    }
  }
  return query_string.join("&");
};

ReevooMark.Util.load_script = function(url){
  var script = document.createElement("script");
  script.setAttribute("type", "text/javascript");
  script.setAttribute("src", url);
  this.body().appendChild(script);
};

ReevooMark.Util.extend = function(a,b,c){
  for(i in b){a[i] = b[i];}
  if(c){
    ReevooMark.Util.extend(a, c);
  }
  return a;
};

ReevooMark.Util.browser_dimensions = function() {
  return {
    width: (window.innerWidth || (window.document.documentElement.clientWidth || window.document.body.clientWidth)),
    height: (window.innerHeight || (window.document.documentElement.clientHeight || window.document.body.clientHeight))
  };
};

ReevooMark.Util.create_element = function(tag_name, attributes) {
  var el = document.createElement(tag_name);
  for(i in attributes) {
    if(i in Object.prototype) { continue; }
    if(i == "class") {
      el.className = attributes[i];
    }else{
      el.setAttribute(i, attributes[i]);
    }
  }
  return el;
};


ReevooMark.Util.get_elements_by_class = function(searchClass,node,tag){
  var classElements = new Array();
  if ( node == null )
    node = document;
  if ( tag == null )
    tag = '*';
  var els = node.getElementsByTagName(tag);
  var elsLen = els.length;
  var pattern = new RegExp("(^|\\s)"+searchClass+"(\\s|$)");
  for (i = 0, j = 0; i < elsLen; i++) {
    if ( pattern.test(els[i].className) ) {
      classElements[j] = els[i];
      j++;
    }
  }
  return classElements;
}

ReevooMark.Util.when_dom_ready = [];

ReevooMark.Util.ready = function(callback) {
  if(this.domIsReady) {
    callback();
  }else{
    this.when_dom_ready.push(callback);
  }
}

ReevooMark.Util.dom_now_ready = function(){
  if(this.domIsReady){return;}
  this.domIsReady = true;
  for(var i = 0; i < this.when_dom_ready.length; i++){
    this.when_dom_ready[i]();
  }
  this.when_dom_ready = [];
}



ReevooMark.Util.listen_for_dom_ready = function(){
  if ( this.hooked_up_dom_ready ){ return; }
  this.hooked_up_dom_ready = true;

  if ( document.addEventListener ) {
    document.addEventListener( "DOMContentLoaded", function(){
      document.removeEventListener( "DOMContentLoaded", arguments.callee, false );
      ReevooMark.Util.dom_now_ready();
    }, false );
  } else if ( document.attachEvent ) {
    document.attachEvent("onreadystatechange", function(){
      if ( document.readyState === "complete" ) {
        document.detachEvent( "onreadystatechange", arguments.callee );
        ReevooMark.Util.dom_now_ready();
      }
    });

    if ( document.documentElement.doScroll && window == window.top ) (function(){
      if ( this.domIsReady ) return;

      try {
        document.documentElement.doScroll("left");
      } catch( error ) {
        setTimeout( arguments.callee, 0 );
        return;
      }

      ReevooMark.Util.dom_now_ready();
    })();
  }

  var old_onload = window.onload;
  window.onload = function(e){
    ReevooMark.Util.dom_now_ready();
    if(typeof(old_onload) == "function"){old_onload(e);}
  }
}

ReevooMark.Util.listen_for_dom_ready();


  ReevooMark.Callbacks = {click_observers: [], load_observers: []};

ReevooMark.Callbacks.observe_click = function(callback){
  this.click_observers.push(callback);
}

ReevooMark.Callbacks.observe_load = function(callback){
  this.load_observers.push(callback);
}

ReevooMark.Callbacks.on_click = function(reevoomark){
  for(var i = 0; i < this.click_observers.length; i++) {
    try{
      this.click_observers[i](reevoomark);
    }catch(e){ };
  }
}

ReevooMark.Callbacks.on_load = function(reevoomark){
  for(var i = 0; i < this.load_observers.length; i++) {
    try{
      this.load_observers[i](reevoomark);
    }catch(e){ };
  }
}

  ReevooMark.Cookies = {};

ReevooMark.Cookies.set = function(name,value) {
  var date = new Date();
  date.setTime(date.getTime()+(30*24*60*60*1000));
  var expires = "; expires="+date.toGMTString();
  document.cookie = escape("reevoomark_" + name)+"="+escape(value)+expires+"; path=/";
}

ReevooMark.Cookies.get = function(name) {
  var nameEQ = escape("reevoomark_" + name) + "=";
  var ca = document.cookie.split(';');
  for(var i=0;i < ca.length;i++) {
    var c = ca[i];
    while (c.charAt(0)==' ') c = c.substring(1,c.length);
    if (c.indexOf(nameEQ) == 0) return unescape(c.substring(nameEQ.length,c.length));
  }
  return null;
}

  /* All methods defned here are considered public (retailers know about them) and should not be removed or have their functionality changed */

ReevooMark.init_badge = function(target_id, product_sku, options) {
  if(options == undefined){ options = {}; }

  if(options.immediate) {
    this.init_badge_from_identifiers(target_id, {sku: product_sku}, options);
  }
  else {
    ReevooMark.Util.ready(function() {
      ReevooMark.init_badge(target_id, product_sku, ReevooMark.Util.extend({}, options, {immediate: true}));
    });
  }
}

ReevooMark.init_badges = function(options) {
  if(options == undefined){ options = {}; }

  if(options.immediate) {
    var elements = ReevooMark.Util.get_elements_by_class("reevoomark", ReevooMark.Util.body(), "a");
    var matcher = /\/partner\/TSC\/(.*)$/i;
    for(var i = 0; i < elements.length; i++){
      var target_id = "reevoomark_badge_"+i;
      var el = elements[i];
      if(parts = matcher.exec(el.href)) {
        var product_sku = parts[1];
        var place_holder = ReevooMark.Util.create_element("div", {id: target_id});
        el.parentNode.insertBefore(place_holder, el);
        el.parentNode.removeChild(el);
        ReevooMark.init_badge(target_id, product_sku, options);
      }
    }
  }
  else {
    ReevooMark.Util.ready(function() {
      ReevooMark.init_badges(ReevooMark.Util.extend({}, options, {immediate: true}));
    });
  }
}

ReevooMark.show_popup = function(product_identifiers, options) {
  if(typeof(product_identifiers) != "object") {
    product_identifiers = {sku:product_identifiers};
  }

  var controller = new ReevooMark.BadgeController(null, product_identifiers, options);
  controller.display_popup();
}

ReevooMark.observe = function(action, callback){
  ReevooMark.Callbacks["observe_"+action](callback)
}

ReevooMark.track_purchase = function(skus) {
  ReevooMark.Util.ready(function() {
    ReevooMark.Tracking.track_with_cookies("http://mark.reevoo.com/reevoomark/track/purchase?locale=en_GB&amp;retailer_id=98" + "&" + ReevooMark.Util.query_string({"skus[]": skus}));
  });
}


  ReevooMark.Tracking = {};

ReevooMark.Tracking.update_viewed_products = function(value) {
  ReevooMark.Cookies.set('viewed_products', value);
}

ReevooMark.Tracking.track_with_cookies = function(url) {
  ReevooMark.Util.load_script(url + "&viewed_products=" + escape(ReevooMark.Cookies.get('viewed_products')));
}

ReevooMark.observe("click", function(rvm){
  ReevooMark.Tracking.track_with_cookies(rvm.product.click_through_tracking_url);
});

ReevooMark.observe("load", function(rvm) {
  ReevooMark.View.insert_tracking_image(rvm.product.tracking_url);
});

  ReevooMark.Retailer = function(options) {
  this.trkref = "TSC";
  this.badge_style = options.badge_style || "imagescoresonly_sharp230x60";
  this.force_popup = options.force_popup || false;
};


ReevooMark.Product = {};
ReevooMark.Product.load = function(product_identifiers, retailer, callback) {
  var callback_name = ("callback_"+retailer.trkref+"_"+"http://mark.reevoo.com/reevoomark/product_summaries.js?locale=en_GB?" + ReevooMark.Util.query_string(product_identifiers)).replace(/[^a-z0-9_]/ig, "_");
  ReevooMark[callback_name] = callback;

  var parameters = {retailer: retailer.trkref, badge_style: retailer.badge_style, callback: "ReevooMark."+callback_name};
  for(i in product_identifiers) {
    if(typeof(product_identifiers[i]) == "function") { continue; }
    parameters[i] = product_identifiers[i];
  }
  ReevooMark.Util.load_script("http://mark.reevoo.com/reevoomark/product_summaries.js?locale=en_GB&"+ReevooMark.Util.query_string(parameters));
};

  ReevooMark.View = {};

ReevooMark.View.render_badge = function(controller, values) {
  var img = ReevooMark.Util.create_element("img", {
    src: "http://mark.reevoo.com/reevoomark/badges/en_GB/" + values.retailer.badge_style + "/" + values.product.average_score + ".png",
    alt: values.product.badge_title
  });
  img.style.border = "0";

  var link = ReevooMark.Util.create_element("a", {
    "class": "reevoomark_badge",
    href: controller.popup_url(),
    title: values.product.badge_title
  });

  link.appendChild(img);
  link.onclick = function() {
    controller.display_popup();
    return false;
  };

  controller.target.appendChild(link);
};

ReevooMark.View.render_popup = function(controller) {
  if(this.popup_iframe) {
    return this.popup_iframe;
  }

  var close_button = ReevooMark.Util.create_element('a', {"class": "reevoomark_close_button", title: "Close this review window"});
  close_button.appendChild(document.createTextNode("Close this review window"));
  close_button.onclick = function(){ controller.hide_popup(); return false; };

  var container = ReevooMark.Util.create_element('div', {"class": "reevoomark_container"});
  
  this.popup_iframe = ReevooMark.Util.create_element('iframe', {src: 'about:blank', frameborder: '0'})
  container.appendChild(this.popup_iframe);

  this.popup_frame = ReevooMark.Util.create_element("div", {id:"reevoomark_popup_frame", "class":"en_GB"});
  this.popup_frame.appendChild(close_button);
  this.popup_frame.appendChild(container);
  ReevooMark.Util.hide(this.popup_frame);

  this.popup_backdrop = ReevooMark.Util.create_element('div', {id:"reevoomark_popup_backdrop"});
  ReevooMark.Util.hide(this.popup_backdrop);
  this.popup_backdrop.onclick = function(){ controller.hide_popup(); return false; };

  var body = ReevooMark.Util.body();

  body.appendChild(this.popup_backdrop);
  body.appendChild(this.popup_frame);

  return this.popup_iframe;
};

ReevooMark.View.show_popup_frame = function() {
  var IE = navigator.userAgent.match(/MSIE [678]/i) ? true : false;
  if(IE){
    ReevooMark.Util.add_class_name(ReevooMark.Util.html(), "reevoomark_ie");
    this.popup_backdrop.style.opacity = 0.8;
    window.scrollTo(0, 0);
  }
  ReevooMark.Util.show(this.popup_frame);
  ReevooMark.Util.show(this.popup_backdrop);
};

ReevooMark.View.hide_popup_frame = function() {
  ReevooMark.Util.remove_class_name(ReevooMark.Util.html(), "reevoomark_ie");
  ReevooMark.Util.hide(this.popup_frame);
  ReevooMark.Util.hide(this.popup_backdrop);
  this.popup_iframe.setAttribute("src", "about:blank");
};

ReevooMark.View.insert_tracking_image = function(url) {
  var img = ReevooMark.Util.create_element("img", {src: url});
  img.style.position = "absolute";
  img.style.left = "-100px";
  ReevooMark.Util.body().appendChild(img);
};

  ReevooMark.minimum_window_dimensions_for_lightbox = {"width":798, "height":500};

ReevooMark.BadgeController = function(target_id, product_identifiers, retailer_options) {
  if(retailer_options == undefined){ retailer_options = {}; }

  this.target = document.getElementById(target_id);
  this.retailer = new ReevooMark.Retailer(retailer_options);
  this.product_identifiers = product_identifiers;
};

ReevooMark.BadgeController.prototype.display_badge = function() {
  if(!this.product) {
    var me = this;
    ReevooMark.Product.load(this.product_identifiers, this.retailer, function(loaded_product) {
      me.product = loaded_product;
      me.display_badge();
    });
    return;
  }

  ReevooMark.Callbacks.on_load(this);

  if(this.has_reviews()) {
    ReevooMark.View.render_badge(this, {product:this.product, retailer:this.retailer});
  }
};

ReevooMark.BadgeController.prototype.popup_url = function(){
  return "http://mark.reevoo.com/reevoomark/en_GB/product?" + ReevooMark.Util.query_string(ReevooMark.Util.extend({}, this.product_identifiers, {retailer: this.retailer.trkref, badge_style: this.retailer.badge_style}));
}

ReevooMark.BadgeController.prototype.display_popup = function() {
  ReevooMark.Callbacks.on_click(this);

  var url = this.popup_url();

  if(this.isMobileBrowser()){
    window.location = url;
  }else if(this.retailer.force_popup || !this._window_is_large_enough_for_lightbox()){
    window.open(url, "_reevoomark", "width="+ReevooMark.minimum_window_dimensions_for_lightbox["width"]+",height="+ReevooMark.minimum_window_dimensions_for_lightbox["height"]);
  } else {
    var popup_iframe = ReevooMark.View.render_popup(this);
    popup_iframe.setAttribute("src", url);
    ReevooMark.View.show_popup_frame();
  }
};

ReevooMark.BadgeController.prototype.isMobileBrowser = function() {
  return navigator.userAgent.match(/iPhone/i) || navigator.userAgent.match(/iPod/i)
};

ReevooMark.BadgeController.prototype.hide_popup = function() {
  ReevooMark.View.hide_popup_frame();
};

ReevooMark.BadgeController.prototype._window_is_large_enough_for_lightbox = function() {
  var dimentions = ReevooMark.Util.browser_dimensions();
  return (dimentions.height >= ReevooMark.minimum_window_dimensions_for_lightbox["height"] && dimentions.width >= ReevooMark.minimum_window_dimensions_for_lightbox["width"]);
}

// API Method (gets passed into callbacks)
ReevooMark.BadgeController.prototype.review_count = function(){
  return this.product.review_count;
}

// API Method (gets passed into callbacks)
ReevooMark.BadgeController.prototype.scores_count = function(){
  return this.product.scores_count;
}

// API Method (gets passed into callbacks)
ReevooMark.BadgeController.prototype.has_reviews = function(){
  return this.review_count() > 0 || this.scores_count() > 0;
}

// API Method (gets passed into callbacks)
ReevooMark.BadgeController.prototype.sku = function(){
  return this.product.sku;
}


  ReevooMark.init_badge_from_identifiers = function(target_id, product_identifiers, options) {
    var controller = new ReevooMark.BadgeController(target_id, product_identifiers, options);
    controller.display_badge();
  };

  window.ReevooMark = ReevooMark;
})();

