var replaceElement = "#contents";
var contentHandler = "#wrapper";
var ajaxLoader = "#ajax-loader";

$(document).ready(function() {
  $("form[dynamic=true]").ajaxForm(ajaxOptions);
  autoSkipInputs();
  $("input:text").hint();
  fireOnloadEvents();
  bindTextTools();
  $('#contents form :input:visible:first').focus();
  $(replaceElement).ajaxSuccess(function(request, settings) {
    autoSkipInputs();
    $("input:text").hint();
    fireOnloadEvents();
  });

  /* Quick patch to IE fade bug */
  jQuery.fn.fadeTo = function(speed,to,callback) {
    return this.animate({opacity: to}, speed, function() {
      if (to == 1 && jQuery.browser.msie) {
        this.style.removeAttribute("filter");
      }
      if (typeof callback == "function") {
        callback();
      }
    });
  };
});

var ajaxOptions = {
  target: replaceElement,
  beforeSubmit: formBefore,
  success: formSuccess,
  error: formError,
  type: "POST",
  contentType: "application/x-www-form-urlencoded; charset=UTF-8"
};

function formBefore(formData, jqForm) {
  var form = jqForm[0];
  if (form.beenSubmitted)
    return false;
  else
    form.beenSubmitted = true;

  document.body.style.cursor="wait";
  $(replaceElement).fadeTo(0.1, 0.5);
  var h = $(replaceElement).height() ;
  var w = $(replaceElement).width();
  var leftPosition = $(replaceElement).position().left;
  $(ajaxLoader).css({
    "margin-left" : w/2,
    "margin-top" : h/2,
    "left" : leftPosition
  });
  $(ajaxLoader).show();
  return true;
}

function formSuccess() {
  $(replaceElement).fadeTo(0.1, 1);
  document.body.style.cursor="auto";
  $('form[dynamic=true]').ajaxForm(ajaxOptions);
  $(ajaxLoader).hide();
  bindTextTools();
  safeMail();
  setHashState();
  $("form[dynamic=true]").trigger('form-loaded');
  $('#contents form :input:visible:first').focus();
}

function formError(request, status) {
  var resp = $(request.responseText);
  var rscript = /<script(.|\s)*?\/script>/gi;
  $(contentHandler).replaceWith($("<div />").append(request.responseText.replace(rscript, "")).find(contentHandler));
  var title = resp.next("title").text();
  if (title)
    document.title = title;
  formSuccess();
}
function fireOnloadEvents() {
  $("[dynamic-action]").each(function() {
    eval($(this).attr("dynamic-action"));
  });
}

function bindTextTools() {
  $("textarea[layout=wysiwyg]").each(function() {
    wysiwyg(this);
  });
  $("textarea[layout=counter]").each(function() {
    createCounter(this);
    var $textarea = $(this);
    $textarea.bind("change click keyup", function() {
      updateCounterHandler(this);
    });
  });
  $("textarea[layout=counter]:last").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"));
  });
  $("input, select").bind("keydown", function(e) {
    if (e.keyCode == 13) { // enter key
      e.preventDefault();
      $(this).closest('form').submit();
      return false;
    } else  {
      return true;
    }
  });
}

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().next().children("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"]');
    var prev = $(this).parent().prev().find('input[type="text"]');
    if (prev.length === 0)
      prev = $(this).prev().prev('nput[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);
      }
    });
  }
}

$(document).ready(function() {
  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) {
        document.body.style.cursor="wait";
        $(replaceElement).fadeTo(0.1, 0.5);
        var h = $(replaceElement).height() ;
        var w = $(replaceElement).width();
        $(ajaxLoader).css({
          "margin-left" : w/2,
          "margin-top" : h/2
        });
        $(ajaxLoader).show();
        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) {
            $(replaceElement).html(data);
            $(replaceElement).fadeTo(0.1, 1);
            document.body.style.cursor="auto";
            $('form[dynamic=true]').ajaxForm(ajaxOptions);
            $(ajaxLoader).hide();
            bindTextTools();
            safeMail();
          },
          error: formError
        });
      }
    });
    var testHash = $.param.fragment();
    if (testHash)
      $(window).trigger('hashchange');
  }
});

$(document).ready(function(){
  $("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];
                    }
      });
    });
  });
});

$(document).ready(function() {
  if (!jQuery.fn.tinymce)
    return;
  $("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;
    }
  });
});


/*
 * Funkcje zamówienia programów
 */
function loadRollableHeaders() {
  if (window.fdSliderController !== undefined && !($.browser.msie && $.browser.version.match(/^6\..+/) !== null)) {
    fdSliderController.create();
  }
  $("tr.form-row-header.roll").click(function() {
    var header = this;
    var jHeader = $(header);
    jHeader.toggleClass("header-hidden");
    jHeader.toggleClass("header-visible");
    var hiding = false;
    $(this).parent().find("tr").each(function() {
      var row = $(this);
      if (hiding && (row.hasClass("table-row1") || row.hasClass("table-row2"))) {
        row.find(".fd-slider").toggle();
        if(row.css('display') == 'none') {
          row.show();
        } else {
          row.hide();
        }
      }
      if (this == header) {
        hiding = true;
      } else if (hiding && row.hasClass("form-row-header")) {
        hiding = false;
      }
    });
    if (window.fdSliderController !== undefined && !($.browser.msie && $.browser.version.match(/^6\..+/) !== null)) {
      fdSliderController.redrawAll();
    }
  });
  $("tr.form-row-header.roll").addClass("header-visible");
  $("tr.form-row-header.roll:gt(0)").click();
}

function summary() {
  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>';
  $("#contents").prepend('<div class="summary-window">' + summary + '</div>');
  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);
}

/*
 * Wysiwyg
 */
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>");
  }
  /* This needs further work
  if ($.browser.opera) {
    var lines = content.split(/[\n\r]/);
    if (lines.length > 1) {
      content = "";
      for (var i = 0; i < lines.length; i++)
        content += "<p>" + lines[i] + "</p>";
    }
  }
  */
  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);
}

jQuery.fn.hint = function () {
  return this.each(function () {
    var t = jQuery(this);
    var title = t.attr('title');
    if (title) {
      t.blur(function () {
        if (t.val() === '' || t.val() == title) {
          t.val(title);
          t.addClass('blur');
        }
      });
      t.focus(function () {
        if (t.val() == title) {
          t.val('');
          t.removeClass('blur');
        }
      });

      t.parents("form:first").find("input[type='submit']").click(function(){
          if (t.val() == title) {
              t.val('');
              t.removeClass('blur');
          }
      });

      t.blur();
    }
  });
};

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;
};

String.prototype.startsWith = function(str) {
  return (this.match("^" + str) == str);
}
String.prototype.endsWith = function(str) {
  return (this.match(str + "$") == str);
}
