/* TownNews Stats Tracker */
function TNStats_Tracker($domain) {
    this._domain = $domain;
    
    this._trackerDomain = "stats.townnews.com";
    this._trackerURI = "/shared-content/stats/common/tracker.gif";
    
    this._plugins = ["DetectFlash", "DetectRes", "DetectVisitor", "DetectPageTitle"];        
    
    this._globalvars = [];        
    this._trackvars = [];

    this._uriPrefix = "";    
    this._sessionTimeout = 1800; // 30 minutes
    this._cookieTimeout = 43800; // 5 years    
    
    this._pageStart = new Date();
    this._ignoreURI = new Array();
    this._ignoreURI["/shared-content/firebuglite/firebug.html"] = 1;        
    this._cookiePath = "/";
    this.crossDomain = true;

    if(document.getElementsByTagName) {
        
        $options = document.getElementsByTagName('meta');

        for($i = 0; $i < $options.length; $i++)
        {
            if($options[$i].name != "murlinstats")
                continue;
 
            if($options[$i].content.substr(0, 6) == "ignore")
            {
               $ignorelist = $options[$i].content.substr(7).split(",");

               for($x = 0; $x < $ignorelist.length; $x++)
               {
                   this._ignoreURI[$ignorelist[$x]] = 1;              
               }
            }     
        }
    }

    this._setGlobalVar = function($sVar, $sValue)
    {    
        this._globalvars[$sVar] = $sValue;
    }
    
    this._getGlobalVar = function ($sVar)
    {    
    	if(this._globalvars[$sVar])
	    return this._globalvars[$sVar];
	    
	return "";
    }    
    
    this._addTrackVar = function($key, $value) {

        $key = escape($key);
        $value = escape($value);
        this._trackvars[$key] = $value;
    }

    this._clearTrackVars = function() {
        this._trackvars = [];
    }

    this._joinGlobalVars = function() {
        var $array = new Array;
	
	for(var $key in this._globalvars) {
            
            if(typeof(this._globalvars[$key]) == 'string')
  	       $array[$array.length] = (escape($key) + "=" + escape(this._globalvars[$key]));
        }
	
	return $array.join('&');
    }
    
    this._joinTrackVars = function() {

        var $array = new Array;

        for (var $key in this._trackvars) {

            if(typeof(this._trackvars[$key]) == 'string')
                $array[$array.length] = ($key + "=" + this._trackvars[$key]);
        }

        return $array.join('&');
    }

    this._addCookie = function($name, $value, $expireHours) {
        var $cookieString = $name + "=" + escape($value) + "; path="+this._cookiePath+";";

        if ($expireHours > 0) {
            var $date = new Date();
            var $current_time = $date.getTime();

            $date.setTime(($expireHours * 3600 * 1000) + $current_time);
            $cookieString = $cookieString + " expires=" + $date.toGMTString() + ";";
        }
	
        document.cookie = $cookieString;
    }

    this._getCookie = function($name) {
        var $strCookie = document.cookie;
        var $arrCookie = $strCookie.split("; ");
        for (var $i = 0; $i < $arrCookie.length; $i++) {
            var $arr = $arrCookie[$i].split("=");

            if ($arr[0] == $name) {
                return unescape($arr[1]);
            }
        }
        return "";
    }

    this._sendTracker = function() {
        var $date = new Date();
	
	if (window.location.protocol.indexOf('http:')==0?'s':'')
	    var $url = 'http://'+this._trackerDomain+this._trackerURI;
	else
	    var $url = 'https://'+this._trackerDomain+this._trackerURI;
	    	
        $url = $url + '?' + this._joinTrackVars() + '&rt=' + $date.getTime();

        var img = new Image(1, 1);
        img.src = $url;
    }

}

TNStats_Tracker.prototype.setTracker = function($http_url, $https_url) {
	/** Depreciated function **/
}


TNStats_Tracker.prototype.setTrackerDomain = function($domain) {
    this._trackerDomain = $domain;
}


TNStats_Tracker.prototype.setTrackerURI = function($uri) {
    this._trackerURI = $uri;
}

TNStats_Tracker.prototype.setURIPrefix = function($uri) {
    this._uriPrefix = $uri;
}

TNStats_Tracker.prototype.ignoreURI = function($uri, $module) {
    if(!$module)
        this._ignoreURI[$uri] = 1;
    else
        this._ignoreURI[$module+"-"+$uri] = 1;
}

TNStats_Tracker.prototype.pluginDetectRes = function() {
    if (screen) {
        this._addTrackVar('tnms_rs', screen.width + "x" + screen.height + "x" + screen.colorDepth);
    }
}

TNStats_Tracker.prototype.pluginDetectPageTitle = function() {
    var $old_title = this._getCookie('tnms_pdt');
    var $title = this._getGlobalVar('title');

    if(!$title.length)
        $title = "(empty title)";

    if($old_title)
        this._addTrackVar('tnms_pdt', $old_title);

    this._addTrackVar('tnms_dt', $title);
    this._addCookie('tnms_pdt', $title, this._cookieTimeout);
}

TNStats_Tracker.prototype.pluginDetectVisitor = function() {
    var $date = new Date();
    var $visitor_type = 0; /* 0 is continuing visit, 1 is new visitor, 2 is returning visitor */
    var $visitor_id = new String(this._getCookie('tnms_vid'));    
    var $visitor_start = this._getCookie('tnms_vsst'); /* visitor session start visit time */
    var $visitor_last = this._getCookie('tnms_vssl');  /* visitor session last visit time */
    var $visitor_puri = this._getCookie('tnms_vpuri'); /* previous uri */
    var $visitor_len = 0;
	    
    /** New Visitor - VisitorID Generation **/
    if(!$visitor_id.length)
    {	
        $visitor_type = 1;
	$visitor_start = $date.getTime() / 1000;
		
        /** Generate a unique id here off of browser properties and time **/
        $visitor_id += $date.getTime();

        if(window.screenX)
           $visitor_id+=Math.abs(window.screenX);
        else if(window.screenLeft)
           $visitor_id+=Math.abs(window.screenLeft);

        if(window.screenX)
            $visitor_id+=Math.abs(window.screenY);
        else if(window.screenTop)
            $visitor_id+=Math.abs(window.screenTop);

        if(document.body && document.body.clientWidth)
            $visitor_id+=document.body.clientWidth;
        else if(window.innerWidth)
            $visitor_id+=window.innerWidth;

        if(document.body && document.body.clientHeight)
            $visitor_id+=document.body.clientHeight;
        else if(window.innerHeight)
            $visitor_id+=window.innerHeight;

        $visitor_id+=Math.floor(Math.random()*$date.getTime());	
    }
    /** End VisitorID Generation **/
    else if((!$visitor_start) || ((($date.getTime() / 1000) - $visitor_last) > this._sessionTimeout))
    {    	
        $visitor_type = 2;
	$visitor_start = $date.getTime() / 1000;
    }    
       
    this._addCookie('tnms_vsst', Math.ceil($visitor_start));
    this._addCookie('tnms_vssl', Math.ceil(($date.getTime() / 1000)));


    this._addCookie('tnms_vpuri', this._uri, this._cookieTimeout);
    this._addCookie('tnms_vid', $visitor_id, this._cookieTimeout);
    
    /** True unique monthly visitor support **/    
    var $true_unique = this._getCookie('tnms_vtumt');
    var $year_month = String($date.getFullYear()) + String($date.getMonth());
    
    if($true_unique != $year_month) {
        /** register the user as a new unique monthly visitor **/
	this._addTrackVar('tnms_vtum', 1);
	this._addCookie('tnms_vtumt', $year_month, this._cookieTimeout);	
    }        
    /** End true unique monthly visitor **/
   
    if($visitor_last)
    {
        this._addTrackVar('tnms_vpuri', $visitor_puri);

        if($visitor_type) {
            /* On the last page of a visit, there's no way to know how long a visitor was on the page */
            $visitor_len = 0;
        } else {
            $visitor_len = ($date.getTime() / 1000) - $visitor_last;
        } 

        this._addTrackVar('tnms_vplen', Math.ceil($visitor_len));
    }
    
    this._addTrackVar('tnms_vt', $visitor_type);
    this._addTrackVar('tnms_vid', $visitor_id);
}


TNStats_Tracker.prototype.pluginDetectFlash = function() {
    var $version = false;

    if (navigator.plugins["Shockwave Flash"] && navigator.plugins["Shockwave Flash"].description) {
        var $flashver = new String(navigator.plugins["Shockwave Flash"].description);
        var $array = $flashver.split(" ");
        $version = $array[2];
    } else if(window.ActiveXObject) {
            axo = new ActiveXObject("ShockwaveFlash.ShockwaveFlash.5");
	
	    if(axo) {
                var $flashver = new String(axo.GetVariable("$version"));
                var $array = $flashver.split(/[, ]/);
                $version = $array[1] + "." + $array[2];
            }
    }

    if ($version) {
        this._addTrackVar('tnms_fl', $version);
    }
}

TNStats_Tracker.prototype.runPlugins = function() {

    for (var $x = 0; $x < this._plugins.length; $x++) {
        if(!this._ignoreURI[this._plugins[$x]+"-"+this._uri]) {
            eval("this.plugin" + this._plugins[$x] + "();");
        }
    }

    this._addTrackVar('tnms_do', this._domain);
    this._addTrackVar('tnms_uri', this._uri);
    this._addTrackVar('tnms_ref', this._getGlobalVar('referrer'));

    this._sendTracker();
}

TNStats_Tracker.prototype.trackPageView = function($passed_uri) {
    var $uri = new String(document.location);
    var $ret = $uri.match(/^(http|https):\/\/([^\/]{1,})(.*)$/);
    this._clearTrackVars();

    if ($ret) {
        this._uri = this._uriPrefix + $ret[3];
        this._scheme = $ret[1];
    }

    if ($passed_uri) {
        this._uri = this._uriPrefix + $passed_uri;
    }

    if (this._ignoreURI[this._uri]) {
        return;
    }

    /** All variables used for statistical purposes in the plugins must be registered here **/
    this._setGlobalVar("title", document.title);
    this._setGlobalVar("referrer", document.referrer);
    this._setGlobalVar("domain", this._domain);
    this._setGlobalVar("uri", this._uri);

    /** Super old browsers do not support document.createElement **/        
   if(document.createElement && this.crossDomain) {
	    /** this is used only to determine if the browser has iframe support at all **/
            var iframe = document.createElement("iframe");
	
            if (iframe && iframe.src != undefined) {	     	
		var src = this._scheme + "://" + this._trackerDomain+"/"+this._domain+"/?"+this._joinGlobalVars();
		document.write('<if' + 'rame src="'+src+'" width="0" height="0" frameBorder="0" style="position: absolute; width: 0px; height: 0px;"></iframe>');
            } else {
                this.runPlugins();
            }	   
	    
     }  else {
            /** If there is no support for iframes, fall back to old functionality **/
            this.runPlugins();
     }    
}


/** Cross domain tracker **/
TNStats_Tracker.prototype.trackPageViewCD = function() {

        var $uri = new String(document.location);
        var $ret = $uri.match(/\?(.*)$/);

        if(!$ret || !$ret[1]) {
            return;
        }
    
	/** Set the cookie path to the /domain.com/, and split apart the query string and store them as global vars **/
        var $args = $ret[1].split("&");

        for(var $i in $args) {	
            var $x = $args[$i].split("=");
	    var $key = unescape($x[0]);
	    var $val = unescape($x[1]);
            this._setGlobalVar($key, $val);

            if($key == "uri") {
                this._uri = $val;
            }                	
            else if($key == "domain") {
                this._domain = $val;
            }                	
        }
	
	if(!this._uri || !this._domain) {
            return;
        }


        this._cookiePath = "/"+this._domain+"/";        
        this.runPlugins();
}

