﻿/* Copyright 2006 Microsoft Corporation.  Microsoft's copyrights in this work are licensed under the Creative Commons */
/* Attribution-ShareAlike 2.5 License.  To view a copy of this license visit http://creativecommons.org/licenses/by-sa/2.5 */

function HCard(firstName, lastName, email, phone, homeStreet, homeCity, homeState, homeZip, homeCountry, homeLatitude, homeLongitude, businessStreet, businessCity, businessState, businessZip, businessCountry, businessLatitude, businessLongitude,currentStreet, currentCity, currentState, currentZip, currentCountry, currentLatitude, currentLongitude, uid, nickName, url)
{
    this.formatType = "vcard";
    this.formatRootClassName = "vcard";
    this.FirstName = firstName;
    this.LastName = lastName;
    this.Email = email;
    this.Phone = phone;
    
    this.HomeStreet = homeStreet;
    this.HomeCity = homeCity;
    this.HomeState = homeState;
    this.HomeZip = homeZip;
    this.HomeCountry = homeCountry;
    this.HomeLatitude = homeLatitude;
    this.HomeLongitude = homeLongitude;
    
    this.BusinessStreet = businessStreet;
    this.BusinessCity = businessCity;
    this.BusinessState = businessState;
    this.BusinessZip = businessZip;
    this.BusinessCountry = businessCountry;
    this.BusinessLatitude = businessLatitude;
    this.BusinessLongitude = businessLongitude;
    
    this.CurrentStreet = currentStreet;
    this.CurrentCity = currentCity;
    this.CurrentState = currentState;
    this.CurrentZip = currentZip;
    this.CurrentCountry = currentCountry;
    this.CurrentLatitude = currentLatitude;
    this.CurrentLongitude = currentLongitude;          
    
    this.UID = uid;
    this.NickName = nickName;
    this.URL = url;
    
    
    this.updateCallback;
    this.HTML;
    
    var self = this;
    
    this.clearProps = function()
    {
        self.FirstName = null;
        self.LastName = null;
        self.Email = null;
        self.Phone = null;
        
        self.HomeStreet = null;
        self.HomeCity = null;
        self.HomeState = null;
        self.HomeZip = null;
        self.HomeCountry = null;
        self.HomeLatitude = null;
        self.HomeLongitude = null;
        
        self.BusinessStreet = null;
        self.BusinessCity = null;
        self.BusinessState = null;
        self.BusinessZip = null;
        self.BusinessCountry = null;
        self.BusinessLatitude = null;
        self.BusinessLongitude = null;
        
        self.CurrentStreet = null;
        self.CurrentCity = null;
        self.CurrentState = null;
        self.CurrentZip = null;
        self.CurrentCountry = null;
        self.CurrentLatitude = null;
        self.CurrentLongitude = null;          
        
        self.UID = null;
        self.NickName = null;
        self.URL = null;
        
        self.buildHtml();
    }
    
    this.buildHtml = function()
    {
        var hCardString = "<div class=\"vcard\">";
        
        if (self.UID)
            hCardString += "<span class=\"uid\">" + self.UID + "</span>";     
        
        if (self.FirstName || self.LastName)
        {    
            hCardString += "<div class=\"n\">";
            if (self.FirstName)
                hCardString += "<span class=\"given-name\">" + self.FirstName + "</span> ";
            if (self.LastName)
                hCardString += "<span class=\"family-name\">" + self.LastName + "</span>";
            hCardString += "</div>";
        }
        
        if (self.NickName)
            hCardString += "<span class=\"nickname\">" + self.NickName + "</span>";        
        
        if (self.Email)
            hCardString += "<a class=\"email\" href=\"" + self.Email + "\">" + self.Email + "</a>";
        
        if (self.Phone)
            hCardString += "<div class=\"tel\"><span class=\"value\">" + self.Phone + "</span></div>";
        
        if (self.HomeStreet || self.HomeCity || self.HomeState || self.HomeZip || self.HomeCountry || self.HomeLatitude || self.HomeLongitude)
        {
            hCardString += "<div class=\"adr\"><span class=\"type\">Home</span>:";
            
            if (self.HomeStreet)
                hCardString += "<div class=\"street-address\">" + self.HomeStreet + "</div>";
            
            if (self.HomeCity)
                hCardString += "<span class=\"locality\">" + self.HomeCity + "</span> ";
                
            if (self.HomeState)
                hCardString += "<span class=\"region\">" + self.HomeState + "</span> ";
                
            if (self.HomeZip)
                hCardString += "<span class=\"postal-code\">" + self.HomeZip + "</span> ";
                
            if (self.HomeCountry)
                hCardString += "<abbr class=\"type\" title=\"dom\">" + self.HomeCountry + "</abbr>";  
                
            if (self.HomeLatitude && self.HomeLongitude)
            {
                hCardString += "<div class=\"geo\"><abbr class=\"latitude\" title=\"" + self.HomeLatitude + "\">" + self.HomeLatitude + "</abbr><abbr class=\"longitude\" title=\"" + self.HomeLongitude + "\">" + self.HomeLongitude + "</abbr></div>";
            }
                            
            hCardString += "</div>";                  
        }
        
        if (self.BusinessStreet || self.BusinessCity || self.BusinessState || self.BusinessZip || self.BusinessCountry || self.BusinessLatitude || self.BusinessLongitude)
        {
            hCardString += "<div class=\"adr\"><span class=\"type\">Work</span>:";
            
            if (self.BusinessStreet)
                hCardString += "<div class=\"street-address\">" + self.BusinessStreet + "</div>";
            
            if (self.BusinessCity)
                hCardString += "<span class=\"locality\">" + self.BusinessCity + "</span> ";
                
            if (self.BusinessState)
                hCardString += "<span class=\"region\">" + self.BusinessState + "</span> ";
                
            if (self.BusinessZip)
                hCardString += "<span class=\"postal-code\">" + self.BusinessZip + "</span> ";
                
            if (self.BusinessCountry)
                hCardString += "<abbr class=\"type\" title=\"dom\">" + self.BusinessCountry + "</abbr>";  
                
            if (self.BusinessLatitude && self.BusinessLongitude)
            {
                hCardString += "<div class=\"geo\"><abbr class=\"latitude\" title=\"" + self.BusinessLatitude + "\">" + self.BusinessLatitude + "</abbr><abbr class=\"longitude\" title=\"" + self.BusinessLongitude + "\">" + self.BusinessLongitude + "</abbr></div>";
            }
                     
            hCardString += "</div>";                  
        }
        
        if (self.CurrentStreet || self.CurrentCity || self.CurrentState || self.CurrentZip || self.CurrentCountry || self.CurrentLatitude || self.CurrentLongitude)
        {
            hCardString += "<div class=\"adr\"><span class=\"type\">Current</span>:";
            
            if (self.CurrentStreet)
                hCardString += "<div class=\"street-address\">" + self.CurrentStreet + "</div>";
            
            if (self.CurrentCity)
                hCardString += "<span class=\"locality\">" + self.CurrentCity + "</span> ";
                
            if (self.CurrentState)
                hCardString += "<span class=\"region\">" + self.CurrentState + "</span> ";
                
            if (self.CurrentZip)
                hCardString += "<span class=\"postal-code\">" + self.CurrentZip + "</span> ";
                
            if (self.CurrentCountry)
                hCardString += "<abbr class=\"type\" title=\"dom\">" + self.CurrentCountry + "</abbr>";  
                
            if (self.CurrentLatitude && self.CurrentLongitude)
            {
                hCardString += "<div class=\"geo\"><abbr class=\"latitude\" title=\"" + self.CurrentLatitude + "\">" + self.CurrentLatitude + "</abbr><abbr class=\"longitude\" title=\"" + self.CurrentLongitude + "\">" + self.CurrentLongitude + "</abbr></div>";
            }
                     
            hCardString += "</div>";                  
        }        
        
        if (self.URL)
            hCardString += "<a class=\"url\" href=\"" + self.URL + "\">" + self.URL + "</a>";         
        
        hCardString += "</div>";
        self.HTML = hCardString;
    }
    
    // Initialize all contact properties from the hCard XML segment and rebuild hCard HTML.
    this.initFromXmlString = function(hCardXmlString)
    {
        this.clearProps();
        var hCardXmlStringWithHeader = "<?xml version=\"1.0\" encoding=\"utf-8\" ?>" + hCardXmlString;
        
        // IE 5+
        if (window.ActiveXObject)
        {
            hcardXmlNode = new ActiveXObject("Microsoft.XMLDOM");
            hcardXmlNode.async=false;
            hcardXmlNode.loadXML(hCardXmlStringWithHeader);
    
            var node;
            
            node = hcardXmlNode.selectSingleNode("*[@class='vcard']/*[@class='n']/span[@class='given-name']");
            if (node)
                self.FirstName = node.nodeTypedValue;
                
            node = hcardXmlNode.selectSingleNode("*[@class='vcard']/*[@class='uid']");
            if (node)
                self.UID = node.nodeTypedValue;
                
            node = hcardXmlNode.selectSingleNode("*[@class='vcard']/*[@class='url']/@href");
            if (node)
                self.URL = node.nodeTypedValue;
                
            node = hcardXmlNode.selectSingleNode("*[@class='vcard']/*[@class='nickname']");
            if (node)
                self.NickName = node.nodeTypedValue;                                
            
            node = hcardXmlNode.selectSingleNode("*[@class='vcard']/*[@class='n']/span[@class='family-name']");
            if (node)
                self.LastName = node.nodeTypedValue;
            
            node = hcardXmlNode.selectSingleNode("*[@class='vcard']/a[@class='email']");
            if (node)
                self.Email = node.nodeTypedValue;
                
            node = hcardXmlNode.selectSingleNode("*[@class='vcard']/*[@class='tel']/span[@class='value']");
            if (node)
                self.Phone = node.nodeTypedValue;           
                
            node = hcardXmlNode.selectSingleNode("*[@class='vcard']/*[@class='adr' and (span[@class='type'] = 'Home' or span[@class='type'] = 'home')]/*[@class='street-address']");
            if (node)
                self.HomeStreet = node.nodeTypedValue;
            
            node = hcardXmlNode.selectSingleNode("*[@class='vcard']/*[@class='adr' and (span[@class='type'] = 'Home' or span[@class='type'] = 'home')]/span[@class='locality']");
            if (node)
                self.HomeCity = node.nodeTypedValue;
            
            node = hcardXmlNode.selectSingleNode("*[@class='vcard']/*[@class='adr' and (span[@class='type'] = 'Home' or span[@class='type'] = 'home')]/span[@class='region']");
            if (node)
                self.HomeState = node.nodeTypedValue;
                
            node = hcardXmlNode.selectSingleNode("*[@class='vcard']/*[@class='adr' and (span[@class='type'] = 'Home' or span[@class='type'] = 'home')]/span[@class='postal-code']");
            if (node)
                self.HomeZip = node.nodeTypedValue;           
                
            node = hcardXmlNode.selectSingleNode("*[@class='vcard']/*[@class='adr' and (span[@class='type'] = 'Home' or span[@class='type'] = 'home')]/abbr[@title='dom']");
            if (node)
                self.HomeCountry = node.nodeTypedValue;
                
            node = hcardXmlNode.selectSingleNode("*[@class='vcard']/*[@class='adr' and (span[@class='type'] = 'Home' or span[@class='type'] = 'home')]/div[@class='geo']/abbr[@class='latitude']/@title");
            if (node)
                self.HomeLatitude = node.nodeTypedValue;
                
            node = hcardXmlNode.selectSingleNode("*[@class='vcard']/*[@class='adr' and (span[@class='type'] = 'Home' or span[@class='type'] = 'home')]/div[@class='geo']/abbr[@class='longitude']/@title");
            if (node)
                self.HomeLongitude = node.nodeTypedValue;                                
                
            node = hcardXmlNode.selectSingleNode("*[@class='vcard']/*[@class='adr' and (span[@class='type'] = 'Work' or span[@class='type'] = 'work')]/*[@class='street-address']");
            if (node)
                self.BusinessStreet = node.nodeTypedValue;
            
            node = hcardXmlNode.selectSingleNode("*[@class='vcard']/*[@class='adr' and (span[@class='type'] = 'Work' or span[@class='type'] = 'work')]/span[@class='locality']");
            if (node)
                self.BusinessCity = node.nodeTypedValue;
            
            node = hcardXmlNode.selectSingleNode("*[@class='vcard']/*[@class='adr' and (span[@class='type'] = 'Work' or span[@class='type'] = 'work')]/span[@class='region']");
            if (node)
                self.BusinessState = node.nodeTypedValue;
                
            node = hcardXmlNode.selectSingleNode("*[@class='vcard']/*[@class='adr' and (span[@class='type'] = 'Work' or span[@class='type'] = 'work')]/span[@class='postal-code']");
            if (node)
                self.BusinessZip = node.nodeTypedValue;           
                
            node = hcardXmlNode.selectSingleNode("*[@class='vcard']/*[@class='adr' and (span[@class='type'] = 'Work' or span[@class='type'] = 'work')]/abbr[@title='dom']");
            if (node)
                self.BusinessCountry = node.nodeTypedValue;   
                
            node = hcardXmlNode.selectSingleNode("*[@class='vcard']/*[@class='adr' and (span[@class='type'] = 'Work' or span[@class='type'] = 'work')]/div[@class='geo']/abbr[@class='latitude']/@title");
            if (node)
                self.BusinessLatitude = node.nodeTypedValue;
                
            node = hcardXmlNode.selectSingleNode("*[@class='vcard']/*[@class='adr' and (span[@class='type'] = 'Work' or span[@class='type'] = 'work')]/div[@class='geo']/abbr[@class='longitude']/@title");
            if (node)
                self.BusinessLongitude = node.nodeTypedValue;       
                
            node = hcardXmlNode.selectSingleNode("*[@class='vcard']/*[@class='adr' and (span[@class='type'] = 'Current' or span[@class='type'] = 'current')]/*[@class='street-address']");
            if (node)
                self.CurrentStreet = node.nodeTypedValue;
            
            node = hcardXmlNode.selectSingleNode("*[@class='vcard']/*[@class='adr' and (span[@class='type'] = 'Current' or span[@class='type'] = 'current')]/span[@class='locality']");
            if (node)
                self.CurrentCity = node.nodeTypedValue;
            
            node = hcardXmlNode.selectSingleNode("*[@class='vcard']/*[@class='adr' and (span[@class='type'] = 'Current' or span[@class='type'] = 'current')]/span[@class='region']");
            if (node)
                self.CurrentState = node.nodeTypedValue;
                
            node = hcardXmlNode.selectSingleNode("*[@class='vcard']/*[@class='adr' and (span[@class='type'] = 'Current' or span[@class='type'] = 'current')]/span[@class='postal-code']");
            if (node)
                self.CurrentZip = node.nodeTypedValue;           
                
            node = hcardXmlNode.selectSingleNode("*[@class='vcard']/*[@class='adr' and (span[@class='type'] = 'Current' or span[@class='type'] = 'current')]/abbr[@title='dom']");
            if (node)
                self.CurrentCountry = node.nodeTypedValue;   
                
            node = hcardXmlNode.selectSingleNode("*[@class='vcard']/*[@class='adr' and (span[@class='type'] = 'Current' or span[@class='type'] = 'current')]/div[@class='geo']/abbr[@class='latitude']/@title");
            if (node)
                self.CurrentLatitude = node.nodeTypedValue;
                
            node = hcardXmlNode.selectSingleNode("*[@class='vcard']/*[@class='adr' and (span[@class='type'] = 'Current' or span[@class='type'] = 'current')]/div[@class='geo']/abbr[@class='longitude']/@title");
            if (node)
                self.CurrentLongitude = node.nodeTypedValue;                                     
        }
        // Mozilla etc.
        else if (typeof DOMParser != "undefined")
        {
            var domParser = new DOMParser();
            var hcardXmlNode = domParser.parseFromString(hCardXmlStringWithHeader, 'application/xml');
                
            if (document.evaluate)
            {               
                var node;
                
                node = document.evaluate("*[@class='vcard']/*[@class='n']/span[@class='given-name']", hcardXmlNode, null, 0 /*XPathResult.ANY_TYPE*/, null).iterateNext();
                if (node)
                    self.FirstName = node.textContent;
                    
                node = document.evaluate("*[@class='vcard']/*[@class='uid']", hcardXmlNode, null, 0 /*XPathResult.ANY_TYPE*/, null).iterateNext();
                if (node)
                    self.UID = node.textContent;
                    
                node = document.evaluate("*[@class='vcard']/*[@class='url']/@href", hcardXmlNode, null, 0 /*XPathResult.ANY_TYPE*/, null).iterateNext();
                if (node)
                    self.URL = node.textContent;
                    
                node = document.evaluate("*[@class='vcard']/*[@class='nickname']", hcardXmlNode, null, 0 /*XPathResult.ANY_TYPE*/, null).iterateNext();
                if (node)
                    self.NickName = node.textContent;                  
                
                node = document.evaluate("*[@class='vcard']/*[@class='n']/span[@class='family-name']", hcardXmlNode, null, 0 /*XPathResult.ANY_TYPE*/, null).iterateNext();
                if (node)
                    self.LastName = node.textContent;
                
                node = document.evaluate("*[@class='vcard']/a[@class='email']", hcardXmlNode, null, 0 /*XPathResult.ANY_TYPE*/, null).iterateNext();
                if (node)
                    self.Email = node.textContent;
                    
                node = document.evaluate("*[@class='vcard']/*[@class='tel']/span[@class='value']", hcardXmlNode, null, 0 /*XPathResult.ANY_TYPE*/, null).iterateNext();
                if (node)
                    self.Phone = node.textContent;           
                    
                node = document.evaluate("*[@class='vcard']/*[@class='adr' and (span[@class='type'] = 'Home' or span[@class='type'] = 'home')]/*[@class='street-address']", hcardXmlNode, null, 0 /*XPathResult.ANY_TYPE*/, null).iterateNext();
                if (node)
                    self.HomeStreet = node.textContent;
                
                node = document.evaluate("*[@class='vcard']/*[@class='adr' and (span[@class='type'] = 'Home' or span[@class='type'] = 'home')]/span[@class='locality']", hcardXmlNode, null, 0 /*XPathResult.ANY_TYPE*/, null).iterateNext();
                if (node)
                    self.HomeCity = node.textContent;
                
                node = document.evaluate("*[@class='vcard']/*[@class='adr' and (span[@class='type'] = 'Home' or span[@class='type'] = 'home')]/span[@class='region']", hcardXmlNode, null, 0 /*XPathResult.ANY_TYPE*/, null).iterateNext();
                if (node)
                    self.HomeState = node.textContent;
                    
                node = document.evaluate("*[@class='vcard']/*[@class='adr' and (span[@class='type'] = 'Home' or span[@class='type'] = 'home')]/span[@class='postal-code']", hcardXmlNode, null, 0 /*XPathResult.ANY_TYPE*/, null).iterateNext();
                if (node)
                    self.HomeZip = node.textContent;           
                    
                node = document.evaluate("*[@class='vcard']/*[@class='adr' and (span[@class='type'] = 'Home' or span[@class='type'] = 'home')]/abbr[@title='dom']", hcardXmlNode, null, 0 /*XPathResult.ANY_TYPE*/, null).iterateNext();
                if (node)
                    self.HomeCountry = node.textContent;
                    
                node = document.evaluate("*[@class='vcard']/*[@class='adr' and (span[@class='type'] = 'Home' or span[@class='type'] = 'home')]/div[@class='geo']/abbr[@class='latitude']/@title", hcardXmlNode, null, 0 /*XPathResult.ANY_TYPE*/, null).iterateNext();
                if (node)
                    self.HomeLatitude = node.textContent;
                    
                node = document.evaluate("*[@class='vcard']/*[@class='adr' and (span[@class='type'] = 'Home' or span[@class='type'] = 'home')]/div[@class='geo']/abbr[@class='longitude']/@title", hcardXmlNode, null, 0 /*XPathResult.ANY_TYPE*/, null).iterateNext();
                if (node)
                    self.HomeLongitude = node.textContent;                   
                    
                node = document.evaluate("*[@class='vcard']/*[@class='adr' and (span[@class='type'] = 'Work' or span[@class='type'] = 'work')]/*[@class='street-address']", hcardXmlNode, null, 0 /*XPathResult.ANY_TYPE*/, null).iterateNext();
                if (node)
                    self.BusinessStreet = node.textContent;
                
                node = document.evaluate("*[@class='vcard']/*[@class='adr' and (span[@class='type'] = 'Work' or span[@class='type'] = 'work')]/span[@class='locality']", hcardXmlNode, null, 0 /*XPathResult.ANY_TYPE*/, null).iterateNext();
                if (node)
                    self.BusinessCity = node.textContent;
                
                node = document.evaluate("*[@class='vcard']/*[@class='adr' and (span[@class='type'] = 'Work' or span[@class='type'] = 'work')]/span[@class='region']", hcardXmlNode, null, 0 /*XPathResult.ANY_TYPE*/, null).iterateNext();
                if (node)
                    self.BusinessState = node.textContent;
                    
                node = document.evaluate("*[@class='vcard']/*[@class='adr' and (span[@class='type'] = 'Work' or span[@class='type'] = 'work')]/span[@class='postal-code']", hcardXmlNode, null, 0 /*XPathResult.ANY_TYPE*/, null).iterateNext();
                if (node)
                    self.BusinessZip = node.textContent;           
                    
                node = document.evaluate("*[@class='vcard']/*[@class='adr' and (span[@class='type'] = 'Work' or span[@class='type'] = 'work')]/abbr[@title='dom']", hcardXmlNode, null, 0 /*XPathResult.ANY_TYPE*/, null).iterateNext();
                if (node)
                    self.BusinessCountry = node.textContent;
                    
                node = document.evaluate("*[@class='vcard']/*[@class='adr' and (span[@class='type'] = 'Work' or span[@class='type'] = 'work')]/div[@class='geo']/abbr[@class='latitude']/@title", hcardXmlNode, null, 0 /*XPathResult.ANY_TYPE*/, null).iterateNext();
                if (node)
                    self.BusinessLatitude = node.textContent;
                    
                node = document.evaluate("*[@class='vcard']/*[@class='adr' and (span[@class='type'] = 'Work' or span[@class='type'] = 'work')]/div[@class='geo']/abbr[@class='longitude']/@title", hcardXmlNode, null, 0 /*XPathResult.ANY_TYPE*/, null).iterateNext();
                if (node)
                    self.BusinessLongitude = node.textContent;        
                    
                node = document.evaluate("*[@class='vcard']/*[@class='adr' and (span[@class='type'] = 'Current' or span[@class='type'] = 'current')]/*[@class='street-address']", hcardXmlNode, null, 0 /*XPathResult.ANY_TYPE*/, null).iterateNext();
                if (node)
                    self.CurrentStreet = node.textContent;
                
                node = document.evaluate("*[@class='vcard']/*[@class='adr' and (span[@class='type'] = 'Current' or span[@class='type'] = 'current')]/span[@class='locality']", hcardXmlNode, null, 0 /*XPathResult.ANY_TYPE*/, null).iterateNext();
                if (node)
                    self.CurrentCity = node.textContent;
                
                node = document.evaluate("*[@class='vcard']/*[@class='adr' and (span[@class='type'] = 'Current' or span[@class='type'] = 'current')]/span[@class='region']", hcardXmlNode, null, 0 /*XPathResult.ANY_TYPE*/, null).iterateNext();
                if (node)
                    self.CurrentState = node.textContent;
                    
                node = document.evaluate("*[@class='vcard']/*[@class='adr' and (span[@class='type'] = 'Current' or span[@class='type'] = 'current')]/span[@class='postal-code']", hcardXmlNode, null, 0 /*XPathResult.ANY_TYPE*/, null).iterateNext();
                if (node)
                    self.CurrentZip = node.textContent;           
                    
                node = document.evaluate("*[@class='vcard']/*[@class='adr' and (span[@class='type'] = 'Current' or span[@class='type'] = 'current')]/abbr[@title='dom']", hcardXmlNode, null, 0 /*XPathResult.ANY_TYPE*/, null).iterateNext();
                if (node)
                    self.CurrentCountry = node.textContent;
                    
                node = document.evaluate("*[@class='vcard']/*[@class='adr' and (span[@class='type'] = 'Current' or span[@class='type'] = 'current')]/div[@class='geo']/abbr[@class='latitude']/@title", hcardXmlNode, null, 0 /*XPathResult.ANY_TYPE*/, null).iterateNext();
                if (node)
                    self.CurrentLatitude = node.textContent;
                    
                node = document.evaluate("*[@class='vcard']/*[@class='adr' and (span[@class='type'] = 'Current' or span[@class='type'] = 'current')]/div[@class='geo']/abbr[@class='longitude']/@title", hcardXmlNode, null, 0 /*XPathResult.ANY_TYPE*/, null).iterateNext();
                if (node)
                    self.CurrentLongitude = node.textContent;
            }
            else
            {
                for (var i = 0; i < hcardXmlNode.childNodes.length; i++)
                {
                    var vCardNode = null;
                    
                    for (var j = 0; j < hcardXmlNode.childNodes[i].attributes.length; j++)
                    {
                        if ((hcardXmlNode.childNodes[i].attributes[j].nodeName == "class") && (hcardXmlNode.childNodes[i].attributes[j].nodeValue == "vcard"))
                        {
                            vCardNode = hcardXmlNode.childNodes[i];
                            break; 
                        }
                    }
                    
                    if (vCardNode)
                    {
                        for (var j = 0; j < vCardNode.childNodes.length; j++)
                        {
                            for (var k = 0; k < vCardNode.childNodes[j].attributes.length; k++)
                            {
                                if (vCardNode.childNodes[j].attributes[k].nodeName == "class")
                                { 
                                    if (vCardNode.childNodes[j].attributes[k].nodeValue == "n")
                                    {
                                        for (var l = 0; l < vCardNode.childNodes[j].childNodes.length; l++)
                                        {
                                            if (vCardNode.childNodes[j].childNodes[l].attributes)
                                            {
                                                for (var m = 0; m < vCardNode.childNodes[j].childNodes[l].attributes.length; m++)
                                                {
                                                    if ((vCardNode.childNodes[j].childNodes[l].attributes[m].nodeName == "class") && (vCardNode.childNodes[j].childNodes[l].attributes[m].nodeValue == "given-name"))
                                                        self.FirstName = vCardNode.childNodes[j].childNodes[l].childNodes[0].nodeValue;
                                                    else if ((vCardNode.childNodes[j].childNodes[l].attributes[m].nodeName == "class") && (vCardNode.childNodes[j].childNodes[l].attributes[m].nodeValue == "family-name"))
                                                        self.LastName = vCardNode.childNodes[j].childNodes[l].childNodes[0].nodeValue;                                                    
                                                }
                                            }
                                        }
                                    }
                                    else if (vCardNode.childNodes[j].attributes[k].nodeValue == "uid")
                                    {
                                        self.UID = vCardNode.childNodes[j].childNodes[0].nodeValue;
                                    }
                                    if (vCardNode.childNodes[j].attributes[k].nodeValue == "email")
                                    {
                                        for (var l = 0; l < vCardNode.childNodes[j].attributes.length; l++)
                                        {
                                            if (vCardNode.childNodes[j].attributes[l].nodeName == "href")                                                  
                                                self.Email = vCardNode.childNodes[j].attributes[l].nodeValue;
                                        }
                                    }  
                                    if (vCardNode.childNodes[j].attributes[k].nodeValue == "url")
                                    {
                                        for (var l = 0; l < vCardNode.childNodes[j].attributes.length; l++)
                                        {
                                            if (vCardNode.childNodes[j].attributes[l].nodeName == "href")                                                  
                                                self.URL = vCardNode.childNodes[j].attributes[l].nodeValue;
                                        }
                                    }
                                    else if (vCardNode.childNodes[j].attributes[k].nodeValue == "nickname")
                                    {
                                        self.NickName = vCardNode.childNodes[j].childNodes[0].nodeValue;
                                    }
                                    if (vCardNode.childNodes[j].attributes[k].nodeValue == "tel")
                                    {
                                        for (var l = 0; l < vCardNode.childNodes[j].childNodes.length; l++)
                                        {
                                            if (vCardNode.childNodes[j].childNodes[l].attributes)
                                            {
                                                for (var m = 0; m < vCardNode.childNodes[j].childNodes[l].attributes.length; m++)
                                                {
                                                    if ((vCardNode.childNodes[j].childNodes[l].attributes[m].nodeName == "class") && (vCardNode.childNodes[j].childNodes[l].attributes[m].nodeValue == "value"))
                                                        self.Phone = vCardNode.childNodes[j].childNodes[l].childNodes[0].nodeValue;                                                   
                                                }
                                            }
                                        }
                                    }
                                    if (vCardNode.childNodes[j].attributes[k].nodeValue == "adr")
                                    {
                                        for (var l = 0; l < vCardNode.childNodes[j].childNodes.length; l++)
                                        {
                                            if (vCardNode.childNodes[j].childNodes[l].attributes)
                                            {
                                                for (var m = 0; m < vCardNode.childNodes[j].childNodes[l].attributes.length; m++)
                                                {
                                                    if ((vCardNode.childNodes[j].childNodes[l].attributes[m].nodeName == "class") && (vCardNode.childNodes[j].childNodes[l].attributes[m].nodeValue == "type"))
                                                        if ((vCardNode.childNodes[j].childNodes[l].childNodes[0].nodeValue == "home") || (vCardNode.childNodes[j].childNodes[l].childNodes[0].nodeValue == "Home"))
                                                        {
                                                            for (var n = 0; n < vCardNode.childNodes[j].childNodes.length; n++)
                                                            {
                                                                if (vCardNode.childNodes[j].childNodes[n].attributes)
                                                                {
                                                                    for (var o = 0; o < vCardNode.childNodes[j].childNodes[n].attributes.length; o++)
                                                                    {
                                                                        if ((vCardNode.childNodes[j].childNodes[n].attributes[o].nodeName == "class") && (vCardNode.childNodes[j].childNodes[n].attributes[o].nodeValue == "street-address"))
                                                                            self.HomeStreet = vCardNode.childNodes[j].childNodes[n].childNodes[0].nodeValue;
                                                                            
                                                                        if ((vCardNode.childNodes[j].childNodes[n].attributes[o].nodeName == "class") && (vCardNode.childNodes[j].childNodes[n].attributes[o].nodeValue == "locality"))
                                                                            self.HomeCity = vCardNode.childNodes[j].childNodes[n].childNodes[0].nodeValue;
                                                                            
                                                                        if ((vCardNode.childNodes[j].childNodes[n].attributes[o].nodeName == "class") && (vCardNode.childNodes[j].childNodes[n].attributes[o].nodeValue == "region"))
                                                                            self.HomeState = vCardNode.childNodes[j].childNodes[n].childNodes[0].nodeValue;
                                                                            
                                                                        if ((vCardNode.childNodes[j].childNodes[n].attributes[o].nodeName == "class") && (vCardNode.childNodes[j].childNodes[n].attributes[o].nodeValue == "postal-code"))
                                                                            self.HomeZip = vCardNode.childNodes[j].childNodes[n].childNodes[0].nodeValue;
                                                                            
                                                                        if ((vCardNode.childNodes[j].childNodes[n].attributes[o].nodeName == "title") && (vCardNode.childNodes[j].childNodes[n].attributes[o].nodeValue == "dom"))
                                                                            self.HomeCountry = vCardNode.childNodes[j].childNodes[n].childNodes[0].nodeValue;
                                                                    }
                                                                }
                                                            }
                                                        }
                                                        else if ((vCardNode.childNodes[j].childNodes[l].childNodes[0].nodeValue == "work") || (vCardNode.childNodes[j].childNodes[l].childNodes[0].nodeValue == "Work"))
                                                        {
                                                            for (var n = 0; n < vCardNode.childNodes[j].childNodes.length; n++)
                                                            {
                                                                if (vCardNode.childNodes[j].childNodes[n].attributes)
                                                                {
                                                                    for (var o = 0; o < vCardNode.childNodes[j].childNodes[n].attributes.length; o++)
                                                                    {
                                                                        if ((vCardNode.childNodes[j].childNodes[n].attributes[o].nodeName == "class") && (vCardNode.childNodes[j].childNodes[n].attributes[o].nodeValue == "street-address"))
                                                                            self.BusinessStreet = vCardNode.childNodes[j].childNodes[n].childNodes[0].nodeValue;
                                                                            
                                                                        if ((vCardNode.childNodes[j].childNodes[n].attributes[o].nodeName == "class") && (vCardNode.childNodes[j].childNodes[n].attributes[o].nodeValue == "locality"))
                                                                            self.BusinessCity = vCardNode.childNodes[j].childNodes[n].childNodes[0].nodeValue;
                                                                            
                                                                        if ((vCardNode.childNodes[j].childNodes[n].attributes[o].nodeName == "class") && (vCardNode.childNodes[j].childNodes[n].attributes[o].nodeValue == "region"))
                                                                            self.BusinessState = vCardNode.childNodes[j].childNodes[n].childNodes[0].nodeValue;
                                                                            
                                                                        if ((vCardNode.childNodes[j].childNodes[n].attributes[o].nodeName == "class") && (vCardNode.childNodes[j].childNodes[n].attributes[o].nodeValue == "postal-code"))
                                                                            self.BusinessZip = vCardNode.childNodes[j].childNodes[n].childNodes[0].nodeValue;
                                                                            
                                                                        if ((vCardNode.childNodes[j].childNodes[n].attributes[o].nodeName == "title") && (vCardNode.childNodes[j].childNodes[n].attributes[o].nodeValue == "dom"))
                                                                            self.BusinessCountry = vCardNode.childNodes[j].childNodes[n].childNodes[0].nodeValue;
                                                                    }
                                                                }
                                                            }
                                                        }
                                                        else if ((vCardNode.childNodes[j].childNodes[l].childNodes[0].nodeValue == "current") || (vCardNode.childNodes[j].childNodes[l].childNodes[0].nodeValue == "Current"))
                                                        {
                                                            for (var n = 0; n < vCardNode.childNodes[j].childNodes.length; n++)
                                                            {
                                                                if (vCardNode.childNodes[j].childNodes[n].attributes)
                                                                {
                                                                    for (var o = 0; o < vCardNode.childNodes[j].childNodes[n].attributes.length; o++)
                                                                    {
                                                                        if ((vCardNode.childNodes[j].childNodes[n].attributes[o].nodeName == "class") && (vCardNode.childNodes[j].childNodes[n].attributes[o].nodeValue == "street-address"))
                                                                            self.CurrentStreet = vCardNode.childNodes[j].childNodes[n].childNodes[0].nodeValue;
                                                                            
                                                                        if ((vCardNode.childNodes[j].childNodes[n].attributes[o].nodeName == "class") && (vCardNode.childNodes[j].childNodes[n].attributes[o].nodeValue == "locality"))
                                                                            self.CurrentCity = vCardNode.childNodes[j].childNodes[n].childNodes[0].nodeValue;
                                                                            
                                                                        if ((vCardNode.childNodes[j].childNodes[n].attributes[o].nodeName == "class") && (vCardNode.childNodes[j].childNodes[n].attributes[o].nodeValue == "region"))
                                                                            self.CurrentState = vCardNode.childNodes[j].childNodes[n].childNodes[0].nodeValue;
                                                                            
                                                                        if ((vCardNode.childNodes[j].childNodes[n].attributes[o].nodeName == "class") && (vCardNode.childNodes[j].childNodes[n].attributes[o].nodeValue == "postal-code"))
                                                                            self.CurrentZip = vCardNode.childNodes[j].childNodes[n].childNodes[0].nodeValue;
                                                                            
                                                                        if ((vCardNode.childNodes[j].childNodes[n].attributes[o].nodeName == "title") && (vCardNode.childNodes[j].childNodes[n].attributes[o].nodeValue == "dom"))
                                                                            self.CurrentCountry = vCardNode.childNodes[j].childNodes[n].childNodes[0].nodeValue;
                                                                    }
                                                               }
                                                          }
                                                     }
                                                }
                                            }
                                        }
                                    }
                                }
                            }
                        }
                        
                        break;
                    }                     
                }               
            }
        }
        
        self.buildHtml();
    }

    self.buildHtml();
}