﻿if (window.MyBulletinBoard === undefined) {
    window.MyBulletinBoard = {};
}

MyBulletinBoard.onButtonLoginClick = function MyBulletinBoard_onButtonLoginClick() {
    //document.getElementById('btnLogin').style.display = 'none';
    var postData = 'u=&p=';
    var request = new MyBulletinBoard.AsyncServerCall(
        'LoginHandler.ashx',
        postData,
        this.onLoginComplete);
    request.send();
}

MyBulletinBoard.onButtonCreateUserClick = function MyBulletinBoard_onButtonCreateUserClick() {
    var userName = document.getElementById('inputCreateUserName').value;
    var userPassword = document.getElementById('inputCreateUserPassword').value;
    var userConfirmedPassword = document.getElementById('inputCreateUserConfirmPassword').value;
    if (!userName || !userPassword) {
        alert('User name and password are required fields');
        return;
    }
    if (userPassword != userConfirmedPassword) {
        alert('Both passwords must match');
        return;
    }    
    document.getElementById('buttonCreateUser').disabled = true;
    MyBulletinBoard.setCreateUserStatus('Creating user...');
    var postData = 'u=' + encodeURIComponent(userName) + '&p=' + encodeURIComponent(userPassword);
    var request = new MyBulletinBoard.AsyncServerCall(
        'CreateUserHandler.ashx',
        postData,
        this.onCreateUserComplete);
    request.send(); 
}

MyBulletinBoard.resetLoginStatus = function MyBulletinBoard_resetLoginStatus() {
    //var div = document.getElementById('loginStatusDiv');
    //div.style.display = 'none';
}

MyBulletinBoard.resetCreateUserStatus = function MyBulletinBoard_reseCreateUserStatus() {
    //var div = document.getElementById('createUserStatusDiv');
    //div.style.display = 'none';
}

MyBulletinBoard.setLoginStatus = function MyBulletinBoard_setLoginStatus(status) {
    //var div = document.getElementById('loginStatusDiv');
    //div.innerHTML = status;
    //div.style.display = '';
}

MyBulletinBoard.setCreateUserStatus = function MyBulletinBoard_setCreateUserStatus(status) {
    //var div = document.getElementById('createUserStatusDiv');
    //div.innerHTML = status;
    //div.style.display = '';
}

MyBulletinBoard.onLoad = function MyBulletinBoard_onLoad() {
    MyBulletinBoard.checkLoginCookies();
    MyBulletinBoard.resetLoginStatus();
    MyBulletinBoard.resetCreateUserStatus();
}

MyBulletinBoard.loadInitialMessagesPayload = function() {
    var payloadHiddenElement = document.getElementById('HiddenFieldInitialMessagesPayload');
    if (!payloadHiddenElement || !payloadHiddenElement.value) {
        return;
    }
    var payload = MyBulletinBoard.deserialize(payloadHiddenElement.value);
    if (!payload) {
        return;
    }
    MyBulletinBoard.parseRefreshMessagesResponse(payload);
}

MyBulletinBoard.onLoginComplete = function MyBulletinBoard_onLoginComplete(responseBody, status) {
    MyBulletinBoard.user = null;
    MyBulletinBoard.updateLoggedInStyle();
    if (status != 200 || !responseBody) {
        MyBulletinBoard.setLoginStatus('Login failed.');
        return;
    }
    var response = MyBulletinBoard.deserialize(responseBody);
    if (!response || !response.authenticated) {
        MyBulletinBoard.setLoginStatus('Login failed. ' + response.message);
        return;
    }    
    if (response.consentToken) {
        var url = unescape(window.location.pathname);
        window.setTimeout(
            function() {
                window.location.href = url;
                
            },
            1);
    }
    MyBulletinBoard.onSuccessfulLogin(response.name, response.sessionKey, response.cid, response.consentToken);   
}

MyBulletinBoard.onSuccessfulLogin = function(name, sessionKey, cid, consentToken) {
    MyBulletinBoard.updateSignedInUser(name, sessionKey, cid, consentToken);
    MyBulletinBoard.resetLoginStatus();
    MyBulletinBoard.setLoginStatus('Welcome, ' + MyBulletinBoard.user.name);
    window.setTimeout(
        function() {
            MyBulletinBoard.resetLoginStatus();
            //document.getElementById('login').style.display = 'none';
            //document.getElementById('create').style.display = 'none';
        }, 3000);
    MyBulletinBoard.updateLoggedInStyle();
}

MyBulletinBoard.updateSignedInUser = function MyBulletinBoard_updateSignedInUser(name, sessionKey, cid, consentToken) {
    MyBulletinBoard.user = {};
    MyBulletinBoard.user.sessionKey = sessionKey;
    MyBulletinBoard.user.name = name;
    MyBulletinBoard.user.cid = cid;
    MyBulletinBoard.user.consentToken = consentToken;
    MyBulletinBoard.user.refreshState = {};
    MyBulletinBoard.user.refreshState.revision = 0;
    MyBulletinBoard.loggedOutRevision = 0;
}

MyBulletinBoard.updateLoggedInStyle = function MyBulletinBoard_updateLoggedInStyle() {
    /* if (!MyBulletinBoard.isLoggedIn()) 
    {
        document.getElementById('dvSignIn').style.display = '';
        document.getElementById('dvPhotoFrame').style.display = 'none';
        document.getElementById('dvLogout').style.display = 'none';
        
    }
    else 
    {
       document.getElementById('dvPhotoFrame').style.display = '';
       document.getElementById('dvSignIn').style.display = 'none';
       document.getElementById('dvLogout').style.display = 'block';
    }*/
    //document.getElementById('historyPlaceHolderSpan').innerHTML = '';
    //MyBulletinBoard.displayedMessagedCount = 0;
}

MyBulletinBoard.onCreateUserComplete = function MyBulletinBoard_onCreateUserComplete(responseBody, status) {
    document.getElementById('buttonCreateUser').disabled = false;
    if (status != 200 || !responseBody) {
        MyBulletinBoard.setCreateUserStatus('User creation failed. ');
        return;
    }
    var response = MyBulletinBoard.deserialize(responseBody);
    if (!response || !response.created || !response.sessionKey) {
        MyBulletinBoard.setCreateUserStatus('User creation failed. ' + response.message);
        return;
    }
    MyBulletinBoard.setCreateUserStatus('User created successfully.');
    window.setTimeout(function() { MyBulletinBoard.resetCreateUserStatus(); }, 3000);
    MyBulletinBoard.onSuccessfulLogin(response.name, response.sessionKey, '', '');
}

MyBulletinBoard.logOut = function MyBulletinBoard_logOut() {
    var postData = 'u=&s=';
    var request = new MyBulletinBoard.AsyncServerCall(
            'LogoutHandler.ashx',
            postData,
            null);
    request.send();
    MyBulletinBoard.user = null;
    MyBulletinBoard.updateLoggedInStyle();
    MyBulletinBoard.loggedOutRevision = 0;
}

MyBulletinBoard.deserialize = function MyBulletinBoard_deserialize(serialized) {
    if (window.JSON) {
        return window.JSON.parse(serialized);
    }
    else {
        return eval('(' + serialized + ')');
    }
}

MyBulletinBoard.startRefreshInterval = function MyBulletinBoard_startRefreshInterval() {
    if (MyBulletinBoard.refreshInterval > 0) {
        return;
    }    
    MyBulletinBoard.refreshInterval = window.setInterval(
        MyBulletinBoard.onRefreshInterval,
        5000);
}

MyBulletinBoard.stopRefreshInterval = function MyBulletinBoard_stopRefreshInterval() {
    if (!MyBulletinBoard.refreshInterval > 0) {
        return;
    }
    window.clearInterval(MyBulletinBoard.refreshInterval);
    MyBulletinBoard.refreshInterval = 0;
}

MyBulletinBoard.onRefreshInterval = function MyBulletinBoard_onRefreshInterval() {    
    var userName = '';
    var sessionKey = '';
    var revision = 0;
    if (MyBulletinBoard.isLoggedIn()) {
        if (!MyBulletinBoard.user.refreshState) {
            MyBulletinBoard.user.refreshState = {};
            MyBulletinBoard.user.refreshState.revision = 0;
        }
        userName = MyBulletinBoard.user.name;
        sessionKey = MyBulletinBoard.user.sessionKey;
        revision = MyBulletinBoard.user.refreshState.revision;
    }
    else {
        if (MyBulletinBoard.loggedOutRevision) {
            revision = MyBulletinBoard.loggedOutRevision;
        }
    }
    /* commented to stop show messages.
    var postData = 'u=' + userName +
        '&s=' + sessionKey +
        '&r=' + revision;
    var request = new MyBulletinBoard.AsyncServerCall(
        'RefreshMessagesHandler.ashx',
        postData,
        MyBulletinBoard.onRefreshMessageComplete);
    request.send();
    */
}

MyBulletinBoard.onRefreshMessageComplete = function MyBulletinBoard_onRefreshMessageComplete(responseBody, status) {
    if (status != 200 || !responseBody) {
        return;
    }

    if (!MyBulletinBoard.displayedMessagedCount) {
        MyBulletinBoard.displayedMessagedCount = 0;
    }

    var response = MyBulletinBoard.deserialize(responseBody);
    if (!response) {
        return;
    }
    MyBulletinBoard.parseRefreshMessagesResponse(response);
}
    
MyBulletinBoard.parseRefreshMessagesResponse = function(response) {
    if (!response.length && MyBulletinBoard.displayedMessagedCount === 0) {
        document.getElementById('lastRefreshMessage').innerHTML = 'The board contains no messages. (last refreshed at ' +
            MyBulletinBoard.formatDate(new Date()) + ')';
        return;
    }
    if (response.length > 0) {
        document.getElementById('lastRefreshMessage').innerHTML = '';
    }
    for (var i = 0; i < response.length; i++) {
        var entry = response[i];
        MyBulletinBoard.displayUserMessage(
            entry.name,
            entry.cid,
            entry.created,
            entry.message);
        if (MyBulletinBoard.isLoggedIn()) {
            if (!MyBulletinBoard.user.refreshState.revision) {
                MyBulletinBoard.user.refreshState.revision = entry.id;
            }
            else if (MyBulletinBoard.user.refreshState.revision < entry.id) {
                MyBulletinBoard.user.refreshState.revision = entry.id;
            }
        }
        else {
            if (!MyBulletinBoard.loggedOutRevision) {
                MyBulletinBoard.loggedOutRevision = entry.id;
            }
            if (MyBulletinBoard.loggedOutRevision < entry.id) {
                MyBulletinBoard.loggedOutRevision = entry.id;
            }
        }
    }
}

MyBulletinBoard.onAddMessage = function MyBulletinBoard_onAddMessage() {
    if (!MyBulletinBoard.isLoggedIn()) {
        alert('Must be logged-in to add messages.');
        return;
    }
    var message = document.getElementById('textAreaAddMessage').value;
    if (!message) {
        alert('Please type a message first!');
        return;
    }
    if (message.length > 1024) {
        alert('Message length cannot exceed 1024 characters.');
        return;
    }
    var isPublic = false;
    if (document.getElementById('checkBoxIsPublic').checked) {
        isPublic = true;
    }
    var postData = 'u=' + MyBulletinBoard.user.name +
        '&s=' + MyBulletinBoard.user.sessionKey +
        '&m=' + encodeURIComponent(message) +
        '&p=' + (isPublic ? '1' : '0');
    var request = new MyBulletinBoard.AsyncServerCall(
            'AddMessageHandler.ashx',
            postData,
            this.onAddMessageComplete);
    request.send();

    // Display the message in the UI immediatly
    MyBulletinBoard.displayUserMessage(
        MyBulletinBoard.user.name,
        MyBulletinBoard.user.cid,
        MyBulletinBoard.formatDate(new Date()),
        message);
}

MyBulletinBoard.onAddMessageComplete = function MyBulletinBoard_onAddMessageComplete(responseBody, status) {
    if (status != 200 || !responseBody) {
        return;
    }
    var response = MyBulletinBoard.deserialize(responseBody);
    if (!response) {
        return;
    }
    var errorMessage = document.getElementById('addMessageError');
    if (response.resultMessage == "OK") {
        errorMessage.style.display = 'none';
    }
    else {
        errorMessage.innerHTML = 'Unable to post the message: ' + response.resultMessage;
        errorMessage.style.display = '';
        return;
    }
    if (!response.revision) {
        return;
    }
    if (!MyBulletinBoard.isLoggedIn()) {
        return;
    }
    if (!MyBulletinBoard.user.refreshState) {
        MyBulletinBoard.user.refreshState = {};
    }
    MyBulletinBoard.user.refreshState.revision = response.revision;
}

MyBulletinBoard.displayUserMessage = function MyBulletinBoard_displayUserMessage(userName, cid, created, message) {
    if (!MyBulletinBoard.displayedMessagedCount) {
        MyBulletinBoard.displayedMessagedCount = 0;
    }
    MyBulletinBoard.displayedMessagedCount++;

    var entry = document.createElement('table');
    entry.setAttribute('width', '100%');
    entry.setAttribute('border', '0');

    var detailsRow = document.createElement('tr');

    var nameCol = document.createElement('td');
    nameCol.setAttribute('width', '60%');

    var saidSpan = document.createElement('span');
    saidSpan.setAttribute('class', 'messagesEntryUserNameSaid');
    saidSpan.innerHTML = 'Posted at ';
    nameCol.appendChild(saidSpan);

    var createdSpan = document.createElement('span');
    createdSpan.setAttribute('class', 'messagesEntryCreated');
    createdSpan.innerHTML = created + ' by ';
    nameCol.appendChild(createdSpan);

    var nameSpan = document.createElement('span');
    nameSpan.setAttribute('class', 'messagesEntryUserName');
    nameSpan.innerHTML = userName;
    nameCol.appendChild(nameSpan);

    var profileCol = document.createElement('td');
    profileCol.setAttribute('width', '40%');
    if (MyBulletinBoard.profileColId === undefined) {
        MyBulletinBoard.profileColId = 0;
    }
    profileCol.setAttribute('id', 'profileCol' + MyBulletinBoard.profileColId++);
    profileCol.setAttribute('align', 'right');
    profileCol.setAttribute('valign', 'top');
    var profilePlaceHolder = document.createElement('span');
    if (MyBulletinBoard.profilePlaceHolderElementId === undefined) {
        MyBulletinBoard.profilePlaceHolderElementId = 0;
    }
    profilePlaceHolder.setAttribute('id', 'profilePlaceHolder' + MyBulletinBoard.profilePlaceHolderElementId++);
    profileCol.appendChild(profilePlaceHolder);

    detailsRow.appendChild(nameCol);
    detailsRow.appendChild(profileCol);

    var messageRow = document.createElement('tr');
    var messageCol = document.createElement('td');
    messageCol.setAttribute('colspan', 2);
    if (MyBulletinBoard.displayedMessagedCount % 2 == 0) {
        messageCol.setAttribute('class', 'messagesEntryEvenTd');
    }
    else {
        messageCol.setAttribute('class', 'messagesEntryOddTd');
    }
    messageCol.innerHTML = decodeURIComponent(message);
    messageRow.appendChild(messageCol);

    var entryTBody = document.createElement('tbody');
    entryTBody.appendChild(detailsRow);
    entryTBody.appendChild(messageRow);
    entry.appendChild(entryTBody);

    var container = document.createElement('table');
    container.setAttribute('border', '1');
    container.setAttribute('width', '100%');
    var containerRow = document.createElement('tr');
    var containerCol = document.createElement('td');
    containerCol.appendChild(entry);
    containerRow.appendChild(containerCol);
    var containerTBody = document.createElement('tbody');
    containerTBody.appendChild(containerRow);
    container.appendChild(containerTBody);

    var historyPlaceHolderSpan = document.getElementById('historyPlaceHolderSpan');
    if (historyPlaceHolderSpan.childNodes.length) {
        historyPlaceHolderSpan.insertBefore(container, historyPlaceHolderSpan.childNodes[0]);
    }
    else {
        historyPlaceHolderSpan.appendChild(container);
    }
    return detailsRow;
}

MyBulletinBoard.isLoggedIn = function MyBulletinBoard_isLoggedIn() {
    if (MyBulletinBoard.user && MyBulletinBoard.user.sessionKey) {
        return true;
    }
    return false;
}

MyBulletinBoard.formatDate = function(date) {
    if (!(date instanceof Date)) {
        return '';
    }
    var d = date;
    var format = '' + (d.getMonth() + 1) + '/' +
        d.getDate() + '/' +
        d.getFullYear() + ' ' +
        MyBulletinBoard.getAMPMHour(d) + ':' +
        MyBulletinBoard.getTwoDigitString(d.getMinutes()) + ':' +
        MyBulletinBoard.getTwoDigitString(d.getSeconds()) + ' ' +
        MyBulletinBoard.getPMAM(d);
    return format;
}

MyBulletinBoard.getTwoDigitString = function(num) {
    if (num < 10) {
        return '0' + num;
    }
    return '' + num;
}

MyBulletinBoard.getAMPMHour = function(date) {
    return date.getHours() % 12;
}

MyBulletinBoard.getPMAM = function(date) {
    return date.getHours() < 12 ? 'AM' : 'PM';
}

MyBulletinBoard.trimString = function(s) {
    return s.replace(/^\s+|\s+$/g, '');
}

MyBulletinBoard.checkLoginCookies = function() {
    var cookies = document.cookie;
    if (!cookies) {
        return;
    }
    var cookieValues = cookies.split(/;/);
    if (!cookieValues || !cookieValues.length) {
        return;
    }
    var name = null;
    var sessionKey = null;
    var cid = null;
    var consentToken = null;
    for (var i = 0; i < cookieValues.length; i++) {
        var cookieValue = cookieValues[i];
        if (!cookieValue) {
            continue;
        }
        var pair = cookieValue.split('=');
        if (!pair || pair.length !== 2) {
            continue;
        }
        var key = MyBulletinBoard.trimString(pair[0]);
        var value = MyBulletinBoard.trimString(pair[1]);
        switch (key) {
            case 'MyBulletinBoard-user-name':
                name = pair[1];
                break;
            case 'MyBulletinBoard-user-sessionKey':
                sessionKey = pair[1];
                break;
            case 'MyBulletinBoard-user-cid':
                cid = pair[1];
                break;
            case 'msgr-consent-token':
                consentToken = pair[1];
                break;
        }
    }
    if (name && sessionKey) {
        MyBulletinBoard.onSuccessfulLogin(name, sessionKey, cid, consentToken);
    }
}

// AsyncServerCall type --------------

MyBulletinBoard.AsyncServerCall = function(url, postData, callback) {
    this._url = document.location.protocol + '//' + document.location.host + '/' + url;
    this._callback = callback;
    this._postData = postData || '';
    if (!window.XMLHttpRequest) {
        alert('This browser is not supported');
        this._isSupported = false;
    }
}

MyBulletinBoard.AsyncServerCall.prototype = {
    _url: null,
    _callback: null,
    _request: null,
    _responseText: null,
    _responseStatus: null,
    _isSupported: true,
    _postData: null,

    send: function MyBulletinBoard_AsyncServerCall_send() {
        this._request = new XMLHttpRequest();
        this._request.open('POST', this._url, true);
        var serverCall = this;
        this._request.onreadystatechange = function() {
            if (4 === serverCall._request.readyState) {
                serverCall.onComplete(serverCall._request);
            }
        }
        try {
            this._request.send(this._postData);
        }
        catch ($e) {
            this.onComplete();
        }
    },

    onComplete: function MyBulletinBoard_AsyncServerCall_onComplete() {
        try {
            this._responseText = this._request.responseText;
            var injectedAdsStart = this._responseText.indexOf('<script');
            var injectedAdsEnd = this._responseText.indexOf('</script>');
            if (injectedAdsStart > 0 && injectedAdsEnd > 0 && injectedAdsStart < injectedAdsEnd) {
                var modifiedResponseText = this._responseText.substring(0, injectedAdsStart);
                this._responseText = modifiedResponseText + this._responseText.substr(injectedAdsEnd + 9);
                this._responseText = MyBulletinBoard.trimString(this._responseText);
            }
            this._responseStatus = this._request.status;
        }
        catch ($e) {
            this._responseText = null;
            this._responseStatus = null;
        }
        if (this._callback) {
            this._callback.call(MyBulletinBoard, this._responseText, this._responseStatus);
        }
        this._request = null;
    }
}

