/*****************************************************/
/*  GA
/*****************************************************/
var _gaq = _gaq || [];

var _gadr = {
    /* global variables */
    /* uri helper */
    __testProfiles: new Array("UA-3160331-28"),
    _trackedElements: [],
    testurl: document.location,
    isSetup: false,
    guid: 'UA-3160331-28',
    _allowedURLvars: ["_g_l", "_g_r", "_g_z", "_g_e"],
    buckets: [1000,2000,3000,4000,5000,7000,10000,20000,30000],
    getCurrentPageName: function() {
        try {
            var gaPath = window.location.pathname;
            var gaPage = ssPath.substring(gaPath.lastIndexOf('/') + 1);
            return gaPage;
        } catch (err) { return 'uknownpage'; }
    },
    /* ga helper functions */
    getPathUrl: function() {
        return document.location.pathname + document.location.search;
    },
    /*######  setup ###########*/
    _profile_setup: function() {
        _gaq.push(
                ['_setAccount', this.guid],
                ['_setAllowLinker', true],
			 	['_setDetectFlash', true],
			  	['_setDetectTitle', true],
			 	['_setSessionCookieTimeout', 7200000]
			 	);

        if (jQuery.inArray(this.guid,this.__testProfiles)!=-1){
            _gaq.push(['_setDomainName', 'none']);
        }
		return true;
    },
    ___error_do: function(calling_proc, err) {
        console.log("[_gadr]:[" + calling_proc + "]: error: " + err);
        return;
    },
    setup: function(guid) {
        try {
            if (guid == null) {
                this.guid = 'UA-3160331-28';
            } else {
                this.guid = guid;
            }
            this.isSetup = this._profile_setup();
        } catch (err) {
        	this.___error_do("setup", err);
        }
    }, 
    trackPageview: function(trackurl) {
        try {
            if (!this.isSetup || this.guid == null) {
            	this.___error_do("trackPageView","Cannot track. gaq not setup");
                return;
            }
            if (trackurl == undefined || trackurl == null) _gaq.push(['_trackPageview']);
            else _gaq.push(['_trackPageview', trackurl]); // modified/fake pageview
            return;
        } catch (err) {
            this.___error_do("trackPageview", err);
        }
    },
    trackEvent: function(category, action, optional_label, optional_value) {
		try{
	        _gaq.push(['_trackEvent', category, action, optional_label, optional_value]);
		}catch(err){
			this.___error_do("trackEvent", err);
		}
    },
    startTime: (new Date()).getTime(),
    endTime: function(){return (new Date()).getTime()},
    pageLoadTimer: function(){
        try{
		loadTime = this.endTime()-this.startTime;
		for(i=0;i<this.buckets.length;i++){
			if(loadTime < this.buckets[i]){
				if(i==0){
					bucketString = "0-" +  (this.buckets[i]-1);
				}else{
					bucketString = (this.buckets[i-1]) +"-" +  (this.buckets[i]-1);
				}
				break;
			}
		};
		this.trackEvent('PageLoadTime', "bucket (ms): " + bucketString, this.getPathUrl(), loadTime);
        }catch(err){
        	this.___error_do("pageLoadTimer", err);
        }
    },
    eventStartTime: '',
    eventTimer: function(eventTracker){
        try{
		if(this.eventStartTime==''){
			this.eventStartTime=(new Date()).getTime();
		}else{
			loadTime = (new Date()).getTime() - this.eventStartTime;
			this.eventStartTime='';
			for(i=0;i<this.buckets.length;i++){
				if(loadTime < this.buckets[i]){
					if(i==0){
						bucketString = "0-" +  (this.buckets[i]-1);
					}else{
						bucketString = (this.buckets[i-1]) +"-" +  (this.buckets[i]-1);
					}
					break;
				}
			}
			this.trackEvent(eventTracker, "bucket (ms): " + bucketString, this.getPathUrl(), loadTime);
		}
        }catch(err){
        	this.___error_do("eventTimer", err);
        }
    },
    _gl_get: function() {
        var hrefparse = location.href;
        if (hrefparse == null || hrefparse == '' || hrefparse == undefined){
            return "unknown";
        }
        
        var uriObj = this.parseUri.execute(hrefparse);

        if (uriObj.queryKey["t"] != undefined){
            return uriObj.queryKey["t"];
        }

        if (uriObj.path == "/"){return "index";}
        if (uriObj.path == "/index.jsp"){return "index";}
        if (uriObj.path == "/terms.jsp"){return "terms";}

		return "Error:"+uriObj.path;
    },
    rewrite: function(href_rewrite, page_zone, element_id, element_action) {
    	var gl = this._gl_get();
        var gr = gl;
        
        element_id=this.clearInj(element_id);
        
        var oldurl = href_rewrite;
		if(element_action=="click"){
	        this.trackEvent("_"+element_action+"_"+gl, page_zone, element_id);
		}else{
			if($.inArray((page_zone+"_"+element_id+"_"+element_action),this._trackedElements)==-1){
				this.trackEvent("_"+element_action+"_"+gl, page_zone, element_id);
				this._trackedElements.push(page_zone+"_"+element_id+"_"+element_action);
			}
		}
     	//var newurl = this.ga_appender(href_rewrite, ["_g_r","_g_l", "_g_z", "_g_e"], [gr, gl, page_zone, element_id]);
		var newurl = this.ga_appender(href_rewrite, ["_g_r", "_g_z", "_g_e"], [gr, page_zone, element_id]);
        
        return newurl;
    },
    clearInj: function(str){
    	var chars = chars || "\\s";
		if($.isArray(str)){
			for(i=0;i<str.length;i++){
				str[i] = str[i].replace(/<[^>]*>/g,"");
				str[i] = str[i].replace(/&(lt|gt)/g,"");
				str[i] = str[i].replace(/script/ig,"");
				str[i] = str[i].replace(new RegExp("^[" + chars + "]+", "g"), "");
				str[i] = str[i].replace(new RegExp("[" + chars + "]+$", "g"), "");
				str[i] = str[i].replace(new RegExp("[" + "\\t" + "]+$", "g"), "");
			}
		}else{
			str = str.replace(/<[^>]*>/g,"");
			str = str.replace(/&(lt|gt)/g,"");
			str = str.replace(/script/ig,"");
			str = str.replace(new RegExp("^[" + chars + "]+", "g"), "");
			str = str.replace(new RegExp("[" + chars + "]+$", "g"), "");
			str = str.replace(new RegExp("[" + "\\t" + "]+$", "g"), "");
		}
		return str;
    },
    ga_appender: function(curUrl,gakeys,gavals){
        try{
	    	if((curUrl.substr(0,11)=="javascript:")||(curUrl=="")||(curUrl==null)){return curUrl;}
	    	if ((gakeys == undefined) || (gakeys == null)) {return curUrl;}
	    	if ((gavals == undefined) || (gavals == null)) {return curUrl;}
	    	if(!$.isArray(gakeys))gakeys=$.makeArray(gakeys);
	    	if(!$.isArray(gavals))gavals=$.makeArray(gavals);
	    	if (gakeys.length != gavals.length) return curUrl;
	        
	    	var qTemp='';
	    	var urlStart='';
	    	
	    	gakeys = this.clearInj(gakeys);
	    	gavals = this.clearInj(gavals);
	    	curUrl = this.clearInj(curUrl);
	    	
	    	var returnUrl='';
	    	uriObj = this.parseUri.execute(curUrl);
	    	if(uriObj.protocol!=''){ urlStart = uriObj.protocol + "://";}
	    	if(uriObj.authority!=''){urlStart += uriObj.authority;}
	    	if(uriObj.path!=''){urlStart += uriObj.path;}
	    	qTemp = uriObj.query;
	    	for(i=0;i<gakeys.length;i++){
		    	if($.inArray(gakeys[i],this._allowedURLvars) != -1){
		    		if(uriObj.queryKey[gakeys[i]]!=undefined){
		    			qTemp = qTemp.replace(gakeys[i]+"="+uriObj.queryKey[gakeys[i]],gakeys[i]+"="+gavals[i]);
		    		}else{
			    		if(uriObj.query==''){
			    			if(i<=gavals.length && i>0){qTemp+="&";}
				    	}else{
			    			if(i<=gavals.length){qTemp+="&";}
				    	}
		    			qTemp += gakeys[i]+"="+gavals[i];
		    		}
		    	}
    		}
	    	anchorStr = uriObj.anchor!='' ? "#"+uriObj.anchor : "" ;
	    	return urlStart + "?" + qTemp + anchorStr;
        } catch(err){return curUrl;}
    },
    parseUri: {
    	options: {
        		strictMode: false,
        		key: ["source","protocol","authority","userInfo","user","password","host","port","relative","path","directory","file","query","anchor"],
        		q:   {
        			name:   "queryKey",
        			parser: /(?:^|&)([^&=]*)=?([^&]*)/g
        		},
        		parser: {
        			strict: /^(?:([^:\/?#]+):)?(?:\/\/((?:(([^:@]*)(?::([^:@]*))?)?@)?([^:\/?#]*)(?::(\d*))?))?((((?:[^?#\/]*\/)*)([^?#]*))(?:\?([^#]*))?(?:#(.*))?)/,
        			loose:  /^(?:(?![^:@]+:[^:@\/]*@)([^:\/?#.]+):)?(?:\/\/)?((?:(([^:@]*)(?::([^:@]*))?)?@)?([^:\/?#]*)(?::(\d*))?)(((\/(?:[^?#](?![^?#\/]*\.[^?#\/.]+(?:[?#]|$)))*\/?)?([^?#\/]*))(?:\?([^#]*))?(?:#(.*))?)/
        		}
        },
    	execute: function(str) {
        	var	o   = this.options,
        		m   = o.parser[o.strictMode ? "strict" : "loose"].exec(str),
        		uri = {},
        		i   = 14;
        	while (i--) uri[o.key[i]] = m[i] || "";
        	uri[o.q.name] = {};
        	uri[o.key[12]].replace(o.q.parser, function ($0, $1, $2) {
        		if ($1) uri[o.q.name][$1] = $2;
        	});
        	return uri;
        }
    },
    gafoot: function() {
    	var ga = document.createElement('script');
        ga.type = 'text/javascript';
        ga.async = true;
        ga.setAttribute('async', 'true');
        ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
        var s = document.getElementsByTagName('script')[0];
        s.parentNode.insertBefore(ga, s);
        this.pageLoadTimer();
    }

}