if (typeof Domestika == 'undefined') { throw 'Unable to load Domestika base object'; }

if (typeof Domestika.Toggle == 'undefined') {
  Domestika.Toggle = {};
}

Domestika.Toggle.Handler = function(){
  
  var RegExp_Id_reference = /#(.*)$/;
  var RegExp_Toggle_Shown = /(^|\s+)toggle_show($|\s+)/g;
  var RegExp_Toggle_Selected = /(^|\s+)toggle_selected($|\s+)/g;
  var RegExp_Toggle_None = /(^|\s+)toggle_none($|\s+)/g;

  var U = Domestika.utils;
  
  var is_visible = function (toggle) {
    var element = get_reference(toggle);
    if (element.className.match(RegExp_Toggle_Shown)) return true;
    return false;
  };

  var show = function (toggle) {
    var element = get_reference(toggle);
    
    U.addClass(toggle,"toggle_selected");
    U.removeClass(element,"toggle_hide");
    U.addClass(element, "toggle_show");
  };

  var hide = function (toggle) {
    var element = get_reference(toggle);
    
    U.removeClass(toggle,"toggle_selected");
    U.removeClass(element,"toggle_show");
    U.addClass(element, "toggle_hide");
  };

  var get_reference = function(toggle) {
    return U.get(RegExp_Id_reference.exec(toggle.href)[1]);
  };
  
  var is_toggle = function (toggle) {
    if (toggle.className.match(RegExp_Toggle_None)) return false;
    else return true;
  };  
  
  var should_open_toggle = function (toggle) {
    if (toggle.className.match(RegExp_Toggle_Selected)) return true;
    else return false;
  };

  var manage_standalone_toggle_reference = function (e) {
    U.stopEvent(e); 
    if (is_visible(this)) hide(this);
    else show(this);
  };

  var manage_grouped_toggle_reference = function(e) {
    U.stopEvent(e);
    var parent = U.getAncestorBySelector(this,'.toggle_reference');
    
    if (parent) {
      var arr_toggles = parent.getElementsByTagName('a');
      
	  for(var i=0, len = arr_toggles.length; i < len; i++) {
        if (arr_toggles[i] == this)  show(arr_toggles[i]);
        else hide(arr_toggles[i]);
      }

	  	  
    }
  };

  var set_toggle_references = function() {      
    var arr_toggles = U.query(".toggle_reference");

    for(var i=0, len = arr_toggles.length; i < len; i++) {
      if (arr_toggles[i].tagName == 'A') set_standalone_toggle_reference(arr_toggles[i]);
      else set_grouped_toggle_references(arr_toggles[i]);
    }
  };
  
  var set_standalone_toggle_reference = function(toggle) {
    if (should_open_toggle(toggle)) show(toggle);
    else hide(toggle);
    
    U.on(toggle,'click', manage_standalone_toggle_reference );
  };
  
  
  var set_grouped_toggle_references = function (toggle) {
    var arr_toggles = toggle.getElementsByTagName('a');

    var toggle_to_open = null;
    for(var i=0, len = arr_toggles.length; i < len; i++) {
      if (is_toggle(arr_toggles[i])) {
        //if (toggle_to_open == null || should_open_toggle(arr_toggles[i])) toggle_to_open = arr_toggles[i];
        if (should_open_toggle(arr_toggles[i])) toggle_to_open = arr_toggles[i];
        hide(arr_toggles[i]);
        U.on(arr_toggles[i], 'click', manage_grouped_toggle_reference);
      }
    }
    //show(toggle_to_open);
	if (toggle_to_open != null) show(toggle_to_open);
  };
  
  var init = function() {
    set_toggle_references();
  };
  
  U.ready(init);

}();

