/*
 * jQuery Keyboard Navigation Plugin - Current
 *   http://www.amountaintop.com/projects/keynav/
 *
 * To use, download this file to your server, save as keynav.js,
 * and add this HTML into the <head>...</head> of your web page:
 *   <script type="text/javascript" src="keynav.js"></script>
 *
 * Copyright (c) 2006 Mike Hostetler <http://www.amountaintop.com/>
 * Licensed under the MIT License:
 *   http://www.opensource.org/licenses/mit-license.php
 */

function prepareArray(jsondata){

  var new_arr = [];
  for(var i=0;i<jsondata.item.length;i++){

    if(jsondata.item[i].title != undefined && jsondata.item[i].description != undefined && jsondata.item[i].link != undefined){
      var  tempdata = new Object();
      tempdata.title = jsondata.item[i].title+"";
      tempdata.link = jsondata.item[i].link+"";
      tempdata.subcat = jsondata.item[i].subcat+"";
      tempdata.description = jsondata.item[i].description+"";
      tempdata.parentcat = jsondata.parentcat+"";

      new_arr.push(tempdata);
    }
  }

  return new_arr;
}

  $.createkeynav = new Object();
  $.fn.createkeynav = function(cat,onClass,offClass){
      var kc = $.createkeynav;

      if(!kc.init){
		kc.init = true;
      }
	if($.keynav){
		$.keynav.removeChild(onClass,offClass);
		$.keynav.reset();
	}
      $.createkeynav.initial(this,cat,onClass,offClass);
      return 
   }
  $.createkeynav.initial = function(e,cat,onClass,offClass){

	$.getJSON("json_test.php5",{cat:cat},function(data){

		$.createkeynav.createList(e,prepareArray(data.channel),onClass,offClass);
	});

  }
  
  
 
  $.keynav = new Object();

  $.fn.keynav = function (parent,onClass,offClass) {
	  //Initialization
	$.keynav.parent = parent;
	$.keynav.parent_attr = $(parent).get(0);


	  var kn = $.keynav;
	  if(!kn.init) {
		  kn.el = new Array();
		  
		  $(document).keydown(function(e) {

			var key = e.charCode ? e.charCode : e.keyCode ? e.keyCode : 0;
			switch(e.which) {
				case 37:
				case 27: 
				  $.keynav.goLeft();
				  break;
				case 38: 
				  $.keynav.goUp();
				$.keynav.adjustScroll();
				  break;
				case 13:
				case 39: 
				  $.keynav.goRight();
				  break;
				case 40: 
				  $.keynav.goDown();
				$.keynav.adjustScroll();
				  break;
				case 13: 
				  $.keynav.activate();
				  break;
			}
return false;
		  });

		  kn.init = true;
	  }

	  return this.each(function() {
		$.keynav.reg(this,onClass,offClass);

	  });
  }

$.createkeynav.createList = function(e,arr,onClass,offClass){




	for (var i=0;i<arr.length;i++){
          var suggestions_menu = $('<div class="keynav_box"></div>').get(0);
	  var title  = $('<div class="item-title">'+arr[i].title+'</div>').get(0);
	  var description = $('<div class="item-description">'+arr[i].description+'</div>').get(0);
          suggestions_menu.subcat = arr[i].subcat;
          suggestions_menu.parentcat = arr[i].parentcat;
          suggestions_menu.link = arr[i].link;
	  $(suggestions_menu).append(title);
	  $(suggestions_menu).append(description);


	$(e).append(suggestions_menu);

	}


	$('.'+ offClass).keynav(e,onClass,offClass);

	var first = $('.'+ offClass+':first');

	first.removeClass().addClass(onClass);

	//Change the currentelement to first element
	$.keynav.currentEl = $.keynav.el[0];


  }

  $.fn.keynav_sethover = function(onClass,offClass) {
	  return this.each(function() {
		this.onClass = onClass;
		this.offClass = offClass;
	  });
  }

  $.keynav.reset = function() {
	  var kn = $.keynav;
	  kn.el = new Array();
  }
  
   $.keynav.reg = function(e,onClass,offClass) {
	  var kn = $.keynav;
	  e.pos = $.keynav.getPos(e);
	  e.onClass = onClass;
	  e.offClass = offClass;
	  e.onmouseover = function (e) { $.keynav.setActive(this); };
	  e.onclick = function(e) { $.keynav.goRight(); };
	  kn.el.push(e);
  }
  
  $.keynav.removeChild = function(onClass,offClass){
	$('.'+offClass).remove();
	$('.'+onClass).remove();
  }

  $.keynav.setActive = function(e) {
	  var kn = $.keynav;
	  var cur = $.keynav.getCurrent();
	  $(cur).trigger('blur');
	  for(var i=0;i<kn.el.length;i++) {
		var tmp = kn.el[i];
		$(tmp).removeClass().addClass(tmp.offClass);
	  }
	  $(e).removeClass().addClass(e.onClass);	
	  $(e).trigger('focus');
	  kn.currentEl = e;
  }
  $.keynav.getCurrent = function () {
	  var kn = $.keynav;
	  if(kn.currentEl) {
		  var cur = kn.currentEl;
	  }
	  else {
		  var cur = kn.el[0];
	  }
	  return cur;
  }
  $.keynav.adjustScroll = function(){

	var el = $.keynav.getCurrent();
      var viewportHeight = $('body').get(0).clientHeight;        
      var wholeHeight = $.keynav.parent_attr.scrollHeight;
      var scrolled = $('body').get(0).scrollTop;
      var elTop = el.offsetTop;

      var elBottom = elTop + el.offsetHeight;

      if(elBottom > scrolled + viewportHeight){
	$('body').get(0).scrollTop = elBottom - viewportHeight;
      }
      else if(elTop < scrolled){
        $('body').get(0).scrollTop = elTop;
      }
      return true; 
    }
  $.keynav.quad = function(cur,fQuad) {
	  var kn = $.keynav;
	  var quad = Array();
	  for(i=0;i<kn.el.length;i++) {
		var el = kn.el[i];
		if(cur == el) continue;
		if(fQuad((cur.pos.cx - el.pos.cx),(cur.pos.cy - el.pos.cy)))
		  quad.push(el);
	  }
	  return quad;
  }
  $.keynav.activateClosest = function(cur,quad) {
	  var closest;
	  var od = 1000000;
	  var nd = 0;
	  var found = false;
	  for(i=0;i<quad.length;i++) {
		var e = quad[i];
		nd = Math.sqrt(Math.pow(cur.pos.cx-e.pos.cx,2)+Math.pow(cur.pos.cy-e.pos.cy,2));
		if(nd < od) {
			closest = e;
			od = nd;
			found = true;
		}
	  }
	  if(found)
		$.keynav.setActive(closest);
  }
  $.keynav.goLeft = function () {
	  var cur = $.keynav.getCurrent();
	if(cur.parentcat){
		$.keynav.parent.createkeynav(cur.parentcat,'keynav_focusbox','keynav_box');
	}
	 
  }
  $.keynav.goRight = function () {

	  var cur = $.keynav.getCurrent();

	if(cur.subcat != "undefined"){

		$.keynav.parent.createkeynav(cur.subcat,'keynav_focusbox','keynav_box');
 	}else if(cur.link){
		window.location= cur.link;
	}
	 
  }

  $.keynav.goUp = function () {

	  var cur = $.keynav.getCurrent();
	  var quad = $.keynav.quad(cur,function (dx,dy) { 
										if((dx >= 0) && (Math.abs(dy) - dx) <= 0)
											return true;	
										else
											return false;
								   });
	  $.keynav.activateClosest(cur,quad);
  }

  $.keynav.goDown = function () {
	  var cur = $.keynav.getCurrent();
	  var quad = $.keynav.quad(cur,function (dx,dy) { 
										if((dx <= 0) && (Math.abs(dy) + dx) <= 0)
											return true;	
										else
											return false;
								   });
	  $.keynav.activateClosest(cur,quad);
	return false;
  }

  $.keynav.activate = function () {
	  var kn = $.keynav;
	  $(kn.currentEl).trigger('click');
  }

  /**
   * This function was taken from Stefan's exellent interface plugin
   * http://www.eyecon.ro/interface/
   * 
   * I included it in this library's namespace because the functions aren't
   * quite the same.
   */
  $.keynav.getPos = function (e)
  {
    var l = 0;
    var t  = 0;
    var w = $.intval($.css(e,'width'));
    var h = $.intval($.css(e,'height'));
    while (e.offsetParent){
        l += e.offsetLeft + (e.currentStyle?$.intval(e.currentStyle.borderLeftWidth):0);
        t += e.offsetTop  + (e.currentStyle?$.intval(e.currentStyle.borderTopWidth):0);
        e = e.offsetParent;
    }
    l += e.offsetLeft + (e.currentStyle?$.intval(e.currentStyle.borderLeftWidth):0);
    t += e.offsetTop  + (e.currentStyle?$.intval(e.currentStyle.borderTopWidth):0);
	var cx = Math.round(t+(h/2));
	var cy = Math.round(l+(w/2));
    return {x:l, y:t, w:w, h:h, cx:cx, cy:cy};
  };

  /**
   * This function was taken from Stefan's exellent interface plugin
   * http://www.eyecon.ro/interface/
   */
  $.intval = function (v)
  {
    v = parseInt(v);
    return isNaN(v) ? 0 : v;
  };


