﻿///<reference name="MicrosoftAjax.js"/>
///<reference path="../buttons/NineSliceButton/NineSliceButton.js"/>

var njs;
if (!njs) njs = {};
if (!njs.ui) njs.ui = {};
if (!njs.ui.widgets) njs.ui.widgets = {};

njs.ui.widgets.ErrorMessage = {}

///Log and Handles the exception
njs.ui.widgets.ErrorMessage.HandleError = function (message, url, line)
{       
   if(!njs.ui.widgets.ErrorMessage.IsServiceException(message)){
        njs.services.Logging.LogJavaScriptException(message, url, line);
    }
    njs.ui.widgets.ErrorMessage.Show(message, url, line);
    return true;
 }  

///Displays the exception
njs.ui.widgets.ErrorMessage.Show = function(message, url, line) {
    if (!this.IsSeriousException(message)) 
        return;
        
    var contentContainer = new njs.ui.Div();
    var errorImage = new njs.ui.Div();
    var textContainer = new njs.ui.Div();
    var buttonContainer = new njs.ui.Div();
    var div = njs.ui.widgets.ErrorMessage.GetDiv();
    
    div.Clear();
      
    textContainer.AddText(njs.ui.widgets.ErrorMessage.CreateMessage(message));
    buttonContainer.Add(njs.ui.widgets.ErrorMessage.CreateButton(message));
    
    contentContainer.Add(errorImage);
    contentContainer.Add(buttonContainer);
    contentContainer.Add(textContainer);
    
    div.Add(contentContainer);
    div.SetClass('njs-ErrorMessageVisible');
    contentContainer.SetClass('njs-ErrorMessageVisible-content');
    errorImage.SetClass('njs-ErrorMessageVisible-image');
    textContainer.SetClass('njs-ErrorMessageVisible-text');
    buttonContainer.SetClass('njs-ErrorMessageVisible-button')
}

///Hides the exception
njs.ui.widgets.ErrorMessage.Hide = function() {
    var div = njs.ui.widgets.ErrorMessage.GetDiv();
    div.Clear();    
    div.SetClass('njs-ErrorMessageHidden');
}

///Exemption Div
njs.ui.widgets.ErrorMessage.GetDiv = function() {
    var errorDiv = new njs.ui.Element('njsErrorMessageDiv');
    if (errorDiv.Container === null) {
        errorDiv = new njs.ui.Div();
        errorDiv.SetID('njsErrorMessageDiv');
        njs.ui.widgets.ErrorMessage.GetContainer().Add(errorDiv);
    }
    return errorDiv;
}

///Exception Container
njs.ui.widgets.ErrorMessage.GetContainer = function() {
    return new njs.ui.Element(document.getElementsByTagName('body')[0]);
}

///Creates exception message to display to the user
njs.ui.widgets.ErrorMessage.CreateMessage = function(message) {
    if (njs.ui.widgets.ErrorMessage.HasAuthenticationTicketExpired(message))
        return 'Your session expired. Please click the Login button to login again.';
    else if (njs.ui.widgets.ErrorMessage.IsUrlInvalid(message))
        return message + ' Please, reload this page with a corrected URL.';
    else return 'An application exception occurred. Click the Close button. If you continue having issues, refresh the page.';
}

njs.ui.widgets.ErrorMessage.CreateButton = function(message) {
    if (njs.ui.widgets.ErrorMessage.HasAuthenticationTicketExpired(message))
        return new njs.ui.widgets.buttons.NineSliceButton('Login', function() {location.reload();});
    else 
        return new njs.ui.widgets.buttons.NineSliceButton('Close', njs.ui.widgets.ErrorMessage.Hide);
}

njs.ui.widgets.ErrorMessage.RequiredElements = [];
njs.ui.widgets.ErrorMessage.AddRequiredElement = function(element) {
    this.RequiredElements[this.RequiredElements.length] = element;
}

njs.ui.widgets.ErrorMessage.IsPageNotLoaded = function() {
    
    for (var i=0; i<this.RequiredElements.length; i++)  {
        if (this.RequiredElements[i].IsEmpty()) 
            return true;
    }
    return false;
}

///Exception Types
njs.ui.widgets.ErrorMessage.IsSeriousException = function(message) {
    return this.IsServiceException(message) || this.IsPageNotLoaded() || this.IsUrlInvalid(message);
}

njs.ui.widgets.ErrorMessage.HasAuthenticationTicketExpired = function(message) {
    if (!(this.IsServiceException(message)))
        return false;
    
    return (message.get_message() == 'Athentication Ticket Expired');
}

njs.ui.widgets.ErrorMessage.IsServiceException = function(message) {
    return (typeof message == 'object') && (message.get_message());
}

njs.ui.widgets.ErrorMessage.IsUrlInvalid = function(message) {
    return message.startsWith && message.startsWith('Invalid URL');   
}