/****
* NAME:    utm.js
* TEAM:    COMODO WEB TEAM
* VERSION: 2.0.27 - release
* DATE:    07-02-2012
*/

$(document).ready(function(){
	var tmpCk = '';
try{
	UTMUtils.getTrackVal();
	
	var tmpUrl = UTMUtils.urlComp( document.URL );
		
	if( UTMUtils.keysExist(document.URL) ){
		UTM.breakInKeys();
		
		var pageID = UTM.getPageID( tmpUrl[0] );
		UTM.addKeyVal( 'key7', pageID );
		
	}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] );
		};
		
		var pageID = UTM.getPageID( tmpUrl[0] );
		UTM.addKeyVal( 'key7', pageID );
		
		UTM.checkChannel();
	
		UTM.entryPage();
	} 
	
	UTM.checkExitPage();
	
	$('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.toStringAll();
				$(this).attr('href', tmp);
			}
		}
	}); 
	
	$('a[href!="#"][href!="javascript:"]').live( 'click', function(e){
		var track		= '';
		var pageID		= '';
		var tmpUrl		= '';
		var tmp 		= $(this).attr('href');
		var timestamp 	= UTMUtils.getTimestamp();
		
		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 = UTMUtils.getTrackVal( tmp );
				else 
					track = KeysObj['track'];
				
				UTM.addKeyVal( 'key5', track ); 
				UTM.addKeyVal( 'key5', timestamp ); 
				
				tmp = tmp.substring( 0, ( tmp.indexOf('key') != -1 ?  tmp.indexOf('key')-1 : tmp.length ) );
				if( tmp.indexOf('?') != -1 )
					tmp += '&';
				else
					tmp += '?';
			
				tmp += KeysObj.toStringAll();
				
				$(this).attr( 'href', tmp );
			}
		}
	});
	
	window.onbeforeunload = function()
	{
		var len = parseInt( UTMUtils.findLastVal( UTMUtils.getLastEntry('key5') ) );
		var	timestamp = UTMUtils.getTimestamp();
		var tmpStr = 'timestamp=' + timestamp + '&' + 
						KeysObj.getKeyValue( 'key5', -2 ).join('=') + '&' + KeysObj.getKeyValue( 'key5', -1 ).join('=') + '&' + 
						KeysObj.getKeyValue( 'key7', -1 ).join('=');
				if( KeysObj['key8'] != undefined )
					tmpStr += '&' + KeysObj.toString('key8');
		
		UTMUtils.createCookie( 'key5', 'key5sk'+ (len + 1) + '=' + KeysObj.track + '&key5sk'+ (len + 2)+ '=' + timestamp , 180 );
		UTMUtils.createCookie( 'utmexit', tmpStr, 180 );
	}
}catch(err){
	console.log( 'Unrecoverable error occured: ' + err.lineNumber + ' (' + err.message + ')' );
}
}); 

//***** UTM Objects *****//
var KeysObj = {
	"track": '',
	
	getKeyValue: function( key, index ){
		var tmp = '';
		var totalSKeys = '';
		try{
			if( index < 0 ){
				totalSKeys = KeysObj[ key ].length;
				return KeysObj[ key ][ totalSKeys + index ];
			}
		
			return KeysObj[ key ][ index ];
		}catch(err){
			return false;
		}
	},
	
	createKey: function( name ){
		KeysObj[ name ] = [];
		KeysObj[ name ].length++;
	},
	
	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;
	},
	
	toStringAll: function(){
		var str = [];
		
		for( var it in KeysObj )
			if( $.isArray( KeysObj[ it ] )  && !$.isEmptyObject( KeysObj[ it ] ) )
				str[str.length] = KeysObj.toString( it );
		
		return str.join('&');
	}
}

var UTM = {
	initialKeys: function (){
		var tmp = '';
		var timestamp = UTMUtils.getTimestamp();
		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.createKey( 'key5' );
			KeysObj.key5[ KeysObj.key5.length ] = [ 'key5sk1', tmp ];
			KeysObj.key5[ KeysObj.key5.length ] = [ 'key5sk2', KeysObj.track ];
			KeysObj.key5[ KeysObj.key5.length ] = [ 'key5sk3', timestamp ];
			
			KeysObj.createKey( 'key6' );
			tmp = UTMUtils.toArray( UTMUtils.ajaxCall( 'dataReferrer=' + encodeURIComponent(document.referrer) + '&usf=retrieveInfo' ) );
			
			for( var it in tmp ){
				KeysObj.key6[iter++] = [ it, tmp[it] ];
			}
			
			KeysObj.key6[ KeysObj.key6.length ] = [ 'key6sk7', encodeURIComponent(referrer) ];
			if(FlashDetect.installed)
				KeysObj.key6[ KeysObj.key6.length ] = [ 'key6sk8', FlashDetect.major.toString() + FlashDetect.minor.toString() + FlashDetect.revision.toString() ];
			KeysObj.key6[ KeysObj.key6.length ] = [ 'key6sk9', screen.width.toString() + screen.height.toString() ];
			KeysObj.key6[ KeysObj.key6.length ] = [ 'key6sk10', navigator.javaEnabled() ];
			KeysObj.key6[ KeysObj.key6.length ] = [ 'key6sk11', UTMUtils.readCookie('sha') ];
	},

	breakInKeys: function (){
		var tmpKeys = {};
		var tmp = '';
			
		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);
				if( !KeysObj[ tmp ] )
					KeysObj.createKey( tmp );
				
				switch(tmp[0])
				{
					case 'key5':
						var keyID = UTMUtils.findLastVal( it );
						KeysObj.key5[ keyID ] =[ it, tmpKeys[it] ];
						break;
					default:
						KeysObj[ tmp ][ KeysObj[tmp].length ] =[ it, tmpKeys[it] ];
						break;
				}
			}
		}
	},
	
	addKeyVal: function ( key, val ){
		var tmp = '';
		var tmpVal = '';
		
		if( KeysObj[ key ] != undefined && KeysObj[key].length > 1 ){
			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 ]; 
		}else{
			KeysObj.createKey( key );
			KeysObj[key][1] = [ key+'sk1', val ];
		}
	},
	
	addKeyNameVal: function ( key, name, val ){
		var tmp = UTMUtils.findLastVal(name);
		if( KeysObj[ key ] == undefined )
			KeysObj.createKey( key );
		KeysObj[ key ][ tmp ] = [name, val];
	},
	
	getPageID: function( url, setup ){
		var pageID = '';

		pageID = UTMUtils.ajaxCall( 'usf=getUrlId&url=' + encodeURIComponent( url.toLowerCase() ), setup );
		if( (pageID.length < 1 || pageID.length > 10) || isNaN(pageID) )
			pageID = '0000'; 
		
		return pageID;
	},
	
	checkChannel: function (){
		if( UTMUtils.getURLParams( document.URL ) || (KeysObj["key6"][7][1] == "Google" || KeysObj["key6"][7][1] == "Yahoo" || KeysObj["key6"][7][1] == "Bing" ) ){
			var tmpParams = UTMUtils.toArray( UTMUtils.getURLParams( document.URL ) );
			var tmpSplitParams = UTMUtils.splitParams( UTMUtils.getURLParams( document.URL ) );
			var conditions = [
				['tmpParams["key1sk1"] == "sem"', 'funcSEMEMUPL', ['sem', tmpParams["afl"] ] ],
				['tmpParams["key1sk1"] == "em"', 'funcSEMEMUPL', ['em', tmpParams["afl"] ] ],
				['tmpParams["key1sk1"] == "upl"', 'funcSEMEMUPL', ['upl', tmpParams["afl"] ] ],
				
				['(tmpParams["key1sk1"] != "sem" || tmpParams["key1sk1"] != undefined || tmpParams["key1sk1"] != "dt") && KeysObj["key6"][7][1] == "Google"', 'funcORS', 'Google'],
				['(tmpParams["key1sk1"] != "sem" || tmpParams["key1sk1"] != undefined || tmpParams["key1sk1"] != "dt") && KeysObj["key6"][7][1] == "Yahoo"', 'funcORS', 'Yahoo'],
				['(tmpParams["key1sk1"] != "sem" || tmpParams["key1sk1"] != undefined || tmpParams["key1sk1"] != "dt") && KeysObj["key6"][7][1] == "Bing"', 'funcORS', 'Bing'],
				
				['tmpParams["rs"] != undefined', 'funcApp', ['rs', tmpParams["pid"], tmpParams["rs"]] ],
				['tmpParams["d"] != undefined', 'funcApp', ['d', tmpParams["stage"], tmpParams["d"]] ],
				//['tmpParams["key4sk1"] != undefined', 'funcK4', tmpParams["key4sk1"] ],
				['tmpParams["key1sk1"] == "app" && tmpParams["key1sk2"] != undefined && tmpParams["key1sk3"] != undefined && tmpParams["key1sk4"] != undefined', 'funcK1App', '' ],
				
				['tmpParams["subaffiliateid"] != undefined && tmpParams["subaffiliateid"] != ""', 'funcSTeam', tmpParams["subaffiliateid"] ],
				
				['KeysObj.getKeyValue("key1", 1) == undefined', 'funcDT', '']
			];
			
			KeysObj.createKey( 'key1' );

			for( var it in conditions){
				if( eval(conditions[it][0]) ){  
					window.CampaignMon[conditions[it][1]](conditions[it][2]);
					break;
				}
			}
		}else{
			window.CampaignMon.funcDT();
		}
	},

	checkExitPage: function() {
		var utmexit = '';
		var tmpData = '';
		
		utmexit = UTMUtils.toArray( UTMUtils.readCookie( 'utmexit' ) );
				
		if( ( UTMUtils.getTimestamp() - utmexit['timestamp'] ) > 300000 ){
			for( var it in utmexit){
				if( it != 'timestamp' )
					tmpData += it + '=' + utmexit[ it ] + '&';
			};
			
			tmpData = tmpData.substring( 0, tmpData.lastIndexOf('&') );
			
			UTMUtils.ajaxCall(tmpData , 
				{
				url: '/images/pixel.track',
				async: false,
				type: 'GET',
				cache: true
				}
			);
		};
	},
	
	entryPage: function() {
		UTMUtils.ajaxCall(KeysObj.toStringAll(),
			{
			url: '/images/pixel.track',
			async: true,
			type: 'GET',
			cache: true
			}
		);
	}

};

var UTMUtils = {
	settings: {
		url			: '/includes/utm.php',
		type		: 'POST',
		dataType	: 'text',
		async		: false,
		cache		: false
	},
	
	ajaxCall: function ( dataToSend, options ){
		var tmp = '';
		var setup = {};
		
		for( var it in this.settings )
			setup[ it ] = this.settings[ it ];

		if( options ){
			for( var it in options ){
				setup[ it ] = options[ it ];
			}
		}
		
		try{
			$.ajax({
				url		: setup.url,
				type	: setup.type,
				dataType: setup.dataType,
				data	: dataToSend,
				async	: setup.async,
				cache	: setup.cache,
				success	: function(data) {
					tmp = data;
					tmp = tmp.replace(/<(?:.|\n)*?>[a-zA-Z0-9\.\(\)\!]{1,}(<[^>]*>?)|(<[^>]*>?)|(\n)/gm, '');
				},
				error	: function(data){
					tmp = 0;
				},
				complete: function(data){
					if( options && options['callfunc'] )
						options.callfunc(data.responseText);
				}
			});
			return tmp;
		}catch(err){
			console.log( 'Error: ' + err.lineNumber + '(' + err.message + ')' );
		}
	},
	
	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 );
	},
	
	getURLParams: function ( url ){
		var tmpURL = url;
		if( tmpURL.indexOf('?', 0) != -1 ){
			return tmpURL.substring( tmpURL.indexOf( '?', 0 ) + 1, tmpURL.length );
		}
		return false;
	},

	getLastEntry: function ( key ){
		return KeysObj[key][ KeysObj[key].length - 1 ];
	},	
	
	getTrackVal: function ( url ){
		var tmp = '';
		
		if( url ){
			tmp = UTMUtils.urlComp( url );
			if( tmp.length > 1 ){
				tmp = UTMUtils.toArray( tmp[1] );
				KeysObj.track = tmp['track'];
			}
			return KeysObj.track;
		}else{
			KeysObj.track = $("#track").html();
			$("#track").remove();
		};
	},
	
	getTimestamp: function (){
		var tmpDate 	= new Date();
		return Date.UTC(tmpDate.getFullYear(), tmpDate.getMonth(), tmpDate.getDate(), tmpDate.getHours(), tmpDate.getMinutes(), tmpDate.getSeconds() );
	},
	
	keysExist: function ( url ){
		var tmpParams = url; 
		
		if( tmpParams.match( /key[5-7]sk[1-9]/ig ) != null )
			return true;
		else
			return false;
	},
	
	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;
	},
	
	toArray: function ( str ){
		var tmpArr = {};
		var tmpStr = [];
		var tmp = '';
		
		if( str )
			tmpStr = str.split('&');
		
		for( var i in tmpStr ){
			tmp = tmpStr[i];
			tmp = tmp.split('=');
			tmpArr[ tmp[0] ] = tmp[ 1 ];
		}
		return tmpArr;
	},
	
	splitParams: function( str ){
		var tmpArr = [];
		
		if( str )
			tmpArr = str.split('&');
			
		return tmpArr;
	},

	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) {
		UTMUtils.createCookie(name,"",-1);
	}
};

var CampaignMon = {
	funcSEMEMUPL: function( args ){
		UTM.addKeyVal( 'key1', args[0] );
		UTM.addKeyVal( 'key1', KeysObj.getKeyValue('key6', 7)[1] );
		UTM.addKeyVal( 'key1', KeysObj.getKeyValue('key6', 1)[1] );
		if( args[1] )
			UTM.addKeyNameVal( 'key1', 'key1sk5', args[1] );
	},
	
	funcORS: function( se ){
		UTM.addKeyVal( 'key1', 'ors' );
		UTM.addKeyVal( 'key1', KeysObj.getKeyValue('key6', 7)[1] );
		if( KeysObj.getKeyValue('key6', 1)[1] != '' )
			UTM.addKeyVal( 'key1', KeysObj.getKeyValue('key6', 1)[1] );
	},
	
	funcApp: function( args ) {
		UTM.addKeyVal( 'key1', 'app' );
		if( args[0] == 'rs' ){
			UTM.addKeyVal( 'key1', 'CIS' );
			UTM.addKeyVal( 'key1', args[1] );
			UTM.addKeyVal( 'key1', args[2] );
		}else if( args[0] == 'd' ){
			UTM.addKeyVal( 'key1', 'GBTBA' );
			UTM.addKeyVal( 'key1', args[1] );
			UTM.addKeyVal( 'key1', args[2] );
		}
	},
	
	funcSTeam: function( args ) {
		UTM.addKeyVal( 'key1', 'st' );
		UTM.addKeyNameVal( 'key1', 'key1sk5', args );
	},
	
	funcDT: function() {
		UTM.addKeyVal( 'key1', 'dt' );
		UTM.addKeyVal( 'key1', KeysObj.getKeyValue('key6', 7)[1] );
		if( KeysObj.getKeyValue('key6', 1)[1] != '' )
			UTM.addKeyVal( 'key1', KeysObj.getKeyValue('key6', 1)[1] );
	},

	funcK1App: function() {
		var tmpParams = UTMUtils.toArray(UTMUtils.getURLParams( document.URL ));
		
		for( var it in tmpParams )
			if( it.match(/key1sk[1-5]/ig) )
				UTM.addKeyNameVal( 'key1', it, tmpParams[it] );
	},
	
	funcK4: function( args ){console.log('funcK4');
		var tmpStr = args.split('_');
		UTM.addKeyVal( 'key1', 'app' );
		for( var it in tmpStr )
			UTM.addKeyVal( 'key1', tmpStr[it] );
	}
};

var dbg = (function () {
	isDev = false;
	return {
		log: function ( msg ){
			try{
				if( typeof(msg) == "object" && isDev == true )
					console.dir( msg );
				else if( typeof(msg) == "string" && isDev == true )
					console.log( msg );
				else if( isDev )
					console.log( msg );
			
			}catch(err){
				console.log( 'Error: ' + err.lineNumber + '(' + err.message + ')' );
			}
		}
	}
})();

