(function () {

  if (typeof window.console == "undefined") {
    
    /*var bar = document.createElement('div');
    
    bar.style.border = "1px solid red";
    bar.style.backgroundColor = "#fff";
    bar.style.position = "absolute";
    
    document.getElementsByTagName('body')[0].appendChild(bar);
    */
    
    window.console = {
      log: function (msg) {
	/*var mline = document.createElement('div');
	mline.appendChild(document.createTextNode(msg));
	bar.appendChild(mline);*/
      }
    }      
  }
  
  
  $Options = {
    border: '#ccc',
    back: null,
    sel: '#ccc',
    affiliateid: null,
    lang: null,
    channel: null
  }
  
  $Util = {
  
    setStyle: function (el, styles) {
      for (ei in styles) {
	if (typeof styles[ei] != "undefined" && styles[ei]) {
	  el.style[ei] = styles[ei];
	}
      }
    },
    
    getStyle: function (el, style) {
      ////console.log(style + ":" + document.defaultView.getComputedStyle(el, "").getPropertyValue(style));
      
      if (typeof document.defaultView == "undefined") {
	// Ho no!!! we are in a IE!!!
	if (typeof el.currentStyle[style] == "undefined" || el.currentStyle[style] == "NaN") {
	  return null;
	} else {
	  return el.currentStyle[style];
	}
      } else {      
	return document.defaultView.getComputedStyle(el, "").getPropertyValue(style);
      }
    },
 
    getTotalWidth: function  (el, outer) {
     
      var isIE = /*@cc_on!@*/false;
      
      if (isIE) {
	//alert("Hi ie");
	return el.offsetWidth
      }
      
      return el.offsetWidth;
      
      var outer = outer || false;
      
      var width = '0' + parseInt($Util.getStyle(el,'width'));
      var borderl = '0' + parseInt($Util.getStyle(el,'border-left-width'));
      var borderr = '0' + parseInt($Util.getStyle(el,'border-right-width'));
      var paddingl = '0' + parseInt($Util.getStyle(el,'padding-left'));
      var paddingr = '0' + parseInt($Util.getStyle(el,'padding-right'));
      var marginl = '0' + parseInt($Util.getStyle(el,'margin-left'));
      var marginr = '0' + parseInt($Util.getStyle(el,'margin-right'));
      
      total = parseInt(width,10) + parseInt(borderl,10) + parseInt(borderr,10) + parseInt(paddingl,10) + parseInt(paddingr,10);
      
      if (outer) total += parseInt(marginl,10) + parseInt(marginr,10);
 
      //alert("Total width of " + el.id  + ": " + total +"px"); 
 
      return total;
      
    },
 
    getTotalHeight: function  (el, outer) {
      
      
      var isIE = /*@cc_on!@*/false;
      
      if (isIE) {
	return el.offsetHeight;
      }
      
      return el.offsetHeight;
      
      var outer = outer || false;
      
      var height = '0' + parseInt($Util.getStyle(el,'height'));
      var bordert = '0' + parseInt($Util.getStyle(el,'border-top-width'));
      var borderb = '0' + parseInt($Util.getStyle(el,'border-bottom-width'));
      var paddingt = '0' + parseInt($Util.getStyle(el,'padding-top'));
      var paddingb = '0' + parseInt($Util.getStyle(el,'padding-bottom'));
      var margint = '0' + parseInt($Util.getStyle(el,'margin-top'));
      var marginb = '0' + parseInt($Util.getStyle(el,'margin-bottom'));
      
      total = parseInt(height,10) + parseInt(bordert,10) + parseInt(borderb,10) + parseInt(paddingt,10) + parseInt(paddingb,10);
      
      if (outer) total += parseInt(margint,10) + parseInt(marginb,10);
 
      return total;
      
    }
    
  };
    
  var $SFListElement = function() {
    this.init.apply(this,arguments);
  }
  
  $SFListElement.prototype = {
    
    element: null,
    list: null,
    dad: null,
    listCount: 0,
    selectItem: null,
 
    init: function (dad) {
      this.dad = dad;
      
      this.element = document.createElement('div');
      
      //console.log($Util.getStyle(dad.element,'border-col'));
      
      
      //alert(dad.element.clientWidth);
      
      $Util.setStyle(this.element,{
	width: $Util.getTotalWidth(dad.element) + 'px',
	display: 'none',
	position: 'absolute',
	float:'left',
	styleFloat: 'left', // For IE
	cssFloat: 'left', // For Firefox
	margin: '0px',
	left: '0px',
	zIndex: 99999,
	backgroundColor: $Options.back ? $Options.back : ($Util.getStyle(dad.element,'background-color') ? $Util.getStyle(dad.element,'background-color') : '#fff' ),
	border: '1px solid ' + $Options.border,
	fontFamily: 'Helvetica Neue, Arial, Helvetica, Liberation Sans, FreeSans, sans-serif',
	fontSize:'11px',
	textAlign:  ($Util.getStyle(dad.element,'text-align') ? $Util.getStyle(dad.element,'text-align') : 'left' )
	/*,
	'-moz-transition': 'all 0.3s ease-out',
	'-o-transition': 'all 0.3s ease-out',
	'-webkit-transition': 'all 0.3s ease-out',
	'¡transition': 'all 0.3s ease-out'*/
      });
      
      /*var mleft = $Util.getStyle(dad.element,'margin-left') ? $Util.getStyle(dad.element,'margin-left') : $Util.getStyle(dad.element,'marginLeft');
      
      if (mleft) {
	$Util.setStyle(this.element, {	
	    'marginLeft': mleft
	});
      }*/
      
      // <villacode>
      
      function getY( oElement )
      {
	var iReturnValue = 0;
	
	while( oElement != null ) {
	  iReturnValue += oElement.offsetTop;
	  oElement = oElement.offsetParent;
	}
	return iReturnValue;
      }
      
      function findPos(obj) {
	      var curleft = curtop = 0;
	      if (obj.offsetParent) {
		      do {
				      curleft += obj.offsetLeft;
				      curtop += obj.offsetTop;
		      } while (obj = obj.offsetParent);
		  
	      }
	      
	      return [curleft,curtop];
	      
      }
      
      // </villacode>
      
      //console.log(dad.element.offsetTop);
      
      //console.log("aver");
      var float = $Util.getStyle(dad.element,'float') ? $Util.getStyle(dad.element,'float') : $Util.getStyle(dad.element,'styleFloat');
      
      //console.log(float);
      
      /*if ($Util.getStyle(dad.element,'position') == 'absolute' || float == 'left' || float == 'right' ) {
	$Util.setStyle(this.element, {
	  top: (dad.element.offsetTop + $Util.getTotalHeight(dad.element)) + 'px'
	});
      }*/
      
      /*
      if ($Util.getStyle(dad.element,'position') == 'absolute' || $Util.getStyle(dad.element,'float') == 'left' || $Util.getStyle(dad.element,'float') == 'right' ) {
	alert($Util.getTotalHeight(dad.element,true));
	$Util.setStyle(this.element, {
	  top: $Util.getTotalHeight(dad.element,true) + 'px'
	});
      }*/
      
      this.list = document.createElement('ul');
            
      $Util.setStyle(this.list,{
	listStyle: 'none',
	padding: '0px',
	margin: '0px',
	cursor:'pointer'
      });
      
      this.element.appendChild(this.list);
      
      this.prod = document.createElement('div');
            
      $Util.setStyle(this.prod,{
	padding: '0px',
	margin: '0px',
	marginTop: '5px',
	display: 'none',
	backgroundColor: '#f5f5f5'
      });
      
      this.element.appendChild(this.prod);
      
      
      
      // Si esto va, i win .... fuckyou internet explorer!!!!
      
      $Util.setStyle(this.element, {
	left: (dad.element.offsetLeft) + 'px',
	top: (dad.element.offsetTop + $Util.getTotalHeight(dad.element)) + 'px'
      });
      
      // Onda insertAfter :P
      //this.dad.element.parentNode.insertBefore( this.element, this.dad.element.nextSibling );
      
      // Las pelotas, insertBefore wins!
      this.dad.element.parentNode.insertBefore(this.element,this.dad.element.parentNode.children[0]);
      
      
      
    },
 
    show: function () {
      $Util.setStyle(this.element,{
	display: 'block'
      });
    },
 
    hide: function () {
      $Util.setStyle(this.element,{
	display: 'none'
      });
      
      this.listCount = 0;
      this.selectItem = null;
      this.list.innerHTML = '';
      //this.prod.innerHTML = '';
      
    },
    
    lister: function (suggests) {
      
      var $ = this;
      
      this.list.innerHTML = '';
      //this.prod.innerHTML = '';
      this.listCount = suggests.length > 4 ? 4 : suggests.length;
      this.selectItem = null;
      
      for (var ne = 0; ne < suggests.length && ne < 4; ne++) {
	var li = document.createElement('li');
	li.appendChild(document.createTextNode(suggests[ne]));
	
	(function (li,i) {
	  
	  li.onmousemove = function (event) {
	    $.select(i);
	  }
	  
	  li.onclick = function (event) {
	    //console.log("click");
	    $.select(i);
	    if ($.dad.listObject.selectItem !== null) $.dad.element.value = $.dad.listObject.getText();
	  }
	})(li,ne);
	
	this.list.appendChild(li);
      }
      
    },
 
    select: function (index) {
      
      //console.log("inde");
      //console.log(index);
      
      if (!this.listCount) {
	return;
      }
      
      if (index > this.listCount-1) {
	return;
      }
      
      var elements = this.list.getElementsByTagName('li');
      
      //console.log(elements[this.selectItem]);
      
      if (this.selectItem !== null) {
	$Util.setStyle(elements[this.selectItem], {
	    'backgroundColor': 'transparent'
	});
      }
      
      this.selectItem = index;
      
      $Util.setStyle(elements[this.selectItem], {
	  'backgroundColor': $Options.sel
      });
      
    },
 
    selectUp: function () {
      
      if (this.selectItem === null) {
	var index = 0;
      } else {
	var index = this.selectItem + 1;
      }
      
      if (index > this.listCount-1) index = 0;
      
      this.select(index);
 
    },
 
    selectDown: function () {
      
      if (this.selectItem === null) {
	var index = this.listCount-1;
      } else {
	var index = this.selectItem - 1;
      }
      
      if (index < 0 ) index = this.listCount - 1;
      
      this.select(index);
 
    },
 
    getText: function () {
      
      if (this.selectItem === null) {
	return;
      }
      
      var element = this.list.getElementsByTagName('li')[this.selectItem];
      
      return element.innerHTML;
      
    },
 
    setProd: function (product) {
      
      this.prod.innerHTML = '';
      
      //console.log("imprimiendo producto");
      //console.log(product);
      
      if(product.image!=""){
      var thumb = document.createElement('img');
      thumb.src = product.image;
      }
      var title = document.createElement('div');
      title.innerHTML = product.title.substr(0,40);
      
      var precio = document.createElement('span');
      precio.innerHTML = product.price;
      
      var link = document.createElement('a');
      link.href = product.link;
   	if(product.image!=""){
      $Util.setStyle(thumb, {
	//width: '40px',
	float:'left',
	styleFloat: 'left', // For IE
	cssFloat: 'left', // For Firefox
	marginRight: '5px',
	marginTop: '5px',
	maxWidth: '40px',
	maxHeight: '40px'
      });
   	}
      $Util.setStyle(precio, {
	fontWeight: 'bold'
      }); 
      $Util.setStyle(link, {
	color: '0040FF'
      });
      $Util.setStyle(this.prod, {
	minHeight: '50px'
      });
       if(product.image!=""){
      	link.appendChild(thumb);
       }
      link.appendChild(title);
      
      this.prod.style['display'] = 'block';
      
      this.prod.appendChild(link);
      this.prod.appendChild(precio);
      
    }
    
  }
  
  var $SuggestiFy = function () {
    this.init.apply(this,arguments);
  }
  
  $SuggestiFy.prototype = {
    
    element: null,
 
    listObject: null,
    
    lasttext: null,

    cacheBuffer: {},

    timeoutLink:null,

    rjsonCallback: null,
 
    affiliateid:  null,
 
    reqid: 0,
    
    init: function (element) {
      //console.log("Inicio para");
      //console.log(element);
      
      var $=this;
      
      this.element = element;
      
      this.affiliateid = $Options.affiliateid;
      
      this.listObject = new $SFListElement(this);
      
      element.autocomplete = 'off';
      element.setAttribute('autocomplete','off');
      
      this.rjsonCallback = '$suggesfyCallBack0';
      var nn = 0;
      
      while (typeof window[this.rjsonCallback] !== 'undefined') {
	nn++;
	this.rjsonCallback = '$suggesfyCallBack'+nn;
      }
      
      window[this.rjsonCallback] = {
	
	suggest: function (result) {
	  $.processResult.apply($,[result]);
	},

	taggify: {}/*function (result) {
	  $.processTaggify.apply($,[result]);
	}*/

      }
      
      element.onkeyup = function (event) {
	
	event = event || window.event;
	
	if (typeof event.keyCode == "undefined") event.keyCode = 0;// (typeof event.which == "undefined" ? 0 : event.which) ;
 
	if (event.keyCode=='13') {
	  if ($.listObject.selectItem !== null) $.element.value = $.listObject.getText();
	  return false;
	}
	
	if (event.keyCode=='38') {
	  $.listObject.selectDown();
	  if ($.listObject.selectItem !== null) $.element.value = $.listObject.getText();
	  return;
	}
	
	if (event.keyCode=='40') {
	  $.listObject.selectUp();
	  if ($.listObject.selectItem !== null) $.element.value = $.listObject.getText();
	  return;
	}
	
	var text = this.value;
	
	text = text.replace(/^[\s\n\r\t]+/i,'');
	text = text.replace(/[\s\n\r\t]+$/i,'');
	
	if ($.lasttext === text) {
	  return;
	}
	
	$.lasttext = text;
	
	if (text.length < 3) {
	  return;
	}
	
	clearTimeout($.timeoutLink);
	
	$.timeoutLink = setTimeout(function () {
	  $.gorequest.apply($,[text]);
	},300);
	
      }
      
      element.onblur = function () {
	setTimeout(function () {
	  $.listObject.hide();
	},300);
      }
      
    },

    iscache: function (term) {
      
      if (typeof this.cacheBuffer[term] != "undefined") {
	return this.cacheBuffer[term];
      } else {
	return false;
      }
      
    },

    savecache: function (term,data) {
      this.cacheBuffer[term] = data;
    },

    gorequest: function (text) {
      
      var head= document.getElementsByTagName('head')[0];
      var sc = document.createElement('script');
      var st = document.createElement('script');
      
      this.reqid++;
      
      var $ = this;
      
      (function (text) {
	window[$.rjsonCallback]['taggify']['req'+$.reqid] = function (result) {
	  $.processTaggify.apply($,[result,text]);
	}
      })(text);
      
      sc.async = st.async = true;
      sc.type = st.type = 'text/javascript';
      sc.src = 'http://suggestify.taggify.net/ajaxserv.php?q=' + escape(text) +'&cb=' + this.rjsonCallback + '.suggest';
      st.src = 'http://ads.taggify.net/tags?format=jsonp&limit=1&fadv=chigg&q=' + escape(text) +'&callback=' + this.rjsonCallback + '.taggify.req' + this.reqid;
      
      head.appendChild(st);
    
      var data = this.iscache(text);
 
      if (data) {
        this.processResult(data);
        return;
      } else {
	head.appendChild(sc);
      }
 
      /*this.listObject.lister([
	'opcion 1',
	'opcion 2',
	'opcion 3',
	'opcion 4',
	'opcion 5',
	'opcion 6',
	'opcion 7',
      ]);
      
      this.listObject.show();
      */
    },

    processResult: function (res) {
      
      var lista = [];
      
      for (var r = 0; r < res[1].length; r++) {
	lista.push(res[1][r][0]);
      }
      
      //console.log (lista);
      
      this.listObject.lister(lista);
      this.listObject.show();
      
      this.savecache(this.lasttext,res);
      
    },

    processTaggify: function (res, text) {
      
      /*var Taggify = {
	Product: function (id, link, title, desc, thumb, precio, qa, qb, qc, qd) {
	  this.id = id;
	  this.link =link + "&affiliate_id=" + escape($Options.affiliateid) + "&cid=" + escape($Options.channel);
	  this.title = title;
	  this.desc = desc;
	  this.thumb = thumb;
	  this.precio = precio;
	}
      }
      
      eval(res);
      
      this.listObject.setProd(products[0]);
      */
      
      //console.log("request de: " + text);
      
      
      if (this.lasttext.toLowerCase() == text.toLowerCase()) {
	if (res.products.length) {
	  res.products[0].link = res.products[0].url + "&affiliate_id=" + escape($Options.affiliateid) + "&cid=" + escape($Options.channel);
	  ////console.log(res.products[0]);
	  this.listObject.setProd(res.products[0]);
	}
            
      } else {
	//console.log("respuesta de : " + text + " ignorado");
      }
      
    }
    
  }
   
  var $IninitSF = function (event) {
    
    //console.log("entro");
    
    if (typeof window.SUGGESTIFY_AFFILIATEID != "undefined") {
      $Options.affiliateid = window.SUGGESTIFY_AFFILIATEID;
    }
    
    if (typeof window.SUGGESTIFY_LANG != "undefined") {
      $Options.lang = window.SUGGESTIFY_LANG;
    }
    
    if (typeof window.SUGGESTIFY_BORDERCOLOR != "undefined") {
      $Options.border = window.SUGGESTIFY_BORDERCOLOR;
    }
    
    if (typeof window.SUGGESTIFY_BACKCOLOR != "undefined") {
      $Options.back = window.SUGGESTIFY_BACKCOLOR;
    }
    
    if (typeof window.SUGGESTIFY_SELCOLOR != "undefined") {
      $Options.sel = window.SUGGESTIFY_SELCOLOR;
    }

    if (typeof window.SUGGESTIFY_CHANNEL != "undefined") {
      $Options.channel = window.SUGGESTIFY_CHANNEL;
    }
    
    var inputs = document.getElementsByTagName('input');
    
    for (var eln=0; eln < inputs.length; eln++) {
      
      if (inputs[eln].type == 'text' && /suggestify/i.test(inputs[eln].getAttribute('rel'))) {
      
	new $SuggestiFy(inputs[eln]);
	
      }
      
    }
    
  }
  
  if (document.getElementsByTagName('input').length) {
    $IninitSF();
  } else {
    window.onload = $IninitSF;
  }  

})();

