// forms -  based on jQuery v1.4.3
// Copyright (c) 2011 Nicolas Hindryckx - spirio_314@hotmail.com
// Licensed under the MIT license: http://www.opensource.org/licenses/mit-license.php

//requires
//JQuery v1.4.3+

/************************************************************************************
*************************************************************************************
Checkbox
*************************************************************************************
*************************************************************************************/
var checkboxDefaults = {
    includeHidden: false,
    onClick: false
};
jQuery.fn.checkbox = function () {
    //arguments
    var args = arguments[0] || {};

    var opts = $.extend({}, checkboxDefaults, args);

    //element
    this.each(function () {
        var o = $(this);

        if (!o.is(':hidden') || opts.includeHidden) {

            var oCheckboxLink = $('<div></div>').insertBefore("#" + o.attr('id'));
            oCheckboxLink.attr("id", 'chk' + o.attr('id')).addClass('checkbox_link opaque');

            if (o.attr('title') !== undefined)
                oCheckboxLink.attr('title', o.attr('title'));

            (this.checked) ? oCheckboxLink.addClass('active') : oCheckboxLink.removeClass('active');
            (o.hasClass('disabled')) ? oCheckboxLink.addClass('disabled') : oCheckboxLink.removeClass('disabled')
            //
            o.addClass('checkbox').hide();
            //
            oCheckboxLink.bind('click.checkbox', function (e) {

                if (!$(this).hasClass('disabled')) {
                    ($(this).hasClass('active')) ? $(this).removeClass('active') : $(this).addClass('active');
                    $("#" + this.id + " ~ input[type=checkbox]").trigger("click");

                }

                e.preventDefault();
            });
        }

    });
};

/************************************************************************************
*************************************************************************************
Query string helper
*************************************************************************************
*************************************************************************************/
jQuery.fn.QueryString = function () {
    var urlParams = {};
    var e,
        a = /\+/g,  // Regex for replacing addition symbol with a space
        r = /([^&;=]+)=?([^&;]*)/g,
        d = function (s) { return decodeURIComponent(s.replace(a, " ")); },
        q = window.location.search.substring(1);

    e = r.exec(q);
    while (e) {
        urlParams[d(e[1])] = d(e[2]);
        e = r.exec(q);
    }

    return urlParams;
}

/************************************************************************************
*************************************************************************************
string helper
*************************************************************************************
*************************************************************************************/
function isNullOrEmpty(text) {
    return (text == "" || text == undefined || text == null);
}
function trim(value) {
    value = value.replace(/^\s+/, '');
    value = value.replace(/\s+$/, '');
    return value;
}

/************************************************************************************
*************************************************************************************
tooltips helper
*************************************************************************************
*************************************************************************************/
function initialize_tooltips() {
    $(".tooltip").unbind('.tooltipActions');
    $(".tooltip").bind('click.tooltipActions', tooltip_ClickHandler);
}

var tooltip_ClickHandler = function (e) {
    e.preventDefault();
}

/************************************************************************************
*************************************************************************************
message helper
*************************************************************************************
*************************************************************************************/
jQuery.fn.addErrorMessage = function () {
    //element
    var o = $(this[0]);

    //arguments
    var args = arguments[0] || {};
    var message = args.message;
    var onComplete = args.onComplete;

    //
    o.addMessage({ type: "error", message: message, onComplete: onComplete });
};
jQuery.fn.addSuccessMessage = function () {
    //element
    var o = $(this[0]);

    //arguments
    var args = arguments[0] || {};
    var message = args.message;
    var onComplete = args.onComplete;

    //
    o.addMessage({ type: "success", message: message, onComplete: onComplete });
}
jQuery.fn.addMessage = function () {
    //element
    var o = $(this[0]);

    //arguments
    var args = arguments[0] || {};
    var type = args.type; //success || error || info
    var message = args.message;
    var onComplete = args.onComplete;

    //
    if (o.is(':parent')) {
        //we make list here
        container = o.find("div.messages." + type + "Container")
        if (container.find('ul').length <= 0) {
            container.wrapInner('<li />').wrapInner('<ul />');
        }
        container.find('ul').append($('<li>' + message + '</li>'));
    } else {
        var messageContainer = $('<div>').html(message).addClass("messages " + type + "Container").hide();
        o.append(messageContainer);
        messageContainer.fadeIn('slow', function () {
            if (onComplete)
                onComplete.call();
        });
    }

}
jQuery.fn.removeMessages = function () {
    //element
    var o = $(this[0]);

    //arguments
    var args = arguments[0] || { animate: 'none' };
    var animate = args.animate; //fade || none

    //
    if (animate == 'fade')
        o.children().fadeOut('slow', function () { o.html(''); });
    else
        o.html('');
}

/************************************************************************************
*************************************************************************************
AJAX helper
*************************************************************************************
*************************************************************************************/
var ajaxRequests = { "ajax_request": null };
var ajaxDefaults = {
    method: "GET",
    dataType: "html",
    requestType: "data",
    request: "ajax_request",
    href: "/",
    onComplete: false,
    onSuccess: false,
    onError: false,
    data: {},
    dataForms: {}
};
var ajaxDataFormDefaults = {
    loader: "#loading",
    statuscontainer: "#status",
    skipEmpty: false,
    fields: {}
};
$.ajaxSetup({
    jsonp: null,
    jsonpCallback: null,
    error: Ajax_ErrorHandler,
    xhr: function () {
        //return new window.XMLHttpRequest();
        try {
            if (window.ActiveXObject)
                return new window.ActiveXObject("Microsoft.XMLHTTP");
        } catch (e) { }

        return new window.XMLHttpRequest();
    }
});

$(function () {
    //check page
    if ($('#AjaxError').length == 0)
        alert("you must set an hidden field on your page 'AjaxError'! \n This must contain the Errorbox partial url.");
});

jQuery.fn.AjaxRequest = function () {
    //arguments args.message
    var _this = this;
    var args = arguments[0] || {};
    var opts = $.extend({}, ajaxDefaults, args);
    opts._this = _this;

    if (ajaxRequests[opts.request] !== null && ajaxRequests[opts.request] !== undefined) { ajaxRequests[opts.request].abort(); }
    ajaxRequests[opts.request] = $.ajax({
        type: opts.method,
        url: opts.href,
        beforeSend: function () {
            for (var formKey in opts.dataForms) {

                var bShowLoader = true;
                if (opts.dataForms[formKey].skipEmpty) {
                    bShowLoader = false;
                    for (var fieldKey in opts.dataForms[formKey].fields) {
                        if (!isNullOrEmpty(opts.data[opts.dataForms[formKey].fields[fieldKey]]))
                            bShowLoader = true;
                    }

                }

                if (bShowLoader)
                    $(opts.dataForms[formKey].loader).show();
            }
        },
        success: function (data) {
            if (opts.requestType == "data") {
                if (opts.onComplete)
                    opts.onComplete.call(_this, data);
            } else if (opts.requestType == "form") {
                Ajax_FormResponseHandler(data, opts);
            }
        },
        data: opts.data,
        dataType: opts.dataType
    });
}

function Ajax_FormResponseHandler(data, opts) {
    var bSucces = true;

    for (var formKey in opts.dataForms) {
        var dataForm = $.extend({}, ajaxDataFormDefaults, opts.dataForms[formKey]);
        var MessageContainer = $(dataForm.statuscontainer);

        //clearstatus
        $(".input-validation-error").removeClass("input-validation-error");
        MessageContainer.removeMessages();

        if (!isNullOrEmpty(data["success"])) {

            var bShowMessage = true;
            if (dataForm.skipEmpty) {
                bShowMessage = false;
                for (var fieldSuccessKey in dataForm.fields)
                    if (!isNullOrEmpty(opts.data[dataForm.fields[fieldSuccessKey]]))
                        bShowMessage = true;
            }

            if (bShowMessage)
                MessageContainer.addSuccessMessage({ message: data["success"] });
        } else {
            for (var fieldKey in dataForm.fields) {
                var fieldName = dataForm.fields[fieldKey];
                if (!isNullOrEmpty(data[fieldName]) && !isNullOrEmpty(data[fieldName][0])) {
                    if ($("#" + fieldName).length > 0)
                        $("#" + fieldName).addClass("input-validation-error");

                    MessageContainer.addErrorMessage({ message: data[fieldName][0] });
                    bSucces = false;
                }
            }
        }

        $(dataForm.loader).hide();
    }

    //callbacks
    if (bSucces && opts.onSucces)
        opts.onSucces.call(opts._this, data);
    else if (!bSucces && opts.onError)
        opts.onError.call(opts._this, data);

}

// global error handling
function Ajax_ErrorHandler(xhr, textStatus) {

    hideLoadBox();

    if (xhr.status == 401) {
        //show message relogin
        var href = $('#AjaxError').val();
        $.colorbox({ href: href, title: "", opacity: 0.4, width: 300, scrolling: false });

    }
}


/************************************************************************************
*************************************************************************************
Loadbox helper
*************************************************************************************
*************************************************************************************/
function showLoadBox(divID) {
    if ($(divID).find(".loading").length == 0) {
        $(divID).append('<div class="loading"></div>');
        //$(".loading").shadow();
    }
}
function hideLoadBox(divID) {
    $(divID).find(".loading").parent().remove();
}


/* INIT
********************************** */
$(document).ready(function () {
    initialize_dropdowns();
    initialize_tooltips();
    initialize_Jquery();
});

/* FUNCTION
********************************** */
function initialize_Jquery() {
    $(".JQuery").show();
    $(".NotJQuery").hide();
}

function initialize_dropdowns() {
    $('select').not('#LocalisationDisplay select').dropdown({ maxVisibleOptions: 6 });
}

/* EXTENSION METHODS
********************************** */
(function ($) {
    $.fn.customFadeIn = function (speed, callback) {
        $(this).fadeIn(speed, function () {
            if (jQuery.browser.msie)
                $(this).get(0).style.removeAttribute('filter');
            if (callback != undefined)
                callback();
        });
    };
    $.fn.customFadeOut = function (speed, callback) {
        $(this).fadeOut(speed, function () {
            if (jQuery.browser.msie)
                $(this).get(0).style.removeAttribute('filter');
            if (callback != undefined)
                callback();
        });
    };
})(jQuery);
/* General Functions
********************************* */
function initialize_Contact() {
    $('#submitButton').bind('click.ContactEvents', Contact_SubmitHandler);
}

/* ------------------------------- */
function onContactSubmitSuccess(data) {

    $("#contactEmailInput").val('');
    $("#contactNameInput").val('');
    $("#contactMessage").val('');

    $("#contactMiddleLeft .messages").delay(1000).fadeOut("slow", function () {
        $(this).remove();
    });
}


/* EventHandlers
********************************* */
var Contact_SubmitHandler = function (e) {

    var email = $("#contactEmailInput").val();
    var name = $("#contactNameInput").val();
    var subject = $("#subjectDropdown").val();
    var message = $("#contactMessage").val();

    var dataForms = {
        "_FORM1": { loader: "#loading_contact", statuscontainer: "#contact_status", fields: { 1: "Email", 2: "Name", 3: "Subject", 4: "Message"
        }
        }
    };

    var postData = { Email: email, Name: name, Subject: subject, Message: message
    };

    $.fn.AjaxRequest({
        href: $(this).attr('name'),
        method: "POST",
        dataType: "json",
        requestType: "form",
        dataForms: dataForms,
        data: postData,
        onSucces: onContactSubmitSuccess
    });

    e.preventDefault();
}
/* ------------------------------- */

/* INIT
********************************** */
$(document).ready(function () {
    initialize_Contact();
});

