(function(){
  var accessInfo={
    requestUrl:location.protocol+'//'+location.host+location.pathname+location.search,
    userAgent:navigator.userAgent.toLowerCase(),
    referer:'',
    exception:false
  };
  try{
    accessInfo.referer=(location.href!=parent.location.href)?parent.document.referrer:document.referrer;
  }catch(e){
    accessInfo.exception=true;
  }
  var browser={
    Version:(accessInfo.userAgent.match(/.+(?:rv|it|ra|ie)[\/: ]([\d.]+)/)||[])[1],
    Safari:/webkit/.test(accessInfo.userAgent),
    Opera:/opera/.test(accessInfo.userAgent),
    IE:/msie/.test(accessInfo.userAgent)&&!/opera/.test(accessInfo.userAgent),
    Mozilla:/mozilla/.test(accessInfo.userAgent)&&!/(compatible|webkit)/.test(accessInfo.userAgent),
    Chrome:/chrome/.test(accessInfo.userAgent)
  },
  getNow=function(){return (new Date()).getTime()},
  getDate=function(){return (new Date()).getDate()},
  RaTracker=function(){
    this.init();
    return this;
  };
  RaTracker.prototype={
    type:{Load:'0',Click:'1',BtnClick:'2',Adsense:'g',UnLoad:'u',ClickMap:'m',ScrollMap:'s'},
    hId:null,
    uCd:null,
    vCd:null,
    accessTime:null,
    stayCd:null,
    clickTime:null,
    customTrackTime:null,
    scrollTimerId:null,
    init:function(){
      this.accessTime=getNow();
      this.stayCd=Math.floor(Math.random()*10000)+getNow();
    },
    getTitle:function(){
      if(document.getElementById('title')){
        var elmT=document.getElementsByTagName('title')[0];
        return (browser.IE)?elmT.innerHTML:elmT.firstChild.nodeValue;
      }else{
        return document.title;
      }
    },
    getTrackingUrl:function(url,title,referer,type){
      return 'http://analyze.pro.research-artisan.com/track/tracker.php?ucd='+this.uCd+'&hid='+this.hId+'&vcd='+this.vCd+'&tp='+type+'&rf='+encodeURIComponent(referer)+'&ur='+encodeURIComponent(url)
      +'&ti='+encodeURIComponent(title)+'&sw='+screen.width+'&sh='+ screen.height+'&sc='+screen.colorDepth+'&ce='+this.getCookieEnabled()
      +'&stc='+this.stayCd+'&stt='+this.getStayTime()+'&s='+Math.floor(Math.random()*100);
    },
    getClickMapParam:function(e){
      var x=Math.round((this.x(e)+this.clientX())/10)*10;
      var y=Math.round((this.y(e)+this.clientY())/10)*10;
      var w=this.clientWidth();
      var h=this.clientHeight();
      return isNaN(x)|| isNaN(y)?'':'&x='+x+'&y='+y+'&w='+w+'&h='+h;
    },
    getScrollMapParam:function(){
      var top=this.clientY();
      var btm=top+this.h();
      return isNaN(top)||isNaN(btm)?'':'&top='+top+'&btm='+btm;
    },
    sendServer:function(url,dom,timeout){
      if(dom){
        var itemElm=document.getElementById('item'),
            bodyElm=(itemElm)?itemElm:document.getElementsByTagName('body').item(0),
            scriptElm=document.createElement('script'),
            sendId;
        scriptElm.setAttribute('src',url);
        scriptElm.setAttribute('defer','defer');
        if (timeout) {
          sendId=setTimeout(function(){bodyElm.appendChild(scriptElm);},400);
        } else {
          bodyElm.appendChild(scriptElm);
        }
        this.wait(0.4);
      }else{
        document.write('<script type="text/javascript" src="'+url+'" defer="defer"></script>');
      }
      return this;
    },
    clickTracking:function(e){
      var url='',title='',rel='';
      var targetElm=this.getTargetElm(e);
      var targetName=targetElm.nodeName.toLowerCase();
      var checkClick=function(url,rel,clickRel){return (_RaTracker.isUrl(url)&&(!url.match(location.host)&&rel!='_RAPROnoclick'||rel=='_RAPROclick'))?true:false;};
      var clickMapTrack=false;
      switch(targetName){
        case 'a':
          url=targetElm.href;
          title=(browser.IE)?targetElm.innerText:targetElm.text;
          rel=(targetElm.rel!==undefined)?targetElm.rel:'';
          if(checkClick(url,rel,this.clickRel)){
            this.sendServer(this.getTrackingUrl(url,title,accessInfo.requestUrl,this.type.Click)+this.getClickMapParam(e),true);
          }else{
            this.stayTracking(e,this.getClickMapParam(e));
          }
          clickMapTrack=true;
          this.init();
          break;
        case 'input':
          if(targetElm.type.toLowerCase()=='button'||targetElm.type.toLowerCase()=='submit'){
            url=accessInfo.requestUrl+'#'+targetElm.value;
            title='['+targetElm.value+'] ('+this.getTitle()+')';
            this.sendServer(this.getTrackingUrl(url,title,accessInfo.requestUrl,this.type.BtnClick)+this.getClickMapParam(e),true,true);
            clickMapTrack=true;
            this.init();
          }
          break;
        default:
          if (targetElm.parentNode.href!==undefined) {
            url=targetElm.parentNode.href;
            title=(targetElm.alt!==undefined)?targetElm.alt:((browser.IE)?targetElm.innerText:targetElm.firstChild.nodeValue);
            rel=(targetElm.parentNode.rel!==undefined)?targetElm.parentNode.rel:'';
            if(checkClick(url,rel,this.clickRel)){
              this.sendServer(this.getTrackingUrl(url,title,accessInfo.requestUrl,this.type.Click)+this.getClickMapParam(e),true);
            }else{
              this.stayTracking(e,this.getClickMapParam(e));
            }
            clickMapTrack=true;
            this.init();
          }
          break;
      }
      if(!clickMapTrack)this.clickMapTracking(e);
    },
    adsenseElms:[],
    adsenseOnFocus:false,
    adsenseTargetElm:null,
    adsenseTracking:function(){
      var size='',url='',aElmLength=this.adsenseElms.length;
      if(this.adsenseOnFocus){
        for(var i=0;i<aElmLength;i++){
          if((this.adsenseElms[i].src&&this.adsenseTargetElm.src&&this.adsenseElms[i].src==this.adsenseTargetElm.src)||this.adsenseElms[i].id==this.adsenseTargetElm.id){
            size=(this.adsenseElms[i].width && this.adsenseElms[i].height)?this.adsenseElms[i].width+'x'+this.adsenseElms[i].height:'unknown';
            url=encodeURIComponent('Unit='+(i+1)+',Size='+size);
            this.sendServer(this.getTrackingUrl(url,url,accessInfo.requestUrl,this.type.Adsense),true,true);
            this.init();
            this.adsenseOnFocus=false;
            break;
          }
        }
      }
    },
    adsenseFocus:function(e){
      this.adsenseOnFocus=true;
      this.adsenseTargetElm=this.getTargetElm(e);
    },
    adsenseBlur:function(e){
      this.adsenseOnFocus=false;
      this.adsenseTargetElm=null;
    },
    iframeElms:[],
    iframeTargetElm:null,
    iframeTimerId:null,
    iframeTracking:function(){
      var src,cnt,url;
      if (this.iframeTargetElm) {
        src=this.iframeTargetElm.src;
        cnt=src.indexOf('?');
        if (cnt!=-1) {
          url=src.substring(0,cnt+1)+encodeURIComponent(src.substring(cnt+1));
        } else {
          url=src;
        }
        this.sendServer(this.getTrackingUrl(url,url,accessInfo.requestUrl,this.type.Click),true);
        this.init();
      }
    },
    iframeFocus:function(e){
      this.iframeTargetElm=this.getTargetElm(e);
      this.iframeTimerId=setTimeout(function(){RaTracker.transfer.iframeTracking();},1000);
    },
    iframeBlur:function(e){
      if(this.iframeTimerId)clearTimeout(this.iframeTimerId); 
    },
    iframeSearch:function(e){
      var iframeElms=document.getElementsByTagName('iframe'),iElmLength=iframeElms.length;
      var findAd=false; 
      for(var i=0;i<iElmLength;i++){
        findAd=false;
        if(iframeElms[i].src.indexOf('googlesyndication.com')>-1||iframeElms[i].src.indexOf('googleads.g.doubleclick.net')>-1)findAd=true;
        if(iframeElms[i].id&&iframeElms[i].id.indexOf('aswift_')>-1&&iframeElms[i].parentNode.tagName.toLowerCase()=='ins'&&iframeElms[i].parentNode.id!==undefined&&iframeElms[i].parentNode.id.indexOf('aswift_')>-1)findAd=true;
        if(findAd){
          this.adsenseElms.push(iframeElms[i]);
          this.addEvent('mouseover',RaTracker.transfer.adsenseFocus,iframeElms[i]);
          this.addEvent('mouseout',RaTracker.transfer.adsenseBlur,iframeElms[i]);
          if(browser.Opera){
            this.addEvent('unload',RaTracker.transfer.adsenseTracking,window);
          }else{
            this.addEvent('beforeunload',RaTracker.transfer.adsenseTracking,window);
          }
        } else {
          this.iframeElms.push(iframeElms[i]);
          this.addEvent('mouseover',RaTracker.transfer.iframeFocus,iframeElms[i]);
          this.addEvent('mouseout',RaTracker.transfer.iframeBlur,iframeElms[i]);
        }
      }
    },
    getStayTime:function(){return Math.floor((getNow()-this.accessTime)/1000);},
    stayTracking:function(e,clickMapParam){
      if(this.getStayTime()>0&&(!this.adsenseTargetElm)){
        if(!clickMapParam)clickMapParam='';
        this.sendServer(this.getTrackingUrl(accessInfo.requestUrl,this.getTitle(),accessInfo.referer,this.type.UnLoad)+clickMapParam,true);
      }
    },
    clickMapTracking:function(e){
      var clickMapParam;
      if((this.checkInterval(this.clickTime,5)||(this.x(e)>this.w()||this.y(e)>this.h()))) {
        clickMapParam=this.getClickMapParam(e);
        if(clickMapParam!='')this.sendServer(this.getTrackingUrl(accessInfo.requestUrl,this.getTitle(),accessInfo.referer,this.type.ClickMap)+clickMapParam,true);
      }
      this.clickTime=getNow();
    },
    catchScroll:function(){
      if(this.scrollTimerId)clearTimeout(this.scrollTimerId); 
      this.scrollTimerId=setTimeout(function(){RaTracker.transfer.scrollMapTracking();},3000);
    },
    scrollMapTracking:function(){
      var scrollMapParam=this.getScrollMapParam();
      if(scrollMapParam!='')this.sendServer(this.getTrackingUrl(accessInfo.requestUrl,this.getTitle(),accessInfo.referer,this.type.ScrollMap)+scrollMapParam,true);
    },
    documentReady:function(callback){
      if(browser.IE){
        (function(){
          try {
            document.documentElement.doScroll('left');
          } catch(error) {
            setTimeout(arguments.callee, 0);
            return;
          }
          callback.apply(document);
        })();
      }else{
        if(document.addEventListener){
          document.addEventListener('DOMContentLoaded',callback,false);
        }else{
          window.attachEvent?window.attachEvent('onload',callback):window.addEventListener('load',callback,false);
        }
      }
      return document;
    },
    addEvent:function(e,callback,obj){
      if((obj.nodeType!==undefined&&(obj.nodeType===1||obj.nodeType===9))||obj===window)
        obj.attachEvent?obj.attachEvent('on'+e,callback):obj.addEventListener(e,callback,false);
      return obj;
    },
    removeEvent:function(e,callback,obj){
      if((obj.nodeType!==undefined&&(obj.nodeType===1||obj.nodeType===9))||obj===window)
        obj.detachEvent?obj.detachEvent('on'+e,callback):obj.removeEventListener(e,callback,false);
      return obj;
    },
    getTargetElm:function(e){
      return window.event?window.event.srcElement:e.target;
    },
    wait:function(second){
      var w=getNow()+(second*1000);
      while(true){
        if(getNow()>w){return;}
      }
    },
    setCookie:function(k,v){
      var c=k+'='+encodeURIComponent(v)+';';
      var dt=new Date();
      dt.setDate(dt.getDate()+365);
      c += 'expires='+dt.toGMTString()+';';
      document.cookie=c;
    },
    getCookie:function(k){
      var rtn='',data=document.cookie.split(';'),dataLength=data.length,exp=/ /g,i=0;
      k = k.replace(exp, '');
      while(i<dataLength) {
        var dk=data[i].split('=');
        if (dk.length>=2) {
          dk[0]=dk[0].replace(exp, '');
          if(k==dk[0]){
            rtn=decodeURIComponent(dk[1]);
            break;
          }
        }
        ++i;
      }
      return rtn;
    },
    getCookieEnabled:function(){return (navigator.cookieEnabled!==undefined&&navigator.cookieEnabled===true)?'1':'0';},
    mapDocument:function(){return document.documentElement&&document.documentElement.clientHeight!==0?document.documentElement:document.body;},
    x:function(e){return e.clientX;},
    y:function(e){return e.clientY;},
    clientX:function(){return browser.IE?this.mapDocument().scrollLeft:window.pageXOffset;},
    clientY:function(){return browser.IE?this.mapDocument().scrollTop:window.pageYOffset;},
    w:function(){return browser.IE?this.mapDocument().clientWidth:window.innerWidth;},
    h:function(){return browser.IE?this.mapDocument().clientHeight:window.innerHeight;},
    clientWidth:function(){return document.documentElement.scrollWidth||document.body.scrollWidth;},
    clientHeight:function(){return document.documentElement.scrollHeight||document.body.scrollHeight;},
    isUrl:function(url){return url&&url.match("^(https?|ftp):\/\/")?true:false},
    checkInterval:function(time,interval){return (time&&(getNow()-time)/1000<interval)?false:true;},
    doTracking:function(){
      if(accessInfo.exception)return;
      this.vCd=this.getCookie('_ra_vcd');
      if(!this.vCd){
        if(this.getCookieEnabled()=='1'){
          this.vCd='ed1a951602f5cd679a14ca284d71fc6c';
        } else {
          this.vCd='687ca099d5acd174eb664ebde02c8d6f';
        }
      }
      this.setCookie('_ra_vcd',this.vCd);
      this.sendServer(this.getTrackingUrl(accessInfo.requestUrl,this.getTitle(),accessInfo.referer,this.type.Load)+this.getScrollMapParam(),false);
      this.addEvent('click',RaTracker.transfer.clickTracking,document);
      if(browser.IE)this.addEvent('contextmenu',RaTracker.transfer.clickTracking,document);
      if(browser.IE||browser.Chrome||browser.Safari){
        this.addEvent('beforeunload',RaTracker.transfer.stayTracking,window);
      }else{
        this.addEvent('unload',RaTracker.transfer.stayTracking,window);
      }
      this.documentReady(RaTracker.transfer.iframeSearch);
      this.addEvent('scroll',RaTracker.transfer.catchScroll,window);
      return this;
    },
    customTracking:function(type,url,title){
      if(accessInfo.exception||(!url)||(!this.checkInterval(this.customTrackTime,1)))return;
      var customHost=location.protocol+'//'+location.host;
      var customReferer=customHost+location.pathname+location.search+location.hash;
      if(!this.isUrl(url)){
        if(url&&url.length>1&&url.substring(0,1)!='/')url='/'+url;
        url=customHost+url;
      }
      if(!title)title=url;
      this.sendServer(this.getTrackingUrl(url,title,customReferer,type),true);
      this.init();
      this.customTrackTime=getNow();
    },
    trackPageview:function(url,title){this.customTracking(this.type.Load,url,title);},
    trackLinkclick:function(url,title){this.customTracking(this.type.Click,url,title);},
    trackButtonclick:function(title){this.customTracking(this.type.BtnClick,accessInfo.requestUrl+'#'+title,title);}
  }
  RaTracker.transfer = {
    clickTracking:function(e){_RaTracker.clickTracking(e);},
    adsenseTracking:function(e){_RaTracker.adsenseTracking(e);},
    iframeTracking:function(e){_RaTracker.iframeTracking(e);},
    adsenseFocus:function(e){_RaTracker.adsenseFocus(e);},
    adsenseBlur:function(e){_RaTracker.adsenseBlur(e);},
    iframeFocus:function(e){_RaTracker.iframeFocus(e);},
    iframeBlur:function(e){_RaTracker.iframeBlur(e);},
    iframeSearch:function(e){_RaTracker.iframeSearch(e);},
    stayTracking:function(e){_RaTracker.stayTracking(e);},
    catchScroll:function(e){_RaTracker.catchScroll();},
    scrollMapTracking:function(e){_RaTracker.scrollMapTracking();}
  }
  window._RaTracker=new RaTracker();
}())
