﻿var URL_COMMON = BASE_AJAX_URL + 'ajCommon.aspx';
isUserSleeping = false;
function showDuelLog(id, p1Name, p2Name) {
    var wd = new Ext.Window({
        html: '<div style="text-align:center"><img src="' + RES_IMG_DIR + 'loading.gif"></div>',
        resizable: true,
        width: 300
    });
    wd.show();
    Ext.Ajax.request({
        url: BASE_AJAX_URL + 'ajDuel2.aspx?a=log&id=' + id + '&p1Name=' + p1Name
				+ '&p2Name=' + p2Name + '&m=' + Math.random(100),
        method: 'get',
        success: function (obj) {
            if (obj.responseText.indexOf('{') != -1) {
                var data = Ext.decode(obj.responseText);
                var tpl = new Ext.XTemplate(
						'<div class="duelLogWindow">',
						'<div class=header><table width="100%"><tr><td width="62px" align=center><div class="imgwrapper"><img src="{av1}"/></div><b>',
						p1Name,
						'</b></td><td width=*><span class=vs> vs </span></td><td width="62px" align=center><div class="imgwrapper"><img src="{av2}"/></div><b>',
						p2Name,
						'</b></td></tr><tr><td colspan=3> at {dueltime}</td></tr></table></div>',
						'<tpl for="result">',
						'<tpl if="xindex%2==0"><div class=even>{c}</div></tpl>',
						'<tpl if="xindex%2!=0"><div class=odd>{[this.parseIcon(values.c)]}</div></tpl>',
						'</tpl>', '</div>', {
						    parseIcon: function (cmdText) {
						        if (!Ext.isEmpty(yahooIcons)) {
						            var tpl = "<img src='" + RES_IMG_DIR + "icons/yahooIcons/{0}.gif'>";
						            for (var i = 0; i < yahooIcons.length; i++) {
						                var icon = yahooIcons[i];
						                var iconText = "#" + icon[1] + "#";
						                while (cmdText.indexOf(iconText) != -1) {
						                    cmdText = cmdText
													.replace(iconText,
															String.format(tpl,
																	icon[1]));
						                }
						            }
						            return cmdText;
						        }
						    },
						    getImg: function (avatar) {
						        var tpl = '<div class="ImgWrapper"><img class="FBAvatar" src="{0}"/></div>';
						        return String.format(tpl, avatar);
						    }
						});
                tpl.overwrite(wd.body, data);
            } else {
                wd.body.dom.innerHTML = obj.responseText;
            }
        },
        failure: function (obj) {
            wd.body.dom.innerHTML = "Data not available";
        }
    });
    return false;
}

function filterRecentDuels() {
    var name = document.getElementById('txtNameFlt').value.trim();
    var loc = window.location.href.indexOf('?');
    var newUrl = "";
    if (loc == -1) {
        newUrl = location.href + '?nameFlt=' + name;
    } else {
        var base = location.href.substring(0, loc);
        if (base.indexOf('.aspx') == -1) {
            base += 'Default.aspx';
        }
        var params = Ext.urlDecode(location.href.substring(loc + 1));
        if (!Ext.isEmpty(params.nameFlt)) {
            // reset other params cuz name change
            params.rds = 1;
        }
        params.nameFlt = name;

        newUrl = base + '?' + Ext.urlEncode(params);
    }
    location.href = newUrl;
    return false;
}

function deleteFeedback(id) {
    $.post(URL_COMMON, {
        p: 'feedback',
        a: 'del',
        id: id
    }, function (d, t) {
        Ext.get('item-fb-' + id).ghost("t", {
            remove: true
        });
    });
    return false;
}

function sendFeedback() {
    var name = document.getElementById('txtName').value.trim();
    var email = document.getElementById('txtEmail').value.trim();
    var title = document.getElementById('txtTitle').value.trim();
    var content = document.getElementById('txtContent').value.trim();
    var mailreg = /^([\w]+)(.[\w]+)*@([\w-]+\.){1,5}([A-Za-z]){2,4}$/;
    if (Ext.isEmpty(title) || Ext.isEmpty(content)) {
        showMess(lang.get("FB_NO_CONTENT"));
        return false;
    }
    if (!Ext.isEmpty(email) && !mailreg.exec(email)) {
        showMess("Địa chỉ email không đúng định dạng.");
        return false;
    }
    name = validate(name);
    email = validate(email);
    title = validate(title);
    content = validate(content);
    Ext.Ajax.request({
        method: 'post',
        url: URL_COMMON + '?p=feedback&a=post',
        success: function (obj) {
            var feedback = Ext.decode(obj.responseText);
            showMess(
							"Gửi phản hồi thành công. Cảm ơn bạn rất nhiều^^!",
							true);
            setupNewMess(feedback.FeedbackId, name, email, title,
							content, feedback.Avatar, feedback.PostedDate);
            Ext.get('dvMask').setStyle('display', 'none');
        },
        failure: function () {
            showMess("Gửi phản hồi thất bại. Thành thật xin lỗi bạn ~\"~!");
        },
        params: {
            name: name,
            email: email,
            title: title,
            content: content
        }
    });
    return false;
}
function setupNewMess(id, n, e, t, c, a, p) {
    var tblFbList = Ext.get('item-fb-' + (id - 1));
    var newId = 'item-fd-' + id;
    var str = String
			.format(
					"<tr id='"
							+ newId
							+ "'><td colspan=2><div class='BGWhiteBoxTL'><div class='BGWhiteBoxTR'><div class='BGWhiteBoxTC'></div></div></div><div class='BGWhiteBoxCL'><div class='BGWhiteBoxCR'><div><table class='FBItemTable' width=100%><tr><td rowspan=3 width='20px'>x. </td><td rowspan=3 width='80px' class='avt'><div class='ImgWrapper'><img src='{0}' class='FBAvatar'></div><div class='name'>{1}</div></td><td width=*><div class='title'>{2}</div></td></tr><tr><td><div class='content'>{3}</div></td></tr><tr><td><div class='posteddate'>Posted date:{4} - Email: <span class='email'>{5}</span></div></td></tr></table></div></div></div><div class='BGWhiteBoxBL'><div class='BGWhiteBoxBR'><div class='BGWhiteBoxBC'></div></div></div><div></div></td></tr>",
					a, n, t, c, p, e);
    tblFbList.insertHtml('beforeBegin', str);
    Ext.get(newId).focus();
}

var tplUserLink = "<a onmouseover=\"TagToTip('div-usertip-{UserId}',WIDTH,300);\" href='../../forum.aspx?g=profile&u={UserId}' title='{Username}' class='StandardUserLink'><span class='medal{Level} std_medal'>{Username}</span></a><div id='div-usertip-{UserId}' style='display: none;'><img class='tip-img' src='{Avatar}' style='float: left;'>Slogan: {Slogan}<br>Point:<b>{Point}</b> Level:<b>{Level}</b> Deck:<b>{DeckName}</b></div>";

var tpl = "{0} - <b><a href=# onclick='return promptPwd({1},{2});'>Join</a> {3}</b><br><span class='desc'>{4}</span> - <span class='time'>{5}</span>";
//
// [{
// userLink: '',
// duelId: 1,
// slogan: '',
// duelTime: '',
// duelSettings: {
// pwd: '',
// lv: 0,
// rk: 0,
// }
// }
// ]
//
//function refreshOpenDuels() {
//    Ext.Ajax.request({
//        url: URL_COMMON,
//        params: {
//            p: 'duel',
//            a: 'open'
//        },
//        success: function (obj) {
//            var panel = Ext.get('pnlHosting');
//            var data = Ext.decode(obj.responseText);
//            if (data.length == 0) {
//                panel
//								.update("<ul><li>There is no duel in this list at the moment.</li></ul>");
//            } else {
//                var ul = panel.child('ul');
//                if (!Ext.isEmpty(ul)) {
//                    ul.remove();
//                }
//                ul = panel.createChild({
//                    tag: 'ul'
//                });
//                panel.fadeOut({
//                    duration: 1,
//                    remove: false,
//                    callback: function () {
//                        Ext.get('pnlHosting').fadeIn({
//                            duration: 2
//                        });
//                        populateULRow(ul, data);
//                    }
//                });
//            }
//        }
//    });
//    return false;
//}

function populateULRow(ul, data) {
    for (var i = 0; i < data.length; i++) {
        var userHtml = getUserLink(data[i].UserInfo);
        var duelSettings = getDuelSettings(data[i].DuelSettings);
        duelSettings = !Ext.isEmpty(duelSettings)
				? '(' + duelSettings + ')'
				: '';
        var html = String.format(tpl, userHtml, data[i].DuelId, Ext
						.isEmpty(data[i].DuelSettings.Pwd) ? 0 : 1,
				duelSettings, data[i].Slogan, data[i].DuelTime);
        ul.createChild({
            tag: 'li',
            duration: 1,
            easing: 'elasticIn',
            html: html
        });
    }
}

function getUserLink(userInfo) {
    var userTpl = new Ext.XTemplate(tplUserLink)
    return userTpl.apply(userInfo);
}

function getDuelSettings(duelSettings) {
    var tpl = "<img src='" + RES_IMG_DIR + "icons/{0}' title='{1}'>";
    var imgs = ["lock.gif", "medal_gold_delete.gif", "report_user.gif"];
    var alts = [lang.get("REQ_PWD"), lang.get("REQ_LEVEL"),
			lang.get("REQ_RANK")];
    var result = "";
    if (!Ext.isEmpty(duelSettings.Pwd)) {
        result += String.format(tpl, imgs[0], alts[0]);
    }
    if (duelSettings.Lv > 0) {
        result += String.format(tpl, imgs[1], alts[1] + duelSettings.Lv);
    }
    if (duelSettings.Rk > 0) {
        result += String.format(tpl, imgs[2], alts[2] + duelSettings.Rk);
    }
    return result;
}

function validate(str) {
    str = String.escape(str);
    str = Ext.util.Format.stripScripts(str);
    str = Ext.util.Format.htmlEncode(str);
    return str;
}
function showMess(str, ok) {
    // var fb = Ext.get('fbMessage');
    if (!Ext.isEmpty(ok))
        Ext.Msg.alert('Thong bao', str);
    else
        Ext.Msg.alert('Loi', str);
    // fb.update(str);
}
function showFullImg(index) {
    var img = Ext.getDom('ss' + index);
    var body = Ext.getBody();
    var image = body.createChild({
        tag: 'img',
        src: img.src,
        style: 'visibility:hidden'
    });

    // recalculate size and keep original ratio
    if (image.dom.width >= 800) {
        image.dom.height = Math.round(800 / image.dom.width) * image.dom.height;
        image.dom.width = 800;
    }
    var finalW = image.dom.width;
    var finalH = image.dom.height;
    // create a floating window to show the image
    var window = new Ext.Window({
        width: finalW,
        height: finalH,
        layout: 'fit',
        plain: true,
        bodyStyle: 'padding:1px;',
        bodyBorder: false,
        border: false,
        shadow: false,
        items: [{
            html: '<img src="' + img.src
							+ '" width="100%" height="100%">'
        }],
        listeners: {
            'beforeclose': function () {
                Ext.fly(window.el).ghost('b', {
                    easing: 'easeOut',
                    duration: .5,
                    remove: true,
                    callback: function () {
                        window.hide();
                    }
                });
                return false;
            },
            'hide': function () {
                Ext.destroy(image);
                this.destroy();
            }
        }
    });
    var imgEl = Ext.get(img);
    var x = imgEl.getBox().x;
    var y = imgEl.getBox().y;
    var h = imgEl.getBox().height;
    var w = imgEl.getBox().width;
    var ax = imgEl.getCenterXY()
    var newX = ax[0] - Math.floor(finalW / 2);
    var newY = ax[1] - Math.floor(finalH / 2);
    newY = (newY < 20) ? 20 : newY;
    window.setPagePosition(x, y);
    window.show();
    Ext.fly(window.el).shift({
        x: newX,
        y: newY,
        duration: 0.4,
        concurrent: true
    }).fadeIn({
        endOpacity: 1,
        duration: 0.5
    });
}

function promptPwd(gk, hasPwd, isTestMode, ignoreBL) {
    var duelpass;
    if (hasPwd) {
        Ext.Msg.prompt('Password Required', 'Please enter Duel Password:',
				function (btn, text) {
				    if (btn == 'ok') {
				        duelpass = text;
				    }
				    sendJoinDuelRequest(gk, duelpass, isTestMode, ignoreBL);
				});
    } else {
        sendJoinDuelRequest(gk, '', isTestMode, ignoreBL);
    }
}

function sendJoinDuelRequest(gk, duelpass, isTestMode, ignoreBL) {
    //var page = 'StartDuel.aspx';
    Ext.Ajax.request({
        url: '../../ajax/ajDuel2.aspx?a=check',
        success: function (obj) {
            var res = Ext.decode(obj.responseText.trim());
            if (res.code == 0) {
                Ext.Msg.alert('Thong bao', res.text);
            } else {
                window.location.href = "../Duels/StartDuel.aspx?a=join&gk="
								+ gk + "&pwd=" + duelpass + "&bl=" + ignoreBL;
            }
        },
        failure: function () {
            Ext.Msg.alert("Information",
							"There is a problem with this duel.");
        },
        params: {
            duelpass: duelpass,
            gamekey: gk
        }
    });
}

var current_duels = { Template: false, Data: false, IsTemplateLoaded: false };

function RenderLevel(who) {
    return (who == 1 ? this.data.Player1.User.Level : this.data.Player2.User.Level) * 10;
}
function RenderDate(d) {
    return toISOString();
}
function padzero(n) {
    return n < 10 ? '0' + n : n;
}
function pad2zeros(n) {
    if (n < 100) {
        n = '0' + n;
    }
    if (n < 10) {
        n = '0' + n;
    }
    return n;
}
function toISOString(d) {
    return d.getUTCFullYear() + '-' + padzero(d.getUTCMonth() + 1) + '-' + padzero(d.getUTCDate()) + 'T' + padzero(d.getUTCHours()) + ':' + padzero(d.getUTCMinutes()) + ':' + padzero(d.getUTCSeconds()) + '.' + pad2zeros(d.getUTCMilliseconds()) + 'Z';
}
function fnToISO() {
    var now = new Date();
    alert(toISOString(now));
}
function RenderCurrentDuels() {
    if (current_duels.IsTemplateLoaded) {
        var data = current_duels;
        $('#plh-current-duels').current_duels({
            template: data.Template,
            data: data.Data
        });
        jQuery('abbr.timeago').timeago();
    }
}
$.fn.current_duels = function (options) {
    return this.each(function () {
        var html = $.tmpl(options.template, options.data);
        $(this).html(html);
    });
};

function LoadCurrentDuels() {
    var task = {
        run: function () {
            work();
        },
        interval: 25000
    };
    Ext.TaskMgr.start(task);

    function work() {
        if (isUserSleeping) return;
        $.post('../../ajax/ajCommon.aspx', { p: 'current-duels', isLoaded: current_duels.IsTemplateLoaded }, function (data) {
            if (!current_duels.IsTemplateLoaded) {
                current_duels.Template = data.Template;
                current_duels.IsTemplateLoaded = true;
            }
            current_duels.Data = data.Data;
            RenderCurrentDuels();
        }, 'json');
    };
}

$(function () {
    $('#a-startduel').bind('click', function () {
        var pwd = $('#txtDuelpass').val();
        if (pwd && pwd.length >= 10) {
            Ext.Msg.alert('Thông báo', 'Mã khóa duel không quá 10 ký tự');
            return false;
        }
        var ptt = /^[0-9]*$/;
        var lv = $('#txtLevel').val();
        var rk = $('#txtRank').val();
        if (!ptt.test(rk) || !ptt.test(lv)) {
            Ext.Msg.alert('Thông báo', 'Level và rank phải nhập bằng số.');
            return false;
        };

        var sound = $('#cbSound:checked').val();
        var mode = $('#rdMode:checked').val();
        var ignoreBL = $('#ignoreBanList:checked').val();
        var isTagDuel = $('#isTagDuel:checked').val();

        var href = $(this).attr('href');
        if (isTagDuel) {
            href = "../../Yugioh/Duels/TagDuel.aspx?a=createDuel";
        }
        //if (href.indexOf('pwd') !=-1))
        href = "../../Yugioh/Duels/StartDuel.aspx?a=createDuel";
        $(this).attr('href', href + String.format("&pwd={0}&lv={1}&rk={2}&sound={3}&mode={4}&bl={5}", pwd, lv, rk, (sound ? true : false), mode, (ignoreBL ? true : false)));

        return true;
    });

    LoadCurrentDuels();
});
