﻿var interactivity = (function ($) {
  var FORM_ID_LENGTH = 10;
  var IN_PROGRESS_DEFAULT_TEXT = '';
  var options = {
    onApplyErrorList: function (form, errorList) { },
    onFormSubmitted: function (form) { },
    onSpinningStopped: function (form) { },
    onShowCustomResult: function (form, content) { }
  };

  function submitForm(sender) {
    var action = $(sender).attr('action');
    if (action == '') action = window.location.href;
    var formId = $(sender).attr('id');
    var serializedForm = $(sender).serializeArray();

    if ($(sender).hasClass('submitting')) { return; }
    if ($(sender).find('input.confirmation').length > 0 && !confirm(encodeCStr($(sender).find('input.confirmation').val()))) { return; }

    if (!$(sender).hasClass('dont-block-on-submit')) $(sender).addClass('submitting');

    if (!formId) {
      formId = 'form' + generateRandomString(FORM_ID_LENGTH);
      $(sender).attr('id', formId);
    }

    serializedForm.push({ name: 'FormId', value: formId });

    startSpinning(sender);

    $(sender).find('.form-result > *:first-child').fadeOut('fast');

    if ($(sender).hasClass('replaceable')) {
      $.post(action, serializedForm, function (response, status, xhr) {
        if (xhr.getResponseHeader('Content-Type').indexOf('text/javascript') !== -1) {
          //it will be executed automatically: eval(xhr.responseText);
        } else {
          $(sender).closest('.content-container').html(response);
        }
      });
    } else {
      $.post(action, serializedForm);
    }

    options.onFormSubmitted(sender);
  }

  function encodeCStr(str) {
    return str.replace('\\n', '\n').replace('\\\'', '\'');
  }

  function generateRandomString(stringLength) {
    var randomString = '';

    for (var i = 0; i < stringLength; i++) {
      randomString += Math.floor(Math.random() * 10);
    }

    return randomString; /// <reference path="interactivity-handlers.js" />

  }

  function getAjaxSpinnerElement(elementToReplace) {
    var ajaxSpinner = $('<div class="ajax-spinner" style="display: none;"><div class="ajax-spinner-content">&nbsp;</div></div>');

    ajaxSpinner.css({
      'width': elementToReplace.width(),
      'height': elementToReplace.height(),
      'margin-top': elementToReplace.css('margin-top')//,
      //'line-height': (elementToReplace.height() - 1) + 'px' // -1px so the text looks more aligned to the center
    });

    var lh = elementToReplace.height() - 1;
    if (lh < 0) lh = 0;
    ajaxSpinner.children('.ajax-spinner-content').css({
      'line-height': lh + 'px' // -1px so the text looks more aligned to the center
    });

    return ajaxSpinner;
  }

  function isIE() {
    return '\v' == 'v'; //works for ie8 too
  }

  function startSpinning(form) {
    var replaceableSelectors = ['.replaceable', '.button-block', 'button', 'input[type="submit"]'];
    var elementToReplace;
    var ajaxSpinner;
    var ajaxSpinnerText;
    var sizeContainer; // So the form doesn't flicker while submitting
    var i = 0;

    for (i = 0; i < replaceableSelectors.length; i++) {
      elementToReplace = $(form).find(replaceableSelectors[i]);
      if (elementToReplace.length > 0) { break; }
    }

    if (elementToReplace.length === 0) { return; }

    ajaxSpinner = $(form).find('.ajax-spinner');

    if (ajaxSpinner.length === 0) {
      ajaxSpinner = getAjaxSpinnerElement(elementToReplace);
      sizeContainer = $('<div></div>').css({ 'height': elementToReplace.outerHeight(), 'margin-top': elementToReplace.css('margin-top') });
      elementToReplace.wrap(sizeContainer);
      elementToReplace.after(ajaxSpinner);
    }
    ajaxSpinner.fadeIn('fast');

    elementToReplace.addClass('hidden-by-loader').hide();

    if ($(form).find('.in-progress-text').length > 0) {
      ajaxSpinnerText = $(form).find('.in-progress-text').val();
    }
    else {
      ajaxSpinnerText = IN_PROGRESS_DEFAULT_TEXT;
    }

    ajaxSpinner.children('.ajax-spinner-content').html(ajaxSpinnerText);
  }

  function stopSpinning(form) {
    $(form).removeClass('submitting');
    $(form).find('.ajax-spinner').hide();
    $(form).find('.hidden-by-loader').removeClass('hidden-by-loader').fadeIn('fast');
  }

  function stopSpinningAllForms() {
    $('form.submitting').each(function () {
      stopSpinning($(this));
    });
  }

  function applyErrorToAllForms(errorMessage) {
    var tempErrorList = [];

    tempErrorList.push({ FieldName: '', ErrorMessage: errorMessage });

    $('form.submitting').applyErrorList(tempErrorList);
  }

  $.fn.addInteractivity = function (customOptions) {

    options = $.extend(options, customOptions);

    //$(this).each(function () {
    if (this.length > 0 && !$(this).data('isInteractive')) {
      switch (this.get(0).tagName.toLowerCase()) {
        case 'form':
          if ($(this).find('input[type="hidden"][name="NextAction"]').length === 0) {
            $(this).append('<input type="hidden" name="NextAction" />');
          }

          $(this).find('button:[value!=""]').bind('click', function () {
            var tempInnerHtml = '';
            if ($.browser.msie) { tempInnerHtml = $(this).html(); $(this).html(''); }
            $(this).closest('form').find('input[type="hidden"][name="NextAction"]').val($(this).val());
            if ($.browser.msie) { tempInnerHtml = $(this).html(tempInnerHtml); }
          });

          $(document).bind('ajaxComplete', function (e, xhr, options) {
            // If we aborted the request or got an error or got "No response" status code
            if (xhr.status === 0 || xhr.status >= 400 || xhr.status == 204) {

              applyErrorToAllForms(xhr.statusText);
              stopSpinningAllForms();
            }
          });

          $(this).find('.form-result').hide();

          //$(this).find('input:not([type="hidden"]):first').select();

          $(this).bind('submit', function () { submitForm(this); return false; });
          $(this).data('isInteractive', true);

          return $(this);
          //break;

        case 'a':
          //break;
          return $(this);
        default:
          //break;
          return $(this);
      }
    }
    //});

    return this;
  };

  $.fn.applyErrorList = function (errorList) {
    $(this).stopSpinning();
    options.onApplyErrorList(this, eval(errorList));
  };

  $.fn.stopSpinning = function () {
    var form = $(this);

    stopSpinning(form);
    options.onSpinningStopped(form);
  };

  $.fn.showFormResult = function (content) {
    var form = $(this);

    stopSpinning(form);
    options.onShowCustomResult(form, content);
  }

  return {

    /*Link Spinning*/
    ajaxRequestByLink: function (link, params, customMessage, method, callback) {

      var l = $j(link);
      var linkRel = l.attr('rel');

      if (l.hasClass('in-progress')) { return; }
      if ((typeof linkRel == 'string') && ($('.in-progress[rel="' + linkRel + '"]').length > 0)) { return; }
      var linkClass = 'link' + generateRandomString(8);
      l.addClass(linkClass);

      interactivity.startSpinningLink(linkClass, link, customMessage);

      var invokeUrl = params.InvokeUrl ? params.InvokeUrl : window.location.pathname + window.location.search;
      delete params.invokeUrl;

      if (!method && method == 'get') {
        jQuery.get(invokeUrl,
                params,
                function () {
                  interactivity.stopSpinningLink(linkClass);
                  if ($.isFunction(callback)) {callback();}
                });
      }
          else {
              $.ajax({
                  type: 'POST',
                  url: invokeUrl,
                  data: params,
                  complete: function (jqXHR, textStatus) {
                    interactivity.stopSpinningLink(linkClass);
                    if ($.isFunction(callback)) { callback(); }  
                  }
              });
              /*
              jQuery.post(invokeUrl,
                params,
                function () {
                  interactivity.stopSpinningLink(linkClass);
                  if ($.isFunction(callback)) {callback();}
              });*/
      }
    },

    startSpinningLink: function (linkClass, control, customMessage) {
      var DEFAULT_MARGIN_LEFT = 5;
      var DEFAULT_MARGIN_TOP = 4;

      if (typeof customMessage == 'string') {
        if (customMessage == 'no-text' || customMessage == '') customMessage = '';
      } else {
        customMessage = 'In Progress...';
      }

      var attrClasses = ''; // $j(control).attr('class');
      var attrStyles = $j(control).attr('styles');

      if (typeof (classNameCollapsed) == 'undefined') attrStyles = '';
      $j(control).after('<span class="' + attrClasses + ' ' + linkClass + '-progress-spinner" styles="' + attrStyles + '"><img src="/local/css/images/loader.gif" style="vertical-align: middle;"/> ' + customMessage + '</span>');
      var marginLeft = $j("." + linkClass + "-progress-spinner").css('margin-left');
      var marginTop = $j("." + linkClass + "-progress-spinner").css('margin-top');

      if (marginLeft == DEFAULT_MARGIN_LEFT + 'px' && marginTop == DEFAULT_MARGIN_TOP + 'px') {
        var sumbitBtnMarginLeft = $j(control).css('margin-left');
        var sumbitBtnMarginTop = $j(control).css('margin-top');

        sumbitBtnMarginLeft = sumbitBtnMarginLeft.substring(0, sumbitBtnMarginLeft.indexOf('px'))
        sumbitBtnMarginTop = sumbitBtnMarginTop.substring(0, sumbitBtnMarginTop.indexOf('px'))

        if (sumbitBtnMarginLeft == '') { sumbitBtnMarginLeft = '0'; }
        if (sumbitBtnMarginTop == '') { sumbitBtnMarginTop = '0'; }

        $j("." + linkClass + "-progress-spinner").css('margin-left', (parseInt(DEFAULT_MARGIN_LEFT) + parseInt(sumbitBtnMarginLeft)) + 'px');
        $j("." + linkClass + "-progress-spinner").css('margin-top', (parseInt(DEFAULT_MARGIN_TOP) + parseInt(sumbitBtnMarginTop)) + 'px');
      }

      $j("." + linkClass + "-progress-spinner").css({ 'line-height': $j(control).height(), 'width': $j(control).width(), 'display': 'block', 'text-align': 'center' });

      $j(control).hide().addClass('in-progress');
    },

    stopSpinningLink: function (linkClass) {
      $j('.' + linkClass).removeClass('in-progress');
      $j('.' + linkClass).show()
      $j('.' + linkClass + '-progress-spinner').remove();
      $j('.' + linkClass).removeClass(linkClass);
    },
    /* End of Link Spinning */
	
    loadPopupContent: function (action, data, url, refreshOnClose) {
      if (typeof url == 'undefined') { url = window.location.href; }
      if (typeof refreshOnClose != 'boolean') { refreshOnClose = false; }
      if (!data) { data = {}; }
      data.ActionType = action;
      var settings = {};

      if (refreshOnClose) {
        settings = $j.extend({}, TB.fancyboxOptions, { onClosed: function () { interactivity.reloadPage(); }, hideOnOverlayClick: true });
      }
      else {
        settings = $j.extend({}, TB.fancyboxOptions, { onClosed: function () { if (interactivity.reloadPageAfterClose) interactivity.reloadPage(); }, hideOnOverlayClick: true });
      }
      $j('#fancy-alert-button').fancybox(settings);

      $('#fancy-alert-content').load(url, data, function (e) {
        $('#fancy-alert-button').click();
        stopSpinningAllForms();
        interactivityHandlers.bindInteractivity('#fancy-alert-content');
        var $fullCalendars = $('.fc');
        if ($fullCalendars != null && typeof $.fullCalendar == 'function') {
          $fullCalendars.fullCalendar('render');
        }
        $.fancybox.resize(true);
      });
    },

    reloadPage: function () {

      window.location.assign(window.location.pathname + window.location.search);
      //window.location.reload();

    },

    reloadPageAfterClose: false
  };
})(jQuery);

/*
var ErrorList = {
FieldName: '',
ErrorMessage: ''
}
*/
