Ext.Chatium.ChannelView = function (channel) {
	this.channel = channel;
	this.toBuffer = false;
	this.newMessagesBuffer = "";
	this.messagesBlock = null;
	this.usersBlock = null;
	this.lastOutedMessageIndex = -1;
	this.firstOutedMessageIndex = -1;
	this.doScroll = true;
	Ext.Chatium.Channel.superclass.constructor.call(this);
}

Ext.extend(Ext.Chatium.ChannelView, Ext.Chatium.MyClass, {
	setBlocks: function (messagesBlock, usersBlock) {
		this.messagesBlock = messagesBlock;
		this.usersBlock = usersBlock;
		
		var view = this;
		
		this.messagesBlock.parentNode.onscroll =  function() {
			if (view.programScroll)
				return;
			view.doScroll = (this.scrollTop >= this.scrollHeight- this.offsetHeight);
		};
	},
		
	outBuffer: function () {
		var allMessages = new Array ();
		while (this.channel.messages[this.lastOutedMessageIndex+1] != null) {
			var messageDiv = this.getMessageHTML (this.channel.messages[this.lastOutedMessageIndex+1]);
			this.lastOutedMessageIndex++;
			
			if (messageDiv)
				this.messagesBlock.appendChild (messageDiv);
		}
		
		if (this.doScroll) {
			this.gotoEnd ();
			setTimeout ("ChannelManager.getChannel(" + this.channel.id + ").view.gotoEnd()", 100);
		}
		
		this.syncMessagesIndex ();
	},
	
	gotoEnd: function() {
		this.programScroll = true;
		this.messagesBlock.parentNode.scrollTop = this.messagesBlock.parentNode.scrollHeight;
		this.programScroll = false;
	},
		
	syncMessagesIndex: function () {
		if (this.firstOutedMessageIndex == -1 && this.lastOutedMessageIndex >= 0)
			this.firstOutedMessageIndex = 0;
		
		if (this.lastOutedMessageIndex - this.firstOutedMessageIndex > 200) {
			var newFirstIndex = this.lastOutedMessageIndex - 200;
			
			for (var i = this.firstOutedMessageIndex; i < newFirstIndex; i++) {
				var messageEl = document.getElementById("message-"+ this.channel.messages[i].id);
				if (messageEl)
					messageEl.parentNode.removeChild(messageEl);
			}
			this.firstOutedMessageIndex = newFirstIndex;
		}
	},
		
	getMessageHTML: function (message) {
		if (this.channel.bannedUsersIds[message.userId] && this.channel.bannedUsersIds[message.userId] > message.index)
			return null;
		
		var c = document.createElement("div");
		c.className = "message";
		c.id = "message-" + message.id;
		
		if (message.type == "system") {
			c.className += " system";
			c.innerHTML = message.text;
			return c;
		}
		
		var params = new Array ();
		var user = this.channel.users[message.userId];
		var txt = this.convertMessageText(message.text, params, message, user);
		
		var userStatus = this.channel.getUserStatus(user);
		
		nickLink = "<img title='" + userStatus.title + "' class='user-symbol' onClick='ChatLayout.userClicked(this, " + user.id + ")' src='/pages/channel/img/" + userStatus.name + ".gif'>";
		nickLink += "<a href='javascript:void(0)' class='fromNick' onClick='ChatLayout.userNickClicked(this, " + message.userId + ");' >" + message.userNick + "</a>";
		if (params.addToNick)
			nickLink += params.addToNick;
		
		var messageClass = "message";
		if (params.ctClass)
			messageClass += " " + params.ctClass;
		if (user && user.gender)
			messageClass += " " + user.gender;
		
		if (user && user.id == CurrentUser.Id) {
			messageClass += " from-me";
		}
		
		c.className = messageClass;
		c.innerHTML = "<font class='time'>[" + this.convertTime(message.time) + "] " + nickLink + ": </font>" + txt + "</font>";
		
		return c;
	},
		
	convertTime: function (time) {
		timeparts = time.split(":");
		var date = new Date ();
		date.setHours(timeparts[0]);
		date.setMinutes(timeparts[1]);
		date.setSeconds(timeparts[2]);
		return date.toLocaleTimeString ();
	},
		
	convertMessageText: function(txt, params, message, user) {
		var regexp = /\[to:(\d*):[^\]]*\]/g
		var toMe = false;
		var addToNick = "";
		var toNickCount = 0;
		
		var userStrs = txt.match(regexp);
		if (userStrs) {
			for (var i = 0; i < userStrs.length; i++) {
				var userStr = userStrs[i];
				var toParams = userStr.substr(1,userStr.length-2).split(":");
				var gender = (this.channel.users[[toParams[1]]]) ? this.channel.users[[toParams[1]]].gender : "";
				txt = txt.replace (userStr, ""/* "<font class='toNick " + gender + "'>" + toParams[2] + "</font>" */);
				if (toParams[1] == CurrentUser.Id)
					toMe = true;
				if (addToNick.length > 0)
					addToNick += ", ";					
				var classAdd = (toParams[1] == CurrentUser.Id) ? " to-me" : "";					
				addToNick += "<font class='toNick " + gender + classAdd + "'>" + toParams[2] + "</font>";
				toNickCount++;
			}
		}
		
		if (addToNick) {
			var classAdd = (toMe && toNickCount == 1) ? " to-me" : "";					
			addToNick = "<span class='message-to" + classAdd + "'>" + addToNick + "</span>";
			params.addToNick = addToNick;
		}
				
		txt = this.replaceLinks (txt);
		
		txt = renderSmiles(txt, 5);
		txt = filterCaseDup(txt, 0.33, 3);
		//заглавные символы плохо фильтруются когда много повторяющихся букав
		txt = filterCaseDup(txt, 0.33, 3);
		return txt;
	},
		
	replaceLinks: function(txt) {
		var httpLinks = txt.match (/http:\/\/(\S*)/gi);
		if (!httpLinks)
			return txt;
		
		for (var i = 0; i < httpLinks.length; i++) {
			var link = httpLinks[i];
			var linkText = link.substr(7);
			if (linkText.length > 20)
				linkText = linkText.substr(0,20) + "..."
			
			var linkHref = link.replace(/\'/g, "%27");
			txt = txt.replace(link, "<a target='_blank' href='" + linkHref + "'>" + linkText  + "</a>");
		}
		return txt;
	},
	
	getUserHTML: function (user ) {
	
		var channelHTML = "ChannelManager.getChannel(" + this.channel.id + ")";
		var cityHTML = (user.city) ? "<div class='user-info'>" + user.city + "</div>" : "&nbsp;";
		var ageHTML = (user.age && user.age > 0) ? " <span class='user-age'>(" + user.age + ")</span>" : "";
		picHTML = (user.data) ? "&r=" + user.data.avatar : "";
		
		var userStatus = this.channel.getUserStatus(user);
		var resultDom = document.createElement("div");
		resultDom.id = "user-" + user.id;
		resultDom.className = "user-block"; 
		
		/*if (gen == "")
			gen = "anon";
		
		html = 	"<div class='user-pic-wrap'><img onClick='ChatLayout.userClicked(this, " + user.id +")' class='user-pic' src='http://chatium.com:8080/avatar?uid=" + user.id + "&gender=" + gen + "&width=40&height=40&" +  + picHTML + "'></div>" +*/
		
		html = 	"<div class='user-pic-wrap'><img onClick='ChatLayout.userClicked(this, " + user.id +")' class='user-pic' src='/data/userpic.php?uid=" + user.id + "&size=40&gender=" + user.gender + picHTML + "'></div>" +
						"<div class='user-title " + (user.gender ? user.gender.toLowerCase() : "") + "'><img title='" + userStatus.title + "' class='user-symbol' onClick='ChatLayout.userClicked(this, " + user.id + ")' src='/pages/channel/img/" + userStatus.name + ".gif'><a onClick='ChatLayout.userNickClicked(this, " + user.id + ")' href='javascript:void(0)'>" + user.nick + ageHTML + "</a></div>" +
						cityHTML;
		resultDom.innerHTML = html;
						
		return resultDom;
	},
		
	expandUser: function (id) {
		var obj = document.getElementById("uc-" + id);
		obj.style.display = (obj.style.display  == "block") ? "none" : "block";
	},
		
	showUserInfo: function (userId) {
  	window.open(ChatApp.MainUrl + "user/profile?id=" + userId, "info", "");
  },
  	
  removeUserMessages: function (userId) {
  	var ids = new Array ();
  	for (var i = 0; i < this.channel.messages.length; i++) {
  		var message = this.channel.messages[i];
  		if (message.userId == userId)
  			ids.push (message.id);  		
  	}
  	for (var i = 0; i < ids.length; i++) {
  		var elem = document.getElementById("message-" + ids[i]);
  		if (!elem)
  			continue;
  		elem.parentNode.removeChild(elem);
  	}
  },
  
  addUser: function (user) {
  	this.delUser(user.id);
  	var c = this.getUserHTML(user);
  	this.usersBlock.appendChild (c);
  },
  	
  delUser: function (userId) {
  	var c = document.getElementById("user-" + userId);
  	if (c)
  		c.parentNode.removeChild(c);
  },
  	
  getUserNickLink: function (userId, userNick) {
  	var user = this.channel.getUser(userId);
  	//if (user)
  		//userNick = user.nick;
  	var gender = "";
  	if (user)
  		gender = user.gender;
  	
  	var userStatus = this.channel.getUserStatus(user);
  	
  	var nickLink = "<img title='" + userStatus.title + "' class='user-symbol' onClick='ChatLayout.userClicked(this, " + userId + ")' src='/pages/channel/img/" + userStatus.name + ".gif'>";
		nickLink += "<a href='javascript:void(0)' class='fromNick " + gender + "' onClick='ChatLayout.userNickClicked(this, " + userId + ");' >" + userNick + "</a>";
		
		return nickLink;
  }
});

