// Custom Functions for Emphasis Search
// Dependencies : js/emphasis_common.js, js/yui/*

// Start Logging
YAHOO.widget.Logger.enableBrowserConsole()

var Emp = YAHOO.namespace('YAHOO.Emphasis');


Emp.init = function() {
	
	// Apply Dynamic Styles & Behaviors
	// Emp.Logger.init(); // Fire Up the Logger for IE
	Emp.Tooltips.init(); // Attach custom tooltips to items with long titles
	Emp.AddRelevanceInfo.init(); // Add tooltips to relevance image if it exists.
	Emp.Steps.init(); // Highlight Steps... used in physician signup wizard.
	Emp.Tabs.init(); // Highlight Tabs... shown to physicians and dept admins.
	Emp.DiseaseSuggest.init(); // Attach XHR Autocomplete to search fields. 
	Emp.Labels.init(); // Display default label to search fields
	Emp.Collapser.init(); // 
	Emp.Cloakmail.init(); // Simple cloaking of email.
	Emp.Tabitha.init();
}

Emp.AddRelevanceInfo = {
	// Adds a tooltip to all instances of the relevance image in search results.
	init : function () {
 		var elems = DOM.getElementsByClassName("rtxt",'DIV');
		for(var i in elems) {
			DOM.addClass(elems[i],"emp_tooltip");
			elems[i].title = "<b>Relevance</b> is calculated through an algorithm that associates the physicians specialty, sub-specialties and clinical interests with the searched term.";
		}
	}
}

Emp.Tabitha = function() {

	var initTabitha = function(elem) {
		// Working on a Tabitha Block
		var sections = DOM.getElementsByClassName('section', 'div', elem);
		var default_block = -1;
		var tab_output = "";
		var hdr;

		// Set Tabs
		for(var i=0; i < sections.length; i++) {
			sections[i].id = "tabsection_" + i;
			if(sections[i].getAttribute('default_block')) {
				default_block = i;
			} else{
				sections[i].style.display = "none";
			}
			hdr = DOM.getElementsByClassName('section_title', 'div', sections[i])[0];	
			// body = DOM.getElementsByClassName('section_body', 'div', sections[i])[0];	
			tab_output += '<li class="tablink';
			if(default_block == i) 
				tab_output += ' active';
			tab_output +='" id="tablink_' + i + '"><a href="#" onclick="return false;">' + hdr.innerHTML + '</a></li>';
			hdr.style.display = "none";

		}
		
		// Handle exception where we hid everything!
		if(default_block == -1) { 
			sections[0].style.display = "block";
			default_block = 0;
		}
	
		var tabs = document.createElement('ul');
		tabs.className = "tablinks";
		tabs.innerHTML = tab_output;
		var first_child = DOM.getFirstChild(elem);
		elem.insertBefore(tabs,first_child);

		// Add Event Handlers
		EVENT.addListener(DOM.getElementsByClassName('tablink','li',elem),'click',showSection);
	}
	
	var showSection = function(e) {
		var elem = EVENT.getTarget(e);
		while(elem.tagName != 'LI') {
			elem = elem.parentNode;
		}
		
		var scope = elem;
		while(scope.className.indexOf('tabitha') == -1) {
			scope = scope.parentNode;
		}
		
		var node_id = elem.id.substr(8);
		var tablinks = DOM.getElementsByClassName('tablink','LI',scope);
		DOM.removeClass(tablinks, 'active')
		DOM.addClass(elem, 'active');
		
		var sections = DOM.getElementsByClassName('section','div',scope);
		for(var i in sections) {
			sections[i].style.display = "none";
		}
		DOM.get('tabsection_' + node_id).style.display = "block";
	
	}

	return {
		init:function() {
			var tab_blocks = DOM.getElementsByClassName('tabitha', 'div');
			for(var i in tab_blocks) {
				initTabitha(tab_blocks[i]);
			}
		}
	}
}();



Emp.Cloakmail = function() {
	// This is a simple script to help cloak emails from spam harvesting bots etc. 
	// It's not too hard to crack, but relies on obscurity.
	// Use the format <span class="cloakmail" user="pr" domain="emphasissearch.com" content="pr#emphasissearch.com<br>"></span> 
	
	var init = function(elem) {
		var user = elem.getAttribute('user');
		var domain = elem.getAttribute('domain') ? elem.getAttribute('domain') : 'emphasissearch.com';
		var addl = elem.getAttribute('addl'); 
		var content = elem.getAttribute('content');
		content = content.replace('#', '@');
		
		var href="mailto:" + user + "@" + domain;
		if(addl) href += "?" + addl; 
		
		elem.href = href;
		elem.innerHTML = "<a href=" + href + ">" + content + "</a>"; 
	}
	
	return {
		init:function() {
			var elems=DOM.getElementsByClassName('cloakmail');
			for(var i in elems) {
				init(elems[i]);
			}			
		}
	}
}();

Emp.Collapser = function()  {
	
	// Collapser function collapses long lists.
	// attribute 'default_collapse'  (collapsed|open) (will start the view out as collapsed)
	// attribute 'engage_on' (int) - specifies the number of list items beyond which the collapser engages.
	
	var tracker = new Array();
	var dataset = new Array();
	
	var initCollapser = function(section, i) {
		
		var	desc = DOM.getElementsByClassName('collapse_desc', 'p', section)[0];
		var	content = DOM.getElementsByClassName('collapse_content', 'div', section)[0];
		
		var walk_the_DOM = function walk(node, func) {
			func(node);
			node=node.firstChild; 
			while (node) {
				walk(node, func);
				node = node.nextSibling;
			}
		};

		var items = [];
		walk_the_DOM(section, function(node) {
			if(node.nodeType === 1 && node.tagName == "LI") {
				items.push(node);
			}
		});
		
		dataset[i] = items; 
				
		if(!section.getAttribute('engage_on') || (section.getAttribute('engage_on') < items.length)) {
			// If the collapser has an engage_on attribute, get it. (e.g. 3)
			// If number of list items is more than engage_on, finish the init process. 
	
			section.id = "section_" + i;
			DOM.removeClass(section, "collapser");
			DOM.addClass(section, "js_collapser");
			
			// put a span tag around the description
			var new_desc = "<span>" + desc.innerHTML + "</span>";
			desc.innerHTML = new_desc;
			
			/* 
			var img = document.createElement("img");
			img.id = "img_" + i;
			img.style.cursor = "pointer";
			img.alt = "";
			desc.insertBefore(img,desc.childNodes[0]);
			*/
			
			desc.id = "desc_" + i;
		    desc.style.cursor = "pointer";
			
			content.id = "content_" + i;
			
		    EVENT.addListener(desc, 'mouseover', hiliteDesc);
		    EVENT.addListener(desc, 'mouseout', unhiliteDesc);
			EVENT.addListener(desc, 'click', hideContent);
		    
			if(section.getAttribute('default_collapse') == "collapsed") 
	 		    hideContent(false,desc.id);
	 		else 
				showContent(false,desc.id);
		}
		section.style.display = "block";
	}

	var showContent = function(e,obj) {
		if(obj) var i = obj.substr(5);
		else var i = this.id.substr(5);		

		var desc = $('desc_' + i);
		// var img = $('img_' + i)
		var content = $('content_' + i)

		// img.src = "images/dwn_arrow.gif";
		content.style.display = "block";
		
		DOM.addClass(desc,'desc_active');

		tracker[i] = "";
	}
	
	var hideContent = function(e,obj) {

		if(obj)
			var i = obj.substr(5);
		else {
			var i = this.id.substr(5);
			obj = this.id
		}	

		if(tracker[i] == "hidden") {
			showContent(e,obj);
			return true;
		}

		var desc = $('desc_' + i);
		// var img = $('img_' + i)
		var content = $('content_' + i)
		
		DOM.removeClass(desc,'desc_active');

		// img.src = "images/side_arrow.gif";
		content.style.display = "none";
		tracker[i] = "hidden";
	}

	var hiliteDesc = function(e) {
		DOM.addClass(this, "desc_hilite");
	}
	
	var unhiliteDesc = function(e) {
	  	DOM.removeClass(this, "desc_hilite");
	}

	return {
		init:function() {
			var collapsable_sections = DOM.getElementsByClassName("collapser");
	        for(var i in collapsable_sections) {
				initCollapser(collapsable_sections[i],i);
			}			
		}
	}
}();


Emp.DiseaseSuggest = {

	init:function () {
		
	    this.diseaseDS = new YAHOO.widget.DS_XHR(this.xhr_location, ["\n", "\t"]);
	    this.diseaseDS.responseType = YAHOO.widget.DS_XHR.TYPE_FLAT;
	    this.diseaseDS.maxCacheEntries = 60;
	    this.diseaseDS.queryMatchSubset = true;
	
		// Find all disease_search fields.
		this.elems = DOM.getElementsByClassName("disease_search","DIV");
		for(var i in this.elems) {
			this.input = DOM.getElementsByClassName("disease_input","INPUT",this.elems[i]);
			this.options = DOM.getElementsByClassName("disease_options","DIV",this.elems[i]);
			
			this.disease_suggest = new YAHOO.widget.AutoComplete(this.input[0],this.options[0], this.diseaseDS);
		    this.disease_suggest.prehighlightClassName = "yui-ac-prehighlight";
		    this.disease_suggest.minQueryLength = 3; 
			this.disease_suggest.maxResultsDisplayed = 30;
		    this.disease_suggest.useShadow = true;
		    
		    if(this.options[0].getAttribute('suggest_options')) { 
			   this.fnCustomFormatter = function(oResultItem, sQuery) {
			        var sKey = oResultItem[0];
			        var sAOC = oResultItem[1];
			        var aMarkup = ["<div class='results'><div class='result_disease'>",
			            sKey,
			            "</div><div class='result_aoc'>",
			            sAOC,
			            "</div></div>"];
			        return (aMarkup.join(""));
			    };
			    this.disease_suggest.formatResult = this.fnCustomFormatter; 	    	
		    }
		}
	}
};


Emp.Steps = {
	
	step : "", 
	init : function () {
		var item = "";
		if(this.step != "") {
			item = "cat_" + this.step;
			if(document.getElementById(item)) 
				document.getElementById(item).className = "active";
		}
		return true;
	}
}

Emp.Tabs = {
	
	tab : "", 
	init : function () {
		var item = "";
		if(this.tab != "") {
			item = "tab_" + this.tab;
			if($(item)) 
				DOM.addClass($(item),"active");
		}
		return true;
	}
}

Emp.Labels = function() {
   // Finds all input tags with title attributes and creates a label inside.
   
   // Wouldn't take much to do the same with textarea.... would it?
   var initLabel = function(input) {
      var lbl = input.title;
      input._label = lbl;
      EVENT.addListener(input, 'focus', focusedLabel);
      EVENT.addListener(input, 'blur', blurredLabel);
      if(input.value == '')showLabel(input);
      }
   var wipeLabels = function(div) {

      var inputs = document.getElementsByTagName('input', div);
  	  YAHOO.log(inputs.length);
      for(var i = 0; i < inputs.length; i++) {
         if(inputs[i].value == inputs[i]._label) hideLabel(inputs[i]);
         }
      }
   var focusedLabel = function(e) {
      var input = window.event ? window.event.srcElement : e ? e.target : null;
      if(input.value == input._label)hideLabel(input);
      }
   var blurredLabel = function(e) {
      var input = window.event ? window.event.srcElement : e ? e.target : null;
      if(input.value == '')showLabel(input);
      }
   var hideLabel = function(input) {
      input.value = '';
      DOM.removeClass(input, 'hint');
      }
   var showLabel = function(input) {
      input.value = input._label;
      DOM.addClass(input, 'hint');
      }
   return {
      init : function(id, form) {
      	var div; 
        if(!document.getElementById ||!document.getElementById(id)) {
        	div = document.getElementsByTagName('body');
        	div = div[0];
        } else {
         	div = document.getElementById(id);
        }
        var titles = document.getElementsByTagName('input');

        for(var i in titles) {
         	if(titles[i].type == "text" && titles[i].title) {
          		initLabel(titles[i]);
         	}
        }
        if(!form) {
         	if(div.getElementsByTagName('form')[0]) var form = div.getElementsByTagName('form')[0];
        	else return false;
        }
        EVENT.addListener(form, 'submit', function() {
            wipeLabels(div)}
        	);
        }
     }
   }
(); // Yay, we have closure.

Emp.Tooltips = function() {
	
	return {
		init : function (context) {
			// Attach custom tooltip handler to all elements of class emp_tooltip 
			if(context) {
				var elems = DOM.getElementsByClassName("emp_tooltip","",context);
			} else {
				var elems = DOM.getElementsByClassName("emp_tooltip");
				YAHOO.log(elems.length);
			}	
			for(var i in elems) {
				// if the title is blank, or there is no title, don't call this. 
				if(elems[i].getAttribute('title') && elems[i].getAttribute('title') != "") {
					DOM.addClass(elems[i],'emp_tooltip_js');
					descriptiveText = new YAHOO.widget.Tooltip("tooltip_" + i, { 
							context: elems[i], 
							autodismissdelay:150000,
							showDelay:500,
							hideDelay:500,
							width:"300px" } );
				}
			}
		}
	}
}();

Emp.Logger = {
	
	init : function() {
		var body = document.getElementsByTagName('body');
		DOM.addClass(body[0],'yui-skin-sam');
		myLogReader = new YAHOO.widget.LogReader('myLogger'); 
	}
}



EVENT.onDOMReady(Emp.init);
