/* --- Drop-down Menus --- */

$(document).ready(function(){
  
  $('#header-nav li>a').each(function(){
    
    if ($(this).attr('href') == '#')
      $(this).click(function(){ this.blur(); return false; });
    
    var _ul = $(this).parent().children('ul');
    
    _ul.stick = function() {
      window.clearTimeout(_ul.timer);
      _ul.timer = null;
      _ul.show();
    }
    
    _ul.close = function() {
      if (!_ul.timer) {
        _ul.timer = window.setTimeout(function(){ _ul.hide(); },100);
      }
    }
    
    $(this).add(_ul).hover(function(){
      _ul.stick();
    }, function(){
      _ul.close();
    });
    
  });
  
});

/* ------toggle labels in form -- */

$(document).ready(
  function labelPosition() {
    //document.getElementById("label").style.position="absolute";
	  $(".label").css({ 'position': 'absolute' });
    
    // label is moved behind the textfield using the script, 
    // so it doesnt apply when javascript disabled
  });


/* --- Fancy Tables --- */

$(document).ready(function(){
  
  $.fn.extend({
    fancy: function() {
      $(this).each(function(){
        var _odd_tr = true;
        $(this).find('tbody tr').each(function(){
          var _odd_td = true;
          $(this).removeClass('odd even').addClass(_odd_tr ? 'odd':'even').children('td').each(function(){
            $(this).removeClass('odd even').addClass(_odd_td ? 'odd':'even');
            _odd_td = !_odd_td;
          });
          _odd_tr = !_odd_tr;
        });
      });
    }
  });
  
  $('table.fancy').fancy();
  
  $(document).ajaxComplete(function(){
    $('table.fancy').fancy();
  });
  
});

/* --- Delete Links ---  */

$(document).ready(function(){
  $('a.delete').click(function(){
	  return confirm('Are you sure you want to delete this?'); 
  });
});

/* --- Newsletter Form --- */

$(document).ready(function(){
  $('#subscribe-email').click(function(){
    if (!this.cleared) {
      $(this).css('color','black');
      $(this).val('');
      this.cleared=true;
    }
    return false;
  });
});

/* --- Timeout Box --- */

function enable_timeout() {
  
  var
    TIMEOUT = 60*30,
    WARNING = 60;
  
  var
    _timer,
    _time_left = TIMEOUT;
  
  var _tick = function() {
    _time_left -= 1;
    if (_time_left <= WARNING) {
      if (_time_left == 0) {
        try {
          setUnloadHandler(false);
        } catch(e) {}
        document.location='/site/logout/auto/1';
        return;
      } else {
        $('#timeout').text('Due to inactivity, your session will expire in '+_time_left+' seconds...').show();
      }
    }
    _timer = window.setTimeout(_tick, 1000);
  }
  
  function _reset() {
    _time_left = TIMEOUT;
    $('#timeout').hide();
  }
  
  _reset();
  _tick();
  
  $(document).mousemove(_reset);
  
};

/* --- AJAX Tabs --- */

Tabs = {}

Tabs.init = function() {
  $('div.tabs a').click(Tabs.load);
  $('div.tabs span').click(Tabs.choose);
  Tabs.load.apply($('div.tabs a.selected')[0]);
}

Tabs.choose = function() {
  id = $(this).attr('id');
  $('div.tabs span').removeClass('selected');
  $(this).addClass('selected');
  $('div.tab div.body').hide();
  $('div.tab div.'+id).show();
}

Tabs.load = function() {
  $('div.tabs a').removeClass('selected');
  url = $(this).attr('href');
  tab = $(this).attr('class');
  $('div.tab div.body').hide();
  if(!$('div#'+tab).size()) {
    $('div.tab').append('<div class="body" id="'+tab+'"></div>');
    $('div#'+tab).load(url);
  }
  $('div.tabs a.'+tab).addClass('selected');
  $('div#'+tab).show();
  return false;
}

MallGroups = {
	init: function () {
		$('div#search-details div.groups input[type=checkbox]').change(MallGroups.select);		
	},
	select: function () {
		var action = 'remove';
		if ($(this).is(':checked'))
			action = 'add';
		var mallCode = $(this).closest('div.group-checkboxes').attr('data-mall-code');
		var groupId = $(this).val();
		$.ajax({
			type: 'post',
			url: '/group/'+action+'Mall',
			data: 'group_id='+groupId+'&mall_code='+mallCode
		});	
	}
};

/* --- "Scroll Down" Notice --- */

var ScrollNotice = function(noticeSel, markerSel) {
  
  var
    _notice = $(noticeSel),
    _marker = $(markerSel);
  
  window.setInterval(function(){
    _notice[_marker.offset().top > $(window).height()+$(window).scrollTop()+40 ? 'show' : 'hide']();
  }, 500);
  
};

/* --- Print Buttons --- */

$(document).ready(function(){
  $('a.print').click(function(){
    $('#print-iframe').src = $(this).attr('href');
    return false;
  });
});

/* --- Inline Toggles (FAQ) --- */

$(document).ready(function(){
  $('.toggle').hover(function(){
    $($(this).attr('data-toggle')).show();
  }, function(){
    $($(this).attr('data-toggle')).hide();
  });
});

/* --- Country Selection --- */

function selectCountry(select) {
  var id = select.options[select.selectedIndex].value;
  var dd = $(select).closest('dl').find('div.localities').closest('dd');
  var dt = dd.prev('dt');
  
  var method = (id == 257 || id == 42) ? 'show' : 'hide';
  dt[method]();
  dd[method]();
}

/**
 * SingleSelect emulates a simple select list, making the <li> elements of a <ul> selectable.
 */
var SimpleSelect = function(el) {
  
  var
    _div = $(el),
    _self = this,
    _selected;
  
  _div[0].onselectstart = _div[0].onselectend = function() {
    return false;
  };
  
  _self.onSelect = function(){};
  
  _div.mousedown(function(e){
    var t = $(e.target);
    if (t.is('li')) {
      if (_selected)
        _selected.removeClass('sel');
      t.addClass('sel');
      _selected = t;
      _self.onSelect(t[0]);
    }
    return false;
  });
  
};

/**
 * SelectList behavior applies to a <ul>, making it's <li> elements selectable.
 * Selected elements will have the 'sel' class applied.
 */
var SelectList = function(el) {
  
  var
    _div = $(el),
    _selecting = false,
    _adding,
    _changed,
    _self = this,
    _url;
  
  _self.items = 'results';
  _self.data = {};
  _self.preload = true;
  
  _div[0].onselectstart = _div[0].onselectend = function() {
    return false;
  };
  
  _div.mousedown(function(e){
    _changed = false;
    var t = e.target;
    if (t.nodeName=='I')
      t = t.parentNode;
    if (t.nodeName=='LI') {
      _selecting = true;
      _changed = true;
      _adding = !$(e.target).hasClass('sel');
      $(t)[_adding?'addClass':'removeClass']('sel');
    }
    return false;
  });
  
  _self.onChange = function(){};
  
  $(document).mouseup(function(){
    if (_selecting) {
      _selecting = false;
      if (_changed) {
        _self.onChange();
      }
    }
    return false;
  });
  
  _div.mousemove(function(e){
    if (_selecting) {
      var t = e.target;
      if (t.nodeName=='I')
        t = t.parentNode;
      if (t.nodeName=='LI')
        $(t)[_adding?'addClass':'removeClass']('sel');
    }
  });
  
  _div.scroll(function(){
    _self.load();
  });
  
  _self.setUrl = function(url, force) {
    _div.scrollTop(0);
    if ((url != _url) || force) {
      _url = _self.preload ? url : null;
      $.post(_self.preload ? url+'&preview=1' : url, _self.data, function(data, status){
        if (status=='success') {
          _div.scrollTop(0);
          _div.html(data);
        }
      });
    }
  };
  
  _self.load = function(loaded) {
    if (_url) {
      var placeholder = _div.find('div.placeholder');
      if (placeholder.length==0) {
        loaded && loaded();
        return;
      }
      $.post(_url+'&preview=0', _self.data, function(data, status){
        if (status=='success') {
          _div.scrollTop(0);
          placeholder.remove();
          _div.find('ul').append(data);
          loaded && loaded();
        }
      });
      _url = null;
    } else {
      loaded && loaded();
    }
  };
  
  _self.all = function() {
    return _div.find('ul li');
  };
  
  _self.selected = function() {
    return _div.find('ul li.sel');
  };
  
  _self.ul = function() {
    return _div.find('ul');
  };
  
  _self.clear = function() {
    _self.selected().removeClass('sel');
  };
  
  _self.count = function() {
    var c = _self.all().length;
    _div.find('small').html(c ? c+' '+_self.items : 'No '+_self.items+'...');
  };
  
  _self.ids = function() {
    var e = _self.all();
    var s = '';
    for (var i=0; i<e.length; i++)
      s += (i>0?',':'') + e[i].id;
    return s;
  };
  
  _self.selected_ids = function() {
    var e = _self.selected();
    var s = '';
    for (var i=0; i<e.length; i++)
      s += (i>0?',':'') + e[i].id;
    return s;
  };
  
};

/**
 * The StockList applies behaviors to a list of stock items and selections.
 * Mark-up is defined in the "search/_stocklist" partial.
 */
var StockList = function(name) {
  
  var
    _self = this,
    _name = name,
    _available = $('div#stock-'+name+'-available'),
    _selected = $('div#stock-'+name+'-selected'),
    _ct = $('#stock-ct-'+name);
  
  var
    _available_list = new SelectList(_available),
    _selected_list = new SelectList(_selected);
  
  _self.available = _available_list;
  _self.selected = _selected_list;
  
  _self.onAdd = function(){};
  _self.onRemove = function(){};
  
  _selected_list.items = 'selections';
  
  var
    _add = _ct.find('div.button.stock-list-add'),
    _add_all = _ct.find('div.button.stock-list-add-all'),
    _remove = _ct.find('div.button.stock-list-remove'),
    _remove_all = _ct.find('div.button.stock-list-remove-all');
  
  function refresh() {
    _available_list.count();
    _selected_list.count();
    _available_list.data.exclude = _selected_list.ids();
  }
  
  _add.click(function(){
    _available_list.selected().appendTo(_selected_list.ul());
    _selected_list.clear();
    refresh();
    _self.onAdd();
    return false;
  });
  
  _add_all.click(function(){
    _available_list.load(function(){
      _available_list.all().appendTo(_selected_list.ul());
      _selected_list.clear();
      refresh();
      _self.onAdd();
    });
    return false;
  });
  
  _remove.click(function(){
    _selected_list.selected().remove();
    _available_list.clear();
    refresh();
    _self.onRemove();
  });
  
  _remove_all.click(function(){
    _selected_list.all().remove();
    _available_list.clear();
    refresh();
    _self.onRemove();
  });
  
  _self.serialize = function() {
    return {name:_name, value:_selected_list.ids()};
  };
  
  StockList.instances.push(_self);
  
  refresh();
  
};

StockList.instances = [];

/*
 * Tooltip script 
 * based on a script by Alen Grakalic (http://cssglobe.com)
 * http://cssglobe.com/post/1695/easiest-tooltip-and-image-preview-using-jquery
 */
(function($) {
  xOffset = 10;
  yOffset = 20;		

  $.fn.tooltip = function() {
    $(".tooltip", this).hover(function(e){
      this.t = this.title;
      this.title = "";									  
      $("body").append("<p id='tooltip'>"+ this.t +"</p>");
      $("#tooltip")
        .css("top",(e.pageY - xOffset) + "px")
        .css("left",(e.pageX + yOffset) + "px")
        .fadeIn("fast");		
    },function(){
      this.title = this.t;		
      $("#tooltip").remove();
    })
    .mousemove(function(e){
      $("#tooltip")
        .css("top",(e.pageY - xOffset) + "px")
        .css("left",(e.pageX + yOffset) + "px");
    })
    .removeClass('tooltip')
    .addClass('x-tooltip');
		return this;
  };
})(jQuery);

$(document).ready(function() {
  $(document).tooltip();
});

(function($) {
  $.fn.checkAll = function (checkboxes) {
    var _checkboxes = $(checkboxes);
    var _select_all = $(this);
    
    function onSelect() {
      _select_all.prop('checked', _checkboxes.length == _checkboxes.filter('*[checked]').length);
    }

    function onSelectAll() {
      var checked = _select_all.prop('checked');
      _checkboxes.each(function () {
        $(this).prop('checked', checked);
      });
    }

    _checkboxes.click(onSelect);
    _select_all.click(onSelectAll);

    onSelect(); // initialize the state of the select-all checkbox
    
    return this;
  };
})(jQuery);

