﻿var MessageType = { Tip: 1, Visit: 2, Item: 3, Mayor: 4, Badge: 5, Shout: 6 };

Function.prototype.bind = function() {
	var method = this;
	var obj = arguments[0];
	var args = [];
	for (var i = 1; i < arguments.length; i++) {
		args.push(arguments[i]);
	}
	return function() {
		return method.apply(obj, args);
	}
}

$(function() {

	fetchData();
	//$(document).unload(GUnload);
});

function fetchData() {
	$.ajax({
		url: "/ajax/GetLatestUpdate.ashx?encoding=utf8&start=0&count=21",
		cache: false,
		type: "GET",
		dataType: "json",
		success: function(json) {

			var msgArr = [];
			$.each(json, function(i, obj) {
				var msg = new Message(obj);
				msgArr.push(msg);
			});
			var player = new Player(msgArr);
			player.start();
		}
	});
}


function Player(toPlay) {
	this.toPlay = toPlay;
	this.totalCount = this.toPlay.length;
	this.visibleCount = 12;
	this.delay = 5000;

	this.toHide = 0;
	this.toShow = this.getToShow();

	this.divContainer;

	this.canPlay = this.totalCount > this.visibleCount;
	if (!this.canPlay) {
		this.toShow = this.totalCount;
	}
}
Player.prototype.getToShow = function() {
	return (this.toHide + this.visibleCount) % this.totalCount;
}
Player.prototype.start = function() {

	var arr = [];
	for (var i = 0; i < this.toPlay.length; i++) {
		var msg = this.toPlay[i];
		var visible = false;
		if (i < this.toShow) {
			visible = true;
		}
		arr.push({ "id": msg.getDomID(), "dom": msg.toDom(), "visible": visible });
	}

	var msg = this.toPlay[this.toShow - 1];
	this.play(msg);
	this.divContainer = new DivContainer(arr, msg.getDomID());

	if (!this.canPlay) {
		return;
	}
	setTimeout(this.run.bind(this), this.delay);
}
Player.prototype.run = function() {
	var toShowID = this.toPlay[this.toShow].getDomID();
	var toHideID = this.toPlay[this.toHide].getDomID();
	this.divContainer.shift(toShowID, toHideID);
	this.toHide = (this.toHide + 1) % this.totalCount;
	this.toShow = this.getToShow();

	var i = this.toShow - 1;
	if (i < 0) {
		i = this.totalCount - 1;
	}
	var msg = this.toPlay[i];
	this.play(msg);

	setTimeout(this.run.bind(this), this.delay);
}
Player.prototype.play = function(msg) {
	//map.showMsg(msg);
}

function DivContainer(children, highlight) {
	this.children = children;
	this.curHighlight = highlight;

	for (var i = 0; i < this.children.length; i++) {
		var obj = this.children[i];
		var dom = obj.dom;
		if (!!obj.visible) {
			$(dom).show().find(".container").show();
		}
		else {
			$(dom).hide();
		}
		$("#divUserUpdateList").prepend(dom);
	}

	this.highlight(this.curHighlight);
}
DivContainer.prototype.shift = function(toShow, toHide) {
	//this.reset(this.curHighlight);
	//this.highlight(toShow);
	
	$("#" + toShow).slideDown(1000).find(".container").fadeIn(2500);
	$("#" + toHide).slideUp(1000, this.toTop.bind(this, toHide));

}
DivContainer.prototype.toTop = function(id) {
	$("#" + id).remove().css("display", "none").prependTo("#divUserUpdateList");
}
DivContainer.prototype.reset = function(id) {
	//$("#" + id).removeClass("ListCellSel").addClass("ListCellNormal");
}
DivContainer.prototype.highlight = function(id) {
	this.curHighlight = id;
	//$("#" + id).removeClass("ListCellNormal").addClass("ListCellSel");
}

function Message(msgJson) {
	this.msgJson = msgJson;
	this.domID = "msg" + this.msgJson.Type + this.msgJson.PKID;
	this.messageType = this.msgJson.Type;
}
Message.prototype.getDomID = function() {
	return this.domID;
}
//        Message.prototype.getLatLng = function()
//        {
//            return new GLatLng(this.msgJson.Lat, this.msgJson.Lng);
//        }
//        Message.prototype.isBroadcast = function()
//        {
//            return this.msgJson.VenueID == 0;
//        }
Message.prototype.getLocation = function() {
	var location = this.msgJson.VenueName;

	return location;
}
Message.prototype.getVenueUrl = function() {
	var venueUrl = "venue/" + this.msgJson.VenueID;

	return venueUrl;
}
Message.prototype.getUserUrl = function() {
	if (this.msgJson.CreatorRole == 0) {
		var userUrl = "user/" + this.msgJson.CreatorName;
	}
	else if (this.msgJson.CreatorRole == 1) {
		var userUrl = "/" + this.msgJson.CreatorUrlName;
	}

	return userUrl;
}
Message.prototype.getUserAnchor = function() {
	return $("<a/>").attr("target", "_blank").attr("href", this.getUserUrl()).text(this.msgJson.CreatorName);
}
Message.prototype.getVenueAnchor = function() {
	return $("<a/>").attr("target", "_blank").attr("href", this.getVenueUrl()).text(this.getLocation());
}
Message.prototype.getItemImage = function() {
	var src = "";
	if (this.messageType == MessageType.Mayor) {
		src = "/images/vip.png";
	}
	else if (this.messageType == MessageType.Tip) {
		src = "/images/Write_Msg.png";
	}
	else if (this.messageType == MessageType.Item) {
		src = "/ajax/UserItemImage.ashx?large=1&id=" + this.msgJson.SourceID;
	}
	else if (this.messageType == MessageType.Badge) {
		src = "/ajax/UserBadgeImage.ashx?large=1&id=" + this.msgJson.SourceID;
	}
	return $("<img  style='width:40px;height:40px' />").attr("src", src)[0];
}
Message.prototype.getAction = function() {
	var act = "";
	if (this.messageType == MessageType.Tip) {
		act = "发表生活情报：";
	}
	else {
		act = "签到，";
	}
	return act;
}
Message.prototype.buildTitle = function() {
	var title = this.getUserAnchor();
	title.after(this.getVenueAnchor());
	title.after("在");
	return title[0];
}
Message.prototype.buildContent = function() {
	var txt = this.msgJson.Content;
	if(txt.length > 50)
	{
		txt = txt.substr(0, 50) + "...";
	}
	return txt;
}
Message.prototype.toDom = function() {

	var userUrl = this.getUserUrl();
	var venueUrl = this.getVenueUrl();
	var location = this.getLocation();
	var content = this.buildContent();

	var dt = new Date();
	dt.setTime(this.msgJson.CreateTime * 1000);
	var dtStr = dt.format("MM月dd日 HH:mm");

	return $("#divTemplate").clone().show().attr("id", this.domID)
            .find(".avatorA").attr("target", "_blank").attr("href", userUrl).end()
            .find(".avatorA img").attr("src", this.msgJson.CreatorImageUrl).end()
            .find(".user").append(this.getUserAnchor()).end()
			.find(".venue").append(this.getVenueAnchor()).end()
			.find(".action").append(this.getAction()).end()
            .find(".text").append(content).end()
            .find(".badge").append(this.getItemImage()).end()
			.find(".pubTime").append(dtStr).end()
            .get(0);
}    
