﻿/****
* UTM.js
* COMODO WEB TEAM
* VERSION 2.0.8 - release
*/

var KeysObj = {
	"key5": [],
	"key6": [],
	"key7": [],
	"track": '',
	toString: function(key){
		var tmp = [];
		var str = '';
		for( var it in KeysObj[key] )
			tmp[it-1] = KeysObj[key][it].join('=');
		str = tmp.join('&');
		str = str.replace(/([&])\1+/g, '&');
		return str;
	}
}

$(document).ready(function(){
	var tmpCk = '';
		
	
	KeysObj.track = $("#track").html();
	$("#track").remove();

	 if( UTMUtils.keysExist(document.URL) ){
		UTM.breakInKeys();
	}else{
		UTM.initialKeys();
		if( UTMUtils.readCookie('key5') != null ){
			tmpCk = UTMUtils.toArray( UTMUtils.readCookie('key5') );
			for(var it in tmpCk)
				UTM.addKeyNameVal( 'key5', it,tmpCk[it] );
		}
	} 
 
	
	$('a').each(function(){
		var tmp = $(this).attr('href');
		var tmp2 = $(this).attr('class');
	
		if( tmp != undefined && tmp2 != 'addthis') { 
			if ( !tmp.match(/facebook\.com\//i) && !tmp.match(/\.swf$/i) && !tmp.match(/\.flv/gi) 
					&& !tmp.match(/liveperson\.net/i) && !tmp.match(/addthis\.com/ig) && !tmp.match(/matousec\.com/i) 
					&& !tmp.match(/cert.webtrust\.org\//i) && !tmp.match(/mailto:/i) && !tmp.match(/http:\/\/www.comodo.cn/i) 
					&& !tmp.match(/http:\/\/www.comodojapan.com/i) && !tmp.match(/http:\/\/www.comodoisrael.com/i) && !tmp.match(/http:\/\/www.comodogroup.it/i) 
					&& !tmp.match(/products\/frontpage/i) && !tmp.match(/javascript:/i) && !tmp.match(/\#/i)  
					&& !tmp.match(/twitter/i) )
			{

				if(!tmp.match(/\.php\?/ig) && !tmp.match(/\.html\?/ig) && !tmp.match(/\.htm\?/ig) )
					tmp += '?';
				else
					tmp += '&' ;
				tmp += KeysObj.toString('key5') + '&' + KeysObj.toString('key6') + '&' + KeysObj.toString('key7');
				$(this).attr('href', tmp);
			}
		}
	}); 
	
	
	$('a[href!="#"][href!="javascript:"]').live( 'click', function(e){
		var track		= '';
		var pageID		= '';
		var tmpUrl		= '';
		var tmp 		= $(this).attr('href');
		var tmpDate 	= new Date();
		var timestamp 	= Date.UTC(tmpDate.getFullYear(), tmpDate.getMonth(), tmpDate.getDate(), tmpDate.getHours(), tmpDate.getMinutes(), tmpDate.getSeconds() );
		
		if( tmp != 'undefined' && tmp != null ) {
			if ( !tmp.match(/facebook\.com\//i) && !tmp.match(/\.swf$/i) && !tmp.match(/\.flv/gi) && !tmp.match(/liveperson\.net/i) 
					&& !tmp.match(/www.addthis\.com/i) && !tmp.match(/matousec\.com/i) && !tmp.match(/cert.webtrust\.org\//i) 
					&& !tmp.match(/mailto:/i) && !tmp.match(/http:\/\/www.comodo.cn/i) && !tmp.match(/http:\/\/www.comodojapan.com/i) 
					&& !tmp.match(/http:\/\/www.comodoisrael.com/i) && !tmp.match(/http:\/\/www.comodogroup.it/i) && !tmp.match(/products\/frontpage/i) 
					&& !tmp.match(/javascript:/i) && !tmp.match(/\#/i) && !tmp.match(/twitter/i) ) 
			{
					
				if( tmp.indexOf('track=') != -1)
					track = tmp.substring(tmp.indexOf('track=', tmp.indexOf('?')) + 6, (tmp.indexOf('&', tmp.indexOf('track=') ) != -1 ? tmp.indexOf('&', tmp.indexOf('track=') ) : tmp.length ) );
				
				else 
					track = KeysObj['track'];
				
				
				UTM.addKeyVal( 'key5', track ); 
				UTM.addKeyVal( 'key5', timestamp ); 
				
				
				tmpUrl = UTMUtils.urlComp( document.URL );
				pageID = UTMUtils.ajaxCall( 'usf=getUrlId&url=' + encodeURIComponent( tmpUrl[0] ) );
				if( pageID.length > 4 && parseInt(pageID) != NaN )
					pageID = '0000';
				UTM.addKeyVal( 'key7', pageID );
				
						
				tmp = tmp.substring( 0, ( tmp.indexOf('key') != -1 ?  tmp.indexOf('key')-1 : tmp.length ) );
				if( tmp.indexOf('?') != -1 )
					tmp += '&';
				else
					tmp += '?';
			
				tmp += KeysObj.toString('key5') + '&' + KeysObj.toString('key6') + '&' + KeysObj.toString('key7');
				
				$(this).attr( 'href', tmp );
			}
		}
	});
	
	
	window.onbeforeunload = function()
	{
		var tmpDate = new Date();
		var len = parseInt( UTMUtils.findLastVal( UTMUtils.getLastEntry('key5') ) );
		var	timestamp = Date.UTC(tmpDate.getFullYear(), tmpDate.getMonth(), tmpDate.getDate(), tmpDate.getHours(), tmpDate.getMinutes(), tmpDate.getSeconds() );
		
		UTMUtils.createCookie( 'key5', 'key5sk'+ (len + 1) + '=' + KeysObj.track + '&key5sk'+ (len + 2)+ '=' + timestamp , 180 );
	}

	
	
}); 


var UTM = {
	initialKeys: function (){
		var tmp = '';
		var tmpDate = new Date();
		var timestamp = Date.UTC(tmpDate.getFullYear(), tmpDate.getMonth(), tmpDate.getDate(), tmpDate.getHours(), tmpDate.getMinutes(), tmpDate.getSeconds() );
		var iter = 1;
		var referrer = '';
		var pageID = '';
		
			
			if(document.referrer != '') {
				var host = UTMUtils.parse_url(document.referrer, 'host');
				if( host.match(/google/i) )
					var referrer = 'Google';
				else if( host.match(/yahoo/i) )
					var referrer = 'Yahoo';
				else if( host.match(/bing/i) )
					var referrer = 'Bing';
				else
					if(document.URL.indexOf('?',0) != -1) 
						var referrer = document.URL.substr(0, document.URL.indexOf('?',0));	
					else
						var referrer = document.URL;
			}else{
				if(document.URL.indexOf('?',0) != -1) 
					var referrer = document.URL.substr(0, document.URL.indexOf('?',0));	
				else
					var referrer = document.URL;
			}
			referrer = encodeURIComponent(referrer);
			
			tmp = UTMUtils.ajaxCall( 'usf=getSHA' );
			KeysObj.key5[1] = [ 'key5sk1', tmp ];
			KeysObj.key5[2] = [ 'key5sk2', KeysObj.track ];
			KeysObj.key5[3] = [ 'key5sk3', timestamp ];
			
			
			tmp = UTMUtils.toArray( UTMUtils.ajaxCall( 'dataReferrer=' + encodeURIComponent(document.referrer) + '&usf=retrieveInfo' ) );
			for( var it in tmp ){
				KeysObj.key6[iter++] = [ it, tmp[it] ];
			}
			
			KeysObj.key6[7] = [ 'key6sk7', referrer ];
			if(FlashDetect.installed)
				KeysObj.key6[8] = [ 'key6sk8', FlashDetect.major.toString() + FlashDetect.minor.toString() + FlashDetect.revision.toString() ];
			KeysObj.key6[9] = [ 'key6sk9', screen.width.toString() + screen.height.toString() ];
			KeysObj.key6[10] = [ 'key6sk10', navigator.javaEnabled() ];
			KeysObj.key6[11] = [ 'key6sk11', UTMUtils.readCookie('sha') ];

			
			tmp = UTMUtils.urlComp( document.URL );
			pageID = UTMUtils.ajaxCall( 'usf=getUrlId&url=' + encodeURIComponent( tmp[0] ) );
			if( pageID.length > 4 && parseInt(pageID) != NaN )
				pageID = '0000';
			KeysObj.key7[1] = [ 'key7sk1', pageID ];
	},

	breakInKeys: function (){
		var tmpKeys = {};
		var tmp = '';
		
		KeysObj.key5.length++;
		KeysObj.key6.length++;
		KeysObj.key7.length++;
		
		if( UTMUtils.keysExist(document.URL) ){
			tmpKeys = UTMUtils.toArray( UTMUtils.getURLParams(document.URL) );

			for( var it in tmpKeys ){
				if( it == '' || it.match(/key[1-9]/ig, it) == null )
					continue;
				tmp = it.match(/key[1-9]/ig, it);
				switch(tmp[0])
				{
					case 'key5':
						KeysObj.key5[ KeysObj.key5.length ] =[ it, tmpKeys[it] ];
						break;
					case 'key6':
						KeysObj.key6[ KeysObj.key6.length ] =[ it, tmpKeys[it] ];
						break;
					case 'key7':
						KeysObj.key7[ KeysObj.key7.length ] =[ it, tmpKeys[it] ];
						break;
				} 
			}
		}
	},

	addKeyVal: function ( key, val ){
		var tmp = '';
		var tmpVal = '';
		
		tmp = KeysObj[key][ KeysObj[key].length -1 ][0];
		tmp = parseInt( tmp.substring( tmp.indexOf('sk',0)+2, tmp.length ) ); 
		KeysObj[key][ KeysObj[key].length ] = [ key+'sk'+(tmp+1), val ]; 
	},
	
	addKeyNameVal: function ( key, name, val ){
		var tmp = UTMUtils.findLastVal(name);
		KeysObj[key][ tmp ] = [name, val];
	},

}


var UTMUtils = {
	getURLParams : function (url){
		var tmpURL = url;
		if( tmpURL.indexOf('?', 0) != -1 ){
			return tmpURL.substring( tmpURL.indexOf( '?', 0 ) + 1, tmpURL.length );
		}
		
	},

	urlComp: function (url){
		var tmp = [];
		if( url.indexOf('?', 0) != -1 ){
			tmp[0] = url.substring( 0, url.indexOf('?', 0) );
			tmp[1] = url.substring( url.indexOf('?', 0) + 1, url.length );
		}else{
			tmp[0] = url;
		}
		return tmp;
	},

	getLastEntry: function (key){
		return KeysObj[key][ KeysObj[key].length - 1 ];
	},	
	
	findLastVal: function (str){
		if( typeof(str) != 'string' )
			return str[0].substring( str[0].indexOf('sk')+2, str[0].length );
		else	
			return str.substring( str.indexOf('sk')+2, str.length );
	},
	
	
	keysExist: function (url){
		var tmpParams = url; 
		
		if( tmpParams.match( /key[1-9]sk[1-9]/ig ) != null )
			return true;
		else
			return false;
	},

	
	toArray: function ( str ){
		var tmpArr = {};
		var tmpStr = str.split('&');
		var tmp = '';
		
		for( var i in tmpStr ){
			tmp = tmpStr[i];
			tmp = tmp.split('=');
			tmpArr[ tmp[0] ] = tmp[ 1 ];
		}
		return tmpArr;
	},

	
	ajaxCall: function ( arg ){
		var tmp = '';
		$.ajax({
			url		: '/includes/utm.php',
			type	: 'POST',
			dataType: 'html',
			data	: arg,
			async	: false,
			cache	: false,
			success	: function(data) {
				 tmp = data;
			},
			error	: function(data){
				 tmp = 0;
			}
		});
		return tmp;
	},

	parse_url: function (str, component) {
		// Parse a URL and return its components  
		// 
		// version: 1109.2015
		// discuss at: http://phpjs.org/functions/parse_url
		// +      original by: Steven Levithan (http://blog.stevenlevithan.com)
		// + reimplemented by: Brett Zamir (http://brett-zamir.me)
		// + input by: Lorenzo Pisani
		// + input by: Tony
		// + improved by: Brett Zamir (http://brett-zamir.me)
		// %          note: Based on http://stevenlevithan.com/demo/parseuri/js/assets/parseuri.js
		// %          note: blog post at http://blog.stevenlevithan.com/archives/parseuri
		// %          note: demo at http://stevenlevithan.com/demo/parseuri/js/assets/parseuri.js
		// %          note: Does not replace invalid characters with '_' as in PHP, nor does it return false with
		// %          note: a seriously malformed URL.
		// %          note: Besides function name, is essentially the same as parseUri as well as our allowing
		// %          note: an extra slash after the scheme/protocol (to allow file:/// as in PHP)
		// *     example 1: parse_url('http://username:password@hostname/path?arg=value#anchor');
		// *     returns 1: {scheme: 'http', host: 'hostname', user: 'username', pass: 'password', path: '/path', query: 'arg=value', fragment: 'anchor'}
		var key = ['source', 'scheme', 'authority', 'userInfo', 'user', 'pass', 'host', 'port', 
							'relative', 'path', 'directory', 'file', 'query', 'fragment'],
			ini = (this.php_js && this.php_js.ini) || {},
			mode = (ini['phpjs.parse_url.mode'] && 
				ini['phpjs.parse_url.mode'].local_value) || 'php',
			parser = {
				php: /^(?:([^:\/?#]+):)?(?:\/\/()(?:(?:()(?:([^:@]*):?([^:@]*))?@)?([^:\/?#]*)(?::(\d*))?))?()(?:(()(?:(?:[^?#\/]*\/)*)()(?:[^?#]*))(?:\?([^#]*))?(?:#(.*))?)/,
				strict: /^(?:([^:\/?#]+):)?(?:\/\/((?:(([^:@]*):?([^:@]*))?@)?([^:\/?#]*)(?::(\d*))?))?((((?:[^?#\/]*\/)*)([^?#]*))(?:\?([^#]*))?(?:#(.*))?)/,
				loose: /^(?:(?![^:@]+:[^:@\/]*@)([^:\/?#.]+):)?(?:\/\/\/?)?((?:(([^:@]*):?([^:@]*))?@)?([^:\/?#]*)(?::(\d*))?)(((\/(?:[^?#](?![^?#\/]*\.[^?#\/.]+(?:[?#]|$)))*\/?)?([^?#\/]*))(?:\?([^#]*))?(?:#(.*))?)/ // Added one optional slash to post-scheme to catch file:/// (should restrict this)
			};
	 
		var m = parser[mode].exec(str),
			uri = {},
			i = 14;
		while (i--) {
			if (m[i]) {
			  uri[key[i]] = m[i];  
			}
		}
	 
		if (component) {
			return uri[component.replace('PHP_URL_', '').toLowerCase()];
		}
		if (mode !== 'php') {
			var name = (ini['phpjs.parse_url.queryKey'] && 
					ini['phpjs.parse_url.queryKey'].local_value) || 'queryKey';
			parser = /(?:^|&)([^&=]*)=?([^&]*)/g;
			uri[name] = {};
			uri[key[12]].replace(parser, function ($0, $1, $2) {
				if ($1) {uri[name][$1] = $2;}
			});
		}
		delete uri.source;
		return uri;
	},

	createCookie: function (name,value,days) {
		if (days) {
			var date = new Date();
			date.setTime(date.getTime()+(days*24*60*60*1000));
			var expires = "; expires="+date.toUTCString();
		}
		else var expires = "";
		document.cookie = name+"="+value+expires+";path=/;domain=comodo.com;";
	},

	readCookie: function (name) {
		var nameEQ = name + "=";
		var ca = document.cookie.split(';');
		for(var i=0;i < ca.length;i++) {
			var c = ca[i];
			while (c.charAt(0)==' ') c = c.substring(1,c.length);
			if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length);
		}
		return null;
	},

	eraseCookie: function (name) {
		createCookie(name,"",-1);
	},
}
