var cform;
var cformConfig = {};

$(document).ready(function() {
  if ($.browser.msie && $.browser.version.substr(0,1) < 7)
    return;
  cform = new CForm("form[dynamic=true]");
  fireOnLoadNonDynamic();
  formsTinymce();
});

function formsTinymce() {
  if (jQuery.fn.tinymce) {
    $("textarea[layout = 'tinymce']").tinymce({
      script_url : '/.skrypty/jquery/tiny_mce/tiny_mce.js',
      theme : "advanced",
      plugins : "safari,preview,paste",
      theme_advanced_buttons1 : "undo,redo,|,cleanup,|,bullist,numlist|,link,unlink,|,styleselect,|,code,preview",
      theme_advanced_buttons2 : "",
      theme_advanced_buttons3 : "",
      theme_advanced_buttons4 : "",
      theme_advanced_toolbar_location : "top",
      theme_advanced_toolbar_align : "left",
      theme_advanced_statusbar_location : "bottom",
      theme_advanced_resizing : true,
      entity_encoding : "raw",
      content_css : "/.style/edytor.css",
      cleanup_callback : function(type, value) {
        switch (type) {
          case "get_from_editor":
            return "<div>" + value + "</div>";
          case "insert_to_editor":
            if (value.startsWith("<div>") && value.endsWith("</div>"))
              return value.substring(5, value.length - 6);
        }
        return value;
      }
    });
  }
};

function fireOnLoadNonDynamic() {
  $("form[dynamic!=true]").each(function(){
    $("[dynamic-action]", $(this)).each(function() {
      eval($(this).attr("dynamic-action"));
    });
  });
}

function cformUpdateSummary() {
  cform.updateSummary();
}

function CForm(formSelector, config) {
  var $form = $(formSelector);
  if ($form.length == 0)
    return;

  var options = {
    replaceElement: "#ajax-form-wrapper",
    contentHandler: "#wrapper",
    formBefore: formBefore,
    formSuccess: formSuccess,
    formError: formError,
    formMethod: "POST",
    formContentType: "application/x-www-form-urlencoded; charset=UTF-8"
  };
  
  jQuery.extend(options, cformConfig);
  jQuery.extend(options, config);

  var ajaxOptions = {
    target: options.replaceElement,
    beforeSubmit: options.formBefore,
    success: options.formSuccess,
    error: options.formError,
    type: options.formMethod,
    contentType: options.formContentType
  };

  initialize();

  function formBefore(formData, jqForm) {
    if ($form.beenSubmitted)
      return false;
    else
      $form.beenSubmitted = true;
    showLoading();
    return true;
  };

  function formSuccess() {
    $form = $(formSelector, $(options.replaceElement));
    $form.ajaxForm(ajaxOptions);
    bindTextTools();
    application.safeMail($form);
    setHashState();
    $form.trigger('cform.loaded');
    hideLoading();
    if ($form.parents("#contents").length > 0)
      $(':input:visible:first', $form).focus();
  };

  function formError(request, status) {
    var resp = $(request.responseText);
    $(options.contentHandler).html(resp.next(options.contentHandler).html());
    var title = resp.next("title").text();
    if (title)
      document.title = title;
    application.init();
    setHashState();
    $form.trigger('cform.loaded');
    hideLoading();
    if ($form.parents("#contents").length > 0)
      $(':input:visible:first', $form).focus();
    var link = window.location.pathname + window.location.search;
    $("div#contents div").append('<p class="content"><a href="' + link + '">Spróbuj ponownie.</a></p>');
  };

  function initialize() {
    $form.parent().wrap('<div id="' + options.replaceElement.substring(1) + '"></div>');
    $form.ajaxForm(ajaxOptions);
    autoSkipInputs();
    $("input:text[title]").hint();
    fireOnloadEvents();
    bindTextTools();
    if ($form.parents("#contents").length > 0)
      $(':input:visible:first', $form).focus();
    $(options.replaceElement).ajaxSuccess(function(request, settings) {
      autoSkipInputs();
      $("input:text[title]", $form).hint();
      fireOnloadEvents();
    });
    suggestionList();
    bbq();
  };

  function showLoading() {
    var $replaceElement = $(options.replaceElement);
    document.body.style.cursor="wait";
    $replaceElement.fadeTo(0.1, 0.5);
    var $ajaxLoader = $("#ajax-loader");
    if ($ajaxLoader.length == 0) {
      $ajaxLoader = $('<div id="ajax-loader"></div>');
      $replaceElement.before($ajaxLoader);
    }
    var h = $replaceElement.height() ;
    var w = $replaceElement.width();
    $ajaxLoader.css({
      "margin-left" : w/2,
      "margin-top" : h/2
    });
    $ajaxLoader.show();
  }

  function hideLoading() {
    $("#ajax-loader").hide();
    $(options.replaceElement).fadeTo(0.1, 1);
    document.body.style.cursor="auto";
  }

  /* Quick patch to IE fade bug */
  $.fn.fadeTo = function(speed,to,callback) {
    return this.animate({opacity: to}, speed, function() {
      if (to == 1 && $.browser.msie) {
        this.style.removeAttribute("filter");
      }
      if (typeof callback == "function") {
        callback();
      }
    });
  };

  function fireOnloadEvents() {
    $("[dynamic-action]", $form).each(function() {
      eval($(this).attr("dynamic-action"));
    });
  };

  function bindTextTools() {
    $("textarea[layout=wysiwyg]", $form).each(function() {
      wysiwyg(this);
    });
    $("textarea[layout=counter]", $form).each(function() {
      createCounter(this);
      var $textarea = $(this);
      $textarea.bind("change click keyup", function() {
        updateCounterHandler(this);
      });
    });
    $("textarea[layout=counter]:last", $form).each(function() {
      $textarea = $(this);
      var checkContinuation = function() {
        $(document).stopTime("check-continuation");
        $.get("/continuation-info.xml", {"continuation-id" : $("input[name=continuation-id]").attr("value")},
            function(data) {
              var $xml = $(data);
              var ttl = $xml.find("continuation").attr("ttl");
              if (ttl) {
                $timer = $("#timer");
                if ($timer.length == 0) {
                  $textarea.parent().append('<p id="timer"/>');
                  $timer = $("#timer");
                }
                ttl = Math.ceil(ttl / 60);
                if (ttl > 0 && ttl < 5) {
                  $timer.html('<strong class="warning-message">Uwaga!</strong> Około ' + ttl + ' min. do zakończenia sesji.');
                } else if (ttl <= 0) {
                  $timer.html('<strong class="warning-message">Sesja została zakończona. Niestety nie można kontynuować pracy z formularzem.</strong>')
                  $("input[type = submit]").attr("disabled", "disabled");
                }
                if (ttl > 0) {
                  $(document).oneTime("300s", "check-continuation", checkContinuation);
                }
              }
            });
      }
      if (jQuery.fn.oneTime)
        $(document).oneTime("300s", "check-continuation", checkContinuation);
    });
    $("input.capitalize").bind("change keyup", function() {
      var $this = $(this);
      $this.val($this.val().toUpperCase().replace(/O/g,"0"));
    });
    defaultFormSubmit();
  };

  function defaultFormSubmit() {
    $('form').each(function() {
      var $form = $(this);
      var $submits = $('input[type=submit]', $form);
      if ($submits.length > 1) {
        var $submit  = $submits.last().clone(true);
        $submit.css({
                      position: 'absolute',
                      left: '-999px',
                      top: '-999px',
                      height: 0,
                      width: 0
                    });
        $submits.first().before($submit);
      }
    });
  };

  function createCounter(textarea) {
    var maxLength = parseInt($(textarea).attr("maxlength"));
    var name = textarea.name + "_charno";
    var id = name + ":input";
    if ($(textarea).siblings("div.counter").length === 0) {
      var elementAfter = $(textarea);
      if (elementAfter.next("img.jtip").length > 0)
        elementAfter = elementAfter.next();
      elementAfter.after(
        '<div class="counter">Pozostało <input id="' +
        id + '" name="' + name + '" size="4" value="' + maxLength +
        '" readonly="readonly" disabled="disabled"/> znaków.</div>');
    }
    updateCounterHandler(textarea);
  };

  function updateCounterHandler(textarea) {
    var maxLength = parseInt($(textarea).attr("maxlength"));
    var inputString = $(textarea).val();
    var numberOfLines = inputString.split("\n").length - 1;
    var stringLength = inputString.length + numberOfLines;
    var charsLeft;
    if (stringLength > maxLength) {
      textarea.value = inputString.substring(0, maxLength - numberOfLines);
      inputString = $(textarea).val();
      charsLeft = maxLength - (inputString.length + inputString.split("\n").length - 1);
    }
    else {
      charsLeft = maxLength - stringLength;
    }
    $("input[id=" + textarea.name + "_charno:input]").val(charsLeft);
  };

  function selectedText(input) {
    var txt = '';
    if (input.selectionStart != undefined)
      txt = input.value.substring(input.selectionStart,input.selectionEnd);
    else if (document.getSelection)
      txt = document.getSelection();
    else
      if (document.selection)
        txt = document.selection.createRange().text;
    return txt;
  };

  function phoneLengthSetter() {
    $('input[id*=phone.phone1]').bind("keyup", function() {
      var phone2 = $(this).parent().parent().find("input[id*=phone2]");
      if (this.value.length >= 3) {
        phone2.attr("maxlength", 2);
        phone2.val(phone2.val().substring(0,2));
      }
      else
        phone2.attr("maxlength", 3);
    });
  }

  function autoSkipInputs() {
    phoneLengthSetter();
    var keys = [8, 9, 16, 17, 18, 19, 20, 27, 33, 34, 35, 36, 37, 38, 39, 40, 45, 46, 144, 145];
    var string = keys.toString();
    $('#contents form input[type="text"]').each(function(ex) {
      var next = $(this).parent().next().find('input[type="text"]');
      if (next.length === 0)
        next = $(this).next().next('input[type="text"]');
      if (next.length === 0)
        next = $(this).parent().next().children('input[type="text"]');
      var prev = $(this).parent().prev().find('input[type="text"]');
      if (prev.length === 0)
        prev = $(this).prev().prev('input[type="text"]');
      if (prev.length === 0)
        prev = $(this).parent().prev().children('input[type="text"]');
      if (this.maxLength > 0 && this.maxLength < 1000) {
        $(this).keydown(function(e) {
          if (this.value.length >= this.maxLength && selectedText(this).length === 0 && string.indexOf(e.which) == -1) {
            if (next.length > 0) {
              var target = next[0];
              $(target).focus();
              target.select();
            }
          }
        });
      }
      $(this).keydown(function(e) {
        if (this.value.length === 0 && e.which == 8 && prev.length > 0) {
          if (prev.length > 0) {
            var target = prev[0];
            $(target).focus();
            target.select();
            return false;
          }
        }
      });
    });
  };

  function setHashState() {
    if (jQuery.bbq) {
      $("form").each(function() {
        var actualPageId = $("input[name=actual-page-id]").attr("value");
        var continuationId = $("input[name=continuation-id]").attr("value");
        if (actualPageId) {
          $.bbq.pushState("#" + actualPageId + "@" + continuationId);
        }
      });
    }
  };

  function bbq() {
    if (jQuery.bbq) {
      var latestXhr = undefined;
      $(window).bind("hashchange", function(e) {
        var continuationId = $("input[name=continuation-id]").attr("value");
        var actualPageId = $("input[name=actual-page-id]").attr("value");
        var hash = $.param.fragment();
        if (!hash)
          hash = "page1" + "@" + continuationId;
        var hashPageId = hash.split('@')[0];
        var hashContinuationId = hash.split('@')[1];
        var carryOn = false;
        if (actualPageId && actualPageId != hashPageId)
          carryOn = true;
        if (!carryOn && hashPageId && hashContinuationId && !actualPageId) {
          carryOn = true;
          actualPageId = "page1";
        }
        if (carryOn) {
          showLoading();
          if (latestXhr) {
            latestXhr.abort();
            latestXhr = undefined;
          }
          jQuery.ajax({
            type: "POST",
            url: $("form[dynamic=true]").attr("action"),
            data: {"jump-to": hashPageId, "continuation-id": hashContinuationId, "prev" : "« Wstecz", "actual-page-id": actualPageId},
            success: function(data) {
              $(options.replaceElement).html(data);
              $('form[dynamic=true]').ajaxForm(ajaxOptions);
              bindTextTools();
              application.safeMail($form);
              hideLoading();
            },
            error: function (request) {
              var resp = $(request.responseText);
              $(options.contentHandler).html(resp.next(options.contentHandler).html());
              var title = resp.next("title").text();
              if (title) {
                document.title = title;
              }
              formSuccess();
            }
          });
        }
      });
      var testHash = $.param.fragment();
      if (testHash)
        $(window).trigger('hashchange');
    }
  };

  function suggestionList() {
    $("input[type = 'suggest']").each(function() {
      var $input = $(this);
      var id = $input.attr("id");
      if (id.startsWith("page")) id = id.substring(6);
      if (id.endsWith(":input")) id = id.substring(0, id.lastIndexOf(":input"));
      $input.attr("autocomplete", "off");
      $.get("/suggestion-list-external/" + id + ".html", function(response) {
        var data = [];
        $("item", response).each(function() {
          data.push($(this).text());
        });
        $input.autocomplete(data, {
          minChars: 0,
          autoFill: true,
          matchContains: true,
          scrollHeight: 220,
          formatItem: function(data, i, total) {
                        return data[0];
                      }
        });
      });
    });
  };

  function loadRollableHeaders() {
    if (window.fdSliderController !== undefined && !($.browser.msie && $.browser.version.match(/^6\..+/) !== null)) {
      fdSliderController.create();
    }
    var formRowHeaders = $("tr.form-row-header.roll");
    formRowHeaders.unbind('click.rollableHeaders');
    formRowHeaders.bind('click.rollableHeaders', loadRollableHeadersClickHandler);
    if (!$(formRowHeaders.get(0)).hasClass('header-visible')) formRowHeaders.get(0).click();
  };
  
  function loadRollableHeadersHideAllRowsAndHeaders() {
    $("tr.form-row-header.roll").each(function() {
      var header = $(this);
      header.removeClass('header-visible').addClass('header-hidden');
      header.nextUntil('tr:not([class*="table-row"]):not([class*="hidden-row"])').not('tr[class*="hidden-row"]').hide();
    });
  }
  
  function loadRollableHeadersClickHandler() {
    var header = $(this);
    if (header.hasClass('header-visible')) loadRollableHeadersHideAllRowsAndHeaders();
    else {
      loadRollableHeadersHideAllRowsAndHeaders();
      header.removeClass('header-hidden').addClass('header-visible');
      header.nextUntil('tr:not([class*="table-row"]):not([class*="hidden-row"])').not('tr[class*="hidden-row"]').show();
    }
    if (window.fdSliderController !== undefined && !($.browser.msie && $.browser.version.match(/^6\..+/) !== null)) {
      fdSliderController.redrawAll();
    }
    return false;
  }

  function summary() {
    var summaryWindow = $("#contents div.summary-window");
    if (summaryWindow.length == 0) {
      summaryWindow = $('<div class="summary-window"/>');
      $("#contents").prepend(summaryWindow);
    }
    var summary = '<h2>Kalkulacja zamówienia</h2>';
    var discount = $("input[id*=discount]").val();
    summary += '<div>Upust: <input size="2" maxlength="2" type="text" value="' + discount + '" id="discount"/> %</div>';
    summary += '<span id="price"/>';
    summary += '<p class="addon">* wartość szacunkowa</p>';
    summaryWindow.html(summary);
    updateSummary();
    $("#discount").keyup(updateSummary);
    $("#contents form input[type='text']").keyup(updateSummary);
  };

  function nisCase() {
    var nisFieldId = "td.form-input input.norton";
    var nisField = $(nisFieldId);
    var booksIds = ["page1.programs.program[113]:input", "page1.programs.program[116]:input", "page1.programs.program[119]:input"];
    var programsCount = 0;
    $("#contents form input[type='text']").each(function() {
      var count = parseFloat($(this).val());
      var id = $(this).attr("id");
      if (count > 0 && id != nisField.attr("id") && $.inArray(id, booksIds) < 0)
        programsCount += count;
    });
    var nisCount = parseFloat(nisField.val());
    if (nisCount > programsCount) {
      nisField.val(programsCount);
      if (window.fdSliderController !== undefined && !($.browser.msie && $.browser.version.match(/^6\..+/) !== null)) {
        window.fdSliderController.updateSlider(nisField.attr("id"));
      }
    }
  };

  function updateSummary() {
    nisCase();
    var total = 0;
    var discount = parseFloat($("#discount").val());
    $("#contents form input[type='text']").each(function() {
      var val = 0;
      var count = parseFloat($(this).val());
      if (count > 0) {
        val = parseFloat($(this).attr("price")) * count;
        total += val;
        if (discount >= 0 && discount < 100 && $(this).metadata().discount != false) {
          total -= val * discount / 100;
        }
      }
    });
    if (discount >= 0 && discount < 100) {
      $("input[id*=discount]").val(discount);
    }
    var text = "0";
    if (total > 0) {
      text = Math.round(total).format();
    }
    text += " zł *";
    $("#price").text(text);
  };

  function myInitialParse(content) {
    if ($.browser.mozilla) {
      content = content.replace(/\/([^\r\n]+?)\//gi,"<i>$1</i>");
      content = content.replace(/=([^\r\n]+?)=/gi,"<strike>$1</strike>");
      content = content.replace(/_([^\r\n]+?)_/gi,"<u>$1</u>");
      content = content.replace(/\*([^\r\n]+?)\*/gi,"<b>$1</b>");
    }
    else if ($.browser.safari) {
      content = content.replace(/\/([^\r\n]+?)\//gi,'<span class="Apple-style-span" style="font-style: italic;">$1</span>');
      content = content.replace(/=([^\r\n]+?)=/gi,'<span class="Apple-style-span" style="text-decoration: line-through;">$1</span>');
      content = content.replace(/_([^\r\n]+?)_/gi,'<span class="Apple-style-span" style="text-decoration: underline;">$1</span>');
      content = content.replace(/\*([^\r\n]+?)\*/gi,'<span class="Apple-style-span" style="font-weight: bold;">$1</span>');
    }
    else {
      content = content.replace(/\/([^\r\n]+?)\//gi,"<em>$1</em>");
      content = content.replace(/=([^\r\n]+?)=/gi,"<strike>$1</strike>");
      content = content.replace(/_([^\r\n]+?)_/gi,"<u>$1</u>");
      content = content.replace(/\*([^\r\n]+?)\*/gi,"<strong>$1</strong>");
    }
    content = content.replace(/\r\n/mg, "<br>");
    content = content.replace(/[\n\r]/mg, "<br>");
    return content;
  };

  function wysiwyg(textarea) {
    var options = {
      css : { fontFamily : [ 'Andale Mono', 'Lucida Console', 'Courier New', 'Courier', 'monospace' ], fontSize : '11px' },
      controls : {
        bold          : { visible : true, tags : ['b', 'strong'], css : { fontWeight : 'bold' } },
        italic        : { visible : true, tags : ['i', 'em'], css : { fontStyle : 'italic' } },
        strikeThrough : { visible : true, tags : ['s', 'strike'], css : { textDecoration : 'line-through' } },
        underline     : { visible : true, tags : ['u'], css : { textDecoration : 'underline' } },
        separator05 : { separator : false },
        insertImage : { visible : false },
        separator06 : { separator : false },
        h1mozilla : { visible : false },
        h2mozilla : { visible : false },
        h3mozilla : { visible : false },
        h1 : { visible : false },
        h2 : { visible : false },
        h3 : { visible : false },
        separator08 : { separator : false },
        increaseFontSize : { visible : false },
        decreaseFontSize : { visible : false },
        separator09 : { separator : false },
        removeFormat : { visible : false },
        createLink : { visible : false }
      },
      saveContent : function() {
        if ( this.original ) {
          var content = this.getContent();
          if ( this.options.rmUnwantedBr )
            content = ( content.substr(-4) == '<br>' ) ? content.substr(0, content.length - 4) : content;

          if ($.browser.safari) {
            content = content.replace(/<span class="Apple-style-span" style="font-style: italic;">([^\r\n]+)<\/span>/gi,"/$1/"); //<i>...</i> -> /.../
            content = content.replace(/<span class="Apple-style-span" style="text-decoration: line-through;">([^\r\n]+?)<\/span>/gi,"=$1="); //<strike>...</strike> -> =...=
            content = content.replace(/<span class="Apple-style-span" style="font-weight: bold;">([^\r\n]+?)<\/span>/gi,"*$1*"); //<strong>...</strong> -> *...*
            content = content.replace(/<span class="Apple-style-span" style="text-decoration: underline;">([^\r\n]+?)<\/span>/gi,"_$1_"); //<u>...</u> -> _..._
          }
          else {
            if ($.browser.mozilla) {
              content = content.replace(/<i>([^\r\n]+?)<\/i>/gi,"/$1/"); //<i>...</i> -> /.../
              content = content.replace(/<b>([^\r\n]+?)<\/b>/gi,"*$1*"); //<b>...</b> -> *...*
            }
            else {
              content = content.replace(/<em>([^\r\n]+?)<\/em>/gi,"/$1/"); //<em>...</em> -> /.../
              content = content.replace(/<strong>([^\r\n]+?)<\/strong>/gi,"*$1*"); //<strong>...</strong> -> *...*
            }
            content = content.replace(/<strike>([^\r\n]+?)<\/strike>/gi,"=$1="); //<strike>...</strike> -> =...=
            content = content.replace(/<u>([^\r\n]+?)<\/u>/gi,"_$1_"); //<u>...</u> -> _..._
          }

          content = content.replace(/<p>([^\r\n]+?)<\/p>/gi,"$1\n"); //<p>...</p> -> ...<br>
          content = content.replace(/<div>(.*?)<\/div>/gi,"$1\n"); //<p>...</p> -> ...<br>
          content = content.replace(/&nbsp;/gi,""); //&nbsp; -> ' '
          content = content.replace(/<br\s*\/?>/mgi,"\n");
          content = content.replace(/<\S[^>]*>/g, "");

          if(content.length > 8000) {
            return this.setContent(myInitialParse(content.substring(0, 8000)));
          }
          else {
            var contentLength = $.trim(content).length;
            if(contentLength >= 8000)
              $('#counter').html('0');
            else
              $('#counter').html(8000 - contentLength);
            $(this.original).val(content);
          }
        }
        return undefined;
      },
      initialParse : myInitialParse
    };
    $(textarea).wysiwyg(options);
    var charsLeft = 8000;
    if ($(textarea).val() != undefined)
      charsLeft -= $("textarea[layout=wysiwyg]").val().length;
    var counter = '<li style="float: right; font-family: Verdana; font-size: 11px;">';
    counter += 'Pozostało: <span id="counter">' + charsLeft + '</span> znaków';
    counter += '</li>';
    $('div.wysiwyg ul.panel').append(counter);
  };

  return {
    updateSummary : function() {
      updateSummary();
    }

  }
}

Number.prototype.format = function() {
  var nStr = this;
  nStr += '';
  x = nStr.split('.');
  x1 = x[0];
  var x2 = '';
  if (x.length > 1)
    x2 += x[1];
  else
    x2 += '00';
  if (x2.length > 2)
    x2 = x2.substring(0,2);
  else if (x2.length == 1)
    x2 += '0';
  x2 = ',' + x2;
  var rgx = /(\d+)(\d{3})/;
  while (rgx.test(x1))
    x1 = x1.replace(rgx, '$1' + ' ' + '$2');
  return x1;
};

