﻿// ------------------------------------------------------------------------------------------------
// BrighterTools jQuery Library
// Custom jQuery/plugins, Initialization and other included jquery plugins
// Copyright © 2010. BrighterTools Limited.
// Other jQuery plugins copyright by their respective owners.
// ------------------------------------------------------------------------------------------------
var intervalTimer = null;

jQuery(document).ready(function () 
{
    $("ul.sf-menu").superfish({ pathClass: 'current' });
    $(".button").button();
    $('.data-entry-field').bind('keypress keyup change', function (e) { highLightSaveButtons(); });
    //$('.delete-button').bind('click', function (e) { confirmDelete(); });
});

function highLightSaveButtons() 
{
    $(".data-entry-save").addClass("save-button");
}

function InitializeDataListView() 
{
    
    // Initialise ListView Alternating Row and Mouse-Over styles
    jQuery('.listview tr:nth-child(even)').addClass('listview-alt');

    jQuery('.listview tr').mouseover(function()
    {
        jQuery(this).addClass('listview-over');

    });
    jQuery('.listview tr').mouseout(function()
    {
        jQuery(this).removeClass('listview-over');
    });

    InitializeListViewTableDragAndDrop();
};



function InitializeHelpIcons()
{
    jQuery('a.HelpIcon').cluetip
    (
        {
            height: 'auto',
            arrows: true,
            ajaxCache: false
        }
    );
};

function HighlightListViewRow(control) 
{
    if (control.checked) 
    {
        jQuery(control).parent("td").parent("tr").addClass("listview-selected");
    }
    else
    {
        jQuery(control).parent("td").parent("tr").removeClass("listview-selected");
    }
};

function SelectCurrentListViewRow(control) {
    var checkBox = jQuery(control).parent("td").parent("tr").find("input:checkbox:first");
    if (checkBox.attr('checked')) {
        checkBox.attr('checked', false);
        jQuery(control).parent("td").parent("tr").removeClass("listview-selected");
    }
    else {
        checkBox.attr('checked', true);
        jQuery(control).parent("td").parent("tr").addClass("listview-selected");
    }
};

function InitializeListViewTableDragAndDrop() {
    jQuery('.listview').tableDnD(
    {
        onDragClass: "listview-dragging",
        onDrop: function(table, row) {
            try {
                if (window != undefined) {
                    if (window.onListViewDragAndDropOrderingDrop != undefined) {
                        onListViewDragAndDropOrderingDrop(table, row);
                    }
                }
            }
            catch (err) {
            }
        },
        dragHandle: "dragHandle"
    });
};

// Checks all the checkboxes to the same status as the specified control in the same table
// Used in ListView Grid Layouts
function SelectAllListViewTableCheckboxes(tableName, control) {
    jQuery('#' + tableName + ' >tbody >tr >td >input:checkbox').attr('checked', control.checked);

    if (control.checked) {
        jQuery('#' + tableName + ' >tbody >tr').addClass("listview-selected");
    }
    else {
        jQuery('#' + tableName + ' >tbody >tr').removeClass("listview-selected");
    }

    jQuery(control).parent("td").parent("tr").removeClass("listview-selected");
    jQuery(control).parent("td").parent("tr").addClass("listview-header");
};

/* Highlights Invalid Form fields */
/* Possible solution to use this to replace validation summary (showing all error messages or one single message */
function HighlightInvalidFormFields(rootURL) {
    var validators = jQuery('.dataEntryFormTable').find("span[controltovalidate]");
    var inputToFocus = '';

    // Reset all the styles
    validators.each(function() {
        jQuery('#' + this.controltovalidate).css("border", "solid 1px #CCCCCC");
        jQuery('#' + this.controltovalidate).css('backgroundImage', '');
    });

    validators.each(function() {

        var validatorEnabled = true;
        if (jQuery('#' + this.id).attr('enabled') == false) {
            validatorEnabled = false;
        }

        if (validatorEnabled) {

            ValidatorValidate(this);

            if (!this.isvalid) {

                if (inputToFocus == '') {
                    inputToFocus = this.controltovalidate;
                }

                var width = jQuery('#' + this.controltovalidate).width() - 16;
                jQuery('#' + this.controltovalidate).css("border", "dashed red 1px");
                if (this.controltovalidate.match(/TextBox$/)) {

                    if (this.controltovalidate.match(/Date/)) {
                        width = width - 17;
                    }

                    //alert(jQuery('#' + this.id).attr('ErrorMessage'));
                    
                    jQuery('#' + this.controltovalidate).css('backgroundImage', 'url(' + rootURL + '/Site/Images/Icons/16x16/Asterisk.gif)');
                    jQuery('#' + this.controltovalidate).css('backgroundRepeat', 'no-repeat');
                    jQuery('#' + this.controltovalidate).css('backgroundPosition', width.toString() + 'px 0px');
                }
            }
        }
    });
    
    if (inputToFocus != '') 
    {
        jQuery('#' + inputToFocus).focus();
    }
}

/* BrighterTools Validate Plugin : brighterValidate */
/* Copyright (c) 2010. BrighterTools Limited.       */
; (function (jQuery) {
    jQuery.fn.brighterValidate = function (options) {
        // default settings
        options = jQuery.extend(
        {
            rootURL: '',
            form_name: 'MainForm',
            required_field_class: 'required-field',
            email_field_class: 'email-field',
            date_field_class: 'date-field',
            date_format_separator: '/',
            date_format: 'dd/mm/yyyy',
            invalid_image: '/Content/Images/Icons/16x16/Asterisk.gif',
            error_message_attribute: 'dataerrormessage',
            equals_attribute:'data-equals',
            reset_styles_only: false,
            onComplete: function () { }
        },
        options || {});

        var fieldsToValidate = jQuery('#' + options.form_name).find("." + options.required_field_class + ", ." + options.email_field_class + ", ." + options.date_field_class);

        var inputToFocus = '';
        var errorCount = 0;
        var errorMessageList = "";

        // Reset all the styles (create external styles to switch)
        fieldsToValidate.each(function ()
        {
            if ( $(this).is('input:checkbox') )
            {    
                $(this).parent().css("border", "solid 1px Transparent"); 
            }
            else
            {
                jQuery(this).css("border", "solid 1px #CCCCCC");
                jQuery(this).css('backgroundImage', '');

                if ($(this).is('select'))
                {
                    jQuery('#' + jQuery(this).attr('id') + ' option:first').css("color", "black");
                }
            }
        });
        
//        if (options.reset_styles_only == true)
//        {
//            return this;
//        }

        fieldsToValidate.each(function () 
        {
            var validationEnabled = true;

            if (jQuery('#' + this.id).attr('enabled') == false) {
                validationEnabled = false;
            }

            if (validationEnabled) 
            {
                var isRequired = false;
                var isValid = true;
                var inputValue = jQuery.trim($(this).attr("value"));
                
                // Validate if required field (Text)
                if (isValid && $(this).is('.' + options.required_field_class)) 
                {
                    isRequired = true;
                    
                    if (inputValue == "")
                    {
                        isValid = false;
                    }
                }

                // Validate if CheckBox
                if ( $(this).is('input:checkbox') && !$(this).is(":checked") )
                {
                    isValid = false;
                }

                // Validate if this field needs to 'equal' another field
                var equalFieldToValidate = jQuery.trim($(this).attr(options.equals_attribute));
                if (isValid && equalFieldToValidate != "")
                {
                    if (jQuery('#' + equalFieldToValidate).length > 0)
                    {
                        if (inputValue != jQuery.trim($('#' + equalFieldToValidate).attr("value")) )
                        {
                            isValid = false;
                        }
                    }
                }

                // Validate if email
                if (isValid && $(this).is('.' + options.email_field_class)) {
                    var emailRegExp = new RegExp(/^((([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(\.([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+)*)|((\x22)((((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(([\x01-\x08\x0b\x0c\x0e-\x1f\x7f]|\x21|[\x23-\x5b]|[\x5d-\x7e]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(\\([\x01-\x09\x0b\x0c\x0d-\x7f]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))))*(((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(\x22)))@((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?$/i);

                    if (!emailRegExp.test(inputValue)) 
                    {
                        isValid = false;
                    }
                }

                // validate if date
                if (isValid && (!isRequired && (inputValue != "")) && $(this).is('.' + options.date_field_class)) 
                {
                    var dateFormatRegExp = new RegExp(/^\d{1,2}(\-|\/|\.)\d{1,2}\1\d{4}$/);
                    if (!dateFormatRegExp.test(inputValue))
                    {
                        isValid = false;
                    }
                    else
                    {
                        var day = 0;
                        var month = 0;
                        var year = 0;
                        var dateArray = inputValue.split(options.date_format_separator);
                        
                        switch(options.date_format)
                        {
                            case "dd/mm/yyyy":
                            {
                                day = dateArray[0];
                                month = dateArray[1];
                                year = dateArray[2];
                                break;
                            }
                            case "mm/dd/yyyy":
                            {
                                day = dateArray[1];
                                month = dateArray[0];
                                year = dateArray[2];
                                break;
                            }
                        }
                        
                        isValid = ((day > 0 && year > 0) && (
                        ((month == 1) && (day <= 31)) ||
                        ((month == 2) && (((day <= 28) && (year % 4 > 0)) || ((day <= 29) && (year % 4 == 0)))) ||
                        ((month == 3) && (day <= 31)) ||
                        ((month == 4) && (day <= 30)) ||
                        ((month == 5) && (day <= 31)) ||
                        ((month == 6) && (day <= 30)) ||
                        ((month == 7) && (day <= 31)) ||
                        ((month == 8) && (day <= 31)) ||
                        ((month == 9) && (day <= 30)) ||
                        ((month == 10) && (day <= 31)) ||
                        ((month == 11) && (day <= 30)) ||
                        ((month == 12) && (day <= 31)) ));
                    }
                }


                if (isValid == false) 
                {
                    errorCount++;

                    if (inputToFocus == '') 
                    {
                        inputToFocus = this.id;
                    }

                    var message = jQuery(this).attr(options.error_message_attribute);

                    if (message != undefined && message != "")
                    {
                        errorMessageList = errorMessageList + (errorMessageList == "" ? "- " + message : "<br />- " + message);
                    }

                    var width = jQuery(this).width() - 16;

                    if ($(this).is('input:checkbox'))
                    {    
                        $(this).parent().css("border", "dashed red 1px"); 
                    }
                    else
                    {
                        jQuery(this).css("border", "dashed red 1px");

                        if ($(this).is('select'))
                        {
                            jQuery('#' + jQuery(this).attr('id') + ' option:first').css("color", "red");
                        }
                    }

                    if ($(this).is('input:text') || $(this).is('input:password')) // || $(this).is('select')
                    {
                        if ($(this).is('.' + options.date_field_class) || $(this).is('select'))
                        {
                            width = width - 17;
                        }

                        if (options.invalid_image != "") 
                        {
                            jQuery(this).css('backgroundImage', 'url(' + options.rootURL + options.invalid_image + ')');
                            jQuery(this).css('backgroundRepeat', 'no-repeat');
                            jQuery(this).css('backgroundPosition', width.toString() + 'px 0px');
                        }
                    }
                }
            }
        });

        // Focus first invalid element
        if (inputToFocus != '') {
            jQuery('#' + inputToFocus).focus();
        }

        result = new Object;
        result.errorCount = errorCount;
        result.formValid = (errorCount <= 0 ? true : false);
        result.errorMessageList = errorMessageList;

        options.onComplete.call(this, result);

        return this;
    };
})(jQuery);

function addJobTitleToSelectList(rootUrl)
{
    openSingleTextEntryAddToListDialog('JobTitleSelectList', '(select job title)', 'Add Job Title', 'AddJobTitle', 'Contacts', rootUrl);
}
function addCompanyToSelectList(rootUrl)
{
    openSingleTextEntryAddToListDialog('CompanySelectList', '(select company)', 'Add Company', 'AddCompany', 'Contacts', rootUrl);
}
function openSingleTextEntryAddToListDialog(selectListName, selectListDefaultItem, title, action, controller, rootUrl) 
{
    $('#SingleTextEntryDialogForm').attr('action', rootUrl + controller + '\/' + action);
    $('#SingleTextEntryDialogForm').attr('selectListName', selectListName);
    $('#SingleTextEntryDialogForm').attr('selectListDefaultItem', selectListDefaultItem);

    $("#SingleTextEntryDialog").dialog(
    {
        title: title,
        modal: true,
        open: function (event, ui) {
            $('#SingleTextEntryTextBox').val('');
            setTimeout("$('#SingleTextEntryTextBox').focus();", 300);
            $('#SingleTextEntryDialogForm').keypress(function (e) {
                if (e.keyCode == 13) {
                    $('.ui-dialog-buttonpane').find('button:contains("Save")').trigger('click');
                    return false;
                }
            });
            $('#SingleTextEntryDialogForm').keyup(function (e) {
                if (e.keyCode == 13) {
                    $('.ui-dialog-buttonpane').find('button:contains("Save")').trigger('click');
                    return false;
                }
            });
        },
        buttons:
        {
            'Save': function () 
            {
                $('#SingleTextEntryDialogForm').brighterValidate({
                    rootURL: rootUrl,
                    form_name: 'SingleTextEntryDialogForm',
                    onComplete: function (result) {
                        if (result.formValid) {
                            var form = $('#SingleTextEntryDialogForm');
                            var formAction = form.attr('action');
                            var formSelectedList = form.attr('selectListName');
                            var formSelectedDefaultItem = form.attr('selectListDefaultItem');
                            var serializedForm = form.serialize().replace('%3C%2F', '--');

                            $("#ajaxLoading").show();

                            try {
                                $.post(formAction, serializedForm, function (Data) {
                                    $('#SingleTextEntryDialog').dialog('close');

                                    if (Data.Result == "ERR") {
                                        alert(Data.ErrorMessage);
                                        return;
                                    }

                                    $("#" + formSelectedList).get(0).options.length = 0;
                                    if (formSelectedDefaultItem != "") {
                                        $("#" + formSelectedList).get(0).options[0] = new Option(formSelectedDefaultItem, "");
                                    }
                                    for (var i = 0; i < Data.Items.length; i++) {
                                        $("#" + formSelectedList).get(0).options[$("#" + formSelectedList).get(0).options.length] = new Option(Data.Items[i].Text, Data.Items[i].Value);
                                    }
                                    $('#' + formSelectedList).val(Data.SelectedID);

                                    $("#ajaxLoading").hide();
                                });

                            }
                            catch (err) {
                                txt = "There was an error on this page.\n\n";
                                txt += "Error description: " + err.description + "\n\n";
                                txt += "Click OK to continue.\n\n";
                                alert(txt);
                            }
                        }
                    }
                });
            },
            'Cancel': function () {
                $('#SingleTextEntryDialog').dialog('close');
                $("#ajaxLoading").hide();
            }
        }
    });
};

function focusElement(elementID) 
{
    jQuery('#' + elementID).focus();
}


function validateAndSubmitForm(formName, rootUrl) 
{
    $('#' + formName).brighterValidate({
        rootURL: rootUrl,
        form_name: formName,
        onComplete: function (result) {
            if (result.formValid) {
                $("#" + formName).submit();
            }
            else {
                if (result.errorMessageList != "") {
                    $('#AlertDialogText').html(result.errorMessageList);

                    $("#AlertDialog").dialog({
                        modal: true,
                        width: '450px',
                        buttons: {
                            Ok: function () {
                                $(this).dialog('close');
                            }
                        }
                    });
                }
            }
        }
    });
};

function hideMessagePanel() 
{
    $('#inline-message-panel').html('').hide();
}
function showMessagePanel(message, type) 
{
    if (message != "") 
    {
        var bordercss = 'solid 1px green';
        var backcolor = 'D4FFD4';
        switch (type) 
        {
            case 'error':
                {
                    bordercss = 'solid 1px #FF0000';
                    backcolor = 'FFD4D4';
                    break;
                }
            case 'info':
                {
                    bordercss = 'solid 1px #0000FF';
                    backcolor = '#D4D4FF';
                    break;
                }
            case 'warn':
                {
                    bordercss = 'solid 1px #FF5500';
                    backcolor = '#FFFFAA';
                    break;
                }
        }
        $('#inline-message-panel').html(message).show().css('border', bordercss).css('background-color', backcolor);

        //intervalTimer = window.setInterval(function () {
        //    window.clearInterval(intervalTimer);
        //    $('#inline-message-panel').hide();
        //}, 1500);
    }
}
