//
// Note: This class has been generalized to support UI pattern that was originally used for NAICS/Industry inputs (thus the NaicsSelector class name).
//       The pattern involves an auto complete search based multi-selector.
//
// Extensions for Contract Vehicle inputs
// 1. Add class function to override back channel data validation.  This allows new entry to be entered (in POST/EDIT forms).
// 2. Add class function to support secondary attribute selector (extra attribute for selected Contract Vehicle type)
// 3. Add back data channel (via textarea) to send back selected information
//

function createSbxNaicsSelector (naics_multiple_list_div_id, naics_multiple_list_selector_id, naics_source_text_div_id, naics_source_text_field_id, naics_source_validate_phpcall, selector_type_display_name) {
  var o = new sbxNaicsSelector ();
  o.bind (naics_multiple_list_div_id, naics_multiple_list_selector_id, naics_source_text_div_id, naics_source_text_field_id, naics_source_validate_phpcall, selector_type_display_name);
  return o;
}

function createSbxNaicsSelectorWithAttribute (
  naics_multiple_list_div_id,
  naics_multiple_list_selector_id,
  naics_source_text_div_id,
  naics_source_text_field_id,
  naics_source_validate_phpcall,
  selector_type_display_name,
  secondary_attribute_selector_id,
  json_data_text_element_id,
  allow_invalid_in_data_as_new_item
) {
  var o = new sbxNaicsSelector ();
  o.allowInvalidInDataAsNewItem (allow_invalid_in_data_as_new_item);
  o.setSecondaryAttributeBinding (secondary_attribute_selector_id, json_data_text_element_id);
  o.bind (naics_multiple_list_div_id, naics_multiple_list_selector_id, naics_source_text_div_id, naics_source_text_field_id, naics_source_validate_phpcall, selector_type_display_name);
  return o;
}

function sbxNaicsSelector () {
  this.naics_multiple_list_div_id = null;
  this.naics_multiple_list_selector_id = null;
  this.naics_source_text_div_id = null;
  this.naics_source_text_field_id = null;
  this.addButton = null;
  this.slected_display_list = null;
  this.naics_source_validate_phpcall = null;
  this.selector_type_display_name = null;
  
  this.allowInvalidInDataAsNewItemFlag = false;
  this.secondaryAttributeSelectorId = false;
  this.jsonDataTextElementId = false;
  this.jsonDataTextValue = '';
  this.selectedListData = new Array ();
  
  this.slectableAttributeTextMode = false;
}

sbxNaicsSelector.prototype.bind = function (naics_multiple_list_div_id, naics_multiple_list_selector_id, naics_source_text_div_id, naics_source_text_field_id, naics_source_validate_phpcall, selector_type_display_name) {
  this.naics_multiple_list_div_id = naics_multiple_list_div_id;
  this.naics_multiple_list_selector_id = naics_multiple_list_selector_id;
  this.naics_source_text_div_id = naics_source_text_div_id;
  this.naics_source_text_field_id = naics_source_text_field_id;
  this.naics_source_validate_phpcall = naics_source_validate_phpcall;
  this.selector_type_display_name = selector_type_display_name;
  this.init ();
}

sbxNaicsSelector.prototype.allowInvalidInDataAsNewItem = function (flag) {
  this.allowInvalidInDataAsNewItemFlag = flag;
}

sbxNaicsSelector.prototype.setSecondaryAttributeBinding = function (secondaryAttributeSelectorId, jsonDataTextElementId) {
  this.secondaryAttributeSelectorId = secondaryAttributeSelectorId;
  this.jsonDataTextElementId = jsonDataTextElementId;
  this.jsonDataTextValue = $(jsonDataTextElementId).text ();
  var json_data_list = eval (this.jsonDataTextValue);
  for (var i in json_data_list) {
    var e = json_data_list[i];
    this.selectedListData[e.code] = e;
  }
}

sbxNaicsSelector.prototype.init = function () {
  $(this.naics_multiple_list_div_id).hide();
  $(this.naics_source_text_div_id).show();

  this.addButton = $('<div class="button addNAICSButton" style="display:none"><a class="addSmButton" >add</a></div>');
  var_div_id = "div-no-select";
  if (this.selector_type_display_name == 'Contract Vehicle')
    var_div_id = "div-no-select-cv";
  this.slected_display_list = $('<div class="listContainer"><span class="selection"><b>Selections:</b></span><ul class="mysbxSelectedList industry"><li id="'+var_div_id+'" class="no-select">You have not selected any '+this.selector_type_display_name+'.</li></ul></div>');
	
  $(this.naics_source_text_field_id).after(this.addButton);
  this.addButton.after (this.slected_display_list);

  var objectInstance = this;

  jQuery.each ($(this.naics_multiple_list_selector_id + ' :selected'), function (i, selected){
    objectInstance.AddListItem ($(selected).val(), $(selected).text());
  });
  
  var cnt = 0;
  $(this.naics_source_text_field_id).blur (function () {
    var naics_source_text_field_id = objectInstance.naics_source_text_field_id;
    var addButton = objectInstance.addButton;
    if ($(this).val() != "" && cnt == 0) {
      $(addButton).show ();
      cnt = cnt + 1;
    }
  });

  $(this.naics_source_text_field_id).keypress (function () {
    var addButton = objectInstance.addButton;
    if ($(this).val() != "" && cnt == 0) {
      $(addButton).show ();
      cnt = cnt + 1;
    }
  });
	
  var addinList = false;
  this.addButton.click (function () {
    addinList = false;
    var inData = $(objectInstance.naics_source_text_field_id).val ();
    if (inData == '') {
      return;
    }
    
    var callBackUri = "/misc/sbx/form_scripts/php/mysbx_check_naic_code.php?str=" + escape (inData) + "&calltype=" + objectInstance.naics_source_validate_phpcall;
    $.getJSON (callBackUri, function (data) {
      if (data['naiccode'] || objectInstance.allowInvalidInDataAsNewItemFlag) {
        objectInstance.applySelectedOrEnteredData (inData, data['naiccode']);
      }
      else {
        alert (inData +" is not a valid " + objectInstance.selector_type_display_name + " selection, please try again and select from suggestions.");
      }
    });
    
    $(objectInstance.naics_source_text_field_id).val ('');
    objectInstance.addButton.hide ();
    cnt = 0;
  });
}

sbxNaicsSelector.prototype.applySelectedOrEnteredData = function (dataString, dataCode) {
  if (dataCode == false) {
    dataCode = dataString;
  }
  
  var addToListFlag = false;
  if ($(this.naics_multiple_list_selector_id + " option[value=" + dataCode + "]").length == 0) {
    $(this.naics_multiple_list_selector_id).append ('<option selected value="' + dataCode + '">' + dataString + "</option>");	
    addToListFlag = true;		
  }
  else {
    if (!$(this.naics_multiple_list_selector_id + " option[value='" + dataCode + "']").attr ('selected')) {
      $(this.naics_multiple_list_selector_id + " option[value='" + dataCode + "']").attr ('selected', 'selected');
      addToListFlag = true;
    }
  }
  if (addToListFlag) {
    this.AddListItem (dataCode, dataString);
  }
}

sbxNaicsSelector.prototype.AddListItem = function (naiccode, naictext) {
  var_div_id = "div-no-select";
  if (this.selector_type_display_name == 'Contract Vehicle')
    var_div_id = "div-no-select-cv";
    $('#'+var_div_id).hide();
    
  var naics_code_str = (isNaN (naiccode)) ? escape (naiccode) : naiccode;
  var objectInstance = this;
  var listItem = $('<li option_id=' + naics_code_str + '><div class="listDelete">X</div>&nbsp;&nbsp;' + naictext + '</li>');
  this.slected_display_list.children ('ul').append (listItem);

  if (typeof (this.selectedListData[naiccode]) == 'undefined') {
    this.selectedListData[naiccode] = new Object;
    this.selectedListData[naiccode].code = naiccode;
    this.selectedListData[naiccode].name = naictext;
    this.selectedListData[naiccode].attr = 0;
  }
	  
  if (this.secondaryAttributeSelectorId) {
    var attributeTextElement = $('<span id="sbx_cv_attr_text_' + naics_code_str + '"></span>');
    var cloneAttributeSelector = $(this.secondaryAttributeSelectorId).clone ();
    
    attributeTextElement.css ('font-style', 'italic');
    attributeTextElement.css ('color', 'gray');
    attributeTextElement.css ('cursor', 'pointer');
    attributeTextElement.peerSelector = cloneAttributeSelector;
    cloneAttributeSelector.peerTextElement = attributeTextElement;
    
    cloneAttributeSelector.appendTo ("li[option_id='" + naics_code_str + "']");
    attributeTextElement.appendTo ("li[option_id='" + naics_code_str + "']");
    
    cloneAttributeSelector.dataCode = naiccode;
    cloneAttributeSelector.val (this.selectedListData[naiccode].attr);
    cloneAttributeSelector.css ('width', '200px');
    cloneAttributeSelector.css ('margin-left', '10px');
    cloneAttributeSelector.attr ('id', 'sbx_cv_attr_selector_' + naics_code_str);
    
    if (this.slectableAttributeTextMode) {
	  attributeTextElement.show ();
      cloneAttributeSelector.hide ();
    }
    else {
      attributeTextElement.hide ();
    }
    
    cloneAttributeSelector.blur (function () {
	    _handle_attribute_selector_action ($(this));
    });
    
    cloneAttributeSelector.change (function () {
      _handle_attribute_selector_action ($(this));
    });

    attributeTextElement.click (function () {
      if (objectInstance.slectableAttributeTextMode) {
        var peerSelector = $('#sbx_cv_attr_selector_' + naics_code_str);
        $(this).hide ();
        peerSelector.show ();
      }
    });
  
    function _handle_attribute_selector_action (oSelector) {
      objectInstance.selectedListData[naiccode].attr = oSelector.val ();
      objectInstance.refreshJsonDataTextField ();
      var peerTextElement = $('#sbx_cv_attr_text_' + naics_code_str);
      if (objectInstance.slectableAttributeTextMode) {
        _setAttributeTextDisplay (peerTextElement, oSelector);
        peerTextElement.show ();
        oSelector.hide ();
      }
    }
    
    function _setAttributeTextDisplay (targetAttributeTextElement, peerSelector) {
      var attributeDisplayText = $(':selected', peerSelector).text();
      targetAttributeTextElement.text (', ' + attributeDisplayText);
    }

    _setAttributeTextDisplay (attributeTextElement, cloneAttributeSelector);
  }
  
  this.refreshJsonDataTextField ();
  
  $('.listDelete', listItem).click (function () {
    var optionId = $(this).parent().attr('option_id');
    var optionIdStr = (isNaN (optionId)) ? unescape (optionId) : optionId;
    $(objectInstance.naics_multiple_list_selector_id + " option[value='" + optionIdStr + "']").remove ();
    $(this).parent().remove ();
    if (typeof (objectInstance.selectedListData[optionId]) != 'undefined') {
      delete objectInstance.selectedListData[optionId];
    }
    objectInstance.refreshJsonDataTextField ();
  });
}		

sbxNaicsSelector.prototype.refreshJsonDataTextField = function () {
  if (!this.jsonDataTextElementId) {
    return;
  }
  $(this.jsonDataTextElementId).val (this.encodeSelectorData (this.selectedListData));
}


sbxNaicsSelector.prototype.encodeSelectorData = function (o) {
  if (typeof (o) == "undefined") {
    return;
  }
  var dataStr = '';
  var seperator = '';
  for (var i in o) {
    elementDataStr = '{"name": "' + o[i].name + '", "code": "' + o[i].code + '", "attr": "' + o[i].attr + '"}';
    dataStr += (seperator + elementDataStr);
    seperator = ',';
  }
  
  if (dataStr != '') {
    dataStr = '[' + dataStr + ']';
  }
  
  return dataStr;
}

