
var LocSelector = function (elm)
{
  this.element = elm;
  this.layer   = null;
  this.form    = null;
  this.input   = null;
}


// STATIC PROPERTY ________________________________________________________

LocSelector.minHeight = 120;
LocSelector.inputName = 'langType';
LocSelector.method = 'GET';
LocSelector.langlist = [];

// INSTANCE METHOD ________________________________________________________

LocSelector.prototype.show = function (ev)
{
  var self = this;
  $(window).bind('resize', function (ev)
  {
    self.hide();
  });
  if (this.layer === null)
  {
    var f = this.element;
    var coord = this.locateElement(ev); // gets coordinates and dimensions of DOM element that selector is being attached to
    var obj = LocSelector.generateSelector(coord.x, coord.y, coord.w, coord.h); // creates a form so you can invoke an action
    this.form  = obj.form;
    this.layer = obj.div;
    this.input = obj.input;
    document.body.appendChild(this.form); // add the form to the DOM
	
	// edo 10-14-2009: de-coupled list of languages to allow re-use in global landing.
	// can now attach languages to a hidden <div> and invoke same methods
	this.addMenuItems(this.layer);
	//this.layer.appendChild( this.generateUserList(LocSelector.langlist) );
  }
  else
  {
    var coord = this.locateElement(ev);
    //console.log(coord);
    LocSelector.setPosition(this.layer, coord);
    $(this.layer).fadeIn(90);
  }

  window.setTimeout(
    function (ev)
    {
      $(document.body).bind('click', {'type': 'BODY_CLICK'}, LocSelector.dispatch);
    },
    0
  );
}



LocSelector.prototype.addMenuItems = function (elem)
{	elem.appendChild( this.generateUserList(LocSelector.langlist) );
}


LocSelector.setPosition = function (elm, coord)
{
  elm.style.left = coord.x + 'px';
}


LocSelector.prototype.locateElement = function (ev)
{
  var w = this.element.offsetWidth;
  var h = this.element.offsetHeight;
  var x = this.element.offsetLeft;
  var y = this.element.offsetTop;

  var jq_pare = $(this.element).parents();
  var node;
  var str_classname;
  outer:for (var i = 0; i < jq_pare.length; ++i)
  {
    node = jq_pare.get(i);
    str_classname = node.getAttribute('class') || node.getAttribute('className');

    switch (str_classname)
    {
      case 'wrap':
      break;

      case 'item':
      case 'item first':
      break outer;

      case 'promos':
        x += node.offsetLeft;
        y += node.offsetTop;
      break outer;

      default:
        x += node.offsetLeft;
        y += node.offsetTop;
      break;
    }
    if ((x > ev.pageX) || (y > ev.pageY))
    {
      throw new Error('Weird');
    }
  }
  return {'x': x, 'y': y, 'w': w, 'h': h};
}



LocSelector.prototype.hide = function (ev)
{
  if (this.layer !== null)
  {
    $(this.layer).fadeOut(
      50, 
      function ()
      {
        $(document.body).unbind('click');
        $(window).unbind('resize');
      }
    );
  }
}


LocSelector.generateAction = function (path, query)
{
  var result = path;
  if (query == '')
  {
    result += '?';
  }
  else
  {
    if (query.indexOf(LocSelector.inputName) == -1)
    {
      result += query + '&';
    }
    else
    {
      var q = '';
      if (query.indexOf('?') == 0)
      {
        q = query.substring(1);
      }
      else
      {
        q = query;
      }
      var arr = q.split('&');
      var res = [];
      for (var i = 0; i < arr.length; ++i)
      {
        if (arr[i].indexOf(LocSelector.inputName) == -1)
        {
          res[res.length] = arr[i];
        }
      }
      if (res.length > 0)
      {
        result += '?' + res.join('&') + '&';
      }
      else
      {
        result += '?';
      }
    }
  }
  return result;
}

// STATIC METHOD __________________________________________________________

LocSelector.generateSelector = function (x, y, w, h)
{

  var elm_form = document.createElement('form');
  elm_form.className = 'LocSelector';
  elm_form.method = LocSelector.method;
  elm_form.name = 'language_selector';
  elm_form.action = LocSelector.generateAction(window.location.pathname, window.location.search);

  var elm_input = document.createElement('input');
  elm_input.setAttribute('type', 'hidden');
  elm_input.name = LocSelector.inputName;
  elm_input.value = '';
  elm_form.appendChild(elm_input);

  var div = document.createElement('div');
  div.className = 'locSelector';
  div.style.position = 'absolute';

  var top = (y + h + 3);
  var height;
  if ((top + LocSelector.minHeight) > document.body.scrollHeight)
  {
    height = document.body.scrollHeight - top - 15;
  }
  else
  {
    height = LocSelector.minHeight;
  }

  div.style.left = x + 'px';
  div.style.top = top + 'px';
  div.style.width = w + 'px';
  // FIX HERE IN FUTURE
  //div.style.height = height + 'px';
  div.style.height = 'auto';
  elm_form.appendChild(div);

  return {'form' : elm_form, 'div' : div, 'input' : elm_input};
}


LocSelector.prototype.generateUserList = function (arr)
{
  //console.log('LocSelector::generateUserList');
  var len = arr.length;
  var ul = document.createElement('ul');
  var last = false;
  for (var i = 0; i < len; ++i)
  {
    if (i == (len - 1))
    {
      last = true;
    }
    ul.appendChild(this.generateListItem( arr[i], last ));
  }
  return ul;
}


LocSelector.prototype.generateListItem = function (obj, last)
{
	// this gets called multiple times to add each language to the menu
	//console.log('LocSelector::generateListItem');
	//console.log(obj);
	var self = this;
	var targetPage;
	var li = document.createElement('li');
	var a = document.createElement('a');
	var span = a.appendChild(document.createElement('span'));
	
	a.href = obj.link;
	li.appendChild(a);

	if (!obj.selected)
	{
		a.onclick = function (ev)
		{   //console.log(ev);
			this.href = LocSelector.getLanguageURL(self.form.action, obj.link);
			return true;
		}
	}
	else
	{	a.onclick = function (ev)
		{	return false;
		}
	}
	
	span.innerHTML = obj.title; // writes the country name in the <span> tag
	//span.appendChild(document.createTextNode(obj.title));
	li.appendChild(a);
	if (last)
	{	li.className = 'last';
	}
	
	return li; // looks something like: <li [class="last"]><a href="1041"><span>Japan</span></a></li>
}


LocSelector.getLanguageURL = function (url, selectedLangCode)
{	
	var langArray = LocSelector.langlist;
	var targetPage = url;
	var langCode = selectedLangCode;
	Controller.cookie.create('selectedLanguage', selectedLangCode, 365);
	
	for(var i=0; i<langArray.length; i++)
	{	if(selectedLangCode == langArray[i].link)
		{	if(langArray[i].redirect != "")
			{	console.log("in LocSelector.getLanguageURL(): selected language=" + langArray[i].link + ", redirect language=" + langArray[i].redirect);
				langCode = langArray[i].redirect;
			}
			break;
		}
	}
	
	//alert("selected language: " + selectedLangCode + "\nredirecting to: " + langCode);
	
	var timeStamp = new Date().getTime(); // added timestamp to defeat caching of "selectedLanguage" cookie
	targetPage = "/default.aspx?langType=" + langCode + "&ts=" + timeStamp; // redirect to home page since target page may not exist in selected language
	return(targetPage);
}


LocSelector.welcomePageClickHandler = function (url, langCode)
{	window.location.href = LocSelector.getLanguageURL(url, langCode);
}

LocSelector.showLangList = function()
{	var result = "\n\n";
	var arr = LocSelector.langlist;
	for(var i=0; i<arr.length; i++)
	{	var row = arr[i];
		for(obj in row)
		{	result += obj + ":" + row[obj] + ", ";
		}
		result = result.substring(0, result.length -1) + "\n"; // chop off last comma, add line feed
	}
	return result;
}

	
// DISPATCH EVENT _________________________________________________________

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

  switch (ev.data.type)
  {
    case 'BODY_CLICK':
     	LocSelector.dispatchBodyClick(ev);
        break;

    case 'CLICK':
      	LocSelector.dispatchClick(ev);
        break;

    default:
        break;
  }
}

// HEADER_CLICK _____________________________________________________________

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

  var target;
  var cls = ev.target.getAttribute('class') || ev.target.getAttribute('className');
  if (cls == 'selector')
  {
    target = ev.target;
  }
  else
  {
    target = $('.selector', $(ev.target).parents()).get(0);
  }

  //console.log(target);
  var locselect = (Controller.getInstance()).dictionary.get(target);
  locselect.show(ev);
}


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

  var groups = Controller.getInstance().dictionary.get(document.body);
  for (var i = 0; i < groups.length; ++i)
  {
    console.log(groups[i]);
    groups[i].hide();
  }

}

