/**  Created Date:  1/26/2007 4:44 PM
 * 	Author:  Irvin Owens Jr
 *  For: Epocrates, Inc.
 *  Project: EOL 2 / Topamax
 *  Description:  This file will act as a library / repository for tools to be used in applications
 *  Libraries Used:  
 **/

registerNS("com.epocrates.online.common.toolLibrary");

/* globals */

_mouseX = 0;
_mouseY = 0;
_event = null;

document.onmousemove = getMouseXY;

_browserVariable = null;

/* constructors */

com.epocrates.online.common.toolLibrary.TypeValidator = function TypeValidator(){
	this.validateType = com.epocrates.online.common.toolLibrary.TypeValidator.validTypeChecker;
}

com.epocrates.online.common.toolLibrary.BrowserInformation = function(){
	this.browserSniffer = com.epocrates.online.common.toolLibrary.browserSniffer;
}


/* prototypes */





/* implementations */

com.epocrates.online.common.toolLibrary.validTypeChecker = function(anObject /* Object */,expectedType /* String */){
	if(typeof(anObject) == expectedType){
		// do nothing
	}else{
		throw("The object is of " + typeof(anObject) + " not of type " + expectedType);
	}
}

com.epocrates.online.common.toolLibrary.browserSniffer = function(){
        if(_browserVariable == null){
		if(navigator.userAgent.toLowerCase().indexOf("msie") != -1){
                    _browserVariable = 1;
	 	}
	 	if(navigator.userAgent.toLowerCase().indexOf("firefox") != -1){
                    _browserVariable = 2;
	 	}
	 	if(navigator.userAgent.toLowerCase().indexOf("opera") != -1){
                    _browserVariable = 3;
	 	}
	 	if(navigator.userAgent.toLowerCase().indexOf("safari") != -1){
                    _browserVariable = 4;
	 	}
		if(navigator.userAgent.toLowerCase().indexOf("iphone") != -1){
                    _browserVariable = 5;
		}
                if(navigator.userAgent.toLowerCase().indexOf("ipod") != -1){
                    _browserVariable = 5;
		}
         }
	 return _browserVariable;
}

com.epocrates.online.common.toolLibrary.getServer = function() {
	 var urlHolder = new Array();
	 var currentAddress = window.location.href;
	 if(currentAddress.indexOf("?") != -1 && currentAddress.indexOf(".c") != -1 && currentAddress.indexOf(".j") != -1) {
		 urlHolder = currentAddress.split("?");
		
		 finalURL = urlHolder[0];
		
	 }else{
		 urlHolder = currentAddress.split("/");
		 urlHolder.pop();
		 finalURL = urlHolder[0] + "//" + urlHolder[2] + "/";
	 }
	 return finalURL;
}

com.epocrates.online.common.toolLibrary.parseXml = function (xmlText){

	try{

		var text = xmlText;

		//text = replaceAll(text,"&lt;","<");

		//text = replaceAll(text,"&gt;",">");

		//text = replaceAll(text,"&quot;","\"");

		//alert(text);

		//var myWin = window.open('','win','resize=yes,scrollbars=yes');

		//myWin.document.getElementsByTagName('body')[0].innerHTML = text;

		if (typeof DOMParser != "undefined") { 

		    // Mozilla, Firefox, and related browsers 

		    var parser=new DOMParser();

		    var doc=parser.parseFromString(text,"text/xml");

		    //alert(text);

		    return doc; 

		}else if (typeof ActiveXObject != "undefined") { 

			// Internet Explorer. 

		var doc = new ActiveXObject("Microsoft.XMLDOM");  // Create an empty document 

		    doc.loadXML(text);            // Parse text into it 

		    return doc;                   // Return it 

		}else{ 

			// As a last resort, try loading the document from a data: URL 

			// This is supposed to work in Safari. Thanks to Manos Batsis and 

			// his Sarissa library (sarissa.sourceforge.net) for this technique. 

			var url = "data:text/xml;charset=utf-8," + encodeURIComponent(text); 

			var request = new XMLHttpRequest(); 

			request.open("GET", url, false); 

			request.send(null); 

			return request.responseXML; 

		}

	}catch(err){

		alert("There was a problem parsing the xml:\n" + err.message);

	}

}

// serialize xml dom to string

com.epocrates.online.common.toolLibrary.serialize = function(dom) {
    var xml = dom.xml;
    if (xml == undefined) {
        try {
            var serializer = new XMLSerializer();
            xml = serializer.serializeToString(dom);
            delete serializer;
        } catch (error) {
            if (debug)
                alert("DOM serialization is not supported.");
        }
    }
    return xml;
}

// Test Node Get Text javascript escaped
com.epocrates.online.common.toolLibrary.getTextFromNode = function(node){
	var nText = "";
	if(node.firstChild == null || node == null){
		nText = null;
	}else if(node.firstChild.childNodes.length == 0){
		nText = null;
	}else{
		var textNodes = node.firstChild.childNodes;
		var textString;
		for(var b=0;b<textNodes.length;b++){
			textString += escape(textNodes[b].nodeValue);
		}
		nText = textString;
	}
	return textString;
}

// hide an element by applying class or regular hide
com.epocrates.online.common.toolLibrary.hideElement = function(nodeid /* dom node id */,cssClass /* css class to apply or null if none */){
	var nodeToHide = document.getElementById(nodeid);
	if(cssClass != null){
		nodeToHide.className = cssClass;
	}else{
		nodeToHide.className = "";
		nodeToHide.style.display = "none";
	}
	delete nodeToHide;
}

// show an element by applying class or regular show
com.epocrates.online.common.toolLibrary.showElement = function(nodeid /* dom node id */,cssClass /* css class to apply or null if none */){
	var nodeToShow = document.getElementById(nodeid);
	if(cssClass != null){
		nodeToShow.className = cssClass;
	}else{
		nodeToHide.className = "";
		nodeToHide.style.display = "block";
	}
	delete nodeToHide;
}

// grab mouse position from globals in controller.js

com.epocrates.online.common.toolLibrary.getMouseXY = function(evt){
	if(com.epocrates.online.common.toolLibrary.browserSniffer() != 1){
		tempx = evt.pageX;
		tempy = evt.pageY;
	}else{
		tempx = window.event.clientX + document.documentElement.scrollLeft;
		tempy = window.event.clientY + document.documentElement.scrollTop;
	}
	//console.log("offset: " + document.documentElement.scrollLeft + ", " + document.documentElement.scrollTop);
}

//get page offset
com.epocrates.online.common.toolLibrary.getWindowOffset = function(){
	var offArr = new Array();
	offArr[0] = (5 + 350);
	offArr[1] = 5;
	return offArr;
}

// open new browser window
com.epocrates.online.common.toolLibrary.openInWindow = function(width,height,navigation,url){
    if(width == 0 || height == 0){
       if(navigation){
            window.open(url,"EpocratesExternalResource","status=0,toolbar=1,location=1,menubar=1,resizable=1,scrollbars=1");
        }else{
            window.open(url,"EpocratesExternalResource","status=0,toolbar=0,location=0,menubar=0,resizable=1,scrollbars=1");
        } 
    }else{
        if(navigation){
            window.open(url,"EpocratesExternalResource","status=0,toolbar=1,location=1,menubar=1,resizable=1,scrollbars=1,width=" + width + ",height=" + height);
        }else{
            window.open(url,"EpocratesExternalResource","status=0,toolbar=0,location=0,menubar=0,resizable=1,scrollbars=1,width=" + width + ",height=" + height);
        }
    }
    return null;
}

// fix for IE not supporting getElementByName
com.epocrates.online.common.toolLibrary.getElementsByName = function(tag, name) {
     
     var elem = document.getElementsByTagName(tag);
     var arr = new Array();
     for(i = 0,iarr = 0; i < elem.length; i++) {
          att = elem[i].getAttribute("name");
          if(att == name) {
               arr[iarr] = elem[i];
               iarr++;
          }
     }
     return arr;
}

// root function for grabbing mouse x and y position
function getMouseXY(evt){
    if (evt) {
            if(window.navigator.userAgent.toLowerCase().indexOf("msie") != -1){
                    _mouseX = window.event.clientX;
                    _mouseY = window.event.clientY;
            }else{
                    _mouseX = evt.pageX;
                    _mouseY = evt.pageY;
            }
    _event = evt;
    }
}

com.epocrates.online.common.toolLibrary.getMouseX = function(){
    return _mouseX;
}

com.epocrates.online.common.toolLibrary.getMouseY = function(){
    return _mouseY;
}

com.epocrates.online.common.toolLibrary.jsRedirect = function(argText){
    var redirText = '<html><head><title>Redirecting</title></head><body><script language=javascript>function findRxMain(cur){	if (cur != cur.top  &&  cur.name != "rxmain") cur = findRxMain(cur.parent);	return cur;}findRxMain(self).location="';
    if (argText.substring(0,redirLen) == redirText) {
        var redirLen = redirText.length;
        var targetEnd = argText.indexOf('"', redirLen);
        var target = argText.substring(redirLen, targetEnd);
        window.location = target;
    }
    return 1;
 }
 
 com.epocrates.online.common.toolLibrary.getElementByClass = function(nodeList, aClass){
    for(var i=0; i < nodeList.length; i++){
        var nodeItem = nodeList[i];
        if(nodeItem.className == aClass)
        {
            return nodeItem;
        }
    }
    return null;
 }