﻿$(function () {
    $('.linkButton, .link-button').live('click', function (event) {
        event.preventDefault();
    });
    $('.linkButton, .link-button').css('cursor', 'pointer');
});
jQuery.fn.center = function () {
    this.css("position", "fixed");
    this.css("top", ($(window).height() - this.height()) / 2 + $(window).scrollTop() + "px");
    this.css("left", ($(window).width() - this.width()) / 2 + $(window).scrollLeft() + "px");
    return this;
}
jQuery.showLoading = function (message) {
    if (!message) {
        message = 'Loading...';
    }
    jQuery.fn.center = function () {
        this.css("position", "fixed");
        this.css("top", ($(window).height() - this.height()) / 2 + $(window).scrollTop() + "px");
        this.css("left", ($(window).width() - this.width()) / 2 + $(window).scrollLeft() + "px");
        return this;
    }
    if ($('.floating-message').size() < 1) {
        var $n = $('<div class="floating-message">Please wait..</div>');
        $('body').append($n);
    }
    var $m = $('.floating-message');
    $m.css({ border: '#0d2340 5px solid', padding: '15px', position: 'fixed',
        'z-index': '100000', 'background-color': '#99cccc',
        'opacity': '1', 'font-size': '24px', color: 'black', display: 'block'
    });
    $m.center();
    $m.addClass('floating-message-style');

    $('body').css('opacity', 0.5);
}
jQuery.hideLoading = function () {
    var $m = $('.floating-message');
    $m.hide();
    $('body').css('opacity', 1);
}
jQuery.showMsg = function (msg, code) {
    $('.info-message').hide();
    jQuery.fn.centerHorizontally = function () {
        this.css("position", "fixed");
        this.css("left", ($(window).width() - this.width()) / 2 + $(window).scrollLeft() + "px");
        return this;
    }
    var background = '#21689a';
    var fontSize = '17px';
    if (code === 2) {
        background = 'Maroon';
    }
    if (code === 3) {
        background = 'Maroon';
        fontSize = '13px';
    }

    //send an array of string errors
    if (code === 4) {
        var arr = msg;
        var arrCnt = arr.length;
        var sb = '<ul>';
        for (var i = 0; i < arrCnt; i++) {
            var current = arr[i];
            sb = sb + '<li>' + current + '</li>';
        }
        sb = sb + '</ul>';
        msg = sb;

        background = 'Maroon';
        fontSize = '13px';
    }

    if ($('.info-message').size() < 1) {
        var $n = $('<div class="info-message">' + msg + '</div>');
        $n.css('display', 'none');
        $('body').append($n);
    }

    var $m = $('.info-message');
    $m.css({
        border: '2px groove #195179',
        padding: '5px',
        position: 'fixed',
        'z-index': '100000',
        'background-color': background,
        'font-size': fontSize,
        color: 'white',
        bottom: '10px',
        width: '700px'
    });
    $('.info-message').html(msg);
    $m.centerHorizontally();
    $('.info-message').fadeIn('slow');
    $m.addClass('info-message-style');
    if (window.infoTimeout) {
        window.clearTimeout(window.infoTimeout);
    }
    window.infoTimeout = setTimeout('jQuery.hideMsg()', 5000);
}
jQuery.hideMsg = function () {
    var $m = $('.info-message');
    $m.fadeOut('slow');
}
function createForm() {
    var submitForm = document.createElement("FORM");
    document.body.appendChild(submitForm);
    return submitForm;
}
function createFormElement(inputForm, elementName, elementValue) {
    var newElement = document.createElement('input');
    newElement.name = elementName;
    newElement.id = elementName;
    newElement.type = 'hidden';
    inputForm.appendChild(newElement);
    newElement.value = elementValue;
    return newElement;
}
function submitForm(form, action, method) {
    if (method) {
        form.method = method;
    } else {
        form.method = "POST";
    }
    if (action) {
        form.action = action;
    } else {
        form.action = window.location;
    }

    form.submit();
}
function center_box(box, width, height) {
    cleft = has_inner
        ? pageXOffset +
          (window.innerWidth - width) / 2
        : has_element
          ? document.documentElement.scrollLeft +
            (document.documentElement.clientWidth - width) / 2
          : document.body.scrollLeft +
            (document.body.clientWidth - width) / 2;

    ctop = has_inner
        ? pageYOffset + (window.innerHeight - height) / 2
        : has_element
          ? document.documentElement.scrollTop +
            (document.documentElement.clientHeight - height) / 2
          : document.body.scrollTop +
            (document.body.clientHeight - height) / 2;

    box.style.left = cleft > 0 ? cleft + 'px' : '0px';
    box.style.top = ctop > 0 ? ctop + 'px' : '0px';
}
//Returns the swapped options
function swapOptions(defaultOpt, customOpt) {

    if (!defaultOpt) {
        defaultOpt = {};
    }
    if (!customOpt) {
        customOpt = {};
    }
    for (var prop in defaultOpt) {
        if (!defaultOpt.hasOwnProperty(prop)) {
            continue; //jump from prototype properties
        }
        var fromCustom = customOpt[prop];
        if (fromCustom != undefined) {
            defaultOpt[prop] = fromCustom;
        }
    }
    return defaultOpt;
}

//Important, you have to have a method getFormOptions in your application js file
/* example
function getFormOptions(key) {
switch (key) {
case 'logon':
return { onsuccess: function () {
if (window.restData.IsAdmin) {
window.location = '/Admin/Home'
} else {
window.location = '/CommandCenter/Home'
}
} };
break;
}
}
*/
$('.rest').live('click', function () {
    var btn = $(this);
    var form = btn.closest('form'); //get closest form element 

    //Decide options    
    var defaults = {
        redirect: null,
        onsuccess: null,
        onerror: null,
        onvalidationerrors: null,
        onunauthorize: null,
        prepost: null,
        showLoading: true
    };
    var customOptions = {};
    var optionskey = form.attr('optionskey'); //get options string by the user
    if (optionskey) {
        customOptions = getFormOptions(optionskey); //get options
    }
    var options = swapOptions(defaults, customOptions);

    //call prepost event
    if (options.prepost) {
        options.prepost(); //if prepost event was there
    }

    var isFormValid = form.valid();
    if (isFormValid) {

        if (options.showLoading) {
            $.showLoading();
        }

        $.getJSON(form.attr('action'), form.serialize(), function (res) {
            if (options.showLoading) {
                $.hideLoading();
            }
            processResponse(res, options);
        });
    }
});
/*
//{ level: 0, data: {productId:’abc-123’, productName:’Xbox-360’} }
//{ level: 1, message: ‘Product has been updated’ }
//{ level: 2, message: ‘Product has been updated’ , data: {productId:’abc-123’, productName:’Xbox-360’} }
//{ level: 3, message: ‘Product not found’ }
//{ level: 4, message: ‘Product not found’  , data: {productId:’abc-123’, productName:’Xbox-360’} }
//{ level: 5, errors: [{subject: 'ProdName', message: 'Product Name is required'},{subject: 'Zip', message: 'Incorrect Postal code format'}] }
//{ level : 401 , message: ‘Unauthorized’ }
*/
function processResponse(response, options) {
    if (response.data) { //restData
        window.restData = response.data;
    }
    if (response.message) {//restMessage
        window.restMessage = response.message;
    }
    if (response.errors) {//restMessage
        window.restErrors = response.errors;
    }
    var defaults = {
        redirect: null,
        onsuccess: null,
        onerror: null,
        onvalidationerrors: null,
        onunauthorize: null
    };
    options = swapOptions(defaults, options);
    var level = response.level;
    switch (level) {
        case 0:
        case 1:
        case 2:
            if (options.redirect) {
                window.location = options.redirect;
            }
            else if (options.onsuccess) {
                options.onsuccess();
            }
            else {
                if (response.message) {
                    $.showMsg(response.message);
                }
            }
            break;
        case 3:
        case 4:
            if (options.onerror) {
                options.onerror();
            }
            else {
                $.showMsg(window.restMessage, 2);
            }
            break;
        case 5:
            if (options.onvalidationerrors) {
                options.onvalidationerrors();
            }
            else {
                var s = '<ul class="validation-summary">';
                var cnt = response.errors.length;
                for (var i = 0; i < cnt; i++) {
                    var err = response.errors[i];
                    s = s + '<li>' + err.message + '</li>';
                }
                s = s + '</ul>';
                $.showMsg(s, 3);
            }
            break;
        case 401:
            if (options.onunauthorize) {
                options.onunauthorize();
            }
            else {
                window.location = '/logon';
            }
            break;
        case 302:
            window.location = response.message;
            break;
    }
}
function getRestResponse(data) {
    var data = eval(data.jqXHR);
    return evalJson(data.responseText);
}
function evalJson(text) {
    var arr = eval('[' + text + ']');
    return arr[0];
}
//this function includes all necessary js files for the application
function includeScript(file) {
    var script = document.createElement('script');
    script.src = file;
    script.type = 'text/javascript';
    script.defer = true;
    document.getElementsByTagName('head').item(0).appendChild(script);
}

//IsChecked
function isChecked(chkid) {
    var selector = jqs_id(chkid) + ':checked';
    if ($(selector).val() == 'on') return true;
    else return false;
}

//check the checkboxes
function checkOn(jqs) {
    $(jqs).attr('checked', true);
}

//remove check from checkboxes
function checkOff(jqs) {
    $(jqs).attr('checked', false);
}
function overlayOpt() {
    return {
        // some mask tweaks suitable for facebox-looking dialogs
        mask: {

            // you might also consider a "transparent" color for the mask
            color: '#000',

            // load mask a little faster
            loadSpeed: 200,

            // very transparent
            opacity: 0.7
        },
        effect: 'default',
        load: false
    };
}
/*
dom load
$(selector).center()
$.showLoading(message optional)
$.hideLoading()
$.showMsg(msg, integerCode)
$.hideMessage()
createForm()
createFormElement(inputForm, elementName, elementValue)
submitForm(form, action, method)
center_box(box, width, height)
$('.rest').live('click', function ()...
processResponse(response)
includeScript(file)
isChecked(chkid)
checkOn(jqs)
checkOff(jqs)
createCookie(name, value, days)
readCookie(name)
eraseCookie(name)
*/

