/**
 * @author: Miroslav Kvasnica - niwi - miradrda@volny.cz, niwiweb.wz.cz
 * @date: 19.9.2009
 */
 
// actual gtitlebox text
var gtitleboxText;
const SLIDE_TIME = 250;

$(function()
{
  // actions handler
  $("select.handleActions").bind('change', selectAction);
  
  // bind gtitlebox
  actualizegtitleBox();
  
  // handle mouse over table rows
  $(".gs_clickableTable tbody tr:has(.gs_clickableTableLink)").hover(rowMouseIn, rowMouseOut);
  $(".gs_clickableTable tbody tr:has(.gs_clickableTableLink)").click(rowClicked);

  // bind togglable elements
  $('[class^=toggle-]').click(togglableClick);
  $('[class^=alt-toggle-]').hide();

  // bind expanding errors
  $(".error-box .error-detail a, .error-box .debug a").click(toggleErrorView);

  // handle icons
  $('.gs-icon').live('mouseover', iconOver);
  $('.gs-icon').live('mouseout', iconOut);

  // jQuery UI
  if ($(".jqui-datepicker").length)
    $(".jqui-datepicker").datepicker({dateFormat: 'dd.mm.yy', firstDay: 1, dayNamesMin: ['Ne', 'Po', 'Út', 'St', 'Čt', 'Pá', 'So'], monthNames: ['Leden', 'Únor', 'Březen', 'Duben', 'Květen', 'Červen', 'Červenec', 'Srpen', 'Září', 'Říjen', 'Listopad', 'Prosinec']});
  $('.button').button();
  
  // submitting forms by enter (due to the bug in IE)
  $('input').keydown(function(e){
    if (e.keyCode == 13)
    {
      $(this).parents('form').submit();
      return false;
    }
  });
});

/**
 * Comment
 */
function err (title, debugContent)
{
  if (debugContent && (typeof debugContent == 'object'))
  {
    if (debugContent['errors'])
    {
      var key = '';
      var out = "Chyby:\n---------\n";
      for (key in debugContent['errors'])
      {
        var errTitle = debugContent['errors'][key]['title'];
        // add ending dot?
        if (errTitle)
        {
          var last = errTitle.charAt(errTitle.length-1);
          if (last != '!' && last != '?' && last != '.')
            errTitle += '.';
        }
        out += errTitle;
        if (debugContent['errors'][key]['publicDetail'])
          out += ': ' + debugContent['errors'][key]['publicDetail'];
        if (debugContent['errors'][key]['detail'])
          out += ' (' + debugContent['errors'][key]['detail'] + ').';
        out += "\n";
      }
      debugContent = out;
    }
  }
  alert(title + ine(debugContent, "\n"));
  return false;
  // BACHA na chyby z dialogu pokud jsou uz nejaky otevreny...
  // !!!!!!!!!!!!!
  // display dialog
  $('html').append('<div id="errDialog">'+ title +'</div>');
  $('#imageAddDialog').dialog({modal: true, title: 'Vyskytla se chyba', buttons: {"Ok": function(){$(this).dialog("close");}}});
  return false;
}


/**
 * checks JSON data
 */
function isError (data)
{
  if (!data || (typeof data != 'object'))
    return false;
  return (data['errors'] ? true : false);
}

var selectAction = function ()
{
  window.location.href = $(this).attr('value');
}

/**
 * If not empty
 */
function ine(variable, stringPre, stringPost)
{
  if (!stringPre)
    stringPre = '';
  if (!stringPost)
    stringPost = '';
  return variable ? stringPre + variable + stringPost : '';
}

/**
 * icon
 */
function icon (img1, img2, title, id, className, href, text)
{
  title = title ? title : text;
  string = '<a href="' + (href ? href:'#') + '"' + ine(title, ' title="', '"') + ine(id, ' id="', '"') + ine(className, ' class="', '"') +  '>';
  string += (text ? text:'') + '<img class="gs-icon'+ ine(img2, ' ') +'" src="'+img1+'"' + ine(title, ' alt="', '"') + ' />';
  string += '</a>';
  return string;
}

/**
 * Comment
 */
function actualizegtitleBox ()
{
  $(".gtitlebox-src").hover(showgtitlebox, hidegtitlebox);
  $(".gtitlebox-src").css('cursor', 'help');    
}

var showgtitlebox = function ()
{
  gtitleboxText = $(this).attr('title');
  if (!gtitleboxText)
    gtitleboxText = '(popis nebyl zadán)';
  $(this).removeAttr('title');
  $(this).after('<div class="gtitlebox hidden">' + gtitleboxText + '</div>');
  $(".gtitlebox").fadeIn('slow');
}

var hidegtitlebox = function ()
{
  $(".gtitlebox").remove();
  $(this).attr('title', gtitleboxText);
  gtitleboxText = '';
}

var rowMouseIn = function ()
{
  if (event.target.nodeName.toLowerCase == 'a')
    return false;
  $(this).children().addClass('gs_clickableTableHover');
  $(this).find('a.gs_clickableTableLink').addClass('gs_clickableTableLink-hover');
}

var rowMouseOut = function ()
{
  $(this).children().removeClass('gs_clickableTableHover');
  $(this).find('a.gs_clickableTableLink').removeClass('gs_clickableTableLink-hover');
}

var rowClicked = function ()
{
  var nodeName = event.target.nodeName.toLowerCase();
  if (nodeName == 'input')
    return false;
  if (nodeName == 'a' || event.target.parentNode.nodeName.toLowerCase() == 'a')
    return true;
  $(this).children().removeClass('gs_clickableTableHover');
  var rowLink = $(this).find('.gs_clickableTableLink');
  if (rowLink.length)
  {
    window.location = $(rowLink).first().attr('href');
  }
  return true;
}


/** 
 * Funkce pro extrakci obsahu XML elementu zadaneho v elementName.
 * @param text XML jako textovy retezec
 * @param elementName Nazev elementu, jehoz obsah funkce vrati
 *   (najde prvni element tohoto jmena)
 */
function getElementContent(text, elementName)
{
  var start = text.search('<' + elementName + '>');
  start += elementName.length + 2;  // oriznuti tagu samotneho elementu
  var end = text.search('</' + elementName + '>')
  return text.substr(start, end-start);
}

var togglableClick = function ()
{
  var classes = $(this).attr("class").split(' ');
  for (var cl in classes)
  {
    if (classes[cl].indexOf('toggle-') == 0)
    {
      var pos = classes[cl].indexOf('-');
      var name = classes[cl].substr(pos+1, classes[cl].length-pos-1);
      togglableClickCore(name);
    }
  }
  return false;
}

function togglableClickCore (name)
{
  if ($("#"+name).length == 0)
    return;

  if ($("#"+name).height() == 0)
  {
    if ($("#"+name+'-hidden').length)
    {
      if ($("#"+name+'-hidden').hasClass('togglable-active'))
      {
        $("#"+name).addClass('togglable-active');
        $("#"+name+'-hidden').removeClass('togglable-active');
        $("#"+name+'-hidden').fadeOut(SLIDE_TIME, function() {
        $("#"+name).show();
        });
        buttonShow = true;
      }
      else
      {
        $("#"+name).removeClass('togglable-active');
        $("#"+name+'-hidden').addClass('togglable-active');
        $("#"+name).hide();
        $("#"+name+'-hidden').fadeIn(SLIDE_TIME);
        buttonShow = false;
      }
    }
    else if ($("#"+name).hasClass('togglable-active'))
    {
      $("#"+name).removeClass('togglable-active');
      $("#"+name).show();
      buttonShow = true;
    }
    else
    {
      $("#"+name).addClass('togglable-active');
      $("#"+name).hide();
      buttonShow = false;
    }
  }
  else
  {
    if ($("#"+name+'-hidden').length)
    {
      if ($("#"+name+'-hidden').hasClass('togglable-active'))
      {
        $("#"+name).addClass('togglable-active');
        $("#"+name+'-hidden').removeClass('togglable-active');
        $("#"+name+'-hidden').slideUp(SLIDE_TIME, function(){
          $("#"+name).slideDown(SLIDE_TIME);
        });
        buttonShow = true;
      }
      else
      {
        $("#"+name).removeClass('togglable-active');
        $("#"+name+'-hidden').addClass('togglable-active');
        $("#"+name).slideUp(SLIDE_TIME, function(){
          $("#"+name+'-hidden').slideDown(SLIDE_TIME);
        });
        buttonShow = false;
      }
    }
    else if ($("#"+name).hasClass('togglable-active') ||
      (!$("#"+name).hasClass('hidden') && !$("#"+name).hasClass('hide'))
        && !$("#"+name).data('inited'))
    {
      $("#"+name).removeClass('togglable-active');
      $("#"+name).data('inited', true);
      $("#"+name).slideUp(SLIDE_TIME);
      buttonShow = true;
    }
    else
    {
      $("#"+name).addClass('togglable-active');
      $("#"+name).slideDown(SLIDE_TIME);
      buttonShow = false;
    }
  }

  var buttons = $(".toggle-"+name);
  for (var i = 0; i < buttons.length; i++)
  {
    setButtonsLabels(buttons[i], name);
  }
}


function setButtonsLabels (button)
{
  // set button label
  var oldLabel = $(button).text();
  var newLabel = oldLabel;
  if ($(button).next().length && $(button).next().hasClass('alt-toggle'))
  {
    // simply swap
    newLabel = $(button).next().text();
    $(button).next().text(oldLabel);
  }
  else if ($(button).attr('rev'))
  {
    // simply swap
    newLabel = $(button).attr('rev');
    $(button).attr('rev', oldLabel);
  }
  else if (buttonShow)
  {
    newLabel = oldLabel.replace("část", "celé");
    if (oldLabel == 'Skrýt')
      newLabel = 'Zobrazit';
  }
  else
  {
    newLabel = oldLabel.replace("celé", "část");
    if (oldLabel == 'Zobrazit')
      newLabel = 'Skrýt';
  }
  var useButton = false;
  if ($(button).hasClass('button'))
  {
    useButton = true;
    $(button).button('destroy');
  }
  $(button).text(newLabel);
  if (useButton)
    $(button).button();
}

/**
 * parseUrl
 */
function parseUrl (url, parentWithEndingSlash)
{
  if (parentWithEndingSlash === undefined)
    parentWithEndingSlash = true;

  var data = {parent: undefined, ending: undefined, 0: undefined, 1: undefined};
  
  lastSlash = url.lastIndexOf('/');
  slash = lastSlash === -1 ? '' : '/';
  dstParent = url.substring(0, lastSlash);
  data['parent'] = data[0] = dstParent + (parentWithEndingSlash ? slash : '');
  data['ending'] = data[1] = url.substring(lastSlash+(lastSlash ? 1 : 0));
  return data;
}

/**
 *
 */
function composeUrl (newSegment)
{
  var newUrl = URL_WITHOUT_TAIL;
  if (URL_WITHOUT_TAIL != '/')
    newUrl += '/' + newSegment;
  else
    newUrl += newSegment;
  return newUrl;
}

var toggleErrorView = function ()
{
  var dispText = '(zobrazit celé)';
  var hideText = '(zobrazit jen část)';
  var parent = $(this).parent();
  parent.find('.err-all, .err-dots').toggle();
  if ($(this).text() == dispText)
    $(this).text(hideText);
  else
    $(this).text(dispText);
  return false;
}

/**
 * Determines whether the variable is array or not
 * version: 901.1623
 * discuss at: http://phpjs.org/functions/is_array
 * original by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
 * improved by: Legaev Andrey
 */
function is_array (mixed_var)
{
    var key = '';

    if (!mixed_var) {
        return false;
    }

    if (typeof mixed_var === 'object') {

        if (mixed_var.hasOwnProperty) {
            for (key in mixed_var) {
                // Checks whether the object has the specified property
                // if not, we figure it's not an object in the sense of a php-associative-array.
                if (false === mixed_var.hasOwnProperty(key)) {
                    return false;
                }
            }
        }
        return true;
    }

    return false;
}

function iconOver ()
{
  var newSrc = $(this).attr('class').substr(8);
  if (!newSrc)
    return false;

  var src = $(this).attr('src');
  var url = parseUrl(src);
  $(this).data('src', src); // store the old src
  $(this).attr('src', url[0] + newSrc); // set new src
  return true;
}

function iconOut ()
{
  var oldSrc = $(this).data('src');
  if (oldSrc)
    $(this).attr('src', oldSrc);
}
