﻿//generic.js

/////////////////
//utility methods

function ParseBoolean(str)
{
    if (str == undefined) return (false);

    //check if boolean
    if (typeof (str) == 'boolean')
    {
        return (str);
    }

    //parse string
    var bool = false;
    if (str.toLowerCase() == 'true')
    {
        bool = true;
    }
    return (bool);
}

function ParseUTCDate(str)
{
    var utcString = str;
    utcString = utcString.replace(new RegExp('/', 'g'), '');
    utcString = utcString.replace('Date(', '');
    utcString = utcString.replace(')', '');
    var utcMilliSeconds = parseInt(utcString);
    var dateObject = new Date(utcMilliSeconds);
    return (dateObject);
}

function ToUTCDateString(dateObject)
{
    var utcDate = new Date(1970, 0, 1);
    var utcMilliSeconds = dateObject - utcDate;
    var utcDateString = '\\/Date(' + utcMilliSeconds + ')\\/';
    return (utcDateString);
}

////////////////////////////
//syntax-highlighter methods

function InitializeSyntaxHighlighter()
{
    SyntaxHighlighter.all();
    SyntaxHighlighter.defaults['gutter'] = true;
    SyntaxHighlighter.defaults['toolbar'] = true;
    SyntaxHighlighter.defaults['wrap-lines'] = true;
}

///////////////////
//jquery-ui methods

function ShowMessageBox(message, title, callbackFn)
{
    //remove previous message-box containers
    $('#MessageBoxContainer').each(function()
    {
        $(this).remove();
    });

    //build message-box container
    message = message.replace(/\r\n/g, '<br/>');
    var tag = '<div id="MessageBoxContainer">';
    tag += '<label>' + message + '</span>';
    tag += '</label>';
    $(tag).appendTo('body');

    //build and show message-box dialog
    var dialogOptions =
    {
        'autoOpen': true,
        'title': title,
        'modal': true,
        'width': 420,
        'draggable': true,
        'resizable': false,
        'buttons': {
            'Ok': function()
            {
                if (callbackFn != undefined)
                {
                    callbackFn.apply();
                }
                $(this).dialog('close');
            }
        }
    };
    $('#MessageBoxContainer').dialog(dialogOptions);
}

//////////////////////////
//callback related methods

function BuildCallbackJson(module, action, argumentValues)
{
    var callbackJson =
    {
        'CallbackModule': module,
        'CallbackAction': action,
        'ArgumentValues': argumentValues
    }
    return (callbackJson);
}

function GeneralReceiveServerData(arg, msg)
{
    var callbackResult = JSON.parse(arg);

    //check error
    if (callbackResult.IsError == true)
    {
        var errorReport = 'Error:\n\n';
        errorReport += 'CallbackAction: ' + callbackResult.CallbackAction + '\n\n';
        errorReport += 'Message: ' + callbackResult.Exception.Message + '\n\n';
        errorReport += 'Source: ' + callbackResult.Exception.Source + '\n\n';
        errorReport += 'File: ' + callbackResult.Exception.File + '\n\n';
        errorReport += 'Method: ' + callbackResult.Exception.Method + '\n\n';
        errorReport += 'Line: ' + callbackResult.Exception.Line + '\n\n';
        errorReport += 'Trace: ' + callbackResult.Exception.Trace;
        alert(errorReport);
    }

    //process callback-result
    switch (callbackResult.CallbackAction)
    {
        case 'DoLogin':
            {
                var userStatus = callbackResult.ReturnValue.UserStatus;
                var loginSuccess = callbackResult.ReturnValue.LoginSuccess;
                if (userStatus == 1) //'NotYetActivated'
                {
                    ShowMessageBox('Your Account is not yet activated.\r\nPlease check your email\'s inbox/spam folder for activation mail.', 'Login');
                }
                else if (userStatus == 3) //'Blocked'
                {
                    ShowMessageBox('Your Account is blocked. Please use contact-page to report the problem.', 'Login');
                }
                else if (userStatus == 2 || userStatus == 0) //'Activated' or 'None'
                {
                    if (loginSuccess == false)
                    {
                        ShowMessageBox('Invalid UserName and/or Password.\r\nIf you have entered correct UserName and Password, please use contact-page to report the problem.', 'Login');
                    }
                    else //if login-success
                    {
                        //redirect to homepage with or without downloadurl
                        var returnUrl = callbackResult.ReturnValue.ReturnUrl;
                        var urlParts = returnUrl.toLowerCase().split('/');
                        if (urlParts.length > 0)
                        {
                            var pageName = urlParts[urlParts.length - 1];
                            if (pageName == 'default.aspx')
                            {
                                window.top.location = '/';
                            }
                            else
                            {
                                window.top.location = '/?action=download&url=' + returnUrl;
                            }
                        }
                        else //if invalid or blank returnurl, then redirect to homepage
                        {
                            window.top.location = '/';
                        }
                    }
                }
                return (true);
            }
        case 'ForgotPassword':
            {
                var emailFound = callbackResult.ReturnValue.EmailFound;
                var resetPasswordSuccess = callbackResult.ReturnValue.ResetPasswordSuccess;
                if (emailFound == false)
                {
                    ShowMessageBox('This Email is not registered with codeding.com.', 'Forgot Password');
                }
                if (resetPasswordSuccess == true)
                {
                    ShowMessageBox('Your password has been reset successfully.\r\nPlease check your email\'s inbox/spam folder for new account information.', 'Forgot Password', function() { window.top.location = '/'; });
                }
                return (true);
            }
        case 'ChangePassword':
            {
                var changePasswordSuccess = callbackResult.ReturnValue.ChangePasswordSuccess;
                if (changePasswordSuccess == true)
                {
                    ShowMessageBox('Your password has been changed successfully.', 'Change Password', function() { window.top.location = '/'; });
                }
                else
                {
                    ShowMessageBox('Invalid Current Password.', 'Change Password');
                }
                return (true);
            }
    }
    return (false);
}

function OnCallbackError(msg)
{
    //save error to error-log
    var jsonArguments = { 'Message': msg };
    var json = BuildCallbackJson('General', 'OnCallbackError', jsonArguments);
    var jsonText = JSON.stringify(json);
    if (CallServer)
    {
        CallServer(jsonText);
    }

    alert('CallbackError: ' + msg + '\r\n\r\nSorry for the inconvenience.\r\n(Admin has been notified about the error).');
}

/////////////
//dom methods

function DisableControl(id, newInnerText)
{
    //change color & set disabled attribute
    $('#' + id).fadeTo('fast', 0.3);
    $('#' + id).attr('Disabled', 'true');

    //backup & remove behavior attributes
    $('#' + id).attr('innerTextBackup', $('#' + id).text());
    $('#' + id).attr('hrefBackup', $('#' + id).attr('href'));
    $('#' + id).removeAttr('href');

    //set new inner-text
    if (newInnerText != undefined)
    {
        $('#' + id).text(newInnerText);
    }
}

function EnableControl(id)
{
    //change color & reset disabled attribute
    $('#' + id).fadeTo('fast', 1.0);
    $('#' + id).attr('Disabled', 'false');

    //reset behavior attributes
    $('#' + id).text($('#' + id).attr('innerTextBackup'));
    $('#' + id).attr('href', $('#' + id).attr('hrefBackup'));
}

function IsDisabled(id)
{
    var disabledAttribute = $('#' + id).attr('Disabled');
    return (ParseBoolean(disabledAttribute));
}

////////////////////
//validation methods

function IsValidUserName(usr)
{
    //pattern description:
    //1) allows alphanumeric characters, dot and underscore
    //2) minimum 3 characters, maximum 30 characters
    //3) should start with an alphabet,
    //4) shouldn't end with a dot.
    var pattern = '^[a-zA-Z]{1}[a-zA-Z0-9_\.]{1,28}[a-zA-Z0-9]{1}$';
    var regex = new RegExp(pattern);
    var match = regex.exec(usr);
    return (match != null);
}

function IsValidPassword(pwd)
{
    //pattern description:
    //1) allows any non-whitespace characters
    //2) minimum 6 characters, maximum 30 characters
    var pattern = '^[\\S]{6,30}$';
    var regex = new RegExp(pattern);
    var match = regex.exec(pwd);
    return (match != null);
}

function IsValidEmail(email)
{
    //pattern description:
    //1) pattern1@pattern2.pattern3
    //2) allows alphanumeric, dot & underscore for pattern1
    //2) allows alphanumeric & hyphen for pattern2
    //3) allows alphabets & dot for pattern3
    //4) pattern1 & pattern2 shud start with an alphanumeric
    //4) minimum 1 character for pattern1, minimum 2 characters for pattern2 & pattern3
    //5) maximum 7 characters for pattern3
    var pattern1 = '[a-zA-Z0-9]{1}[a-zA-Z0-9_\.]{0,}';
    var pattern2 = '[a-zA-Z0-9]{1}[a-zA-Z0-9\-]{1,}';
    var pattern3 = '[a-zA-Z\.]{2,7}';
    var pattern = '^' + pattern1 + '@{1}' + pattern2 + '[\.]{1}' + pattern3 + '$';
    var regex = new RegExp(pattern);
    var match = regex.exec(email);
    return (match != null);
}

/////////////////////////////
//silverlight-related methods

function OnSilverlightError(sender, args)
{
    var appSource = "";
    if (sender != null && sender != 0)
    {
        appSource = sender.getHost().Source;
    }

    var errorType = args.ErrorType;
    var iErrorCode = args.ErrorCode;

    if (errorType == "ImageError" || errorType == "MediaError")
    {
        return;
    }

    var errMsg = "Unhandled Error in Silverlight Application " + appSource + "\n";

    errMsg += "Code: " + iErrorCode + "    \n";
    errMsg += "Category: " + errorType + "       \n";
    errMsg += "Message: " + args.ErrorMessage + "     \n";

    if (errorType == "ParserError")
    {
        errMsg += "File: " + args.xamlFile + "     \n";
        errMsg += "Line: " + args.lineNumber + "     \n";
        errMsg += "Position: " + args.charPosition + "     \n";
    }
    else if (errorType == "RuntimeError")
    {
        if (args.lineNumber != 0)
        {
            errMsg += "Line: " + args.lineNumber + "     \n";
            errMsg += "Position: " + args.charPosition + "     \n";
        }
        errMsg += "MethodName: " + args.methodName + "     \n";
    }

    throw new Error(errMsg);
}

