﻿// msnevs - JavaScript Utilities

function msnevs_LoadXmlByHttpRequest(url, async, cbFunc)
{
    var req = null;
    if (async && !cbFunc)
        throw new Error(msnevs_XmlListViewErrors.settingErr);
    if (!async) async = false;

    if (typeof XMLHttpRequest != "undefined") {
        try {
            var req = new XMLHttpRequest;
        }
        catch(e)
        {}
    }
    else if (typeof ActiveXObject != "undefined") {
   	    try {
    	    req = new ActiveXObject("Msxml2.XMLHTTP");
  	    } catch(e) {
    	    try {
      		    req = new ActiveXObject("Microsoft.XMLHTTP");
    	    } catch(e) {
      		    req = null;
    	    }
	    }
    }
    
    getXmlDocByHttpRequest = function(request) {
        if (request.responseXML.documentElement)
            return request.responseXML;
        else if (request.responseText) {
            var parser = msnevs_GetDOMParser();
            if (parser) {
                return parser.parseFromString(request.responseText, "text/xml");
            }
        }
        else
            return null;
    }
    
    if (req) {
        try {
            if (async) {
                req.onreadystatechange = function() {
                    if (req.readyState == 4)
                        if (req.status == 200)
                            cbFunc(getXmlDocByHttpRequest(req));
                        else
                            alert("Failed in retrieving the XML data:\n" + req.statusText);
                }
            }
            
            req.open("GET", url, async);
            req.send(null);
            if (!async)
                return getXmlDocByHttpRequest(req);
            else
                return true;
        }
        catch(e)
        {}
    }

    alert("Failed in retrieving the XML data.");
    return null;
}

function msnevs_LoadXml(url, async, cbFunc)
{
    var xmlDoc = null;
    
    if (document.implementation && document.implementation.createDocument)
    {
        xmlDoc = document.implementation.createDocument("", "", null);
        if (xmlDoc == null) 
            return null;
        
        xmlDoc.async = async;
        if (async)
        {
            xmlDoc.onload = function() {
                cbFunc(xmlDoc);
            }
        }
    }
    else if (typeof ActiveXObject != "undefined")
    {
        try
        {
            xmlDoc = new ActiveXObject("MSXML2.DOMDocument");
        }
        catch(e)
        {
            xmlDoc = new ActiveXObject("MSXML.DOMDocument");
        }
        if (xmlDoc == null)
            return null;
        
        xmlDoc.async = async;
        if (async)
        {
            xmlDoc.onreadystatechange = function( ) {
                if (xmlDoc.readyState == 4) cbFunc(xmlDoc);
            };
        }
    }
    xmlDoc.load(url);
    return xmlDoc;
}

function msnevs_GetDOMParser()
{
    if (typeof DOMParser != "undefined")
        return new DOMParser();
    
    var domParser = new Object;
    domParser.parseFromString = function (str, contentType) {
        if (typeof XMLHttpRequest != "undefined") {
            try {
                var req = new XMLHttpRequest;
                req.open("GET", "data:" + (contentType || "application/xml") + ";charset=utf-8," + encodeURIComponent(str), false);
                if (req.overrideMimeType) {
                    req.overrideMimeType(contentType);
                }
                req.send(null);
                return req.responseXML;
            }
            catch(e)
            {}
        }

        if (typeof ActiveXObject != "undefined") {
            var doc = null;
            try {
                doc = new ActiveXObject("MSXML2.DomDocument");
            } 
            catch(e) {
                try {
                    doc = new ActiveXObject("MSXML.DomDocument");
                }
                catch(e)
                {}
            }
            if (doc) {
                doc.loadXML(str);
                return doc;
            }
        } 
        throw new Error(msnevs_XmlListViewErrors.xmlErr);
    } // end of function.
    
    return domParser;
}

function msnevs_selectNodes(element, xpath, namespaceURLMapper)
{
    if (!element || !xpath)
        return null;

    if (typeof(element.selectNodes) != "undefined") {
        return element.selectNodes(xpath);
    }
    else if (typeof(XPathEvaluator) != "undefined") {
        var xEvaluator = new XPathEvaluator();
        if (!xEvaluator) return null;
        
        var xIterator = xEvaluator.evaluate(xpath, 
                                           element, 
                                           null, 
                                           XPathResult.ORDERED_NODE_ITERATOR_TYPE, 
                                           null);
        var nodes = new Array;
        if (xIterator != null) 
        {
            var newNode = xIterator.iterateNext();
            while(newNode) 
            {
                nodes.push(newNode);
                newNode = xIterator.iterateNext();
            }
        }
        return nodes;
    }
    else if (typeof(document.createExpression) != "undefined") {
        var xpathExpr = document.createExpression(xpath, namespaceURLMapper);
        var xEvaluator = xpathExpr.evaluate(element, 
                                            XPathResult.ORDERED_NODE_ITERATOR_TYPE, 
                                            null);
        if (xEvaluator) {
            var nodes = new Array(xEvaluator.snapshotLength);
            for (var i = 0; i < xEvaluator.snapshotLength; i++)
                nodes[i] = xEvaluator.snapshotItem(i);
            return nodes; 
        }        
    }
    else {
        return msnevs_selectNodesInSafari(element, xpath);
    }

    return null;
}

function msnevs_selectSingleNode(element, xpath)
{
    if (!element || !xpath)
        return null;

    if (typeof(element.selectSingleNode) != "undefined")
    {
        return element.selectSingleNode(xpath);
    }
    else if (typeof(XPathEvaluator) != "undefined")
    {
        var xEvaluator = new XPathEvaluator();
        var xIterator = xEvaluator.evaluate(xpath, 
                                           element, 
                                           null, 
                                           XPathResult.ORDERED_NODE_ITERATOR_TYPE, 
                                           null);
        if (xIterator)
            return xIterator.iterateNext();
        else
            return null;
   }
   else
       return msnevs_selectSingleNodeInSafari(element, xpath);
}

function msnevs_getXmlNodeValue(element)
{
    if (element && element.childNodes && element.childNodes.length > 0)
        return element.childNodes[0].nodeValue;
    else
        return null;
}

function msnevs_convert(valueString, dataType) {
    if (!dataType)
        return valueString.toString();
        
    switch(dataType.toLowerCase()) {
        case "date":
            return new Date(Date.parse(valueString));
        case "int":
            return parseInt(valueString);
        case "float":
            return parseFloat(valueString);
        default:
            return valueString.toString();
    }
}

function msnevs_format(value, dataType, format)
{
    if (!value) return "";
    if (!dataType) return value.toString();
    
    switch (dataType)
    {
        case "date":
            return msnevs_formatDate(value, format);
        default:
            return value.toString();
    }    
}

function msnevs_formatDate(date, format)
{
    var o = {
        "M+" : date.getMonth()+1, //month
        "d+" : date.getDate(),    //day
        "h+" : date.getHours(),   //hour
        "m+" : date.getMinutes(), //minute
        "s+" : date.getSeconds(), //second
        "q+" : Math.floor((date.getMonth()+3)/3),  //quarter
        "S"  : date.getMilliseconds() //millisecond
    }
    
    var result;
    if(/(y+)/.test(format))
        result = format.replace(RegExp.$1, (date.getFullYear()+"").substr(4 - RegExp.$1.length));
    for(var k in o)
    {
        if(new RegExp("("+ k +")").test(format))
            result = result.replace(RegExp.$1,RegExp.$1.length==1 ? o[k] :("00"+ o[k]).substr((""+ o[k]).length));
    }
    return result;
}

function msnevs_CheckHolder(holder, tag, index)
{
    var holderElement = null;
    
    if (holder) {
        if (typeof holder == "string")
            holderElement = document.getElementById(holder);
        else
            holderElement = holder;
    }
    else {
        if (tag) {
            if (!index || index < 0)
                index = 0;
            var elements = document.getElementsByTagName(tag);
            if (elements || elements.length > index)
                holderElement = elements[index];
        } 
    }
    return holderElement;
}

function msnevs_getDynamicalAttribute(element, attrName)
{
    var result = element.getAttribute(attrName);
    if (result == null)
    try
    {
        result = element[attrName];
    }
    catch(e)
    {
        result = null;
    }
    return result;
}

function msnevs_parserXPathInSafari(xpath)
{
    var nodes = xpath.split("/");
    if (!nodes || nodes.length < 1) 
        return null;

    var result = new Array();
    for (var i = 0; i < nodes.length; i++) {
        if (nodes[i] != "") {
            var nodeObj = msnevs_parserXpathNodeInSafari(nodes[i]);
            if (nodeObj)
                result.push(nodeObj);
        }
    }
    if (result.length > 0)
        return result;
    else
        return null;
}

function msnevs_parserXpathNodeInSafari(node)
{
    var nodeStr = node;
    var r = new Object();
    r.nodeName = null;
    r.filterName = null;
    r.filterValue = null;
    
    var pos = nodeStr.indexOf("[");
    if (pos < 0) {
        r.nodeName = nodeStr;
        return r;
    }
    else
        r.nodeName = nodeStr.substr(0, pos);
    
    nodeStr = nodeStr.substr(pos + 1);
    pos = nodeStr.indexOf("=");
    if (pos < 0) return r;
    r.filterName = nodeStr.substr(0, pos);
    
    pos = nodeStr.indexOf("'");
    var pos2 = nodeStr.lastIndexOf("'");
    if (pos < 0 || pos2 < 0 || pos == pos2) {
        r.filterName = null;
        return;
    }
    r.filterValue = nodeStr.substr(pos + 1, pos2 - pos - 1);
    return r;
}

function msnevs_selectNodesInSafari(element, xpath)
{
    _filterNodes = function(nodes, filterName, filterValue) {
        if (!nodes || nodes.length < 0) return null;
        if (!filterName || !filterValue) return nodes;
        for (var i = 0; i < nodes.length; i++) {
            var snodes = nodes[i].getElementsByTagName(filterName);
            if (snodes && snodes.length > 0)
                if (msnevs_getXmlNodeValue(snodes[0]) == filterValue)
                    continue;
            snodes = null;           
            nodes.splice(i, 1);
            i--;
        }
        return nodes;
    }
        
    _getNodes = function(nodes, xpObject) {
        if (!nodes || nodes.length < 1) return null;
        var result = new Array();
        for (var i = 0; i < nodes.length; i++) {
            var tempNodes = nodes[i].getElementsByTagName(xpObject.nodeName);
            if (tempNodes && tempNodes.length > 0)
                for (var j = 0; j < tempNodes.length; j++)
                    result.push(tempNodes[j]);
        }
        if (result && xpObject.filterName && xpObject.filterValue)
            result = _filterNodes(result, xpObject.filterName, xpObject.filterValue);
        return result;
    }

    var xpList = msnevs_parserXPathInSafari(xpath);
    if (!xpList || xpList.length < 1)
        return null;
    
    var nodes = new Array();
    nodes.push(element);
    for (var i = 0; i < xpList.length; i++) {
        nodes = _getNodes(nodes, xpList[i]);
    }
    return nodes;
}

function msnevs_selectSingleNodeInSafari(element, xpath)
{
    var nodes = msnevs_selectNodesInSafari(element, xpath);
    if (nodes && nodes.length > 0)
        return nodes[0];
    else
        return null;
}
