﻿App.module("utils", function (exports, require) {

    var $ = require("jQuery");
    var App = require("App");

    App.addActions({
        redirect: function ($el) {
            var url = $el.attr("data-url");
            if (url)
                window.location = url;
        }
    })

    exports.getFormInputs = function ($form) {
        $form = exports.getForm($form);
        var val = $form.data("validator");
        if (typeof val != 'undefined') {
            return val.getInputs();
        } else {
            App.log("form doesnt have a validator ??");
            return null;
        }
    }

    exports.getFormValues = function ($form) {
        $form = exports.getForm($form);
        var inputs = exports.getFormInputs($form);
        var vals = {};
        for (var i = 0; i < inputs.length; i++) {
            var input = $(inputs[i]);
            if (input.attr("name")) {
                if (input.attr("data-value"))
                    vals[input.attr("name")] = input.attr("data-value");
                else
                    vals[input.attr("name")] = input.attr("type") == "date" ? input.data("dateinput").getValue() : input.val();
            }
        }
        return vals;
    }

    exports.getForm = function ($el) {
        return $el.is(".form") ? $el : $el.closest(".form");
    }

    exports.getFormFieldMap = function ($el) {

        var form = exports.getForm($el),
            v = form.data("validator");

        var inputs = v.getInputs();
        var map = {};
        for (var i = 0; i < inputs.length; i++) {
            var input = $(inputs[i]);
            if (input.attr("name")) {
                map[input.attr("name")] = input;
            }
        }
        return map;
    }

    exports.hideValidatorMessages = function ($el, fields) {
        var form = exports.getForm($el),
            v = form.data("validator");

        var map = exports.getFormFieldMap(form);

        var inps = [];
        for (var field_name in map) {
            for (var i = 0, k; k = fields[i]; i++)
                if (field_name == k)
                    inps.push(map[field_name]);
        }

        v.reset($(inps));
    }

    exports.isFormValid = function ($form) {
        $form = exports.getForm($form);
        var val = $form.data("validator");
        App.log("validating form: " + $form.attr("className"))
        if (typeof val != 'undefined') {
            return val.checkValidity();
        } else {
            App.log("form doesnt have a validator ??");
            return true;
        }
    }

    exports.formPost = function (action, $el, success, paramName, extraParams) {
        App.log(action);

        // allow the user to pass an object param eg formPost({action:"foo", success: alert,  ...})
        if (arguments.length == 1) {
            var args = arguments[0];
            action = args.action;
            $el = args.$el;
            success = args.success;
            paramName = args.paramName || false;
            extraParams = args.extraParams || false;
        }

        var form = exports.getForm($el),
            loadingIcon = form.find(".loading-icon").show(),
            formVals = exports.getFormValues(form),
            errMsg = form.find(".error-message").hide(),
            postData = formVals;

        App.log(formVals);

        if (extraParams) {
            for (var i in extraParams)
                formVals[i] = extraParams[i];
        }
        if (paramName) {
            var p = {};
            p[paramName] = formVals;
            postData = p;
        }



        App.post(action, postData, function (err, data) {
            loadingIcon.hide();

            var timestamp = $("meta[name='ogamestimestamp']").attr('content') || "";
            var tracking = [],
                trackinggrp = $el.attr("data-tracking-group") || form.attr("data-tracking-group") || "",
                trackingaction = $el.attr("data-tracking") || form.attr("data-tracking") || "";

            if (trackinggrp) {
                if (!trackingaction) trackingaction = action;
                tracking.push(trackinggrp);
            }

            if (trackingaction) {
                tracking.push(trackingaction);
            }

            if (err) {
                App.displayError(err);
                errMsg.html(err).fadeIn();

                if (data) {
                    form.data("validator").invalidate(data);
                } else {
                    if (tracking.length > 0) {
                        if (!trackinggrp) tracking.push("error");
                        tracking.push("error: " + err);
                        App.trackGoogleEvent(tracking);
                    }
                }
                return;
            } else {
                if (tracking.length > 0) {
                    if (!trackinggrp) tracking.push("success");
                    tracking.push("success: " + timestamp);
                    App.trackGoogleEvent(tracking);
                }

                success(data, formVals);
            }
        });
    }
});
