Tagging = function(context) {
  this.site = 'iltasanomat-fi_responsive';
  this.zone = 'default';
  this.source_consent_cookie = '';
  this.source_default_tracking = true;
  this.protocol = window.location.protocol;
  this.autodetect_url = this.protocol + '//cts.sanoma.fi/service/detect/';
  this.context = context;
  this.positions = {};
  this.positions_weighted = {};

  this.positions['banner01'] = '[]';
  this.positions_weighted['banner01'] = false;
  
  this.positions['bottom'] = '[]';
  this.positions_weighted['bottom'] = false;
  
  this.positions['button01'] = '[]';
  this.positions_weighted['button01'] = false;
  
  this.positions['button02'] = '[]';
  this.positions_weighted['button02'] = false;
  
  this.positions['button03'] = '[]';
  this.positions_weighted['button03'] = false;
  
  this.positions['button04'] = '[]';
  this.positions_weighted['button04'] = false;
  
  this.positions['button05'] = '[]';
  this.positions_weighted['button05'] = false;
  
  this.positions['button06'] = '[]';
  this.positions_weighted['button06'] = false;
  
  this.positions['footer'] = '[]';
  this.positions_weighted['footer'] = false;
  
  this.positions['head'] = '[{\"service_name\": \"Smart JS\", \"source_non_tracking\": \"\", \"weight\": null, \"service_kind\": \"\", \"source_tracking\": \"<script type=\\"text/javascript\\">(function(){    var surl = \\"//sn.sanoma.fi/js/smart2.js\\";    var profile_src = (\\"https:\\" == location.protocol ? \\"https:\\" : \\"http:\\") + surl;    document.write(\'<scr\'+\'ipt type=\\"text/javascript\\" src=\\"\'+profile_src+\'\\"></scr\'+\'ipt>\');})();</script>\"}, {\"service_name\": \"AdTech\", \"source_non_tracking\": \"\", \"weight\": null, \"service_kind\": \"\", \"source_tracking\": \"<script type=\\"text/javascript\\" src=\\"//sn.sanoma.fi/js/safeframe/dac/1.1.1f/js/host.min.js\\"></script>\"}]';
  this.positions_weighted['head'] = false;
  
  this.positions['middle01'] = '[]';
  this.positions_weighted['middle01'] = false;
  
  this.positions['middle02'] = '[]';
  this.positions_weighted['middle02'] = false;
  
  this.positions['middle03'] = '[]';
  this.positions_weighted['middle03'] = false;
  
  this.positions['middlebanner01'] = '[]';
  this.positions_weighted['middlebanner01'] = false;
  
  this.positions['middlebanner02'] = '[]';
  this.positions_weighted['middlebanner02'] = false;
  
  this.positions['rectangle1-1'] = '[]';
  this.positions_weighted['rectangle1-1'] = false;
  
  this.positions['rectangle1-2'] = '[]';
  this.positions_weighted['rectangle1-2'] = false;
  
  this.positions['rectangle1-3'] = '[]';
  this.positions_weighted['rectangle1-3'] = false;
  
  this.positions['rectangle1-4'] = '[]';
  this.positions_weighted['rectangle1-4'] = false;
  
  this.positions['rectangle1-5'] = '[]';
  this.positions_weighted['rectangle1-5'] = false;
  
  this.positions['rectangle1-6'] = '[]';
  this.positions_weighted['rectangle1-6'] = false;
  
  this.positions['rectangle1-7'] = '[]';
  this.positions_weighted['rectangle1-7'] = false;
  
  this.positions['rectangle1-8'] = '[]';
  this.positions_weighted['rectangle1-8'] = false;
  
  this.positions['rectangle2-1'] = '[]';
  this.positions_weighted['rectangle2-1'] = false;
  
  this.positions['rectangle2-2'] = '[]';
  this.positions_weighted['rectangle2-2'] = false;
  
  this.positions['rectangle2-3'] = '[]';
  this.positions_weighted['rectangle2-3'] = false;
  
  this.positions['rectangle2-4'] = '[]';
  this.positions_weighted['rectangle2-4'] = false;
  
  this.positions['side01'] = '[]';
  this.positions_weighted['side01'] = false;
  
  this.positions['side02'] = '[]';
  this.positions_weighted['side02'] = false;
  
  this.positions['side03'] = '[]';
  this.positions_weighted['side03'] = false;
  
  this.positions['top'] = '[]';
  this.positions_weighted['top'] = false;
  
  this.positions['top_mobi'] = '[]';
  this.positions_weighted['top_mobi'] = false;
}

Tagging.prototype._has_optin = function(category) {
  var categories, i, tagging = this;
  categories = get_categories(this.source_consent_cookie);
  for (i = 0; i < categories.length; i++) {
    if (categories[i] == category) {
      return true;
    }
  }
  return false;

  function get_categories(name) {
    var split = tagging._get_cookie(name).split(":");
    if (split && typeof split[3] != "undefined") {
      return split[3].split(",");
    } else {
      return [];
    }
  }
}

Tagging.prototype._get_cookie = function(name) {
  if (document.cookie && document.cookie != "") {
    var cookies = document.cookie.split(";");
    for (var i = 0; i < cookies.length; i++) {
      var cookie = trim(cookies[i]);
      if (cookie.substring(0, name.length + 1) == (name + "=")) {
        return decodeURIComponent(cookie.substring(name.length + 1));
      }
    }
  }
  return "";

  function trim(string) {
    return string.replace(/^\s\s*/, "").replace(/\s\s*$/, "");
  }
}

Tagging.prototype._get_tag_source = function(tag) {
  if (this._get_cookie(this.source_consent_cookie)) {
    if (this._has_optin(tag.service_kind)) {
      return tag.source_tracking;
    } else {
      return tag.source_non_tracking;
    }
  } else {
    if (this.source_default_tracking) {
      return tag.source_tracking;
    } else {
      return tag.source_non_tracking;
    }
  }
}

Tagging.prototype.get_json = function(text) {
  return !(/[^,:{}\[\]0-9.\-+Eaeflnr-u \n\r\t]/.test(text.replace(/"(\\.|[^"\\])*"/g, '')))
         && eval('(' + text + ')');
}

Tagging.prototype.random_tag = function(position) {
  var tags = [];
  var weighted_tags = [];

  for (index in position) {
    tag = position[index];
    tags[index] = this._get_tag_source(tag);

    for (var i = 0; i < tag.weight; i++) {
      weighted_tags.push(index);
    }
  }

  // Pick a random tag from array based on weight
  var random_index = weighted_tags[Math.floor((Math.random() * weighted_tags.length))];
  return tags[random_index];
}

Tagging.prototype.all_tags = function(position) {
  var tags = [], index, tag;
  for (index in position) {
    tag = position[index];
    tags[index] = this._get_tag_source(tag);
  }
  return tags.join("\n");
}

Tagging.prototype.render = function(slug, context) {
    document.write(this.get_source(slug, context));
}

Tagging.prototype.get_source = function(slug, context) {
  if (typeof this.positions[slug] == 'undefined') {
    // This position doesn't exist, call the autodetect
    this._detect(slug);
  } else {
    var position = this.get_json(this.positions[slug]);
    var tag_source = "";

    if (this.positions_weighted[slug]) {
      tag_source = this.random_tag(position)
    } else {
      tag_source = this.all_tags(position);
    }

    // Replace variables
    var variables = {};
    for (variable in this.context) {
      variables[variable] = this.context[variable];
    }
    for (variable in context) {
      variables[variable] = context[variable];
    }
    tag_source = this._replace_variables(tag_source, variables);

    // Remove unset variables and return result
    return tag_source.replace(/\$\w+/g, "").replace(/\${\w+}/g, "");
  }
  return '';
}

Tagging.prototype.log = function(err) {
  //this._load(error_endpoint);
}

Tagging.prototype._load = function(url) {
  var head = document.getElementsByTagName('head')[0] || document.documentElement,
      script = document.createElement('script');

  script.type = 'text/javascript';
  script.src = url;
  head.appendChild(script);
}

Tagging.prototype._detect = function(position) {
  this._load(this.autodetect_url + this.site +'/'+ this.zone +'/' + position + '/');
}

Tagging.prototype._replace_variables = function(content, variables) {
  var RE_VALID_IDENT = /^[a-zA-Z_]\w*$/;
  for (variable in variables) {
    if (RE_VALID_IDENT.test(variable)) {
      var regexes = [new RegExp('\\$' + variable, 'g'), new RegExp('\\${' + variable + '}', 'g')];

      for (re in regexes) {
        content = content.replace(regexes[re], variables[variable]);
      }
    } else {
      throw "'" + variable + "' is not a valid identifier.";
    }
  }
  return content;
}



