function createDocument()
{
    if(typeof arguments.callee.activeXString != "string")
    {
        var versions=["MSXML2.DOMDocument.6.0","MSXML2.DOMDocument.3.0","MSXML2.DOMDocument"];
        for(var i=0;i<versions.length;i++)
        {
            try{
                var xmldom = new ActiveXObject(versions[i]);
                arguments.callee.activeXString = versions[i];
                return xmldom;
            }
            catch(ex)
            {
                throw new Error("ERROR: Error MSXML parser");
            }
        }

    }
    return new ActiveXObject(arguments.callee.activeXString);
}

function parseXML(xml)
{
    var xmldom=null;
    if(typeof DOMParser!="undefined")
    {
        xmldom = (new DOMParser()).parseFromString(xml,"text/xml");
        var errors =xmldom.getElementsByTagName("parseerror");
        if(errors.length)
        {
            throw new Error("ERROR: XML Parsing error:"+error[0].textContent);
        }
    }
    else if(document.implementation.hasFeature("LS","3.0"))
    {
        var implementation = document.implementation;
        var parser= implementation.createLSParser(implementation.MODE_SYNCHRONOUS,null);
        var input = implementation.createLSInput();
        input.stringData = xml;
        xmldom=parser.parse(input);
    }
    else if(typeof ActiveXObject != "undefined")
    {
        xmldom = createDocument();
        xmldom.loadXML(xml);
        if(xmldom.parseError!=0)
        {
            throw new Error("ERROR: XML Parsing error:"+xmldom.parseError.reason);
        }
    }
    else
    {
        throw new Error("ERROR: No XML Parser available");
    }
    return xmldom;
}


var oXMLDOM= null;

function getXMLDOM(url)
{
    if(oXMLDOM==null)
    {
        oXMLDOM= parseXML(Ajax.syncAjaxRequestGet(url));
        return oXMLDOM;
    }
    else if(oXMLDOM!=null)
    {
        return oXMLDOM;
    }
    else
    {
        throw new Error("ERROR: Null XML DOM object returned");
                      
    }
}
var resolveLinkFromXMLFile= false;
var xmlLinkFile = "";

function setXMLLinkFile(file)
{
    Ajax.setup();
    xmlLinkFile=file;
    resolveLinkFromXMLFile = true;
}
function getXMLLinkFile()
{
    return xmlLinkFile;
}
function resolveLink(src)
{
    var address=null;
  
    //RESOLVE LINK FROM IN FILE LINK/SOURCE TAGS OR RESOLVE LINK FROM EXTERNAL XML FILE
    if(resolveLinkFromXMLFile & xmlLinkFile!="")
    {
        if(info)
        {
            alert("INFO: Using XML file for links.");
        }
        //From XML File
        var xmldom=getXMLDOM(xmlLinkFile);
        var linkid=null;
        if(xmldom!=null)
        {
            var source=xmldom.getElementsByTagName("source");
      
            for(var i=0;i<source.length;i++)
            {
                if(source[i].getAttribute("src")== src)
                {
                    linkid=source[i].getAttribute("linkid");
                
                    break;
                }
            }
            var link=xmldom.getElementsByTagName("link");
            if(debug)
            {
                alert("LinkID: "+linkid);
            }
            if(linkid==null)
            {
           
                throw Error("ERROR: Link ID is null.");
            }
            for(i=0;i<link.length;i++)
            {
                if(link[i].getAttribute("id")== linkid)
                {
                    address=link[i].getAttribute("dest");
                    break;
                }
            }


        }
        else
        {
            throw new Error("ERROR: XML Link file error");
        }
    }
    else
    {
        //From in file tags
        if(info)
        {
            alert("INFO: Using embedded tags for links.");
        }
        linkid= getLinkIDBySource(src);
        if(debug)
        {
            alert("LinkID: "+linkid);
        }
        if(linkid!=null)
        {
            address=        document.getElementById(linkid).getAttribute("dest");
        }
        else
        {
            throw Error("ERROR: Link ID is null.");
        }

    }
    if(address == null & address == "")
    {
        throw new Error("ERROR: Link not resolved. Source: "+src);
    }
    else
    {
        return address;
    }
   
}

function resolveLinkDirect(linkid,getTarget)
{
    var address=null;
  
    //RESOLVE LINK FROM IN FILE LINK/SOURCE TAGS OR RESOLVE LINK FROM EXTERNAL XML FILE
    if(resolveLinkFromXMLFile & xmlLinkFile!="")
    {
        if(info)
        {
            alert("INFO: Using XML file for links.");
        }
        //From XML File
        var xmldom=getXMLDOM(xmlLinkFile);
       
        if(xmldom!=null)
        {
            
            var link=xmldom.getElementsByTagName("link");
            if(debug)
            {
                alert("LinkID: "+linkid);
            }
            if(linkid==null)
            {
           
                throw Error("ERROR: Link ID is null.");
            }
            for(i=0;i<link.length;i++)
            {
                if(link[i].getAttribute("id")== linkid)
                {
                    address=link[i].getAttribute("dest");
                    if(getTarget)
                    {
                        address+=" "+link[i].getAttribute("target");
                    }
                    break;
                }
            }


        }
        else
        {
            throw new Error("ERROR: XML Link file error");
        }
    }
    else
    {
        //From in file tags
        if(info)
        {
            alert("INFO: Using embedded tags for links.");
        }
        linkid= getLinkIDBySource(src);
        if(debug)
        {
            alert("LinkID: "+linkid);
        }
        if(linkid!=null)
        {
            address=        document.getElementById(linkid).getAttribute("dest");
            if(getTarget)
            {
                address+=" "+link[i].getAttribute("target");
            }
        }
        else
        {
            throw Error("ERROR: Link ID is null.");
        }

    }
    if(address == null & address == "")
    {
        throw new Error("ERROR: Link not resolved. Source: "+src);
    }
    else
    {
        return address;
    }
   
}

function Lclick(element)
{

    var src= element;
    var dest= resolveLink(src.id);
    if(debug)
    {
        alert("ID Clicked:"+src.id);
    }
    if(dest!="" & dest!=null)
    {
        window.location.href=dest;
    }
    else
    {
        alert("ERROR: Destination not reachable: Source="+src+"  Destination="+dest);
    }
}

function LgetLink(srcid,getTarget)
{


    var dest= resolveLinkDirect(srcid,getTarget);
    if(debug)
    {
        alert("ID Clicked:"+srcid);
    }
    if(dest!="" & dest!=null)
    {
        return dest;
    }
    else
    {
        alert("ERROR: Destination not reachable: Source="+src+"  Destination="+dest);
        return "";
    }
}

function LclickDirect(srcid)
{


    var dest= resolveLinkDirect(srcid);
    if(debug)
    {
        alert("ID Clicked:"+srcid);
    }
    if(dest!="" & dest!=null)
    {
        window.location.href=dest;
    }
    else
    {
        alert("ERROR: Destination not reachable: Source="+src+"  Destination="+dest);
    }
}
var debug=false;
var info = false;

function setLinkerDebug(_debug)
{
    debug=_debug;
}
function setLinkerInfo(_info)
{
    info=_info;
}

function getLinkIDBySource(src)
{
    var elementArr=  document.getElementsByTagName("source");
    var linkid=null;
    for(var i=0;i<elementArr.length;i++)
    {
        if(debug)
        {
            alert("DEBUG: Source:"+src+" Found:"+elementArr[i].getAttribute("src"));
        }
        if(elementArr[i].getAttribute("src") == src)
        {
            linkid= elementArr[i].getAttribute("linkid");
        }
    }
    return linkid;
}

function generateLinks()
{
    $("a").each(function ()
    {
        var text=LgetLink($(this).attr("L"),true); //Method returns URL <SPACE> TARGET
        var link=text.split(" ");
        var _url=link[0];
        var _target=link[1];
        if(_target=="_self" || _target=="_blank")
        {
            $(this).attr("href",_url).attr("target",_target);
        }
        else
        {
            $(this).bind("click", {
                url:_url,
                target:_target
            }, function(event)

            {
                var ajaxreq=Ajax.asyncAjaxRequestGet(event.data.url);
                ajaxreq.onreadystatechange= function ()
                {


                    if(Ajax.validateAjaxResponse(ajaxreq)=="Ready")
                    {
                        $("#"+event.data.target).html(ajaxreq.responseText);
                        //alert(event.data.url+" "+event.data.target);
                    }

                }


        
            });
        }
    }
    );
}
