var AD2 = {}; (function(a) {
  var slice = Array.slice || (function() {
    var _slice = Array.prototype.slice;
    return function(arr) {
      return _slice.apply(arr, _slice.call(arguments, 1))
    }
  })(),
  getType = function(v) {
    var s = typeof v;
    if (s === 'object') {
      if (v) {
        if (typeof v.length === 'number') {
          s = 'array'
        }
      } else {
        s = 'null'
      }
    }
    return s
  },
  contains = function(superset, subset) {
    return ! find(subset,
    function(v, k, _break) {
      if (superset[k] !== v) {
        return _break
      }
    })
  },
  equals = function(a, b) {
    return contains(a, b) && contains(b, a)
  },
  isEmpty = function(o) {
    var empty = true;
    each(o,
    function(v, k, _break) {
      empty = false;
      return _break
    });
    return empty
  },
  each = (function() {
    var _break = {},
    arr_fn = function(numerable, fn, bind) {
      for (var i = 0,
      len = numerable.length; i < len; i++) {
        if (fn.call(bind, numerable[i], i, _break) == _break) {
          return i
        }
      }
      return - 1
    },
    iterator_type = {
      'string': function(numerable, fn, bind) {
        return arr_fn(numerable.split(''), fn, bind)
      },
      'array': arr_fn,
      'number': function(numerable, fn, bind) {
        for (var i = 0; i < numerable; i++) {
          fn.call(bind, i, i)
        }
      },
      'object': function(numerable, fn, bind) {
        for (var i in numerable) {
          if (numerable.hasOwnProperty(i)) {
            if (fn.call(bind, numerable[i], i, _break) == _break) {
              return i
            }
          }
        }
        return - 1
      }
    },
    getIterator = function(o) {
      return iterator_type[getType(o)]
    };
    return function(numerable, fn, bind) {
      return getIterator(numerable)(numerable, fn, bind || numerable)
    }
  })(),
  find = function(numerable, fn, bind) {
    var index = each(numerable,
    function(v, k, _break) {
      if (fn.apply(bind, arguments) === true) {
        return _break
      }
    });
    return index == -1 ? null: numerable[index]
  },
  filter = function(numerable, fn, bind) {
    var valids = [];
    each(numerable,
    function(v) {
      if (fn.apply(bind, arguments) === true) {
        valids.push(v)
      }
    });
    return valids
  },
  map = function(numerable, fn, bind, is_dictionary) {
    var results;
    if (is_dictionary) {
      results = {};
      each(numerable,
      function(v, k) {
        results[k] = fn.apply(bind, arguments)
      })
    } else {
      results = [];
      each(numerable,
      function() {
        results.push(fn.apply(bind, arguments))
      })
    }
    return results
  },
  invoke = function(numerable, method_name, arg1, arg2, argN) {
    var args = slice(arguments, 2);
    each(numerable,
    function(v, k) {
      v[method_name].apply(v, args)
    })
  },
  unlink = function(object) {
    if (object == null) {
      return object
    }
    if (typeof object.length == 'number' && typeof object != 'string') {
      return map(object, unlink)
    } else if (typeof object == 'object') {
      return map(object, unlink, null, true)
    }
    return object
  },
  mixdeep = function(r) {
    if (!r) {
      r = {}
    }
    for (var i = 1; i < arguments.length; i++) {
      var s = arguments[i];
      if (s) {
        for (var j in s) {
          if (r[j] && typeof r[j] == 'object' && typeof s[j] == 'object') {
            mix(r[j], s[j])
          } else {
            r[j] = unlink(s[j])
          }
        }
      }
    }
    return r
  },
  mix = function(r) {
    if (!r) {
      r = {}
    }
    for (var i = 1; i < arguments.length; i++) {
      var s = arguments[i];
      if (s) {
        for (var j in s) {
          r[j] = s[j]
        }
      }
    }
    return r
  },
  mixif = function(r) {
    if (!r) {
      r = {}
    }
    for (var i = 1; i < arguments.length; i++) {
      var s = arguments[i];
      if (s) {
        for (var j in s) {
          if (r[j] === undefined) {
            r[j] = s[j]
          }
        }
      }
    }
    return r
  },
  generateId = (function() {
    var id = 1;
    return function() {
      return 'auto_gen_' + id++
    }
  })(),
  Class = {
    proto: (function() {
      var fn = function(instance, method) {
        return this.prototype[method].apply(instance, slice(arguments, 2))
      };
      return function(ctor) {
        ctor.proto = fn
      }
    })(),
    create: function(proto, sp) {
      var ctor = function() {
        if (this.init) {
          this.init.apply(this, arguments)
        }
      };
      if (sp) {
        var F = function() {};
        F.prototype = sp.prototype;
        ctor.prototype = new F()
      }
      var protos = slice(arguments, 2);
      protos.unshift(ctor.prototype, proto);
      mix.apply(window, protos);
      return ctor
    }
  },
  getObjectToStringFn = function(assign_token, pair_separator, need_last, need_encode) {
    var encode = need_encode ? encodeURIComponent: function(k) {
      return k
    };
    return function(o) {
      return map(o,
      function(v, k) {
        if (k != null) {
          return k + assign_token + encode(v)
        }
      }).join(pair_separator) + (need_last ? pair_separator: '')
    }
  };
  mix(a, {
    generateId: generateId,
    slice: slice,
    getType: getType,
    equals: equals,
    isEmpty: isEmpty,
    each: each,
    map: map,
    find: find,
    filter: filter,
    mix: mix,
    mixdeep: mixdeep,
    mixif: mixif,
    buffer: function(runner, delay) {
      var timer;
      return function() {
        if (timer) {
          clearTimeout(timer)
        }
        var args = arguments;
        timer = setTimeout(function() {
          runner.apply(window, args)
        },
        delay || 100)
      }
    },
    Class: Class,
    format: function(s, config, reserve) {
      return s.replace(/\{([^}]*)\}/g, (typeof config == 'object') ?
      function(m, i) {
        var ret = config[i];
        return ret == null && reserve ? m: ret
      }: config)
    },
    getObjectToStringFn: getObjectToStringFn,
    serializeStyles: getObjectToStringFn(':', ';', true, false),
    serializeAttrs: getObjectToStringFn('=', ' ', true, false),
    serializeQuery: getObjectToStringFn('=', '&', false, true)
  })
})(AD2); (function(a) {
  var el_template = '<{tag} {attrs}style="{styles}">{inner}</{tag}>',
  each = a.each,
  propertyCache = {},
  patterns = {
    HYPHEN: /(-[a-z])/i,
    ROOT_TAG: /^body|html$/i
  },
  ua = (function() {
    var o = {
      ie: 0,
      opera: 0,
      gecko: 0,
      webkit: 0,
      mobile: null
    };
    var ua = navigator.userAgent,
    m;
    if ((/KHTML/).test(ua)) {
      o.webkit = 1
    }
    m = ua.match(/AppleWebKit\/([^\s]*)/);
    if (m && m[1]) {
      o.webkit = parseFloat(m[1]);
      if (/ Mobile\//.test(ua)) {
        o.mobile = "Apple"
      } else {
        m = ua.match(/NokiaN[^\/]*/);
        if (m) {
          o.mobile = m[0]
        }
      }
    }
    if (!o.webkit) {
      m = ua.match(/Opera[\s\/]([^\s]*)/);
      if (m && m[1]) {
        o.opera = parseFloat(m[1]);
        m = ua.match(/Opera Mini[^;]*/);
        if (m) {
          o.mobile = m[0]
        }
      } else {
        m = ua.match(/MSIE\s([^;]*)/);
        if (m && m[1]) {
          o.ie = parseFloat(m[1])
        } else {
          m = ua.match(/Gecko\/([^\s]*)/);
          if (m) {
            o.gecko = 1;
            m = ua.match(/rv:([^\s\)]*)/);
            if (m && m[1]) {
              o.gecko = parseFloat(m[1])
            }
          }
        }
      }
    }
    return o
  })();
  var walk = function(el, side) {
    for (var nel = el; nel; nel = nel[side]) {
      if (nel.nodeType == 1) {
        return nel
      }
    }
  },
  buildHTML = function(styles, attrs, tag, inner) {
    return a.format(el_template, {
      tag: tag || 'div',
      attrs: a.serializeAttrs(attrs || {}),
      styles: a.serializeStyles(styles),
      inner: inner || ''
    })
  },
  toCamel = function(property) {
    if (!patterns.HYPHEN.test(property)) {
      return property
    }
    if (propertyCache[property]) {
      return propertyCache[property]
    }
    var converted = property;
    while (patterns.HYPHEN.exec(converted)) {
      converted = converted.replace(RegExp.$1, RegExp.$1.substr(1).toUpperCase())
    }
    propertyCache[property] = converted;
    return converted
  },
  getStyle = (function() {
    if (document.defaultView && document.defaultView.getComputedStyle) {
      return function(el, property) {
        var value = null;
        if (property == 'float') {
          property = 'cssFloat'
        }
        var computed = document.defaultView.getComputedStyle(el, '');
        if (computed) {
          value = computed[toCamel(property)]
        }
        return el.style[property] || value
      }
    } else if (document.documentElement.currentStyle && ua.ie) {
      return function(el, property) {
        switch (toCamel(property)) {
        case 'opacity':
          var val = 100;
          try {
            val = el.filters['DXImageTransform.Microsoft.Alpha'].opacity
          } catch(e) {
            try {
              val = el.filters('alpha').opacity
            } catch(e) {}
          }
          return val / 100;
        case 'float':
          property = 'styleFloat';
        default:
          var value = el.currentStyle ? el.currentStyle[property] : null;
          return (el.style[property] || value)
        }
      }
    } else {
      return function(el, property) {
        return el.style[property]
      }
    }
  })(),
  setStyle = (function() {
    var px = /left|top|right|bottom|width|height/;
    var transVal = function(k, v) {
      if (px.test(k) && typeof v == 'number') {
        v = v + 'px'
      }
      return v
    };
    if (ua.ie) {
      return function(el, property, val) {
        property = toCamel(property);
        switch (property) {
        case 'opacity':
          el.style.filter = 'alpha(opacity=' + val * 100 + ')';
          if (!el.currentStyle || !el.currentStyle.hasLayout) {
            el.style.zoom = 1
          }
          break;
        case 'float':
          property = 'styleFloat';
        default:
          el.style[property] = transVal(property, val)
        }
      }
    } else {
      return function(el, property, val) {
        property = toCamel(property);
        if (property == 'float') {
          property = 'cssFloat'
        }
        el.style[property] = transVal(property, val)
      }
    }
  })(),
  getDocumentScrollLeft = function(doc) {
    doc = doc || document;
    return Math.max(doc.documentElement.scrollLeft, doc.body.scrollLeft)
  },
  getDocumentScrollTop = function(doc) {
    doc = doc || document;
    return Math.max(doc.documentElement.scrollTop, doc.body.scrollTop)
  },
  getDocumentHeight = function() {
    var scrollHeight = (document.compatMode != 'CSS1Compat') ? document.body.scrollHeight: document.documentElement.scrollHeight;
    var h = Math.max(scrollHeight, getViewportHeight());
    return h
  },
  getDocumentWidth = function() {
    var scrollWidth = (document.compatMode != 'CSS1Compat') ? document.body.scrollWidth: document.documentElement.scrollWidth;
    var w = Math.max(scrollWidth, getViewportWidth());
    return w
  },
  getViewportHeight = function() {
    var height = self.innerHeight;
    var mode = document.compatMode;
    if ((mode || ua.ie) && !ua.opera) {
      height = (mode == 'CSS1Compat') ? document.documentElement.clientHeight: document.body.clientHeight
    }
    return height
  },
  getViewportWidth = function() {
    var width = self.innerWidth;
    var mode = document.compatMode;
    if (mode || ua.ie) {
      width = (mode == 'CSS1Compat') ? document.documentElement.clientWidth: document.body.clientWidth
    }
    return width
  },
  getXY = function(el) {
    var pos = [el.offsetLeft, el.offsetTop];
    var parentNode = el.offsetParent;
    var accountForBody = (ua.webkit && getStyle(el, 'position') == 'absolute' && el.offsetParent == el.ownerDocument.body);
    if (parentNode != el) {
      while (parentNode) {
        pos[0] += parentNode.offsetLeft;
        pos[1] += parentNode.offsetTop;
        if (!accountForBody && ua.webkit && getStyle(parentNode, 'position') == 'absolute') {
          accountForBody = true
        }
        parentNode = parentNode.offsetParent
      }
    }
    if (accountForBody) {
      pos[0] -= el.ownerDocument.body.offsetLeft;
      pos[1] -= el.ownerDocument.body.offsetTop
    }
    parentNode = el.parentNode;
    while (parentNode.tagName && !patterns.ROOT_TAG.test(parentNode.tagName)) {
      if (getStyle(parentNode, 'display').search(/^inline|table-row.*$/i)) {
        pos[0] -= parentNode.scrollLeft;
        pos[1] -= parentNode.scrollTop
      }
      parentNode = parentNode.parentNode
    }
    return pos
  },
  $ = function(id) {
    if (typeof id == 'string') {
      return document.getElementById(id)
    }
    return id
  };
  a.DomUtil = {
    ua: ua,
    get: $,
    buildHTML: buildHTML,
    createElement: function(html) {
      if (typeof html != 'string') {
        html = buildHTML.apply(window, arguments)
      }
      var el = document.createElement('div');
      el.innerHTML = html;
      return el.firstChild
    },
    next: function(el) {
      return walk(el, 'nextSibling')
    },
    pre: function(el) {
      return walk(el, 'previousSibling')
    },
    children: function(el) {
      var results = [];
      for (var cel = el.firstChild; cel; cel = cel.nextSibling) {
        if (cel.nodeType == 1) {
          results.push(cel)
        }
      }
      return results
    },
    setStyle: function(el, k, v) {
      el = $(el);
      if (typeof k == 'object') {
        each(k,
        function(_v, _k) {
          setStyle(el, _k, _v)
        })
      } else {
        setStyle(el, k, v)
      }
    },
    getStyle: function(el, k) {
      return getStyle($(el), k)
    },
    getXY: function(el) {
      return getXY($(el))
    },
    hide: function(el) {
      setStyle(el, 'display', 'none')
    },
    show: function(el) {
      setStyle(el, 'display', '')
    },
    getDocumentHeight: getDocumentHeight,
    getDocumentWidth: getDocumentWidth,
    getViewportHeight: getViewportHeight,
    getViewportWidth: getViewportWidth,
    getDocumentScrollTop: getDocumentScrollTop,
    getDocumentScrollLeft: getDocumentScrollLeft,
    absolutize: function(el, zIndex, insert_to_body) {
      el.className = 'absolute';
      a.DomUtil.setStyle(el, {
        position: 'absolute',
        left: '-999px',
        top: '-9999px',
        zIndex: zIndex
      });
      if (insert_to_body) {
        document.body.insertBefore(el, document.body.firstChild)
      }
    },
    align: function(anchor, brick, type) {
      anchor = $(anchor);
      brick = $(brick);
      var sizes = {},
      types = type.split('-'),
      anchorXY = getXY(anchor),
      x = anchorXY[0],
      y = anchorXY[1];
      each({
        anchor: anchor,
        brick: brick
      },
      function(el, name) {
        var o = sizes[name] = {};
        each(['Width', 'Height'],
        function(side) {
          o[side.toLowerCase()] = el['offset' + side]
        })
      });
      each(types[0].split(''),
      function(al) {
        switch (al) {
        case 'r':
          x += sizes.anchor.width;
          break;
        case 'b':
          y += sizes.anchor.height;
          break;
        default:
          break
        }
      });
      each(types[1].split(''),
      function(al) {
        switch (al) {
        case 'r':
          x -= sizes.brick.width;
          break;
        case 'b':
          y -= sizes.brick.height;
          break;
        default:
          break
        }
      });
      brick.style.left = x + 'px';
      brick.style.top = y + 'px'
    }
  }
})(AD2); (function(a) {
  var $ = a.DomUtil.get,
  evt = a.DomEventUtil = {};
  if (document.addEventListener) {
    evt.on = function(el, type, handler) {
      $(el).addEventListener(type, handler, false);
      return handler
    };
    evt.un = function(el, type, handler) {
      $(el).removeEventListener(type, handler, false)
    };
    evt.stopPropagation = function(e) {
      e.stopPropagation()
    };
    evt.preventDefault = function(e) {
      e.preventDefault()
    };
    evt.getTarget = function(e) {
      return e.target
    }
  } else {
    evt.on = function(el, type, handler) {
      el = $(el);
      var actualHandler = function() {
        handler.call(el, window.event)
      };
      el.attachEvent('on' + type, actualHandler);
      return actualHandler
    };
    evt.un = function(el, type, actualHandler) {
      $(el).detachEvent('on' + type, actualHandler)
    };
    evt.stopPropagation = function(e) {
      e.cancelBubble = true
    };
    evt.preventDefault = function(e) {
      e.returnValue = false
    };
    evt.getTarget = function(e) {
      return e.srcElement
    }
  }
  evt.stop = function(e) {
    evt.stopPropagation(e);
    evt.preventDefault(e)
  }
})(AD2); (function(a) {
  a.Cookie = {
    set: function(key, value, options) {
      var text = key + '=' + value;
      if (options) {
        if (options.expires) {
          text += "; expires=" + (new Date((new Date()).getTime() + 86400000 * options.expires)).toGMTString()
        }
        if (options.path) {
          text += "; path=" + options.path
        }
        if (options.domain) {
          text += "; domain=" + options.domain
        }
        if (options.secure === true) {
          text += "; secure"
        }
      }
      document.cookie = text
    },
    get: function() {
      var text = document.cookie;
      var cookies = {};
      if (/[^=]+=[^=;]?(?:; [^=]+=[^=]?)?/.test(text)) {
        var cookieParts = text.split(/;\s/g),
        cookieName = null,
        cookieValue = null,
        cookieNameValue = null;
        for (var i = 0,
        len = cookieParts.length; i < len; i++) {
          cookieNameValue = cookieParts[i].match(/([^=]+)=/i);
          if (cookieNameValue instanceof Array) {
            cookieName = cookieNameValue[1];
            cookieValue = cookieParts[i].substring(cookieNameValue[1].length + 1)
          } else {
            cookieName = cookieParts[i];
            cookieValue = cookieName
          }
          cookies[cookieName] = cookieValue
        }
      }
      return cookies
    },
    remove: function(k, options) {
      options = options || {};
      options.expires = -1;
      this.set(k, "", options)
    }
  }
})(AD2); (function(a) {
  var dom = a.DomUtil,
  $time = Date.now ||
  function() {
    return new Date().getTime()
  },
  default_config = {
    duration: 1,
    transition: function(p) {
      return p
    },
    callback: function() {}
  };
  var compute = function(from, to, delta) {
    return (to - from) * delta + from
  },
  buildFrom = function(el, from, to) {
    a.each(to,
    function(v, k) {
      if (from[k] == null) {
        from[k] = parseInt(dom.getStyle(el, k), 10)
      } else {
        dom.setStyle(el, k, from[k])
      }
    })
  };
  a.Anim = a.Class.create({
    init: function(el, config) {
      this.el = dom.get(el);
      this.config = a.mixif(config, default_config);
      this.chains = []
    },
    morph: function(o) {
      if (this.playing) {
        this.chains.push(o)
      } else {
        this._morph(o);
        this.playing = true
      }
      return this
    },
    _morph: function(o) {
      var from = o.from || {},
      to = o.to,
      config = o.config || {};
      a.mixif(config, this.config);
      var el = this.el,
      duration = config.duration * 1000,
      transition = config.transition,
      startTime = $time(),
      me = this;
      buildFrom(el, from, to);
      var trans = function(delta) {
        a.each(to,
        function(value, property) {
          dom.setStyle(el, property, compute(from[property], value, delta))
        })
      };
      var timer = setInterval(function() {
        var time = $time();
        if (time < startTime + duration) {
          trans(transition((time - startTime) / duration))
        } else {
          trans(1);
          clearInterval(timer);
          me._chain()
        }
      },
      20)
    },
    _chain: function() {
      if (this.chains.length) {
        this._morph(this.chains.shift())
      } else {
        this.playing = false;
        this.config.callback()
      }
    }
  })
})(AD2);
var mutex_lock, mutex_unlock; (function() {
  var locked = false;
  mutex_lock = function() {
    if (locked) {
      return - 1
    } else {
      locked = true;
      return 0
    }
  };
  mutex_unlock = function() {
    locked = false;
    return 0
  }
})(); (function(a) {
  var each = a.each,
  Class = a.Class,
  dom = a.DomUtil,
  ua = dom.ua,
  buildHTML = dom.buildHTML,
  dic_area_display = {},
  cookie = a.Cookie.get(),
  display_index = parseInt(cookie['ad_play_index']) || Math.floor(Math.random() * 100),
  FLASH_VAR_LINK = 'adlink';
  a.Cookie.set('ad_play_index', display_index + 1, {
    expires: 1
  });
  var ping = function(url) { (new Image()).src = url
  },
  displayInOrder = function(area_config) {
    return function() {
      if (arguments.length == 0) {
        return
      }
      var creativity_config = arguments[display_index % arguments.length];
      dic_area_display[area_config.id] = dm.create(creativity_config['display'], {
        area_config: area_config,
        creativity_config: creativity_config
      })
    }
  };
  var renderImage = function(config, el) {
    var styles = {
      display: 'block',
      cursor: 'pointer',
      width: config.width + 'px',
      height: config.height + 'px'
    };
    var url = config.resource_url;
    if (getExtension(url) == 'png' && ua.ie != 0 && ua.ie < 7) {
      styles['filter'] = a.format('progid:DXImageTransform.Microsoft.AlphaImageLoader(src=\'{uri}\')', url)
    } else {
      styles['background-image'] = a.format('url({uri})', url)
    }
    el.innerHTML = buildHTML(styles);
    el.firstChild.onclick = function() {
      window.open(config.link_to)
    }
  };
  var renderFlash = function(config, el) {
    var params = {
      quality: 'high',
      allowscriptaccess: 'always',
      wmode: 'opaque',
      swliveconnect: true
    };
    if (config.params) {
      a.mix(params, config.params)
    }
    var flashvars = config.flashvars || {};
    if (config.link_to) {
      flashvars[FLASH_VAR_LINK] = config.link_to
    }
    params.flashvars = a.serializeQuery(flashvars);
    var attrs = {};
    if (ua.ie) {
      attrs.classid = 'clsid:D27CDB6E-AE6D-11cf-96B8-444553540000';
      params.movie = config.resource_url
    } else {
      params.type = 'application/x-shockwave-flash';
      attrs.data = config.resource_url
    }
    el.innerHTML = buildHTML({
      width: config.width + 'px',
      height: config.height + 'px'
    },
    attrs, 'object', buildParams(params))
  };
  var param_template = '<param name="{name}" value="{value}"></param>';
  var buildParams = function(o) {
    return a.map(o,
    function(v, k) {
      return a.format(param_template, {
        name: k,
        value: v
      })
    }).join('')
  };
  var getExtension = function(uri) {
    var query_string_index = uri.indexOf('?');
    return uri.substring(uri.lastIndexOf('.') + 1, query_string_index == -1 ? uri.length: query_string_index)
  };
  a.DisplayBase = Class.create({
    init: function(config) {
      a.mix(this, config)
    },
    getFodder: function(origin) {
      var fodder = this['creativity_config']['fodder'];
      if (!origin && fodder.length == 1) {
        return fodder[0]
      }
      return fodder
    },
    getDisplayConfig: function() {
      return this['creativity_config']['display_config']
    },
    appendToPing: function() {
      var creativity_config = this.creativity_config;
      a.ping.append({
        loc: this.area_config.id,
        cid: creativity_config.cid,
        oid: creativity_config.oid
      });
      if (creativity_config['monitor_url']) {
        ping(creativity_config['monitor_url'])
      }
    },
    render: function() {
      this.preRender();
      this.doRender()
    },
    preRender: function() {},
    doRender: function() {}
  });
  a.PingDisplayBase = Class.create({
    preRender: function() {
      this.appendToPing()
    }
  },
  a.DisplayBase);
  a.DisplayHelper = {
    render: function(config, el, set_size) {
      if (set_size) {
        dom.setStyle(el, {
          width: config.width,
          height: config.height
        })
      }
      if (config.type == 'image') {
        renderImage(config, el)
      } else {
        renderFlash(config, el);
        if (config.cover) {
          if (dom.getStyle(el, 'position') == 'static') {
            el.style.position = 'relative'
          }
          var cover = document.createElement('div');
          cover.className = 'absolute';
          dom.setStyle(cover, {
            position: 'absolute',
            width: config.width + 'px',
            height: config.height + 'px',
            left: '0px',
            top: '0px',
            cursor: 'pointer',
            'background-color': '#fff',
            filter: 'alpha(opacity=0)',
            opacity: 0
          });
          cover.onclick = function() {
            window.open(config.link_to)
          };
          el.appendChild(cover)
        }
      }
    }
  }; (function() {
    var dic_display_type_klass = {};
    a.DisplayManager = {
      create: function(ctor, config) {
        if (typeof ctor == 'string') {
          ctor = dic_display_type_klass[ctor]
        }
        if (ctor) {
          return new ctor(config)
        }
      },
      reg: function(type, klass) {
        dic_display_type_klass[type] = klass
      }
    }
  })();
  var dm = a.DisplayManager;
  a.area = displayInOrder;
  a.render = (function() {
    var index = 0,
    MAX = 5,
    rendered = {};
    var renderDefault = function(area_id) {
      var el = dom.get(area_id);
      if (!el || dom.getStyle(el, 'display') == 'none') {
        return
      }
      setTimeout(function() { (dm.create('default', {
          area_config: {
            id: area_id
          },
          creativity_config: {
            fodder: [{
              type: 'flash',
              resource_url: a.format('http://adsfile.qq.com/web/default{i}.swf', (index++%MAX) + 1),
              cover: false,
              width: el.clientWidth,
              height: el.clientHeight
            }]
          }
        })).render()
      })
    };
    return function(area_id) {
      if (rendered[area_id]) {
        return
      }
      rendered[area_id] = true;
      var display = dic_area_display[area_id];
      if (display) {
        display.render()
      } else {
        renderDefault(area_id)
      }
    }
  })();
  a.ping = (function() {
    var url = 'http://adping.qq.com/p.jpg?oid={oid}&cid={cid}&loc={loc}',
    query_strings = ['oid', 'cid', 'loc'],
    buffer = {},
    clearBuffer = function() {
      each(query_strings,
      function(k) {
        buffer[k] = []
      })
    };
    clearBuffer();
    return {
      touch: ping,
      append: function(data) {
        each(buffer,
        function(v, k) {
          v.push(data[k])
        });
        return this
      },
      flush: function() {
        ping(a.format(url, buffer));
        clearBuffer();
        return this
      }
    }
  })()
})(AD2); (function(a) {
  var each = a.each,
  map = a.map,
  dom = a.DomUtil,
  $ = dom.get,
  evt = a.DomEventUtil,
  close_button_height = 13,
  close_button_url = 'db_close.gif',
  close_button_html = '<div style="width:{width}px;height:{height}px;background-color:#eee;"><img src="{close_button_url}" style="border:none;float:right;cursor:pointer;width:13px;"></img></div>',
  render = a.DisplayHelper.render,
  doNothing = function() {},
  getFlashInvoker = function(container) {
    var o = container.getElementsByTagName('object');
    if (o.length) {
      var flash = o[0];
      return function(method) {
        try {
          flash[method]()
        } catch(e) {}
      }
    } else {
      return doNothing
    }
  },
  getReg = function(superclass) {
    var _reg = function(o, type) {
      if (typeof o == 'function') {
        o = o()
      }
      a.DisplayManager.reg(type, a.Class.create(o, superclass))
    };
    return function(type, o) {
      if (arguments.length == 1) {
        each(type, _reg)
      } else {
        _reg(o, type)
      }
    }
  },
  regPing = getReg(a.PingDisplayBase),
  regNoPing = getReg(a.DisplayBase),
  observeWindow = function(observer, buffer, run_it) {
    if (buffer) {
      observer = a.buffer(observer, buffer)
    }
    evt.on(window, 'scroll', observer);
    evt.on(window, 'resize', observer);
    if (run_it) {
      observer()
    }
  },
  createAbsoluteElement = function(zIndex) {
    var el = document.createElement('div');
    el.style.position = 'absolute';
    el.className = 'absolute';
    if (zIndex) {
      el.style.zIndex = zIndex
    }
    document.body.insertBefore(el, document.body.firstChild);
    return el
  },
  enter_mutex = function(fn, delay) {
    setTimeout(function() {
      if (mutex_lock() == 0) {
        fn()
      } else {
        setTimeout(arguments.callee, 500)
      }
    },
    (delay || 0) * 1000)
  };
  regNoPing({
    'default': {
      doRender: function() {
        render(this.getFodder(), $(this.area_config.id))
      }
    },
    'popup': {
      doRender: function() {
        var c = this['creativity_config'],
        display_config = c.display_config,
        area_id = this.area_config.id,
        fodder = this.getFodder();
        if (display_config.focus_back && /tencenttraveler|myie|maxthon|opera/i.test(navigator.userAgent)) {
          return
        }
        setTimeout(function() {
          var popup_window = window.open('http://adsfile.qq.com/web/a.html?' + a.serializeQuery(a.mix({
            loc: area_id,
            oid: c.oid,
            cid: c.cid
          },
          fodder)), '_blank', a.getObjectToStringFn('=', ',', false, false)({
            menubar: 'no',
            left: 0,
            top: 0,
            width: fodder.width,
            height: fodder.height
          }));
          if (popup_window && display_config.focus_back) {
            popup_window.blur();
            window.focus()
          }
        },
        display_config.delay * 1000)
      }
    }
  });
  regPing({
    'banner': {
      doRender: function() {
        render(this.getFodder(), $(this.area_config.id))
      }
    },
    'float_fullscreen': {
      doRender: function() {
        var el = dom.get(this.area_config.id),
        fodder = this.getFodder(),
        display_config = this.getDisplayConfig(),
        closed = false;
        var close = function() {
          if (!closed) {
            dom.hide(el);
            mutex_unlock();
            closed = true
          }
        };
        enter_mutex(function() {
          var _el = document.createElement('div');
          render(fodder, _el, true);
          var close_button_panel = dom.createElement(a.format(close_button_html, {
            width: fodder.width,
            height: close_button_height,
            close_button_url: close_button_url
          }));
          evt.on(close_button_panel.firstChild, 'click', close);
          el.appendChild(close_button_panel);
          el.appendChild(_el);
          dom.show(el);
          setTimeout(close, display_config.duration * 1000)
        },
        display_config.delay)
      }
    },
    'raw_fullscreen': {
      doRender: function() {
        var container = dom.get(this.area_config.id),
        fodder = this.getFodder(),
        display_config = this.getDisplayConfig();
        enter_mutex(function() {
          render(fodder, container);
          dom.show(container);
          setTimeout(function() {
            dom.hide(container);
            mutex_unlock()
          },
          display_config.duration * 1000)
        },
        display_config.delay)
      }
    },
    'float': function() {
      var delegate = function(fn, arg2) {
        return function(arg1) {
          return fn(arg1, arg2)
        }
      },
      leftCalculator = {
        left: function(el_width, margin) {
          return dom.getDocumentScrollLeft() + margin
        },
        right: function(el_width, margin) {
          return dom.getViewportWidth() + dom.getDocumentScrollLeft() - el_width - margin
        }
      },
      topCalculator = {
        top: function(el_height, margin) {
          return dom.getDocumentScrollTop() + margin
        },
        middle: function(el_height, margin) {
          return (dom.getViewportHeight() - el_height) / 2 + dom.getDocumentScrollTop()
        },
        bottom: function(el_height, margin) {
          return dom.getViewportHeight() + dom.getDocumentScrollTop() - el_height - margin
        }
      },
      renderFloat = function(edges, display_config, fodder, close) {
        var fodder_height = fodder.height,
        fodder_width = fodder.width,
        direction = edges[0],
        position = edges[1],
        cl = delegate(leftCalculator[direction], display_config.margin_h),
        ct = delegate(topCalculator[position], display_config.margin_v),
        el = createAbsoluteElement(100),
        page_content_width = display_config.page_content_width,
        getPosition = function() {
          return {
            left: cl(fodder_width),
            top: ct(fodder_height)
          }
        },
        anim = new a.Anim(el, {
          duration: 1,
          transition: function(p) {
            return Math.pow(p, .4)
          }
        });
        if (display_config.close_button != 'none') {
          fodder_height += close_button_height;
          var _el = document.createElement('div');
          render(fodder, _el, true);
          var close_button_panel = dom.createElement(a.format(close_button_html, {
            width: fodder_width,
            height: close_button_height,
            close_button_url: close_button_url
          }));
          evt.on(close_button_panel.firstChild, 'click', close);
          if (display_config.close_button == 'bottom') {
            el.appendChild(_el);
            el.appendChild(close_button_panel)
          } else if (display_config.close_button == 'top') {
            el.appendChild(close_button_panel);
            el.appendChild(_el)
          }
        } else {
          render(fodder, el)
        }
        var widthIsValid = function() {
          if ((dom.getViewportWidth() - page_content_width) / 2 < fodder_width + display_config.margin_h) {
            dom.hide(el);
            return false
          }
          dom.show(el);
          return true
        };
        observeWindow(function() {
          if (!display_config.follow_viewport) {
            return
          }
          if (!widthIsValid()) {
            return
          }
          var dp = getPosition();
          sxy = dom.getXY(el),
          sx = sxy[0],
          sy = sxy[1],
          dy = dp.top,
          from = {},
          config = {};
          if (position == 'bottom') {
            if (sy > dy + fodder_height) {
              from.top = dom.getDocumentScrollTop() + dom.getViewportHeight();
              config.duration = .3
            }
          } else if (position == 'top') {
            if (sy < dy - fodder_height) {
              from.top = dom.getDocumentScrollTop() - fodder_height;
              config.duration = .3
            }
          }
          anim.morph({
            from: from,
            to: dp,
            config: config
          })
        },
        300, false);
        dom.setStyle(el, getPosition());
        widthIsValid();
        return el
      };
      return {
        doRender: function() {
          var display_config = this.getDisplayConfig(),
          edges = display_config.edges.split(','),
          fodder = this.getFodder(true);
          delete display_config.edges;
          var close = function() {
            each(els, dom.hide);
            display_config.follow_viewport = false
          };
          var els = map(edges,
          function(edge, i) {
            return renderFloat(edge.split('-'), display_config, fodder[i], close)
          })
        }
      }
    },
    'couplet': function() {
      var top_edge = 17,
      left_edge = 12,
      right_edge = 12,
      page_content_width = 766,
      close_button_size = 13,
      close_button_src = 'images/db_close.gif';
      return {
        doRender: function() {
          var fodders = this.getFodder(),
          closed = false;
          var close = function() {
            display(false);
            closed = true
          };
          var els = map(fodders,
          function(fodder) {
            var el = createAbsoluteElement(100);
            dom.setStyle(el, {
              top: top_edge,
              width: fodder.width,
              height: fodder.height + close_button_size
            });
            render(fodder, el, false);
            var close_button_panel = dom.createElement(a.format(close_button_html, {
              width: fodder.width,
              height: close_button_height,
              close_button_url: close_button_url
            }));
            evt.on(close_button_panel.firstChild, 'click', close);
            el.appendChild(close_button_panel);
            return el
          });
          dom.setStyle(els[0], {
            left: left_edge
          });
          dom.setStyle(els[1], {
            right: right_edge
          });
          var display = function(visible) {
            each(els,
            function(el) {
              dom.setStyle(el, {
                display: visible ? 'block': 'none'
              })
            })
          };
          observeWindow(function() {
            if (!closed) {
              display(dom.getViewportWidth() - left_edge - fodders[0].width - fodders[1].width - right_edge - page_content_width > 0)
            }
          },
          100, true)
        }
      }
    },
    'fullscreen': function() {
      var replay_button_width = 48, //宽度
      replay_button_height = 19, //高度
      replay_button_offsetY = -8,
      replay_button_config = {
        position: 'absolute',
        width: replay_button_width + 'px',
        height: replay_button_height + 'px',
        display: 'none',
        'background-image': 'url(http://www.js.chinamobile.com/images/default/f_replay.gif)', //重播按钮
        cursor: 'pointer'
      },
      close_button_config = {
        position: 'absolute',
        width: '19px', //宽度
        height: '19px', //高度
        right: '7px',
        top: '7px',
        'background-image': 'url(http://www.js.chinamobile.com/images/default/f_close.gif)', // 关闭按钮
        cursor: 'pointer'
      },
      back_proxy_config = {
        'z-index': 999,
        left: '-9999px',
        position: 'absolute',
        border: '2px solid #ccc',
        opacity: .5,
        filter: 'alpha(opacity=50)'
      };
      return {
        doRender: function() {
          var container = dom.get(this.area_config.id),
          fodder = this.getFodder(),
          display_config = this.getDisplayConfig(),
          show_duration = display_config.show_duration,
          hide_duration = display_config.hide_duration,
          close_button = dom.createElement(close_button_config, {
            'class': 'absolute'
          }),
          replay_button = dom.createElement(replay_button_config, {
            'class': 'absolute'
          }),
          close_timer;
          dom.setStyle(container, {
            overflow: 'hidden',
            height: 0,
            position: 'relative',
            display: 'block'
          });
          var fodder_width = fodder.width,
          fodder_height = fodder.height,
          back_proxy = dom.createElement(back_proxy_config);
          render(fodder, container);
          var invokeFlash = getFlashInvoker(container);
          var morphProxy = (function() {
            var anim_proxy = new a.Anim(back_proxy, {
              callback: function() {
                dom.setStyle(back_proxy, {
                  left: -9999
                })
              }
            });
            return function(show) {
              dom.setStyle(replay_button, {
                display: ''
              });
              var f_xy = dom.getXY(container),
              t_xy = dom.getXY(replay_button);
              dom.setStyle(replay_button, {
                display: 'none'
              });
              var arr = [{
                left: f_xy[0],
                top: f_xy[1],
                width: fodder_width - 4,
                height: fodder_height - 4
              },
              {
                left: t_xy[0],
                top: t_xy[1],
                width: replay_button_width - 4,
                height: replay_button_height - 4
              }];
              if (!show) {
                anim_proxy.morph({
                  from: arr[0],
                  to: arr[1],
                  config: {
                    duration: hide_duration
                  }
                })
              } else {
                anim_proxy.morph({
                  from: arr[1],
                  to: arr[0],
                  config: {
                    duration: show_duration
                  }
                })
              }
            }
          })();
          var hide = (function() {
            var anim_hide = new a.Anim(container, {
              duration: hide_duration,
              callback: function() {
                dom.setStyle(replay_button, {
                  display: 'block'
                });
                mutex_unlock()
              }
            });
            return function() {
              clearTimeout(close_timer);
              morphProxy(false);
              invokeFlash('StopPlay');
              anim_hide.morph({
                to: {
                  height: 0
                }
              })
            }
          })();
          var show = (function() {
            var anim_show = new a.Anim(container, {
              duration: show_duration,
              callback: function() {
                invokeFlash('Play');
                close_timer = setTimeout(hide, display_config.duration * 1000)
              }
            });
            return function() {
              clearTimeout(close_timer);
              dom.setStyle(replay_button, {
                display: 'none'
              });
              morphProxy(true);
              invokeFlash('Rewind');
              anim_show.morph({
                to: {
                  height: fodder_height
                }
              })
            }
          })();
          evt.on(close_button, 'click', hide);
          evt.on(replay_button, 'click',
          function() {
            _show(false)
          });
          container.appendChild(close_button);
          document.body.insertBefore(replay_button, document.body.firstChild);
          document.body.insertBefore(back_proxy, document.body.firstChild);
          observeWindow(function() {
            var xy = dom.getXY(container);
            dom.setStyle(replay_button, {
              left: xy[0] + fodder_width - 3,
              top: xy[1] + replay_button_offsetY
            })
          },
          0, true);
          var _show = function(retry) {
            if (retry) {
              enter_mutex(show, 0)
            } else {
              if (mutex_lock() == 0) {
                show()
              }
            }
          };
          setTimeout(function() {
            _show(true)
          },
          display_config.delay * 1000)
        }
      }
    }
  })
})(AD2); (function(a) {
  var convertor = {
    'string': function(value) {
      return value
    },
    'bool': function(value) {
      if (value.toLowerCase() == 'false') {
        return false
      }
      return true
    },
    'number': function(value) {
      return value - 0
    }
  };
  a.getQueryData = function(mapping) {
    var c = {},
    idx = location.href.indexOf('?');
    if (idx != -1) {
      a.each(location.href.substring(idx + 1).split('&'),
      function(pair) {
        pair = pair.split('=');
        if (pair[1] != null) {
          c[pair[0]] = decodeURIComponent(pair[1])
        }
      })
    }
    if (mapping) {
      a.each(mapping,
      function(type, key) {
        if (c[key] != null) {
          c[key] = convertor[type](c[key])
        }
      })
    }
    return c
  }
})(AD2);