﻿//**************************************************
//
// BugFree.js
//
//**************************************************

var enableMvcUrl = false;
var False = false;
var popupHandle = '.panelFlex';
var True = true;
var urlPopupCancel = '/Template/CancelDialog';

function ajaxPost(url, data, noIndicator)
{
    if (noIndicator !== true)
    {
        popupProcessingIndicator();
    }

    url = mvcUrl(url);
    jQuery.ajax({
        url: url,
        type: 'POST',
        dataType: 'html',
        data: data,
        complete: ajaxProcess
    });
}

function ajaxProcess(responseText, textStatus)
{
    popupRemove(jQuery('.popupContent.processing'));

    var mvcActions = responseText.responseText.split('MVCAction=');
    for (var i = 1; i < mvcActions.length; i++)
    {
        var mvcAction = mvcActions[i];
        var target = mvcAction.split('\r\n', 1)[0];
        var action = target.split(':', 1)[0];
        var actionParam = target.substr(action.length + 1);
        try
        {
            switch (action)
            {
                case 'MVCInject':
                    var injectHtml = mvcAction.substr(target.length + 2);
                    jQuery(actionParam).append(injectHtml);
                    continue;

                case 'MVCJavascript':
                    eval(actionParam);
                    continue;

                case 'MVCRedirect':
                    linkTo(actionParam);
                    continue;

                case 'MVCRender':
                    var renderHtml = mvcAction.substr(target.length + 2);
                    ajaxReplace(actionParam, renderHtml);
                    continue;

                default:
                    alert('MVCAction failed: ' + mvcAction);
                    return;
            }
        }
        catch (jsError)
        {
            alert(action + ' failed: ' + actionParam);
            return;
        }
    }
}

function ajaxReplace(actionParam, html)
{
    var targetElement = jQuery(actionParam)[0];
    switch (targetElement.tagName.toLowerCase())
    {
        case 'input':
        case 'textarea':
            targetElement.value = html;
            break;

        case 'style':
            if (window['netscape'])
            {
                targetElement.innerHTML = html;
                break;
            }
            // IE-specific
            if (targetElement.styleSheet)
            {
                targetElement.styleSheet.cssText = html;
                break;
            }
            targetElement.innerText = html;
            break;

        case 'script':
        case 'title':
            targetElement.text = html;
            break;

        default:
            targetElement.innerHTML = html;
            break;
    }
}

function dialogAction(dialog, action)
{
    dialog = jQuery(dialog);
    var controller = dialog.attr('class');
    dialogForm(dialog, '/' + controller + '/' + action, 'DialogId=' + dialog.attr('id'));
}

function dialogFocus(dialog)
{
    var focus = jQuery(dialog).find('.bfFocus:enabled').first();
    if (!focus.length)
    {
        focus = jQuery(dialog).find('.bfInput:enabled').first().addClass('bfFocus');
    }
    focus.focus().select();
}

function dialogForm(dialog, url, data)
{
    dialog = jQuery(dialog);
    var form = dialog.find('form');
    if (form.length)
    {
        // let server know this is a form submission instead of an ajax post
        if (form.find(".bfAjaxForm").length == 0)
        {
            // hidden indicator is not present yet, add it to the form
            form.append('<input type="hidden" class="bfAjaxForm" name="ajaxForm" value="true" />');
        }
        form.attr('action', url);
        form.submit();
        return;
    }

    var text = dialog.find('.bfInput').serialize();
    ajaxPost(url, data + '&' + text);
}

function linkTo(url)
{
    popupProcessingIndicator();
    window.location = mvcUrl(url);
    return false;
}

function messageAction(action)
{
    ajaxPost('/Message/Action?action=' + action);
}

function mvcUrl(url)
{
    if (url.indexOf('/') == 0)
    {
        var mvc = url.indexOf('.mvc');
        if (mvc > 0 && !enableMvcUrl)
        {
            // contains .mvc but should not, remove .mvc
            return url.substring(0, mvc) + url.substring(mvc + 4);
        }
        if (mvc < 0 && enableMvcUrl)
        {
            // contains no .mvc but should, insert .mvc
            var next = url.indexOf('/', 1);
            if (next > 0)
            {
                return url.substring(0, next) + '.mvc' + url.substring(next);
            }
        }
    }
    return url;
}

function popupCancel()
{
    ajaxPost(urlPopupCancel);
}

function popupHide()
{
    // removes last popup from DOM (note: the processing indicator is also a popup!)
    popupRemove(jQuery('.popupContent').not('.processing').last());
}

function popupKeyHandler(event)
{
    if (event.keyCode == 27)
    {
        popupCancel();
        return false;
    }

    if (event.keyCode == 13)
    {
        jQuery('.popupContent').not('.processing').last().find('button.bfDefault:enabled').first().focus().click();
        return false;
    }
}

function popupProcessingIndicator()
{
    jQuery('body').append('<div class="popupMask"></div><div class="popupContent processing"></div>');
    jQuery('.popupMask').last().height(jQuery(document).height());
}

function popupRemove(popup)
{
    if (popup.length)
    {
        var mask = popup.prev();
        popup.remove();
        mask.remove();
    }
}

function popupShow()
{
    // avoid using the processing indicator to calculate the dialog size
    var popup = jQuery('.popupContent').not('.processing').last();
    var mask = popup.prev();
    var doc = jQuery(document);
    mask.height(doc.height());
    var wh = jQuery(window).height();
    var ph = popup.height();
    var offset =
    {
        left: (mask.width() - popup.width()) / 2,
        top: Math.min(Math.max(0, (wh - ph) / 2), 100) + doc.scrollTop()
    }
    popup.offset(offset);
    popup.draggable({ handle: popup.find(popupHandle), containment: mask });
    popup.keydown(popupKeyHandler)
    dialogFocus(popup);
    return popup;
}

function stopPropagation(e)
{
    e = e || window.event;
    if (e.stopPropagation)
    {
        e.stopPropagation();
    }
    else if (window.event)
    {
        e.cancelBubble = true;
    }
}

