if (!window.adecn) {
  var adecn = function() {
    var adecn = new Object();
    var adSpots = {};
    adecn.adSpots = adSpots;

    function zeropad(s, len) {
      var s = s.toString();
      while (s.length < len) s = '0' + s;
      return s;
    }

    function AdSpot() {
      var adspot = new Object();
      adspot.count = 0;
      adspot.interval = 0;

      adspot.rotateInterval = function(interval) {
        adspot.interval = interval;
        adspot.rotate();
      };
      adspot.rotate = function() {
        adspot.newAd();
        setTimeout(adspot.rotate, adspot.interval * 1000);
      };
      adspot.newAd = function(srcUrl) {
        if (!srcUrl) {
          srcUrl = adspot.generateUrl();
          adspot.count += 1;
        }
        if (adspot.container) adspot.container.src = srcUrl;
        if (adspot.window) adspot.window.location.href = srcUrl;
      };
      adspot.generateUrl = function() {
        var now = new Date();
        var url = 'http://temp2.adecn.com/here.spot?';
        url += 'v=' + adspot.version;
        url += '&time=' + now.getDay() + zeropad(now.getHours(), 2);
        if (adspot.keywords) url += '&kw=' + escape(adspot.keywords);
        url += '&spotId=' + adspot.id;
        url += '&c=' + adspot.index;
        if (adspot.count) {
          url += '-';
          if (adspot.count < 20) url += adspot.count;
          else url += '20%2B';
        }
        url += '&ms=' + now.valueOf();
        if (adspot.idid) url += '&idid=' + escape(adspot.idid);
        url += '&ref=' + escape(document.referrer);
        return url;
      };
      adspot.ok = function() {
        var cookie = getCookie('scone') || '';
        return cookie.indexOf('<p,' + adspot.id + ',0>') < 0;
      }
      adspot.writeAd = function() {
        if (!adspot.ok()) return;
        var frameName = 'EC' + adspot.id + '-' + adspot.index;
        var frame = '<iframe id="'+frameName+'" width="' + adspot.width + '" height="' + adspot.height + '"';
        frame += ' scrolling="no" frameborder="0" framespacing="0" marginheight="0"';
        frame += ' marginwidth="0" border="0" hspace="0" vspace="0"';
        frame += ' align="middle" src="' + adspot.generateUrl() + '">';
        frame += '</iframe>';
        document.write(frame);
        adspot.container = document.getElementById(frameName);
      }
      adspot.popAd = function(type) {
        if (!adspot.ok()) return;
        adspot.window = window.open(adspot.generateUrl(), '', adspot.popupfeatures);
        adspot.window.blur();
        window.focus();
      }
      return adspot;
    }

    function Tokenizer(cookie) {
      var tokenizer = new Object();
      tokenizer.pos = 0;
      tokenizer.next = function() {
        var s = null;
        var lastpos = tokenizer.pos;
        if (tokenizer.pos >= 0) {
          var level = 0;
          do {
            switch(tokenizer.str.charAt(tokenizer.pos)) {
            case '<': level++; break;
            case '>': level--; break;
            }
            tokenizer.pos++;
          } while (level > 0 && tokenizer.pos < tokenizer.str.length);
          if (level == 0) s = tokenizer.str.substring(lastpos, tokenizer.pos);
        }
        return s;
      };
      tokenizer.str = cookie;
      return tokenizer;
    }
    adecn.Tokenizer = Tokenizer;

    function setCookie(name, value, expires, path, domain, secure) {
      var curCookie = name + '=' + value;
      if (expires) curCookie += '; expires=' + new Date(expires).toGMTString();
      if (path) curCookie += '; path=' + path;
      if (domain) curCookie += '; domain=' + domain;
      if (secure) curCookie += '; secure';
      document.cookie = curCookie;
    }
    adecn.setCookie = setCookie;

    function getCookie(name) {
      var dc = document.cookie;
      var prefix = '; ' + name + '=';
      var begin = dc.indexOf(prefix);
      if (begin == -1) {
        prefix = prefix.substr(2);
        begin = dc.indexOf(prefix);
        if (begin != 0) return null;
      }
      begin += prefix.length;
      var end = document.cookie.indexOf(';', begin);
      if (end == -1) return dc.substr(begin);
      return dc.substring(begin, end);
    }
    adecn.getCookie = getCookie;

    function saveScone(cookie) {
      var date = new Date().valueOf() + 86400000;
      var d = window.location.href.match('://([^/]*@)?([^/:]*)')[2];
      if (d && d.indexOf('.') >= 0) {
        d = d.split('.');
        d = d[d.length-2] + '.' + d[d.length-1];
      }
      else d = null;
      setCookie('scone', cookie, date, '/', d);
    }

    function expireScones() {
      var cookie = getCookie('scone') || '';
      var s = '';
      var now = new Date().valueOf();
      var tokenizer = Tokenizer(cookie);
      var exp = tokenizer.next();
      var m;
      while (exp) {
        m = exp.match('^<e,([0-9]+)');
        if (m) {
          if (parseInt(m[1])*60000 > now) s += exp;
        }
        else s += exp;
        exp = tokenizer.next();
      };
      saveScone(s);
    }

    function getScone(key) {
      var scone = null;
      var cookie = getCookie('scone') || '';
      var tokenizer = Tokenizer(cookie);
      var s = tokenizer.next();
      var m = null;
      while (s) {
        m = s.match('<'+key+',([,0-9]+)>');
        if (m) {
          scone = new Object();
          scone.key = key;
          scone.value = m[1];
          if (scone.value) scone.value = scone.value.split(',');
          m = s.match('^<e,([0-9]+)');
          if (m) scone.exp = parseInt(m[1]) * 60000;
          else scone.exp = 0;
          break;
        }
        s = tokenizer.next();
      }
      return scone;
    };

    adecn.getAdSpot = function(key, index) {
      var adspots = adSpots[key];
      if (!adspots) {
        adspots = [];
        adSpots[key] = adspots;
      }
      if (index != undefined) return adspots[index];
      var adspot = AdSpot();
      adspot.id = key;
      adspot.index = adspots.length;
      adspots[adspots.length] = adspot;
      return adspot;
    };

    function setScone(scone) {
      deleteScone(scone.key);
      var v = '<'+scone.key+','+scone.value.toString()+'>';
      var cookie = getCookie('scone') || '';
      var s = '';
      var exp = parseInt(scone.exp / 60000);
      if (exp) {
        var prefix = '<e,'+exp+',';
        var start = cookie.indexOf(prefix);
        try {
          if (start >= 0) {
            var token = Tokenizer(cookie.substr(start)).next();
            if (token) {
              s += token.substring(0, prefix.length);
              s += v;
              s += token.substr(prefix.length);
              s += cookie.substring(0, start);
              s += cookie.substr(start + token.length);
            }
            else throw 'failed to group exp';
            cookie = cookie.substring(0, start+prefix.length)+s;
          }
          else throw 'expire not found';
        }
        catch (e) { s = prefix + v + '>' + cookie; }
      }
      else s = v + cookie;
      saveScone(s);
    };

    function deleteScone(key) {
      var found = '';
      var cookie = getCookie('scone') || '';
      var s = '';
      var token;
      var start = 0;
      var prefix = '<'+key;
      var pos = cookie.indexOf(prefix);
      while (pos >= 0 && pos < cookie.length) {
        s += cookie.substring(start, pos);
        token = Tokenizer(cookie.substr(pos)).next();
        if (token) {
          found += token;
          start += pos + token.length;
          pos = cookie.indexOf(prefix, start);
        }
        else break;
      }
      if (pos == -1) s += cookie.substr(start);
      if (s != cookie) saveScone(s);
      return found;
    };

    adecn.freqLimit = function(key, initValue, deltaHours) {
      key = key.replace(/ /g, ',');//v1.0
      expireScones();
      var scone = getScone(key);
      if (scone) {
        if (scone.value > 0) {
          scone.value--;
          setScone(scone);
        }
      }
      else {
        scone = new Object();
        scone.key = key;
        scone.value = initValue;
        scone.exp = new Date().valueOf() + deltaHours * 3600000;
        setScone(scone);
      }
    };

    return adecn;
  }();
}
