if (!console) {
	var console = {
		log: function() {}
	}
}

function serializeObject(obj) {
	var array = [];
	for (var key in obj) {
		array.push(key + '=' + encodeURIComponent(obj[key]));
	}
	return array.join('&');
}

var Cookie = {
	
	sid: null,
	custStatus: null,
	cookieId: "windowshop",
	
	initialize: function() {
		with (this) {
			sid = readCookie(cookieId);
			// doesn't have sid sid: new customer
			if (sid == null) {
				sid = generateSid();
				createCookie(cookieId, sid, 90);
				newUser = true;
				custStatus = "new";
			} 
			// has sid: repeat customer
			else {
				custStatus = "repeat";
			}
			
			// can't access sid: cookies disabled
			if (!readCookie(cookieId)) {
				custStatus = "noCookie";
			}
		}
	},

	/* STARFISH ID functions */
	//a function which generates a string of four random characters
	// ((1 + random(0 to 1) * 65446 | truncate to int).convert to base 36
	four: function() {
		return (((1+Math.random()) * 0x10000 )|0).toString(36);
	},
	
	// SIDs are loosely unique.
	generateSid: function() {
   		return (this.four() + this.four() + this.four() + this.four());
	},
	
	/* COOKIE functions */
	createCookie: function(name, value, days) {
		if (days) {
			var date = new Date();
			date.setTime(date.getTime()+(days*24*60*60*1000));
			var expires = "; expires="+date.toGMTString();
		}
		else var expires = "";
		document.cookie = name+"="+value+expires+"; path=/";
	},
	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);
	},
	errorLog: function(a, b) {
		this.log({"error": a, "errorMessage": b});

	},
	log: function(obj) {
		obj.sid = Cookie.sid;
		obj.d = new Date().getTime();
		
		var image = new Image();
		image.src = "/starfish.gif?" + serializeObject(obj);
	}
}

Cookie.initialize();


var Feedback = {
	initialize: function() {
		
		$('body').prepend(
	'<div id="feedbackForm" style="display: none;"> \
		<div id="feedbackHeader">\
			<h3 class="flyout">Feedback</h3>\
			<div id="feedbackFormClose"><a class="close">x</a></div>\
		</div>\
		<div id="feedbackContent">\
			<div id="feedbackInput">\
				<form action="" id="feedback">\
					<label for="comments">Comments</label>\
					<textarea id="comments" name="comments"></textarea>\
					<label for="name">Name</label>\
					<input id="name" name="name" type="text" />\
					<label for="email">Email</label>\
					<input id="email" name="email" type="text" />\
					<input id="sendFeedbackButton" type="submit" value="Submit" />\
				</form>\
			</div>\
			<div id="feedbackReview">\
				<h5>Thank you for your feedback!</h5>\
				<div id="commentsReview" class="reviewTextArea"></div>\
				<div id="nameReview" class="reviewText"></div>\
				<div id="emailReview" class="reviewText"></div>\
				<input id="closeFeedbackButton" type="button" value="Close" />\
			</div>\
		</div>\
	</div>');
		
		
		$('#feedbackLink').click(Feedback.show);
		$('#feedbackFormClose').click(Feedback.hide);
		$('#feedbackFormClose').hover(
	      function () {
	        $(this).addClass("closeHover");
	    }, 
	      function () {
	        $(this).removeClass("closeHover");
	    });
		
		$('#closeFeedbackButton').click(Feedback.hide);
		$('form#feedback').submit(function() {
			Feedback.send();
			return false;
		});
	},
	
	show: function() {
		
		$('#feedbackReview').hide();
		$('#feedbackInput').show();
		$('#feedbackForm').css("top", $(document).height() - 390 + 'px');
		$('#feedbackForm').fadeIn("slow", function() { $('#comments').get(0).focus(); } );
		return false;
	},
	hide: function() {
		$('#feedbackForm').hide();
		return false;
	},
	escapeMarkup: function(val) {
		return val.replace(/</g, "&lt;").replace(/>/g, "&gt;").replace(/javascript/i, "");
	},
	send: function(){
		//should we validate? if so, it should go here.
		
		
		//
		var feedback = {
			action: "feedback",
			name: Feedback.escapeMarkup($('#name').val()),
			email: Feedback.escapeMarkup($('#email').val()),
			comments: Feedback.escapeMarkup($('#comments').val())
		};
		
		// clear out the comments, but leave the name/email in case they want to submit more comments
		$('#nameReview').html('Name: ' + feedback.name);
		$('#emailReview').html('Email: ' + feedback.email);
		$('#commentsReview').html(feedback.comments);
		
		$('#feedbackInput').hide();
		$('#feedbackReview').show();
		
		//TODO: query string might get truncated by browser/server if it's too long. Impose limit.
		//console.log(serializeObject(feedback));
		try {
			Cookie.log(feedback);
		} catch (e) {
			console.log(e)
		}
	}
};
Feedback.initialize();


var BrowserInfo = {
	initialize: function() {
		this.browserDetect();
		var win = $(window);
		var browserInfo = {
			action: "browser",
			w: win.width(),
			h: win.height(),
			host: window.location.host,
			path: window.location.pathname,
			qs: window.location.search,
			hash: window.location.hash,
			ref: document.referrer,
			br: this.browser + this.version,
			os: this.OS,
			status: Cookie.custStatus
		}		
		
		Cookie.log(browserInfo);
	},
	
	/* BROWSER INSTRUMENTATION */
	
	browserDetect: function () {
		this.browser = this.searchString(this.dataBrowser) || "unknown";
		this.version = this.searchVersion(navigator.userAgent)
			|| this.searchVersion(navigator.appVersion)
			|| "unknown";
		this.OS = this.searchString(this.dataOS) || "unknown";
	},
	searchString: function (data) {
		for (var i=0;i<data.length;i++)	{
			var dataString = data[i].string;
			var dataProp = data[i].prop;
			this.versionSearchString = data[i].versionSearch || data[i].identity;
			if (dataString) {
				if (dataString.indexOf(data[i].subString) != -1)
					return data[i].identity;
			}
			else if (dataProp)
				return data[i].identity;
		}
	},
	searchVersion: function (dataString) {
		var index = dataString.indexOf(this.versionSearchString);
		if (index == -1) return;
		return parseFloat(dataString.substring(index+this.versionSearchString.length+1));
	},
	dataBrowser: [
		{ string: navigator.userAgent,subString: "OmniWeb",versionSearch: "OmniWeb/",identity: "OmniWeb" },
		{ string: navigator.vendor,subString: "Apple",identity: "Safari" },
		{ prop: window.opera,identity: "Opera" },
		{ string: navigator.vendor,subString: "iCab",identity: "iCab" },
		{ string: navigator.vendor,subString: "KDE",identity: "Konqueror" },
		{ string: navigator.userAgent,subString: "Firefox", identity: "Firefox" },
		{ string: navigator.vendor,	subString: "Camino", identity: "Camino"	},
		// for newer Netscapes (6+)
		{ string: navigator.userAgent,subString: "Netscape",identity: "Netscape" },
		{ string: navigator.userAgent, subString: "MSIE", identity: "Explorer",	versionSearch: "MSIE" },
		{ string: navigator.userAgent, subString: "Gecko", identity: "Mozilla",	versionSearch: "rv"	},
		// for older Netscapes (4-)
		{ string: navigator.userAgent, subString: "Mozilla", identity: "Netscape", versionSearch: "Mozilla" }
	],
	dataOS: [
		{ string: navigator.platform, subString: "Win", identity: "windows"	},
		{ string: navigator.platform, subString: "Mac", identity: "mac" },
		{ string: navigator.platform, subString: "Linux", identity: "linux"	}
	]
	
	
	
}
BrowserInfo.initialize();
