﻿var modules = new Object();

modules["vmOptional"] = function () { return false; };

function vmNotBlank(control) { return $(control).val() == '' || $(control).val() == '-1'; };
modules["vmNotBlank"] = vmNotBlank;

function vmNotEmail(control) { return $(control).val().indexOf('@') != -1; };
modules["vmNotEmail"] = vmNotEmail;

function vmEmail(control, settings) {
    var val = $(control).val();
    if (!settings.VPs.vmRequired && val.length == 0) return false;
    return !/^.+?\@.+?\..+?$/.test(val);
};
modules["vmEmail"] = vmEmail;

function vmIsHexColor(control, settings) {
    var val = $(control).val();
    if (!settings.VPs.vmRequired && val.length == 0) return false;
    return !/^#[0-9a-fA-F]{6}$/.test(val);
};
modules["vmIsHexColor"] = vmIsHexColor;

function vmNumber(control, settings) {
    var val = $(control).val();
    if (val.length == 0 && !settings.VPs.vmRequired) return false;
    if (val.length == 0) return true;
    return !(val.toString().search(/^-?[0-9]+$/) == 0);
};
modules["vmNumber"] = vmNumber;

function vmFloat(control, settings) {
    var val = $(control).val();
    if (val.length == 0 && !settings.VPs.vmRequired) return false;
    if (val.length == 0) return true;
    return !(val.toString().search(/^-?(\d*)\.?(?=\d+)\d*$/) == 0);
};
modules["vmFloat"] = vmFloat;

function vmIP(control, settings) {
    var val = $(control).val();
    var rangeVal = '';
    if (settings.VPs.vmIPRange) rangeVal = $('#' + settings.VPs.vmIPRange).val();
    if (!settings.VPs.vmRequired && val.length == 0 && rangeVal.length == 0) return false;
    var match = /^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$/.test(val);
    return !match;
};
modules["vmIP"] = vmIP;

function vmIPRange(control, settings) {
    var val = $('#' + settings.VPs.vmIPRange).val();
    if (!settings.VPs.vmRequired && $(control).val().length == 0 && val.length == 0) return false;
    var match = /^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$/.test(val);
    return !match;
};
modules["vmIPRange"] = vmIPRange;

function vmNoInvalidChars(control, settings) {
    var val = $(control).val();
    var match = /[\*\<\>\:\/\|\"\?]/.test(val);
    return match;
}
modules["vmNoInvalidChars"] = vmNoInvalidChars;

function vmNoInvalidCharsOrBackslash(control, settings) {
    var val = $(control).val();
    var match = /[\*\<\>\:\/\|\"\?\\]/.test(val);
    return match;
}
modules["vmNoInvalidCharsOrBackslash"] = vmNoInvalidCharsOrBackslash;

function vmNoSpaces(control, settings) {
    var val = $(control).val();
    var match = /[ ]/.test(val);
    return match;
}
modules["vmNoSpaces"] = vmNoSpaces;

function vmNumberLess(control, settings) { return parseInt($(control).val()) > settings.VPs.vmNumberLess; };
modules["vmNumberLess"] = vmNumberLess;

function vmNumberGreater(control, settings) { return parseInt($(control).val()) < settings.VPs.vmNumberGreater; };
modules["vmNumberGreater"] = vmNumberGreater;

function vmUNC(control, settings) {
    var val = $(control).val();
    if (!settings.VPs.vmRequired && val.length == 0) return false;
    return val.indexOf('\\\\') == 0;
}
modules["vmUNC"] = vmUNC;

function vmFileRoot(control, settings) {
    var val = $(control).val();
    if (!settings.VPs.vmRequired && val.length == 0) return false;
    return /^[a-zA-Z]\:\\$/.test(val);
}
modules["vmFileRoot"] = vmFileRoot;

function vmFileUnRooted(control, settings) {
    var val = $(control).val();
    if (!settings.VPs.vmRequired && val.length == 0) return false;
    return !/^[a-zA-Z]\:\\/.test(val);
}
modules["vmFileUnRooted"] = vmFileUnRooted;

function vmRequiredIfChecked(control, settings) {
    var cb = $get(settings.VPs.vmRequiredCheckbox);
    if (cb == null) return;
    if (cb.checked && $(control).val().length == 0) return true;
    return false;
};
modules["vmRequiredIfChecked"] = vmRequiredIfChecked;

function vmMustMatch(control, settings) {
    var tb = $get(settings.VPs.vmMustMatchField);
    if (tb == null) return;
    if ($(tb).val() != $(control).val()) return true;
    return false;
};
modules["vmMustMatch"] = vmMustMatch;

function $vc(settingsObject, focus) {
    var control = $get(settingsObject.vcID);
    if (control == null) return;
    control.settingsObject = settingsObject;
    control.settingsObject.isPostBack = modules['isPostBack'];

    $(control).attr('autocomplete', 'off').blur(ControlBlurred);

    if (settingsObject.VPs.vmRequiredCheckbox) {
        var cb = $get(settingsObject.VPs.vmRequiredCheckbox);
        if (cb) {
            var checkFunc = function () { $(control).change(); };
            $(cb).change(checkFunc).click(checkFunc);
        }
    }
    if (settingsObject.VPs.vmIPRange) {
        var tb = $get(settingsObject.VPs.vmIPRange);
        if (tb) {
            var checkFunc = function () { $(control).change(); };
            $(tb).keyup(checkFunc).change(checkFunc).click(checkFunc);
        }
    }

    if (control.settingsObject.isPostBack) $(control).blur();
    control.settingsObject.isPostBack = false;
    if (focus) $(control).change();
}

function ShowTooltipInner(control) {
    var row = $(control).parents("td").parent("tr");
    if (row.length == 1 && row.hasClass("InvalidSetting")) {
        var div = GetTooltipDiv();
        var coords = $(control).offset();
        var width = 15;
        var height = $(control).outerHeight() - 2;

        $('#HTooltipTop').hide();
        $('#HTooltipBottom').hide();
        $('#HTooltipContainer').html(row.attr('validationText'));
        var h = div.outerHeight();
        if (coords.top + height + h > $(document).height() - 8) {
            height = -h - 6;
            $('#HTooltipBottom').show();
        }
        else
            $('#HTooltipTop').show();

        div.css('top', coords.top + height).css('left', coords.left + width);
        div.stop(true, true).fadeIn(150, function () { if (control.style.removeAttribute) control.style.removeAttribute('filter'); });
    }
}

function ShowTooltipGeneric(text, x, y) {
    var jDiv = GetTooltipDiv();

    var con = $('#HTooltipContainer').html(text);

    var h = con.outerHeight();
    var w = con.outerWidth();
    $('#HTooltipTop').show();
    $('#HTooltipBottom').hide();

    var dw = $(document).width()
    if (x + w > dw)
        x = dw - w;
    var dy = $(document).height();
    if (y + h > dy)
        y = dy - h;

    jDiv.css('top', y).css('left', x);
    jDiv.stop(true, true).fadeIn(150);

    return jDiv;
}

function HideTooltip() { GetTooltipDiv().fadeOut(150); }

function GetTooltipDiv() {
    var div = $('#HTooltip');
    if (div.length > 0) return div;

    div = $("<div id='HTooltip'></div>").appendTo($('body'));
    var top = $("<div id='HTooltipTop'></div>").appendTo(div);
    var close = $("<div id='HTooltipClose'></div>").appendTo(div);
    var con = $("<div id='HTooltipContainer'></div>").appendTo(div);
    var bot = $("<div id='HTooltipBottom'></div>").appendTo(div);

    if ($.browser.msie && $.browser.version < 9)
        con.addClass('ToolTipIE');

    for (var i = 1; i < 8; i++) {
        $('<div style="height:' + i + 'px;width:1px;top:' + (8 - i) + 'px;"></div>').appendTo(top);
        $('<div style="height:' + i + 'px;width:1px;"></div>').appendTo(bot);
    }
    for (var i = 7; i > 0; i--) {
        $('<div style="height:' + i + 'px;width:1px;top:' + (8 - i) + 'px;"></div>').appendTo(top);
        $('<div style="height:' + i + 'px;width:1px;"></div>').appendTo(bot);
    }

    $(close).click(HideTooltip);
    $(document).click(HideTooltip);
    $(div).click(function (e) { e.stopImmediatePropagation(); });

    return div;
}

function ControlBlurred() {
    if (!this.subscribed) {
        $(this).keyup(ShowTooltip).change(ShowTooltip).click(ShowTooltip);
        this.subscribed = true;
    }
    CheckControl(this);
}

function ShowTooltip() {
    var invalid = CheckControl(this);
    if (invalid) {
        var controlId = this.settingsObject.vcID;
        if (!this.settingsObject.isPostBack)
            window.setTimeout(function () { ShowTooltipInner($get(controlId)) }, 2);
    }
    else
        HideTooltip();
}

function CheckControl(control) {
    var invalid = false;
    var text = control.settingsObject.lt + "<ul>";
    for (var i = 0; i < control.settingsObject.VMs.length; i++) {
        var module = modules[control.settingsObject.VMs[i]];
        if (module) {
            var retval = module(control, control.settingsObject);
            invalid = invalid || retval;
            var itemtext = modules[control.settingsObject.VMs[i] + "_txt"];
            itemtext = itemtext.replace(/\{0\}/g, control.settingsObject.VPs[control.settingsObject.VMs[i]]);
            text = text + (retval ? "<li class='Invalid'>" : "<li>") + itemtext + "</li>";
        }
    }
    SetControlState(control, invalid, text + "</ul>");
    return invalid;
}

function SetControlState(controlElement, invalid, text) {
    var control = $(controlElement);
    var tableRow = control.parents("td").parent("tr");
    if (invalid) {
        tableRow.attr('validationText', text);
        tableRow.addClass('InvalidSetting');
    }
    else {
        tableRow.removeClass('InvalidSetting');
    }
}


function SetupAddressTooltips() {
    $(function () {
        var fadeTimer = 0;
        var showTimer = 0;
        $(".PreviewPopup").each(function () {
            var popup = $(this);
            var hideTip = function () {
                clearTimeout(showTimer);
                fadeTimer = setTimeout(function () { HideTooltip(); }, 250);
            }
            popup.mouseover(function (e) {
                clearTimeout(fadeTimer);
                showTimer = setTimeout(function () {
                    var mousePos = popup.position();
                    var jDiv = ShowTooltipGeneric(popup.attr('popupText'), mousePos.left, mousePos.top + 10);
                    jDiv.unbind('mouseover').unbind('mouseout').mouseover(function () { clearTimeout(fadeTimer); }).mouseout(hideTip);
                }, 400);
            });
            popup.mouseout(hideTip);
        });
    });
}
