function LiveChat() {
	var self = this;
	var query = new SQuery();
	var sending = false;
	var sa = new Array();
	var sm = new Array();
	var sc = 0;
	var sp = 0;
	var rm;
	var sto;
	var check = true;
	var rated = false;
	var canrate = false;
	var queue = true;
	var sound = true;
	var exit = false;
	var unload = true;
	query.timeout = 15000;
	query.Uninitialized = Uninitialized;
	query.Loading = Loading;
	query.Loaded = Loaded;
	query.Interactive = Interactive;
	query.Completed = Completed;
	query.Error = Error;
	query.Busy = Busy;
	query.TimeOut = TimeOut;
	this.show = function() {
		document.getElementById("init").className = "promptinfo";
		document.getElementById("start").className = "promptinfo";
	}
	this.init = function() {
		var sca = sc;
		sc++;
		sa[sca] = "init";
		sm[sca] = new Array(document.getElementById("fnickname").value, document.getElementById("finitmessage").value, document.getElementById("ftimezone").value, document.getElementById("flanguage").value);
		Send();
		return(false);
	}
	this.queue = function() {
		var sca = sc;
		sc++;
		sa[sca] = "queue";
		sm[sca] = "";
		Send();
	}
	this.chat = function(send) {
		var mv;
		var ml;
		var sca = sc;
		sc++;
		if (send) {
			mv = document.getElementById("fmessage").value;
			if (ml = mv.length) {
				document.getElementById("send").disabled = true;
				if (mv.substr(ml - 2) == "\r\n") {
					mv = mv.substr(0, ml - 2);
				} else if (mv.substr(ml - 2) == "\n\n") {
					mv = mv.substr(0, ml - 2);
				} else if (mv.substr(ml - 1) == "\n") {
					mv = mv.substr(0, ml - 1);
				}
				sa[sca] = "chat";
				sm[sca] = mv;
				document.getElementById("fmessage").value = "";
				document.getElementById("fmessage").focus();
			} else {
				sc--;
			}
		} else {
			sa[sca] = "check";
			sm[sca] = mv;
		}
		Send();
		return(false);
	}
	this.resize = function() {
		var height = 0;
		var width = 0;
		var useragent = window.navigator.userAgent.toLowerCase();
		var show = document.getElementById("show");
		if ((useragent.indexOf("gecko") > -1) || (useragent.indexOf("msie 7") > -1) || (useragent.indexOf("msie 8") > -1)) {
			height = document.documentElement.clientHeight;
		} else {
			height = document.body.clientHeight;
		}
		if ((document.getElementById("chat").className == "hidden") && exit) {
			height = height - 185;
		} else {
			height = height - 255;
		}
		if (height > 200) {
			show.style.height = height + "px";
		} else {
			show.style.height = "200px";
		}
		show.scrollTop = show.scrollHeight - show.offsetHeight;
		if ((width = document.body.offsetWidth - 100) > 200) {
			document.getElementById("fmessage").style.width = width + "px";
		} else {
			document.getElementById("fmessage").style.width = "200px";
		}
	}
	this.checksend = function(event) {
		if (event.keyCode == 13) {
			if (window.navigator.userAgent.toLowerCase().indexOf("khtml") > -1) {
				if (!event.ctrlKey) {
					this.chat(true);
				}
			} else if (!event.shiftKey) {
				this.chat(true);
			}
		}
	}
	this.attachment = function() {
		if (!exit) {
			var w = window.open("livesupport.php?id=" + cid + "&action=upload", "upload", "left=0px, height=500px, location=yes, menubar=no, resizable=yes, scrollbars=no, toolbar=no, top=0px, width=500px");
			w.focus();
		}
		return(false);
	}
	this.rate = function(check) {
		if (canrate) {
			if (!rated) {
				var w = window.open("livesupport.php?id=" + cid + "&action=rate", "rate", "left=0px, height=500px, location=yes, menubar=no, resizable=yes, scrollbars=no, toolbar=no, top=0px, width=500px");
				w.focus();
			}
		} else if (check) {
			window.alert("Please rate the quality of the support after Customer Service access. Thank you!");
		}
		return(false);
	}
	this.sound = function() {
		var sca = sc;
		sc++;
		sa[sca] = "sound";
		if (sound) {
			sound = false;
			document.getElementById("soundicon").className = "soundoff";
			document.getElementById("soundicon").alt = "On";
			sm[sca] = "0";
		} else {
			sound = true;
			document.getElementById("soundicon").className = "soundon";
			document.getElementById("soundicon").alt = "Off";
			sm[sca] = "1";
		}
		Send();
		return(false);
	}
	this.exit = function() {
		this.rate();
	}
	this.status = function(type) {
		if (type == "israted") {
			rated = true;
		} else if (type == "canrate") {
			canrate = true;
		} else if (type == "queue") {
			queue = false;
		} else if (type == "sound") {
			sound = false;
		} else if (type == "exit") {
			exit = true;
			check = false;
		}
	}
	this.checkf5 = function(event) {
		if (!event) {
			event = window.event;
		}
		if (event.keyCode == 116) {
			self.status("israted");
		}
	}
	this.unload = function() {
		if (unload) {
			self.rate();
		}
	}
	function Send() {
		var action;
		var message;
		if (!sending) {
			if (sc) {
				sending = true;
				action = sa[sp];
				message = sm[sp];
				sp++;
				query.url = "livesupport.php?id=" + cid;
				query.method = "POST";
				query.Add("js", "");
				if (action == "init") {
					query.Add("action", "init");
					query.Add("nickname", message[0]);
					query.Add("message", message[1]);
					query.Add("timezone", message[2]);
					query.Add("language", message[3]);
				} else if (action == "chat") {
					query.Add("action", "chat");
					query.Add("message", message);
				} else if (action == "check") {
					query.Add("action", "chat");
				} else if (action == "queue") {
					query.Add("action", "queue");
					query.Add("message", message);
				} else if (action == "sound") {
					query.Add("action", "sound");
					query.Add("message", message);
				} else if (action == "exit") {
					query.Add("action", "exit");
				}
				query.Open();
				if (sp >= sc) {
					sa = new Array();
					sm = new Array();
					sc = 0;
					sp = 0;
				}
			}
		}
	}
	function Check() {
		if (sc) {
			Send();
		} else if (queue) {
			sto = window.setTimeout(function() {self.queue();}, 3000);
		} else if (check) {
			sto = window.setTimeout(function() {self.chat(false);}, 3000);
		}
	}
	function Uninitialized() {
		if (window.navigator.userAgent.toLowerCase().indexOf("khtml") == -1) {
			document.getElementById("status").innerHTML = "Communications can not initialized, please change your Web browser, such as the use of FireFox.";
		}
	}
	function Loading() {
		//document.getElementById("status").innerHTML = "Loading...";
	}
	function Loaded() {
		//document.getElementById("status").innerHTML = "Loaded...";
	}
	function Interactive() {
		//document.getElementById("status").innerHTML = "Interactive...";
	}
	function Completed() {
		var rm = unserialize(query.data);
		var ml = rm.length;
		var i;
		var message;
		var show;
		var action;
		var status;
		sending = false;
		if (document.getElementById("send") && document.getElementById("send").disabled) {
			document.getElementById("send").disabled = false;
		}
		status = document.getElementById("status");
		status.innerHTML = "";
		for (i = 0; i < ml; i++) {
			message = rm[i];
			action = message["action"];
			if (action == 'chat') {
				if (message["status"]) {
					message = message["message"];
					show = document.getElementById("show");
					if (message['msg_type'] > 2) {
						show.innerHTML += "<div class=\"sys\">" + message['msg_message'] + "<small>" + message['msg_time'] + "</small></div>";
					} else {
						show.innerHTML += "<div><span>" + message['msg_name'] + "</span><small>" + message['msg_time'] + "</small><div>" + message['msg_message'] + "</div></div>";
					}
					show.scrollTop = show.scrollHeight - show.offsetHeight;
				} else {
					status.innerHTML = message["message"];
				}
			} else if (action == "queue") {
				document.getElementById("livequeue").innerHTML = message["message"];
			} else if (action == "customerservice") {
				canrate = true;
				message = message["message"];
				if (message["status"]) {
					document.getElementById("customerservice").innerHTML += "<img src=\"" + message["cs_photo"] + "\" alt=\"" + message["cs_name"] + "\" />"
				} else {
					if (message) {
						document.getElementById("customerservice").innerHTML = "";
					} else {
						status.innerHTML = message["message"];
					}
				}
			} else if (action == "wait") {
				document.getElementById("livequeue").className = "promptinfo";
				document.getElementById("start").className = "hidden";
				document.getElementById("init").className = "hidden";
				document.getElementById("iplimit").className = "hidden";
				document.getElementById("wait").className = "promptinfo";
			} else if (action == "iplimit") {
				document.getElementById("init").className = "promptinfo";
				document.getElementById("start").className = "promptinfo";
				document.getElementById("iplimit").className = "promptinfo";
				document.getElementById("iplimit").innerHTML = message["message"];
			} else if (action == "reload") {
				status.className = "";
				status.innerHTML = message["message"];
				document.location.reload();
			} else if (action == "sys") {
				status.className = "alert";
				status.innerHTML = message["message"];
			} else if (action == "sound") {
				window.focus();
				if (sound) {
					try {
						document.getElementById("sound").controls.play();
						document.getElementById("fmessage").focus();
					} catch(e) {
					}
				}
			} else if (action == "exit") {
				exit = true;
				check = false;
				status.className = "alert";
				status.innerHTML = message["message"];
				document.getElementById("chat").className = "hidden";
			}
		}
		Check();
	}
	function Error() {
		sending = false;
		document.getElementById("status").innerHTML = "Livesupport service error.";
		Check();
	}
	function Busy() {
		document.getElementById("status").innerHTML = "Communications busy, please wait.";
	}
	function TimeOut() {
		sending = false;
		document.getElementById("status").innerHTML = "Communications overtime, and you may Livesupport server anomaly.";
		Check();
	}
}
var lc = new LiveChat();