VRT = YAHOO.namespace("trp.vrt.common");

if (typeof VRT.render == "undefined")
{

VRT.render = function(){
	
	//Object will store renderer - callback fn mappings for anchor link processing
	//For portability reasons these mappings will be added from another file (see x.js)
	var rendererAnchorCallbacks = {};
	
	function processAnchor(name) {
		var anchor = VRT.dom.getElementByName(name,"a");
		if(anchor) {
			var container = VRT.dom.findParentNodeByClass(anchor,"renderer");
			if(container) {
				//stop scrolling in defaultIFrameOnload fn
				VRT.page.properties.allowIFrameScroll=false;
				updateRenderer(anchor,container);
				return true;
			}
			else {
				//found anchor link but its not in a renderer
				//do nothing
			}
		}
		return false;
	}
	
	function updateRenderer(anchorEl, containerEl) {
		var el = YAHOO.util.Dom.get(containerEl);	
		for (var i in rendererAnchorCallbacks) { 
			if (YAHOO.util.Dom.hasClass(el,i)) {
				var targetFunction = rendererAnchorCallbacks[i];
				if(targetFunction && typeof targetFunction == 'function') {				
					try {
						VRT.logger.log("VRT.render.updateRenderer - updating " + i + " using callback"); 	
						targetFunction.call(this,anchorEl,el);
						//push it into object
						VRT.render.scollAnchor = anchorEl;
						//delayed scroll after anchor is originally evaluated by browser
						setTimeout("VRT.render.scollAnchor.scrollIntoView(); window.scrollBy(0,-100);",250);
					}
					catch(err) {
						VRT.logger.log(this + ' caught error: ' + err,'error'); 
					}
				} 
				else {
					VRT.logger.log(this + ' received invalid fn: ' + targetFunction,'error'); 
				}
				break;
			}
			else {
				//do nothing - expected case
			}
		}
		VRT.logger.log(this + ' done ','info'); 	
	}
	

	function getAnchorTarget() {
		var hash = window.location.hash;
		return parseAnchorName(hash);
	}

	function parseAnchorName(hash) {
		if(hash && (hash.substring(0,1) == "#")) {
			//apparently some browsers may return a url if no anchor was present so check for #
			hash = hash.substring(1); // remove #	  
			var qPos = hash.indexOf("?");				
			if(qPos > -1) { //some browsers will add query string after hash
				hash = hash.substring(0,qPos);
			}
			return hash;
		}
		else {
			return null;
		}  	
	}
	
	return {
	
		initAnchorClickHandler : function() {
	    	YAHOO.util.Event.on("doc", "click", this.handleAnchorClickEvent); 
			VRT.logger.log("VRT.render.initAnchorClickHandler - registered click handler");
		},	
		
		handleAnchorClickEvent : function(event) {
			var target = YAHOO.util.Event.getTarget(event); 
			if(target && target.tagName.toLowerCase() == "a") {
				var name = parseAnchorName(target.hash);
				var targetPath = target.pathname;
				if (YAHOO.env.ua.ie > 0) {
					targetPath = "/" + targetPath;				
				}  	
				if(name && target.host == window.location.host && targetPath == window.location.pathname) {
					//internal anchor click
					VRT.logger.log("VRT.render.handleAnchorClickEvent - received internal anchor click event");
					processAnchor(name);
				}
			}
		},	
	
		handleDomReadyEvent: function() {	
			VRT.logger.log("VRT.render.handleDomReadyEvent - checking for anchor");
			var name = getAnchorTarget();
			if(!name) {
				return false;
			}
			//anchor requested at page load
			VRT.logger.log("VRT.render.handleDomReadyEvent - received dom ready event");
			processAnchor(name);			
		},
		
		addRendererAnchorCallback: function(className, callbackFn) {
			if(className && callbackFn && typeof callbackFn == 'function') {
				rendererAnchorCallbacks[className] = callbackFn;
			}
			else {
				VRT.logger.log('VRT.render.addRendererAnchorCallback - cannot add className: ' + className + ', callbackFn: ' + callbackFn);
			}
		}

	};
	
}();

}