/**
 * LocateRetailer
 *
 * @author     Takashi Mizohata <takashi@firstbornmultimedia.com>
 * @copyright  2008 firstborn
 * @license    firstborn internal (pending)
 * @TODO       style keep changing because that was how I found the way to 
 *             make things better. but some point in the future, I should
 *             keep everything integrated into one.
 */


// CONSTRUCTOR ____________________________________________________________
var LocateRetailer = function (dict)
{
  //console.log('LocateRetailer::constructor');

  this.currentSelection = null;
  this.blocks           = [];
  this.form             = null;
  this.selector         = null;
  this.submitButton     = null;
  
  var jq_slct = $('#pageBody form.webservice select');
  if (jq_slct.length < 1)
  {
    return;
  }

  var self = this;
  this.selector = jq_slct.get(0);
  this.form = this.selector.form;
  var jq_dts = $('#pageBody dt.method');
  jq_dts.each(
    function (i, n)
    {
      self.blocks[self.blocks.length] = $(n).next().get(0);
    }
  );

  this.onchange();

  dict.set(this.selector, this);
  $(this.selector).bind('change', {'type': 'ONCHANGE'}, LocateRetailer.dispatch);

  this.submitButton = $('#pageBody form.webservice input[type="image"]').get(0);
  dict.set(this.submitButton, this);
  $(this.submitButton).bind('click', {'type': 'ONCLICKSUBMIT'}, LocateRetailer.dispatch);

  this.submitButton.onclick = function (ev){return false;};
}


// STATIC PROPERTY ________________________________________________________


// INSTANCE METHOD ________________________________________________________

LocateRetailer.prototype.getCurrentSelection = function ()
{
  return this.selector.options[this.selector.selectedIndex].value;
}


LocateRetailer.prototype.onsubmit = function (ev)
{
  //console.log('LocateRetailer::onsubmit');
  // getting rid of some inputs that are not used.
  var tbd = [];
  for (var i = 0; i < this.blocks.length; ++i)
  {
    var elm_dd = this.blocks[i];
    var key = elm_dd.getAttribute('title');
    if (key != this.currentSelection)
    {
      tbd[tbd.length] = elm_dd;
    }
  }
  for (var j = 0; j < tbd.length; ++j)
  {
    tbd[j].parentNode.removeChild(tbd[j]);
  }

  // adding up some value for select in order for Ektron side's usage of handling
  var checks = $('input[type="checkbox"]', this.form);
  var c;
  for (var k = 0; k < checks.length; ++k)
  {
    c = checks.get(k);
    if (!c.checked)
    {
      var elm_in = document.createElement('input');
      elm_in.type = 'hidden';
      elm_in.name = c.name;
      elm_in.value = '0';
      this.form.appendChild(elm_in);
    }
  }

  this.form.submit();
}


LocateRetailer.prototype.onchange = function (ev)
{
  //console.log('LocateRetailer::onchange');
  this.currentSelection = this.getCurrentSelection();
  var searchTip = document.getElementById("searchTip");
  
  switch(this.currentSelection)
  {     case "europe":
            window.open("http://www.pingeurope.com/retailerlocator/", "Locator"); // launch European locator in new window
            searchTip.style.display = "none"; // hide the searchTip
            break;
        case "australia":
            searchTip.style.display = "none"; // hide the searchTip
            break;
        default:
            searchTip.style.display = "block"; // show the searchTip
            break;
  }

  for (var i = 0; i < this.blocks.length; ++i)
  {
    var elm_dd = this.blocks[i];
    var key = elm_dd.getAttribute('title');
    if (key == this.currentSelection)
    {
      elm_dd.style.display = 'block';
    }
    else
    {
      elm_dd.style.display = 'none';
    }
  }
}


// STATIC METHOD __________________________________________________________


// DISPATCH EVENT _________________________________________________________

LocateRetailer.dispatch = function (ev)
{
  //console.log('LocateRetailer::dispatch() ' + ev.data.type);

  switch (ev.data.type)
  {
    case 'ONCHANGE':
      LocateRetailer.dispatchOnChange(ev);
    break;

    case 'ONCLICKSUBMIT':
      LocateRetailer.dispatchOnSubmit(ev);
    break;

    default:
      throw new Error('event type not defined.');
    break;
  }
}


// EACH_EVENT _____________________________________________________________

LocateRetailer.dispatchOnSubmit = function (ev)
{
  //console.log('LocateRetailer::dispatchOnSubmit: ' + ev.target.tagName);

  var obj = Controller.getInstance().dictionary.get(ev.target);
  obj.onsubmit(ev);
}


LocateRetailer.dispatchOnChange = function (ev)
{
  //console.log('LocateRetailer::dispatchOnChange: ' + ev.target.tagName);

  var obj = Controller.getInstance().dictionary.get(ev.target);
  obj.onchange(ev);
}


