/**
 * @author pentzold
 */

    var allowed_domains = [
    		'www.sixt.es', 
    		'www.sixt.nl', 
    		'www.sixt.be', 
    		'www.sixt.lu', 
    		'www.sixt.com',
    		'www.sixt.de',
    		'car-rental.sixt.com',
    		'www.sixt.fr',
    		'www.sixt.co.uk',
            'br.sixt.com',
            'ar.sixt.com'
    ];
    var dat = new Date();
    var ab		 = getAB();
    var getParams= Werteliste(location.search);
    var test	 = false;
    var referrer = document.referrer;
    var url		 = document.URL;
    
    
    	/**
    	 * if cookie "SX_RAC_REFSEM" isn't set, yet, 
    	 * we do the refererCheck and set it accordingly
    	 */
    	if (!getCookie('SX_RAC_REFSEM')) {
    		var keks = checkREFR(referrer, url);
    		var json = create_json(keks, "jKeks");
    		//today + 30 days
    		dat.setTime( dat.getTime() + (30 * 24 * 60 * 60 * 1000) );
    		if (test) {
    			tVals["SX_RAC_REFSEM"] = json;
    		}
    		setCookie('SX_RAC_REFSEM', json, false, dat.toGMTString(), '/');
    	}
    	
    	/**
    	 * we check the FREQ cookie and refresh it, if there are entries, older
    	 * than 12 months from now
    	 */
    	if (FREQ = getCookie('SX_RAC_FREQ')) {
    		newFREQ = parseFreqCookie(FREQ);
    		jsFREQ = create_json(newFREQ, "jsFREQ");
    		dat.setTime( dat.getTime() + (365 * 24 * 60 * 60 * 1000) );
    		if (test) {
    			tVals["SX_RAC_FREQ"] = jsFREQ;
    		}
    		setCookie('SX_RAC_FREQ', jsFREQ, false, dat.toGMTString(), '/');
    	}
    	
    	/**
    	 * check for journey-cookie
    	 * if this hasn't been set during the current session, do so
    	 */
    	if (!getCookie('SX_I_TR')) {
    		var ret = checkHistory();
    		var cok = getCookie("SX_RAC_REFSEM");
    		eval("var refsem = " + cok);
    		eval("var comp = " + ret);
    		if (comp.EP) {
    			 refsem.COMP = "EP";
    		}
    		if (comp.RAC) {
    			if (refsem.COMP != undefined) {
    				refsem.COMP += "-RAC"
    			} else {
    				refsem.COMP = "RAC";
    			}
    		}
    		if (comp.PRSVGL) {
    			if (refsem.COMP != undefined) {
    				refsem.COMP += "-PRSVGL"
    			} else {
    				refsem.COMP = "PRSVGL";
    			}
    		}
    		var json = create_json(refsem, "jKeks");
    		dat.setTime( dat.getTime() + (365 * 24 * 60 * 60 * 1000) );
    		setCookie('SX_RAC_REFSEM', json, false, dat.toGMTString(), '/');
    	}
    	
    	if (in_array(location.hostname, allowed_domains)) {
    		jrntCookie = getJrnTrkCookie(url, referrer);
    		var protocol = window.location.protocol;
    		if (protocol.indexOf(":")) {
    			protocol = protocol.substring(0,protocol.indexOf(":"));
    		}
    		var path = protocol + "://trck.sixt.com/php/oi/mrtrk.visit?";
    		var parms = "duri=" + escape(jrntCookie.duri) +
    					"&dref=" + escape(jrntCookie.dref) + 
    					"&chlm=" + escape(jrntCookie.chlm) +
    					"&spc1=" + escape(jrntCookie.spc1) +
    					"&spc2=" + escape(jrntCookie.spc2) + 
    					"&spc3=" + escape(jrntCookie.spc3);
    		
            var imgtag = document.createElement('img');
            
            imgtag.src = '' + path + parms + '';
            
            imgtag.style.height = '1px';
            imgtag.style.width  = '1px';                    
            imgtag.style.position = 'absolute';
            imgtag.style.left = '-1px';
            imgtag.id = "sx_oi_img";

            document.body.appendChild(imgtag);
    	}
    		
    	setCookie('SX_I_TR', '1js', false, '', '/');
    	
    	if (test) {
    		tVals["TR_IMG_TAG"] = '"' + imgtag +'"';
    	}
    		
    	
    
    /*
    	if (test) {
    		$.ajax({
    			type: "POST",
    			url: "/php/oi/mrtrk.test",
    			data: tVals,
    			success: null
    		});
    	}
    
    */
    /*******************************************************************************
     * 				THE FUNCTIONS BLOCK											   *
     ******************************************************************************/
    
    function in_array(item,arr) {
    	for(p=0;p<arr.length;p++) {
    		if (item == arr[p]) return true;
    	}
    	return false;
    }
    	
    function Werteliste (querystring) {
    	if (querystring == '') return;
    	var wertestring = querystring.slice(1);
    	var paare = wertestring.split("&");
    	var paar, name, wert;
    	var ret = {};
    	for (var i = 0; i < paare.length; i++) {
    		paar = paare[i].split("=");
    		name = paar[0];
    		wert = paar[1];
    		name = unescape(name).replace("+", " ");
    		wert = unescape(wert).replace("+", " ");
    		ret[name] = wert;
    	}
    	return ret;
    }
    
    	
    /**
     * returns a fity-fifty random A or B
     */
    function getAB() {
    	var r = Math.round(Math.random() * 10) % 2;
    	if (r == 0) {
    		return 'A';
    	} else {
    		return 'B';
    	}
    }
    
    /**
     * checks referer and url for matching criteria
     */
    function checkREFR(referer, url) {
    	var keks = {
    			REFR : "",
    			REFSEM : ""
    	};
    	
    	// driect_request
    	if (!referer) {
    		keks['REFR'] = (ab == 'A') ? 'DIRA' : 'DIRB';
    	}
    	
    	// search-engine stuff
    	var reg_google		= /http:\/\/(.*)\.google(.*)/;
    	var reg_yahoo		= /http:\/\/(.*)yahoo(.*)/;
    	var reg_bing		= /http:\/\/(.*)\.bing\.(.*)\/?(.*)/;
    	var reg_search		= /http:\/\/(.*)\.search\.(.*)\/?(.*)/;
    	var reg_aol			= /http:\/\/(.*)\.aol.(.*)\/?(.*)/;
    	var reg_altavista	= /http:\/\/(.*).altavista.com\/?(.*)/;
    	var reg_ask			= /http:\/\/(.*).ask.com\/?(.*)/;
    	var reg_lycos		= /http:\/\/(.*).lycos.(.*)\/?(.*)/;
    
    	// referrer is some google-site
    	if (reg_google.exec(referer)) {
    		qstr = getGoogleQueryString(referer).toLowerCase();
    		if (qstr.search(/sixt/) == -1){
    			// we have a google seach without 'sixt'
    			sem = getSemParam(url);
    			if (sem) {
    				keks['REFSEM'] = sem;
    				keks['REFR']   = (ab == 'A') ? 'SEMA' : 'SEMB';
    			} else {
    				keks['REFR']   = (ab == 'A') ? 'SEOA' : 'SEOB';
    			}
    		} else {
    			sem = getSemParam(url);
    			if (sem) {
    				keks['REFSEM'] = sem;
    				keks['REFR']   = (ab == 'A') ? 'SXSEMA' : 'SXSEMB';
    			} else {
    				keks['REFR']   = (ab == 'A') ? 'SXSEOA' : 'SXSEOB';
    			}
    		}
    	} 
    	// referrer is some yahoo-site
    	else if (reg_yahoo.exec(referer)||reg_bing.exec(referer)
    			||reg_search.exec(referer)||reg_aol.exec(referer)
    			||reg_altavista.exec(referer)||reg_ask.exec(referer)
    			||reg_lycos.exec(referer)) {
    		
    		if (reg_yahoo.exec(referer)) {
    			qstr = getYahooQueryString(referer).toLowerCase();
    		} else if (reg_lycos.exec(referer)) {
    			qstr = getLycosQueryString(referer).toLowerCase();
    		} else {
    			qstr = getGoogleQueryString(referer).toLowerCase();
    		}
    
    		if (qstr.search(/sixt/) == -1){
    			// we have a google seach without 'sixt'
    			sem = getSemParam(url);
    			if (sem) {
    				keks['REFSEM'] = sem;
    				keks['REFR']   = (ab == 'A') ? 'SEMA' : 'SEMB';
    			} else {
    				keks['REFR']   = (ab == 'A') ? 'SEOOTA' : 'SEOOTB';
    			}
    		} else {
    			sem = getSemParam(url);
    			if (sem) {
    				keks['REFSEM'] = sem;
    				keks['REFR']   = (ab == 'A') ? 'SXSEMA' : 'SXSEMB';
    			} else {
    				keks['REFR']   = (ab == 'A') ? 'SXSEOOTA' : 'SXSEOOTB';
    			}
    		}
    	} else if (url.search(/utm_source/) != -1) {
    		var utm  = getUtmSource(url);
    		var chk = utm.substr(0, utm.indexOf("_"));
    		if (chk == 'a') {
    			keks['REFR'] = (ab == 'A') ? 'AFFA' : 'AFFB';
    		} else {
    			keks['REFR'] = (ab == 'A') ? 'LINKA' : 'LINKB';
    		}
    		
    	} else if (referer){
    		keks['REFR'] = (ab == 'A') ? 'LINKA' : 'LINKB';
    	} else {
    		keks['REFR'] = (ab == 'A') ? 'DIRA' : 'DIRB';
    	}
    	
    	return keks;
    }
    
    /**
     * return the hostname of the passed url
     * @param string str
     * @return string
     */
    function getHostname(str) {
    	var re = new RegExp('^(?:f|ht)tp(?:s)?\://([^/]+)', 'im');
    	if (str.match(re)) {
    		return str.match(re)[1].toString();
    	} else {
    		return '';
    	}
    }
    
    /**
     * extracts the google-query-string from a googlereferer
     */
    function getGoogleQueryString(googleref) {
    	Wertstart	= googleref.indexOf("&q=") + 3;
    	tmpstr		= googleref.substr(Wertstart, googleref.length);
    	Wertende	= tmpstr.indexOf("&");
    	querystring	= tmpstr.substring(0, Wertende);
    	return querystring;
    }
    
    function getBingQueryString(bingref) {
    	Wertstart	= bingref.indexOf("?q=") + 3;
    	tmpstr		= bingref.substr(Wertstart, bingref.length);
    	Wertende	= tmpstr.indexOf("&");
    	querystring	= tmpstr.substring(0, Wertende);
    	return querystring;
    }
    
    function getAskQueryString(askref) {
    	Wertstart	= askref.indexOf("?q=") + 3;
    	tmpstr		= askref.substr(Wertstart, askref.length);
    	Wertende	= tmpstr.indexOf("&");
    	querystring	= tmpstr.substring(0, Wertende);
    	return querystring;
    }
    
    /**
     * extracts the yahoo-query-string from a yahooreferer
     */
    function getYahooQueryString(yahooref) {
    	Wertstart	= yahooref.indexOf("&p=") + 3;
    	tmpstr		= yahooref.substr(Wertstart, yahooref.length);
    	Wertende	= tmpstr.indexOf("&");
    	querystring	= tmpstr.substring(0, Wertende);
    	
    	return querystring;
    }
    
    /**
     * extracts the yahoo-query-string from a lycosreferer
     */
    function getLycosQueryString(ref) {
    	Wertstart	= ref.indexOf("&query=") + 7;
    	tmpstr		= ref.substr(Wertstart, ref.length);
    	Wertende	= tmpstr.indexOf("&");
    	querystring	= tmpstr.substring(0, Wertende);
    	
    	return querystring;
    }
    
    /**
     * extracts the 'ppc' parameter from a url, if any
     * @author Benjamin Pentzold <benjamin.pentzold@sixt.de>
     * @param url
     * @return mixed
     */
    function getSemParam(url) {
    	if (url.search(/ppc/) != -1) {
    		start = url.indexOf("ppc=") + 4;
    		tmp   = url.substr(start, url.length);
    		ende  = tmp.indexOf("&");
    		out   = tmp.substring(0, ende);
    		return unescape(out);
    	} else {
    		return false;
    	}
    }
    
    /**
     * parses the json for a cookie
     * @author Benjamin Pentzold <benjamin.pentzold@sixt.de>
     * @param c
     * @return mixed
     */
    function parseFreqCookie(c) {
    	dt = new Date();
    	today = dt.getTime();
    	eval("f = " + c);
    	for (i in f) {
    		if (today - parseInt(f[i]) > 31536000000){
    			delete(f[i]);
    		}
    	}
    	x = 0;
    	g = {};
    	for (i in f) {
    		g[x] = f[i];
    		x++;
    	}
    	return g;
    }
    
    /**
     * fills the SX_JRN_TK cookie
     * @author Benjamin Pentzold <benjamin.pentzold@sixt.de>
     * @param url
     * @param referrer
     * @return void
     */
    function getJrnTrkCookie(url, referrer) {
    	var JRNT = {duri:location.hostname};
    	var ppcv = getPpcValue(url)
    	var ppc  = ppcv.toLowerCase();
    
    	if (/http:\/\/(.*)\.google(.*)/.exec(referrer)) { // google-search
    		SEO  = "google";
    		var qstr = getGoogleQueryString(referrer);
    	} else if (/http:\/\/(.*)yahoo(.*)/.exec(referrer)) { // yahoo-search
    		SEO  = "other";
    		var qstr = getYahooQueryString(referrer);
    	} else if (/http:\/\/(.*)\.bing\.(.*)\/?(.*)/.exec(referrer)) { // bing-search
    		SEO  = "other";
    		var qstr = getBingQueryString(referrer);
    	} else if (/http:\/\/(.*)\.search\.(.*)\/?(.*)/.exec(referrer)) { // search-search
    		SEO  = "other";
    		var qstr = getGoogleQueryString(referrer);
    	} else if (/http:\/\/(.*)\.aol.(.*)\/?(.*)/.exec(referrer)) { // aol-search
    		SEO  = "other";
    		var qstr = getGoogleQueryString(referrer);
    	} else if (/http:\/\/(.*)\.altavista.com\/?(.*)/.exec(referrer)) { // altavista-search
    		SEO  = "other";
    		var qstr = getGoogleQueryString(referrer);
    	} else if (/http:\/\/(.*)\.ask.com\/?(.*)/.exec(referrer)) { // ask-search
    		SEO  = "other";
    		var qstr = getAskQueryString(referrer);
    	} else if (/http:\/\/(.*)\.lycos.(.*)\/?(.*)/.exec(referrer)) { // lycos-search
    		SEO  = "other";
    		var qstr = getLycosQueryString(referrer);
    	} else {
    		SEO  = false;
    	}
    
    	var refDomain = getHostname(referrer);
    	JRNT.dref = refDomain;
    	var co  = checkREFR(referrer, url);
    
    	if (url.search(/utm_source/) != -1) {
    		var utm  = getUtmSource(url);
    		var utmc = getUtmContent(url);
    		var chk = utm.substr(0, utm.indexOf("_"));
    
    		switch (chk) {
    		case "nl":
    			 if (!SEO) JRNT.chlm = "NL";
    		break;
    		case "a":
    			if (!SEO) JRNT.chlm = "AFF";
    		break;
    		case "d":
    			if (!SEO) {
    				if (utm.search(/d_perf/) != -1) {
    					JRNT.chlm = "DP";
    				} else {
    					JRNT.chlm = "DB";
    				}
    			}
    		break;
    		case "coop":
    			if (!SEO) JRNT.chlm = "CO";
    		break;
    		case "pa":
    			if (!SEO) JRNT.chlm = "PA";
    		break;
    		case "sm":
    			if (!SEO) JRNT.chlm = "SM";
    		break;
    		case "eml":
    			if (!SEO) JRNT.chlm = "EML";
    		break;
    		case "sv":
    			if (!SEO) JRNT.chlm = "SV";
    		break;
    		}
    
    		JRNT.spc1 = (utm) ? utm : null;
    
    		if (utmc) {
    			if (SEO) {
    				JRNT.spc2 = qstr;
    			} else if(utmc) {
    				JRNT.spc2 = utmc;
    			} else {
    				JRNT.spc2 = null;
    			}
    		} else if (utm && !referrer) {
    			JRNT.spc3 = "COB";
    			JRNT.spc2 = null;
    		}
    		
    		if (utm && !referrer) {
    			JRNT.spc3 = "COB";
    		}
    	} else if (ppc) {
    		if (SEO == 'google') {
    			ppc1 = ppc.substr(0, ppc.indexOf("/"));
    			ppc2 = ppc.substr(ppc.indexOf("/")+1, ppc.length);
    
    			JRNT.chlm = (ppc2.search(/sixt/) != -1) ? "SXSEMG" : "SEMG";
    			JRNT.spc1 = ppc1;
    			JRNT.spc2 = ppc2;
    		} else if (SEO) {
    			ppc1 = ppc.substr(0, ppc.indexOf("/"));
    			ppc2 = ppc.substr(ppc.indexOf("/")+1, ppc.length);
    	
    			JRNT.chlm = (ppc2.search(/sixt/) != -1) ? "SXSEMOT" : "SEMOT";
    			JRNT.spc1 = ppc1;
    			JRNT.spc2 = ppc2;
    		}
    		JRNT.spc3 = (referrer) ? null : "COB";
    
    	} else if (co["REFR"] == "SXSEMA" || co["REFR"] == "SXSEMB") {
    		if (SEO == "google") {
    			JRNT.chlm = "SXSEMG";
    			JRNT.spc2 = qstr;
    		}
    		if (SEO)  {
    			JRNT.chlm = "SXSEMOT";
    			JRNT.spc2 = qstr;
    		}
    	} else if (co["REFR"] == "SEMA" || co["REFR"] == "SEMB") {
    		if (SEO == "google") {
    			JRNT.chlm = "SEMG";
    			JRNT.spc2 = qstr;
    		} else if (SEO)  {
    			JRNT.chlm = "SEMOT";
    			JRNT.spc2 = qstr;
    		}
    	} else if (co["REFR"] == "SEOA" || co["REFR"] == "SEOB") {
    		if (SEO == "google") { 
    			JRNT.chlm = "SEOG";
    			JRNT.spc2 = qstr;
    		} else if (SEO) {
    			JRNT.chlm = "SEOOT";
    			JRNT.spc2 = qstr;
    		}
    	} else if (co["REFR"] == "SXSEOA" || co["REFR"] == "SXSEOB") {
    		if (SEO == "google") {
    			JRNT.chlm = "SXSEOG";
    			JRNT.spc2 = qstr;
    		} else if (SEO) {
    			JRNT.spc2 = qstr;
    			JRNT.chlm = "SXSEOOT";
    		}
    	} else if (co["REFR"] == "SEOOTA" || co["REFR"] == "SEOOTB") {
    		JRNT.chlm = "SEOOT";
    		JRNT.spc2 = qstr;
    	} else if (co["REFR"] == "SXSEOOTA" || co["REFR"] == "SXSEOOTB") {
    		JRNT.chlm = "SXSEOOT";
    		JRNT.spc2 = qstr;
    	} else if (referrer) {
    		var ref_domain = getHostname(referrer);
    		if (/(.*)sixt(.*)/.exec(ref_domain)) {
    			JRNT.chlm = "SXINT";
    		} else {
    			JRNT.chlm = "LINK";
    		}
    	} else {
    		JRNT.chlm = "DIR";
    	}
    	
    	return JRNT;
    }
    
    /**
     * extracts the 'utm_source' param from a url-string
     * @param string p url-string
     * @return string
     */
    function getUtmSource(p) {
    	if (url.search(/utm_source/) != -1) {
    		start = url.indexOf("utm_source=") + 11;
    		tmp   = url.substr(start, url.length);
    		ende  = (tmp.indexOf("&") != -1) ? tmp.indexOf("&") : tmp.length;
    		out   = tmp.substring(0, ende);
    		return unescape(out);
    	} else {
    		return false;
    	}
    }
    
    /**
     * extracts the "utm_content" param from a url-string
     * @param string p url-string
     * @return
     */
    function getUtmContent(p) {
    	if (url.search(/utm_content/) != -1) {
    		start = url.indexOf("utm_content=") + 12;
    		tmp   = url.substr(start, url.length);
    		ende  = (tmp.indexOf("&") != -1) ? tmp.indexOf("&") : tmp.length;
    		out   = tmp.substring(0, ende);
    		return unescape(out);
    	} else {
    		return false;
    	}
    }
    
    /**
     * extracts the "ppc" value from a url-string
     * @param string p url-string
     * @return string
     */
    function getPpcValue(p) {
    	if (url.search(/ppc/) != -1) {
    		start = url.indexOf("ppc=") + 4;
    		tmp   = url.substr(start, url.length);
    		ende  = (tmp.indexOf("&") != -1) ? tmp.indexOf("&") : tmp.length;
    		out   = tmp.substring(0, ende);
    		return unescape(out);
    	} else {
    		return '';
    	}
    }
    
    /**
     * Cookiesetter
     */
    function setCookie(name, wert, domain, expires, path, secure){
    	var cook = name + "=" + escape(wert);
    	cook += (domain) ? "; domain=" + domain : "";
    	cook += (expires) ? "; expires=" + expires : "";
    	cook += (path) ? "; path=" + path : "";
    	cook += (secure) ? "; secure" : "";
    	document.cookie = cook;
    }
    
    /**
     * Cookiegetter
     */
    function getCookie(name){
    	var i = 0;  //Suchposition im Cookie
    	var suche = name + "=";
    	while (i < document.cookie.length) {
    		if (document.cookie.substring(i, i + suche.length) == suche) {
    			var ende = document.cookie.indexOf(";", i + suche.length);
    			ende = (ende > -1) ? ende : document.cookie.length;
    			var cook = document.cookie.substring(i + suche.length, ende);
    			return unescape(cook);
    		}
    	i++;
    	}
    	return null;
    }
    
    /**
     * Cookieeraser
     */
    function eraseCookie(name, domain, path){
       var cook = "name=; expires=Thu, 01-Jan-70 00:00:01 GMT";
       cook += (domain) ? "domain=" + domain : "";
       cook += (path) ? "path=" + path : "";
       document.cookie = cook;
    }
    
    function obj_to_str(obj) {
        
        var str_wrap =  "\"";
        switch(obj.constructor) {
            case Object:
                var p = [];
                for(i in obj) { 
                    var e = '"' + obj_to_str(i,1) + '":' + obj_to_str(obj[i]);
                    p.push(e);
                }
                return '{' + p.join(', ') + '}';
            case Array:
                var p = [];
                for(i in obj) {
                    var e =  obj_to_str(obj[i]);
                    p.push(e);
                }
                return '[' + p.join(', ') + ']';              
            case String:                
                // key is object
                if (arguments.length > 1) {
                    str_wrap =  "";
                }               
                return str_wrap + handle_special_chars(obj, 1) + str_wrap; // quotes and special chars replacen
            case Number:
                return obj.toString();
            case Boolean:
                return obj.toString();
            case Function:
                return handle_special_chars(obj.toString() , 0); // quotes and special chars killen
        }
        return false;
    }
    
    function handle_special_chars(str, mod) {
        
        str =  str.replace(/\\/g, (mod? "\\\\"      : ""));
        str =  str.replace(/\n/g, (mod? "\\n"       : ""));
        str =  str.replace(/\r/g, (mod? "\\n"       : ""));
        str =  str.replace(/\t/g, (mod? "\\n"       : ""));            
        if (!mod) return str;
        
        str =  str.replace(/\"/g, (mod? "\\\""      : ""));
        return str;
    }
    
    function create_json(obj, objname) {
    	
        if (typeof obj != "object")  return false;
    
        this.tmp    =  "";
        var ret     =  obj_to_str(obj) ;
    
        return ret;
    }
    
    function checkHistory() {
    	
    	var Base64 = {
    			_keyStr : "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",
    			encode : function (input) {
    				var output = "";
    				var chr1, chr2, chr3, enc1, enc2, enc3, enc4;
    				var i = 0;
    				input = Base64._utf8_encode(input);
    				while (i < input.length) {
    					chr1 = input.charCodeAt(i++);
    					chr2 = input.charCodeAt(i++);
    					chr3 = input.charCodeAt(i++);
    					enc1 = chr1 >> 2;
    					enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);
    					enc3 = ((chr2 & 15) << 2) | (chr3 >> 6);
    					enc4 = chr3 & 63;
    					if (isNaN(chr2)) {
    						enc3 = enc4 = 64;
    					} else if (isNaN(chr3)) {
    						enc4 = 64;
    					}
    					output = output +
    					this._keyStr.charAt(enc1) + this._keyStr.charAt(enc2) +
    					this._keyStr.charAt(enc3) + this._keyStr.charAt(enc4);
    				}
    				return output;
    			},
    		 
    			decode : function (input) {
    				var output = "";
    				var chr1, chr2, chr3;
    				var enc1, enc2, enc3, enc4;
    				var i = 0;
    				if (typeof(input) == 'undefined') return false;
    				input = input.replace(/[^A-Za-z0-9\+\/\=]/g, "");
    				while (i < input.length) {
    					enc1 = this._keyStr.indexOf(input.charAt(i++));
    					enc2 = this._keyStr.indexOf(input.charAt(i++));
    					enc3 = this._keyStr.indexOf(input.charAt(i++));
    					enc4 = this._keyStr.indexOf(input.charAt(i++));
    					chr1 = (enc1 << 2) | (enc2 >> 4);
    					chr2 = ((enc2 & 15) << 4) | (enc3 >> 2);
    					chr3 = ((enc3 & 3) << 6) | enc4;
    					output = output + String.fromCharCode(chr1);
    					if (enc3 != 64) {
    						output = output + String.fromCharCode(chr2);
    					}
    					if (enc4 != 64) {
    						output = output + String.fromCharCode(chr3);
    					}
    				}
    				output = Base64._utf8_decode(output);
    				return output;
    			},
    		 
    			_utf8_encode : function (string) {
    				string = string.replace(/\r\n/g,"\n");
    				var utftext = "";
    				for (var n = 0; n < string.length; n++) {
    					var c = string.charCodeAt(n);
    					if (c < 128) {
    						utftext += String.fromCharCode(c);
    					}
    					else if((c > 127) && (c < 2048)) {
    						utftext += String.fromCharCode((c >> 6) | 192);
    						utftext += String.fromCharCode((c & 63) | 128);
    					}
    					else {
    						utftext += String.fromCharCode((c >> 12) | 224);
    						utftext += String.fromCharCode(((c >> 6) & 63) | 128);
    						utftext += String.fromCharCode((c & 63) | 128);
    					}
    				}
    				return utftext;
    			},
    		 
    		    _utf8_decode : function (utftext) {
    			    var string = "";
    				var i = 0;
    				var c = c1 = c2 = 0;
    		        while ( i < utftext.length ) {
    					c = utftext.charCodeAt(i);
    					if (c < 128) {
    						string += String.fromCharCode(c);
    						i++;
    					}
    					else if((c > 191) && (c < 224)) {
    						c2 = utftext.charCodeAt(i+1);
    						string += String.fromCharCode(((c & 31) << 6) | (c2 & 63));
    						i += 2;
    					}
    					else {
    						c2 = utftext.charCodeAt(i+1);
    						c3 = utftext.charCodeAt(i+2);
    						string += String.fromCharCode(((c & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63));
    						i += 3;
    					}
    				}
    				return string;
    			}
    	}
    	
    	var ep = [
    		'aHR0cDovL3d3dy5ldXJvcGNhci5kZQ==',
    		'aHR0cDovL3d3dy5ldXJvcGNhci5jb20=',
    	];
    
    	var avhz = [
    		'aHR0cDovL3d3dy5oZXJ0ei5kZQ==',
    		'aHR0cDovL3d3dy5oZXJ0ei5jb20=',
    		'aHR0cDovL3d3dy5hdmlzLmRl',
    		'aHR0cDovL3d3dy5hdmlzLmNvbQ==',
    	];
    	            
    
    	var prsvgl = [
    	  'aHR0cDovL3d3dy5iaWxsaWdlcm1pZXR3YWdlbi5kZQ==',
    	  'aHR0cDovL3d3dy5taWV0d2FnZW5tYXJrdC5kZQ==',
    	  'aHR0cDovL3d3dy5lbWlldHdhZ2VuLmRl',
    	  'aHR0cDovL3d3dy5tLWJyb2tlci5kZQ==',
    	  'aHR0cDovL3d3dy5paHJtaWV0d2FnZW4uZGU=',
    	  'aHR0cDovL3d3dy5taWV0d2FnZW4tYXVza3VuZnQuZGU=',
    	  'aHR0cDovL3d3dy52cm9vbXZyb29tdnJvb20uY29t',
    	  'aHR0cDovL3d3dy5jYXItaGlyZS1jZW50cmUuY28udWs=',
    	  'aHR0cDovL3d3dy5jYXJoaXJlc2VhcmNoLmNvLnVr',
    	  'aHR0cDovL3d3dy5jYXJyZW50YWxzLmNvLnVr',
    	  'aHR0cDovL3d3dy5jaGVlcGNhci5jby51aw==',
    	  'aHR0cDovL3d3dy5jb21wYXJlY2FycmVudGFscy5jby51aw==',
    	  'aHR0cDovL3d3dy5jb21wYXJlLWNhci1yZW50YWwuY28udWs=',
    	  'aHR0cDovL3d3dy5jYXJyZW50YWxzLmNvbQ==',
    	  'aHR0cDovL3d3dy5jYXJoaXJlZGlyZWN0LmNvLnVr',
    	  'aHR0cDovL3d3dy5jYXJoaXJlZXhwcmVzcy5jby51aw==',
    	  'aHR0cDovL3d3dy5jYXJoaXJlb25saW5lLm5ldA==',
    	  'aHR0cDovL3d3dy5jYXItcmVudGFsLWhpcmUuY28udWs=',
    	];
    
    	var EP		= false;
    	var RAC		= false;
    	var PRSVGL	= false;
    	
    	document.write('<style>');
    	document.write('a#ep:link {color: #0000FF;}');
    	document.write('a#ep:visited {color: #FF0000;}');
    	document.write('</style>');
    	
    	var div = document.createElement("div");
    	div.id = "tmp_div";
    	div.style.width = "1px";
    	div.style.heigth = "1px";
    	div.style.top = "0";
    	div.style.left = "0";
    	$("body").append(div);
    	
    	for (var i = 0; i < ep.length; i++) {
    	  var link = document.createElement("a");
    	  link.id = "ep";
    	  link.href = Base64.decode(ep[i]);
    	  link.innerHTML = Base64.decode(ep[i]);
    	  $("tmp_div").append(link);
    	  if (document.defaultView) {
    	    var color = document.defaultView.getComputedStyle(link,null).getPropertyValue("color");
    	  } else {
    	    var color = link.currentStyle['color'];
    	  }
    	  $("tmp_div").remove(link);
    	  if (color == "rgb(0, 0, 255)" || color == "#0000ff") { // not visited
             EP = (EP) ? EP : false;
    	  } else {
    		  EP = true;
    	  }
    	} 
    
    	for (var i = 0; i < avhz.length; i++) {
    	  var link = document.createElement("a");
    	  link.id = "ep";
    	  link.href = Base64.decode(avhz[i]);
    	  link.innerHTML = Base64.decode(avhz[i]);
    	  $("tmp_div").append(link);
    	  if (document.defaultView) {
    	    var color = document.defaultView.getComputedStyle(link,null).getPropertyValue("color");
    	  } else {
    	    var color = link.currentStyle['color'];
    	  }
    	  $("tmp_div").remove(link);
    	  if (color == "rgb(0, 0, 255)" || color == "#0000ff") {
            RAC = (RAC) ? RAC : false;
    	  } else {
    		  RAC = true;
    	  }
    	} 
    
    	for (var i = 0; i < prsvgl.length; i++) {
    	  var link = document.createElement("a");
    	  link.id = "ep";
    	  link.href = Base64.decode(prsvgl[i]);
    	  link.innerHTML = Base64.decode(prsvgl[i]);
    	  $("tmp_div").append(link);
    	  if (document.defaultView) {
    	    var color = document.defaultView.getComputedStyle(link,null).getPropertyValue("color");
    	  } else {
    	    var color = link.currentStyle['color'];
    	  }
    	  $("tmp_div").remove(link);
    	  if (color == "rgb(0, 0, 255)" || color == "#0000ff") {
              PRSVGL =  (PRSVGL) ? PRSVGL : false;
    	  } else {
              PRSVGL = true;
    	  }
    	} 
    	$("tmp_div").remove();
    	return "{\"EP\":" + EP + ", \"RAC\":" + RAC + ", \"PRSVGL\":" + PRSVGL +"}";
    }



