(function($j) {
	$j.fn.pogoUserMgr = function(options) {
		return new function() {
		    this.tth = null;
		    this.withToken = function(doThis) {
		    	if (this.tth != null) {
		    		doThis(this.tth);
		    		return;
		    	}
			    var thisMgr = this;
				var queryUrl =  "";
    			if (typeof options != 'undefined') {
    				if (typeof options.protocol != 'undefined') queryUrl += options.protocol;
    				if (typeof options.host != 'undefined') queryUrl += options.host;
    			}
				queryUrl += "/services/v2/userTransitory/ticket";
				$j.ajax({
					url: queryUrl,
					context: document.body,
					dataType: "text",
					success: function(doc){
						thisMgr.tth = { IC_TICKET : doc, IC_RESULT : eval(doc) };
						doThis(thisMgr.tth);
					},
					error: function(jqXHR, textStatus, errorThrown) {
						alert("An error occurred contacting the server, please try again later\n" + jqXHR.status + "\n" + textStatus + "\n" + errorThrown);
					}
				});
			}
		    var getQueryUrl = function(path) {
    			var queryUrl = "";
    			var site = "pogo";
    			if (typeof options != 'undefined') {
    				if (typeof options.protocol != 'undefined') queryUrl += options.protocol;
    				if (typeof options.host != 'undefined') queryUrl += options.host;
    				if (typeof options.site != 'undefined') site = options.site;
    			}
    			queryUrl += path + "?channel=" + site;
				return queryUrl;
    		}
    		var escapeXmlAttribute = function(str) {
    			str = str.replace(/&/g, '&#38;');
    			str = str.replace(/</g, '&#60;');
    			str = str.replace(/"/g, '&#34;');
    			return str;
    		}
			this.signIn = function(info) {
				var xml = '<?xml version="1.0" encoding="UTF-8" standalone="yes"?><accountinfo screenname="' + escapeXmlAttribute(info.screenname) 
					+ '" password="' + escapeXmlAttribute(info.password) + '"/>';
				var queryUrl = getQueryUrl("/services/v2/userTransitory/login") + "&remember=" + info.remember;
			    var thisMgr = this;
				this.withToken(function(headers) {
					$j.ajax({
						url: queryUrl,
						context: document.body,
						dataType: "xml",
						data: xml,
						type: "POST",
						processData : false,
						contentType : "application/xml",
						headers : headers,
						success: function(doc){
							thisMgr.tth = null;
							var lKey = $j(doc).find("session-token").attr('value');
							var rememberCookie = "";
							if (info.remember) rememberCookie = $j(doc).find("remember-cookie-info").text();
							info.success(lKey, rememberCookie);
						},
						error: function(jqXHR, textStatus, errorThrown) {
							var errors = new Array();
							try {
								var doc = $j.parseXML(jqXHR.responseText);
								$j(doc).find("login-info").each(function() {
									errors.push($j(this).attr('detail'));							
								});
							}
							catch (err) {
								errors.push("An error occurred contacting the server, please try again later");
							}
							info.error(errors);
						}
					});
				});
			}
			this.signUp = function(info) {
			    var thisMgr = this;
				var xml = '<?xml version="1.0" encoding="UTF-8" standalone="yes"?><accountinfo country="' + info.country + '" email="' + escapeXmlAttribute(info.email) 
					+ '" birth_year="' + escapeXmlAttribute(info.year) + '" birth_month="' + info.month + '" birth_day="' + info.day + '" gender="' + info.gender 
					+ '" screenname="' + escapeXmlAttribute(info.screenname) + '" password="' + escapeXmlAttribute(info.password) 
					+ '" regkey="' + info.guestReg + '" roomkey="' + info.roomKey + '"/>';
				var queryUrl = getQueryUrl("/services/v2/userTransitory/register");
				queryUrl += "&send_email=true"
				this.withToken(function(headers) {
					$j.ajax({
						url: queryUrl,
						context: document.body,
						dataType: "xml",
						data: xml,
						type: "POST",
						processData : false,
						contentType : "application/xml",
						headers : headers,
						success: function(doc){
							thisMgr.tth = null;
							info.success();
						},
						error: function(jqXHR, textStatus, errorThrown) {
							var errors = { };
							try {
								var doc = $j.parseXML(jqXHR.responseText);
								$j(doc).find("field").each(function() {
									var fieldName = $j(this).attr('name');							
									var reason = $j(this).attr('reason');
									var suggestedScreenNames = null;
									var ssn = $j(this).attr('suggested-screennames');
									if (ssn != null) {
										suggestedScreenNames = ssn.split(" ");
									}
									errors[fieldName] = { reason : reason, suggestedScreenNames : suggestedScreenNames };							
								});
							}
							catch (err) {
								errors["none"] = { reason : "An error occurred contacting the server, please try again later", suggestedScreenNames : null };
							}
							info.error(errors);
						}
					});
				});
			}
    	}
    }
})(jQuery);

