
/**
 * Common js application
 */

var Application = {
  
  init: function() {
    this.ajax_forms('form.ajax_form');
    this.init_timepicker('.timepicker');
    this.init_datepicker('.datepicker');
    this.confirmation_links('.confirmation_link');
    this.popover_links('a[target="_popover"]');
    this.connect_country_state('#country', '#state', '#state_other');
  },
  
  ajax_forms: function(selector) {
    $(selector).live('submit', function() {
      var $form = $(this);
      $('.form_submit_button', $form).hide();
      $('.form_ajax_loader', $form).show();
      $('div.validation_error', $form).remove();
      $.ajax({
        url: $form.attr('action'),
        type: 'POST',
        data: {data: Application.get_data($form)},
        dataType: 'json',
        success: function(data, textStatus, XMLHttpRequest) {
          $('.form_ajax_loader', $form).hide();
          $('.form_submit_button', $form).show();
          if (data.success == true)
          {
              if (data.location)
              {
                  Application.redirect(data.location);
              }
              if (data.callback)
              {
                  $.globalEval(data.callback);
              }              
          }
          else
          {
              if (data.message)
              {
                  Application.show_alert(data.message);
              }
              if (data.errors)
              {
                  Application.show_errors($form, data.errors);    
              }
          }
        }
      });
      return false;
    });
  },
  
  confirmation_links: function(target) {
    $(target).click(function() {
      var $link = $(this);
      if (confirm($link.attr('title')))
      {
        Application.redirect($link.attr('href'));
      }
      return false;
    });
  },
  
    connect_country_state: function(country_select, state_select, state_input) {
        var $country_select = $(country_select);
        var $state_select = $(state_select);
        var $state_input = $(state_input);
        if ($state_select.length && $state_input.length && $state_select.data('name') == null)
        {
            $state_select
                .data('name', $state_select.attr('name'))
                .attr('name', 'temp_state_select');
            $state_input
                .data('name', $state_input.attr('name'))
                .attr('name', 'temp_state_input');
            $country_select
                .live('change', function() {
                    if ($(this).val() == 223 || $(this).val() == 'United States')
                    {
                        $state_input
                            .attr('name', 'temp_state_input')
                            .hide();
                        $state_select
                            .attr('name', $state_select.data('name'))
                            .show();
                        var input_value = $state_input.val();
                        if (input_value.length)
                        {
							//$('option[selected]').removeAttr('selected');
                            if (input_value.length == 2)
                            {
                                $('option[value=' + input_value.toUpperCase() + ']').attr('selected', 'selected');
                            }
                            else
                            {
                                $('option:contains(' + (input_value.charAt(0).toUpperCase() + input_value.slice(1)) + ')').attr('selected', 'selected');
                            }
                        }
                    }
                    else
                    {
                        $state_select
                            .attr('name', 'temp_state_select')
                            .hide();
                        $state_input
                            .attr('name', $state_input.data('name'))
                            .show();
                    }
                    return this;
                })
				.trigger('change');
        }
    },
    
    /**
     * Character limiter
     */
    
    character_limiter: function(field, indicator, limit) {
        $(field)
            .data({
                indicator:  indicator,
                limit:      limit
            })
            .change(Application.update_character_limiter)
            .keyup(Application.update_character_limiter)
            .trigger('change');
    },
    
    update_character_limiter: function() {
        var $field = $(this);
        var $indicator = $($field.data('indicator'));
        var limit = $field.data('limit');
        var count = $field.val().length;
        $indicator.html('(' + (count >= limit ? 0 : limit - count) + ' characters left.)');
        if (count > limit)
        {
            $field.val($field.val().substr(0, limit));
        }
    },
    
    /**
     * Connect select with input for other option
     */
  
    connect_select_other: function(select_selector, other_selector, trigger_other_value, other_container_selector) {
        var $select = $(select_selector);
        var $other = $(other_selector);
        var $other_container = $(other_container_selector);
        if ($select.length && $other.length)
        {
            $other
                .data('name', $other.attr('name'))
                .attr('name', 'temp_other_name');
            $select
                .data('name', $select.attr('name'))
                .attr('name', 'temp_select_name')
                .live('change', function() {
                    if ($(this).val() == trigger_other_value)
                    {
                        $select.attr('name', 'temp_select_name')
                        $other
                            .attr('name', $other.data('name'))
                            .show();
                        $other_container.show();    
                    }
                    else
                    {
                        $other
                            .attr('name', 'temp_other_name')
                            .hide();
                        $other_container.hide();    
                        $select.attr('name', $select.data('name'))
                    }
                    return this;
                })
                .trigger('change');
        }
    },
  
    get_data: function(target) {
        var $target = $(target);
        var data = {};
        var fields = $('input:hidden,input:text,input:password,input:radio:checked,input:checkbox:checked,textarea,select', $target);
        $.each(fields, function(key, item) {
            var $item = $(item);
            var field = $item.attr('name');
            var value = $item.val();
            if ($item.hasClass('datepicker') && value != '')
            {
                var split_value = value.split('/');
                value = split_value[2] + '-' + split_value[0] + '-' + split_value[1]; 
            }
            if ($item.hasClass('timepicker') && value != '')
            {
                var split_value = value.split(' ');
                var time_value = split_value[0];
                var time_postfix = split_value[1];
                var split_time = time_value.split(':');
                value = (time_postfix == 'pm' ? 12 + parseInt(split_time[0]) :  + split_time[0]) + ':' + split_time[1];
            }
            if (value == null)
            {
                value = '';
            }
            if (data[field] == undefined)
            {
                data[field] = value;
            }
            else
            {
                data[field] += ',' + value;
            }
        });
        return data;
    },
  
  init_datepicker: function(selector) {
      if ($(selector).length)
      {
        $(selector).datepicker();
      }
  },
  
    init_timepicker: function(selector) {
        if ($(selector).length)
        {
            var time_input = $(selector).timepicker({
                                 timeFormat:    'h:mm tt', 
                                 ampm:          true
                             });
        }
    },
  
  popover_links: function(selector) {
    $(selector).live('click', function() {
      openwin($(this).attr('href'));
      return false;
    });
  },

  redirect: function(location) {
    window.location.replace(location);
  },
  
    set_data: function(data) {
        $.each(data, function(selector, fields) {
            var $selector = $(selector);
            $.each(fields, function(field, value) {
                if (value)
                {
                    // set selects, inputs and textarea
                    var $single_input = $('input:text[name=' + field + '],select[name=' + field + '],textarea[name=' + field + '],input:hidden[name=' + field + ']', $selector);
                    if ($single_input.length == 1)
                    {
                        if ($single_input.hasClass('datepicker'))
                        {
                            var split_value = value.split('-');
                            value = split_value[1] + '/' + split_value[2] + '/' + split_value[0]; 
                        }
                        $single_input.val(value);    
                    }
                    else if ($single_input.length > 1)
                    {
                        $single_input.each(function(key, input) {
                            $(input).val(value);    
                        });
                    }
                    // set radios and checkboxes
                    var $multi_inputs = $('input:radio[name=' + field + '],input:checkbox[name=' + field + ']', $selector);
                    if ($multi_inputs.length)
                    {
                        var values = value.split(',');
                        $multi_inputs.each(function(key, multi_input) {
                            var $multi_input = $(multi_input);
                            for (i = 0; i < values.length; i++) {
                                if ($multi_input.val() == values[i])
                                {
                                    $multi_input.attr('checked', true);
                                }
                            }
                        });
                    }
                    // set text blocks
                    var $text = $('div[name=' + field + '],span[name=' + field + ']', $selector);
                    if ($text.length)
                    {
                        if ($text.hasClass('datepicker'))
                        {
                            var split_value = value.split('-');
                            value = split_value[1] + '/' + split_value[2] + '/' + split_value[0]; 
                        }
                        $text.html(value);
                    }
                }
            });
        });
    },
  
  select_admin_menu: function(menu_item) {
    $('.menu a[name=' + menu_item + ']').addClass('select');
  },
 
  show_alert: function(message) {
    alert(message.replace('<br/>', "\n"));
  },
  
  show_errors: function(target, errors) {
    var $form = $(target);
    var $focus_field = false;
    $.each(errors, function(field, error) {
      var $error = $('<div/>').addClass('validation_error').html(error);
      var $field = $('[name=' + field + ']', $form);
      if ($field.hasClass('error_location'))
      {
          $error.css({
              position: 'static',
              float:    'left'
          });
          $($field.attr('target')).html($error);
      }
      else
      {
          $error
            .insertAfter($field)
            .css({
              top: ($field.offset().top) + 'px',
              left: ($field.offset().left + $field.outerWidth() + 10) + 'px'
            });
      }
      if (!$focus_field)
      {
          $focus_field = $field;
      }  
    });
    if ($focus_field)
    {
        $focus_field.trigger('focus');
    }
  },
  
  show_tree: function(tree, parent_item, level) {
    var $parent_item = $(parent_item);
    $.each(tree, function(key, item) {
      var $item = $('<div/>').addClass('tree_item').addClass('tree_level_' + (level > 1 ? 'other' : level)).appendTo($parent_item);
      $('<img/>')
        .attr('src', item.tree_item_checked ? 'images/tree_checkbox_checked.png' : 'images/tree_checkbox_unchecked.png')
        .data('id', item.id)
        .data('checked', item.tree_item_checked)
        .click(function() {
          var $this = $(this);
          if ($this.data('checked'))
          {
            $this.data('checked', false).attr('src', 'images/tree_checkbox_unchecked.png');
          }
          else
          {
            $this.data('checked', true).attr('src', 'images/tree_checkbox_checked.png');
          }
          return false;
        })
        .appendTo($item);
      $('<a/>')
        .attr('href', item.id)
        .data('name', item.name)
        .data('description', item.description)
        .data('opened', false)
        .html(item.name)
        .click(function() {
          var $this = $(this);
          $('#tree_item_name').hide().html($this.data('name')).fadeIn();
          $('#tree_item_description').hide().html($this.data('description')).fadeIn();
          if ($this.data('opened'))
          {
            $this.data('opened', false);
            $this.parent('.tree_item').children('.tree_item').hide('fast');
          }
          else
          {
            $this.data('opened', true);
            $this.parent('.tree_item').children('.tree_item').show('fast');
          }
          return false;
        })
        .appendTo($item);
      if (item.tree_items != undefined)
      {
        Application.show_tree(item.tree_items, $item, level + 1);
      }
    });
  }
  
}

$(document).ready(function() {
  Application.init();
});  

