// Logger

window.$Logger = new function() {


	var $this = this;
		

	// Variables
	
	var $client = false;
	var $session = false;
	
	var $remoteserver = 'http://pp-poolen.groundlogic.se/';


	// Constructor

	jQuery(document).ready(function(){ $this.init(); });


	// Init
	
	this.init = function() {

		this.track('load','page');
		
	};
	
	
	// Events

	
    // Client
	
	this.client = function() {
		if ($client) return $client;
		var client = {};
		client.location = window.location.toString();
		client.useragent = navigator.userAgent.toString()
		client.referrer = "";
		if (parent.document.referrer) {
			client.referrer = parent.document.referrer.toString();
		} else {
			client.referrer = document.referrer.toString();
		};
		client.flash = "";
		/*
		if (swfobject) {
			var fl = swfobject.getFlashPlayerVersion();
			client.flash = (fl.major + "." + fl.minor + "." + fl.release).toString();
		};
		*/
		client.timezone = ((new Date()).getTimezoneOffset()/60).toString();
		client.cookies = (!!document.cookie).toString();
		$client = client;
		return client;
	};


    // Session
	
	this.session = function() {
		if ($session) return $session;
		var session = this.getUserSession();
		$session = session;
		return session;
	};
	
	this.getUserSession = function() {
		var cookie = '_gls_session';
		var cookiesession = $Logic.Cookie.get(cookie);
		var session = (cookiesession) ? cookiesession : this.getUserTrack()+"."+this.getSessionMark();
		$Logic.Cookie.set(cookie,session,0,'/');
		return session;
	};

	this.getUserTrack = function() {
		var cookie = '_gls_track';
		var cookietrack = $Logic.Cookie.get(cookie);
		var track = (cookietrack) ? cookietrack : this.getUserMark();
		$Logic.Cookie.set(cookie,track,365,'/');
		return track;
	};

	this.getUserMark = function() {
		var chars = "0123456789abcdef";
		var mark = new Date().getTime().toString().substring(0,10) + ".";
		for (var i = 0; i < 10; ++i) mark += chars.charAt(Math.floor(Math.random()*chars.length));
		return mark;
	};

	this.getSessionMark = function() {
		var mark = new Date().getTime().toString().substring(0,10);
		return mark;
	};
		

    // Track
	
	this.track = function(event,object,info) {
		var params = {
			user: '',
			session: this.session(),
			data: this.client()
		};
		params.data.page = '';
		params.data.layer = 'html';
		if (event) params.data.event = event;
		if (object) params.data.object = object;
		params.data.info = ''; if (info) params.data.info = info.toString();
		this.send({ id:0, method:'store', params:params });
	};

	this.prepareData = function(requestData) {
		var data = JSON.stringify(requestData);
		data = data.replace(/:\s*(undefined|false|null)/g, ': ""');
		data = data.replace('=','%3D');
		data = data.replace('&','%26');
		data = jQuery.base64Encode(data);
		data = encodeURIComponent(data);
		return data;
	};
		
	this.send = function(data) {
		var base = $remoteserver;
		var location = base+"logger/track" + ".ashx";
		var data = this.prepareData(data);
		//$.ajax({ type: 'GET', url: location + '?' + data });
		var loggerimg = new Image(1,1);
		loggerimg.src = location + '?' + data;
	};


};


// $.base64Encode
	
(function($){
    
    var keyString = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
    
    var uTF8Encode = function(string) {
    	string = string.replace(/\x0d\x0a/g, "\x0a");
    	var output = "";
    	for (var n = 0; n < string.length; n++) {
    		var c = string.charCodeAt(n);
    		if (c < 128) {
    			output += String.fromCharCode(c);
    		} else if ((c > 127) && (c < 2048)) {
    			output += String.fromCharCode((c >> 6) | 192);
    			output += String.fromCharCode((c & 63) | 128);
    		} else {
    			output += String.fromCharCode((c >> 12) | 224);
    			output += String.fromCharCode(((c >> 6) & 63) | 128);
    			output += String.fromCharCode((c & 63) | 128);
    		}
    	}
    	return output;
    };
    
    var uTF8Decode = function(input) {
    	var string = "";
    	var i = 0;
    	var c = c1 = c2 = 0;
    	while ( i < input.length ) {
    		c = input.charCodeAt(i);
    		if (c < 128) {
    			string += String.fromCharCode(c);
    			i++;
    		} else if ((c > 191) && (c < 224)) {
    			c2 = input.charCodeAt(i+1);
    			string += String.fromCharCode(((c & 31) << 6) | (c2 & 63));
    			i += 2;
    		} else {
    			c2 = input.charCodeAt(i+1);
    			c3 = input.charCodeAt(i+2);
    			string += String.fromCharCode(((c & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63));
    			i += 3;
    		}
    	}
    	return string;
    }
    
    $.extend({
    	base64Encode: function(input) {
    		var output = "";
    		var chr1, chr2, chr3, enc1, enc2, enc3, enc4;
    		var i = 0;
    		input = uTF8Encode(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 + keyString.charAt(enc1) + keyString.charAt(enc2) + keyString.charAt(enc3) + keyString.charAt(enc4);
    		}
    		return output;
    	},
    	base64Decode: function(input) {
    		var output = "";
    		var chr1, chr2, chr3;
    		var enc1, enc2, enc3, enc4;
    		var i = 0;
    		input = input.replace(/[^A-Za-z0-9\+\/\=]/g, "");
    		while (i < input.length) {
    			enc1 = keyString.indexOf(input.charAt(i++));
    			enc2 = keyString.indexOf(input.charAt(i++));
    			enc3 = keyString.indexOf(input.charAt(i++));
    			enc4 = keyString.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 = uTF8Decode(output);
    		return output;
    	}
    });
    
})(jQuery);


/*
 * jQuery JSON Plugin
 * version: 1.0 (2008-04-17)
 *
 * This document is licensed as free software under the terms of the
 * MIT License: http://www.opensource.org/licenses/mit-license.php
 *
 * Brantley Harris technically wrote this plugin, but it is based somewhat
 * on the JSON.org website's http://www.json.org/json2.js, which proclaims:
 * "NO WARRANTY EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK.", a sentiment that
 * I uphold.  I really just cleaned it up.
 *
 * It is also based heavily on MochiKit's serializeJSON, which is 
 * copywrited 2005 by Bob Ippolito.
 */
 
(function($) {   
    function toIntegersAtLease(n) 
    // Format integers to have at least two digits.
    {    
        return n < 10 ? '0' + n : n;
    }

    Date.prototype.toJSON = function(date)
    // Yes, it polutes the Date namespace, but we'll allow it here, as
    // it's damned usefull.
    {
        return this.getUTCFullYear()   + '-' +
             toIntegersAtLease(this.getUTCMonth()) + '-' +
             toIntegersAtLease(this.getUTCDate());
    };

    var escapeable = /["\\\x00-\x1f\x7f-\x9f]/g;
    var meta = {    // table of character substitutions
            '\b': '\\b',
            '\t': '\\t',
            '\n': '\\n',
            '\f': '\\f',
            '\r': '\\r',
            '"' : '\\"',
            '\\': '\\\\'
        };
        
    $.quoteString = function(string)
    // Places quotes around a string, inteligently.
    // If the string contains no control characters, no quote characters, and no
    // backslash characters, then we can safely slap some quotes around it.
    // Otherwise we must also replace the offending characters with safe escape
    // sequences.
    {
        if (escapeable.test(string))
        {
            return '"' + string.replace(escapeable, function (a) 
            {
                var c = meta[a];
                if (typeof c === 'string') {
                    return c;
                }
                c = a.charCodeAt();
                return '\\u00' + Math.floor(c / 16).toString(16) + (c % 16).toString(16);
            }) + '"';
        }
        return '"' + string + '"';
    };
    
    $.toJSON = function(o, compact)
    {
        var type = typeof(o);
        
        if (type == "undefined")
            return "undefined";
        else if (type == "number" || type == "boolean")
            return o + "";
        else if (o === null)
            return "null";
        
        // Is it a string?
        if (type == "string") 
        {
            return $.quoteString(o);
        }
        
        // Does it have a .toJSON function?
        if (type == "object" && typeof o.toJSON == "function") 
            return o.toJSON(compact);
        
        // Is it an array?
        if (type != "function" && typeof(o.length) == "number") 
        {
            var ret = [];
            for (var i = 0; i < o.length; i++) {
                ret.push( $.toJSON(o[i], compact) );
            }
            if (compact)
                return "[" + ret.join(",") + "]";
            else
                return "[" + ret.join(", ") + "]";
        }
        
        // If it's a function, we have to warn somebody!
        if (type == "function") {
            throw new TypeError("Unable to convert object of type 'function' to json.");
        }
        
        // It's probably an object, then.
        var ret = [];
        for (var k in o) {
            var name;
            type = typeof(k);
            
            if (type == "number")
                name = '"' + k + '"';
            else if (type == "string")
                name = $.quoteString(k);
            else
                continue;  //skip non-string or number keys
            
            var val = $.toJSON(o[k], compact);
            if (typeof(val) != "string") {
                // skip non-serializable values
                continue;
            }
            
            if (compact)
                ret.push(name + ":" + val);
            else
                ret.push(name + ": " + val);
        }
        return "{" + ret.join(", ") + "}";
    };
    
    $.compactJSON = function(o)
    {
        return $.toJSON(o, true);
    };
    
    $.evalJSON = function(src)
    // Evals JSON that we know to be safe.
    {
        return eval("(" + src + ")");
    };
    
    $.secureEvalJSON = function(src)
    // Evals JSON in a way that is *more* secure.
    {
        var filtered = src;
        filtered = filtered.replace(/\\["\\\/bfnrtu]/g, '@');
        filtered = filtered.replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, ']');
        filtered = filtered.replace(/(?:^|:|,)(?:\s*\[)+/g, '');
        
        if (/^[\],:{}\s]*$/.test(filtered))
            return eval("(" + src + ")");
        else
            throw new SyntaxError("Error parsing JSON, source is not valid.");
    };
})(jQuery);



// Class

window.$Logic = {};

$Logic.Cookie = new function() {


	var $this = this;


	// Variables
	
	
	// Functions

	this.set = function(name,value,days,path,domain,secure) {
		var expires = 0;
		if (days) {
			date = new Date();
			date.setTime(date.getTime()+(days*24*60*60*1000));
			expires = date;
		}
		var cookie = name + "=" + escape(value) +
		((expires) ? "; expires=" + expires.toGMTString() : "") +
		((path) ? "; path=" + path : "; path=/") +
		((domain) ? "; domain=" + domain : "") +
		((secure) ? "; secure" : "");
		document.cookie = cookie;
	}
	
	this.get = function(variable) {
		var variable = variable + "=";
		var vars = document.cookie.split(';');
		for (var i=0;i<vars.length;i++) {
			var c = vars[i];
			while (c.charAt(0)==' ') c = c.substring(1,c.length);
			if (c.indexOf(variable) == 0) return c.substring(variable.length,c.length);
		}
	}
	
	this.del = function(name) {
		$this.set(name,"",-1);
	}
	
	this.check = function(name) {
		return $this.get(name);
	}


};


