﻿//---------------------------------------------------------------------------------
//   APPLICATION JAVASCRIPT : Infinity Config
//   Created By: David Moons
//   Company: Artnova
//   Published Date: 08/02/2010
//   Modfied Date: 08/02/2010
//   Copyright © 2010 - Artnova - Wolfsdonksesteenweg 83 - 2230 Herselt
//---------------------------------------------------------------------------------

var utils = {};

// --------------------------------------------------------------------------------
// Dimensions utilities
// --------------------------------------------------------------------------------
utils.dimensions = function () {
    return {
        mouse: function (e, x, y) {
            return ({ top: e.pageY + y, left: e.pageX + x });
        },
        screen: function () {
            return ({ centerX: $(window).width() / 2, centerY: $(window).height() / 2 });
        },
        anchor: function (target, options) {
            var anchor = $(target);
            var offset = $(target).offset();
            var coords = {};
            switch (options.position) {
                case "top left":
                    coords = { top: offset.top, left: offset.left };
                    break;
                case "top right":
                    coords = { top: offset.top, left: (offset.left + anchor.width()) };
                    break;
                case "bottom left":
                    coords = { top: offset.top + anchor.height() - 15, left: offset.left + 15 };
                    break;
                case "bottom right":
                    coords = { top: offset.top + anchor.height(), left: (offset.left - target.width()) + anchor.width() };
                    break;
                default:
                    coords = { top: offset.top, left: offset.left };
                    break;
            };
            return ({ top: coords.top, left: coords.left });
        }
    }
} ();

// --------------------------------------------------------------------------------
// Validation utilities
// --------------------------------------------------------------------------------

utils.validate = function () {
    return {
        email: function (value) {
            var pattern = /^([0-9a-zA-Z]([-.\w]*[0-9a-zA-Z])*@([0-9a-zA-Z][-\w]*[0-9a-zA-Z]\.)+[a-zA-Z]{2,4})+$/;
            return (pattern.test(value));
        },
        empty: function (value) {
            return (value.length < 1);
        },
        alpha: function (value) {
            var pattern = /^[a-zA-Z0-9]+$/;
            return (pattern.test(value));
        },
        space: function (value) {
            var pattern = /[\s]/;
            return (pattern.test(value));
        }
    }
} ();

// --------------------------------------------------------------------------------
// Delegate utilities
// --------------------------------------------------------------------------------
utils.delegate = function () {
    // Private
    var error = "Method or Function <{0}> does not exist!";

    // Public
    return {
        callFunc: function (func) {
            if (window[func]) {
                window[func].apply(this, Array.prototype.slice.call(arguments, 1));
            } else if (typeof func == 'object' || !func) {
                return methods.init.apply(this, arguments);
            } else {
                $.error('Method ' + method + ' does not exist or the file was not included!');
            }
        }
    }

} ();

utils.format = function () {
    return {
        elementId: function (elem) {
            if (!utils.string.startsWith(elem, '#')) {
                return ('#' + elem);
            }
            return (id);
        },
        elementClass: function (elem) {

        }
    }
} ();

// --------------------------------------------------------------------------------
// String utilities
// --------------------------------------------------------------------------------
utils.string = function () {
    return {
        format: function () {
            var args = arguments[0];
            for (var i = 0; i < arguments.length - 1; i++) {
                var regEx = new RegExp("\\{" + i + "\\}", "gm");
                args = args.replace(regEx, arguments[i + 1]);
            }
            return args;
        },
        formatId: function (value) {
            if (!this.startsWith(value, '#')) {
                return ('#' + value);
            }
            return (value);
        },
        formatClass: function (value) {
            if (!this.startsWith(value, '.')) {
                return ('.' + value);
            }
            return (value);
        },
        startsWith: function (value, prefix) {
            return (value.substr(0, prefix.length) === prefix);
        },
        endsWith: function (value, suffix) {
            return (value.substr(value.length - suffix.length) === suffix);

        },
        contains: function (value, key) {
            return (value.indexOf(key) != -1);
        }
    }
} ();

// --------------------------------------------------------------------------------
// Messenger
// --------------------------------------------------------------------------------
utils.messenger = function () {
    return {
        showPreload: function (e, x, y) {
            $preloader = $('#preloader');
            $preloader.css(utils.dimensions.mouse(e, x, y));
            $preloader.show();
        },
        hidePreload: function () {
            $preloader = $('#preloader');
            $preloader.hide();
        },
        speak: function (message) {
            alert(message);
        }
    }
} ();

// --------------------------------------------------------------------------------
// AJAX UTILS
// --------------------------------------------------------------------------------

utils.ajaxify = function (options) {
    var config = $.extend({
        coords: null
    }, options);

    jQuery.ajax($.extend({
        type: "POST",
        data: "{}",
        dataType: 'json',
        contentType: "application/json;charset=utf-8",
        beforeSend: function () {
            utils.messenger.showPreload(config.coords, 10, -10);
        },
        error: function (xhr, status, error) {
            var message = xhr.status + ": " + error + " at url: " + config.url;
            utils.messenger.speak(message);
        },
        complete: function () {
            utils.messenger.hidePreload();
        }
    }, config));
}
