    /* 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, phone1, phone2, defaultStreet, defaultCity, defaultState, defaultZip, defaultCountry, defaultLatitude, defaultLongitude, uid, url, org)
{
    this.formatType = "vcard";
    this.formatRootClassName = "vcard";
    this.FirstName = firstName;
    this.LastName = lastName;
    this.Email = email;
    this.Phone1 = phone1;
	this.Phone2 = phone2;
    
    this.DefaultStreet = defaultStreet;
    this.DefaultCity = defaultCity;
    this.DefaultState = defaultState;
    this.DefaultZip = defaultZip;
    this.DefaultCountry = defaultCountry;
    this.DefaultLatitude = defaultLatitude;
    this.DefaultLongitude = defaultLongitude;
    
    this.UID = uid;
    this.Org = org;
    this.URL = url;
    
    
    this.updateCallback;
    this.HTML;
    
    var self = this;
    
    this.clearProps = function()
    {
        self.FirstName = null;
        self.LastName = null;
        self.Email = null;
        self.Phone1 = null;
		self.Phone2 = null;
        
        self.DefaultStreet = null;
        self.DefaultCity = null;
        self.DefaultState = null;
        self.DefaultZip = null;
        self.DefaultCountry = null;
        self.DefaultLatitude = null;
        self.DefaultLongitude = null;
        
        self.UID = null;
        self.Org = null;
        self.URL = null;
        
        self.buildHtml();
    }
    
    this.buildHtml = function()
    {
        var hCardString = "<div class=\"vcard uid\" title=\"" + self.UID + "\">";  
        
        if (self.FirstName || self.LastName)
        {    
            hCardString += "<div class=\"fn 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.Org)
            hCardString += "<span class=\"org\">" + self.Org + "</span>";      
                       
        if (self.DefaultStreet || self.DefaultCity || self.DefaultState || self.DefaultZip || self.DefaultCountry || self.DefaultLatitude || self.DefaultLongitude)
        {
            hCardString += "<div class=\"adr\">";
            
            if (self.DefaultStreet)
                hCardString += "<div class=\"street-address\">" + self.DefaultStreet + "</div>";
            
            if (self.DefaultCity)
                hCardString += "<span class=\"locality\">" + self.DefaultCity + ",</span> ";
                
            if (self.DefaultState)
                hCardString += "<span class=\"region\">" + self.DefaultState + "</span> ";
                
            if (self.DefaultZip)
                hCardString += "<span class=\"postal-code\">" + self.DefaultZip + ",</span> ";
                
            if (self.DefaultCountry)
                hCardString += "<span class=\"country-name\">" + self.DefaultCountry + "</span>";

                
            if (self.DefaultLatitude && self.DefaultLongitude)
            {
                hCardString += "<div class=\"geo\"><abbr class=\"latitude\" title=\"" + self.DefaultLatitude + "\">" + self.DefaultLatitude + "</abbr><abbr class=\"longitude\" title=\"" + self.DefaultLongitude + "\">" + self.DefaultLongitude + "</abbr></div>";
            }
                     
            hCardString += "</div>";                  
        }
                
        if (self.URL)
            hCardString += "<a class=\"url\" href=\"" + self.URL + "\">" + self.URL + "</a>"; 
		
		 //if (self.Email)
           // hCardString +=  self.Email;

		if (self.Phone1)
            hCardString += "<div class=\"tel\">T:<span class=\"value\">" + self.Phone1 + "</span></div>";

		if (self.Phone2)
            hCardString += "<div class=\"tel\">F:<span class=\"value\">" + self.Phone2 + "</span></div>";

		if (self.Email)
            hCardString += "<a class=\"email\" href=\"mailto:" + self.Email + "\">" + self.Email + "</a>";
        
        hCardString += "</div>";
        self.HTML = hCardString;
    }

    this.initFromXml = function(hCardXmlNode)
    {
        this.clearProps();
        self.xmlData = hCardXmlNode;
        self.parseXml(hCardXmlNode);
        
        
        if (hCardXmlNode.xml)
        {
            self.HTML =  hCardXmlNode.xml;
        }
        else
        {
            var serializer = new XMLSerializer();
            self.HTML = serializer.serializeToString(hCardXmlNode);
        }
    }
    
    // Initialize all contact properties from the hCard XML segment and rebuild hCard HTML.
    this.initFromXmlString = function(hCardXmlString)
    {
        var hCardXmlNode;
        
        // IE 5+
        if (window.ActiveXObject)
        {
            hCardXmlNode = new ActiveXObject("Microsoft.XMLDOM");
            hCardXmlNode.async=false;
            hCardXmlNode.loadXML(hCardXmlString);
            hCardXmlNode.setProperty("SelectionLanguage", "XPath");
        }
        // Mozilla etc.
        else if (typeof DOMParser != "undefined")
        {
            var domParser = new DOMParser();
            hCardXmlNode = domParser.parseFromString(hCardXmlString, 'application/xml');
        }
        
        this.clearProps();
        self.HTML = hCardXmlString;
        self.xmlData = hCardXmlNode;
        self.parseXml(hCardXmlNode);
    }    
        
    this.parseXml = function(hCardXmlNode)
    {        
        // IE 5+
        if (window.ActiveXObject)
        {
            var node;
            
            node = hCardXmlNode.selectSingleNode("//*[contains(@class, 'vcard')]//*[contains(@class, 'given-name')]");
            if (node)
                self.FirstName = node.nodeTypedValue;
                
            node = hCardXmlNode.selectSingleNode("//*[contains(@class, 'vcard')]//*[contains(@class, 'uid')]");
            if (node)
                self.UID = node.nodeTypedValue;
                
            node = hCardXmlNode.selectSingleNode("//*[contains(@class, 'vcard')]//*[contains(@class, 'url')]/@href");
            if (node)
                self.URL = node.nodeTypedValue;
                
            node = hCardXmlNode.selectSingleNode("//*[contains(@class, 'vcard')]//*[contains(@class, 'org')]");
            if (node)
                self.Org = node.nodeTypedValue;                                 
            
            node = hCardXmlNode.selectSingleNode("//*[contains(@class, 'vcard')]//*[contains(@class, 'family-name')]");
            if (node)
                self.LastName = node.nodeTypedValue;
            
            node = hCardXmlNode.selectSingleNode("//*[contains(@class, 'vcard')]//a[contains(@class, 'email')]");
            if (node)
                self.Email = node.nodeTypedValue;
                
            node = hCardXmlNode.selectSingleNode("//*[contains(@class, 'vcard')]//*[contains(@class, 'tel')]//*[contains(@class, 'value')]");
            if (node)
                self.Phone1 = node.nodeTypedValue;   
			
			node = hCardXmlNode.selectSingleNode("//*[contains(@class, 'vcard')]//*[contains(@class, 'tel')]//*[contains(@class, 'value')]");
            if (node)
                self.Phone2 = node.nodeTypedValue;     
                                
            node = hCardXmlNode.selectSingleNode("//*[contains(@class, 'vcard')]//*[contains(@class, 'street-address')]");
            if (node)
                self.DefaultStreet = node.nodeTypedValue;
            
            node = hCardXmlNode.selectSingleNode("//*[contains(@class, 'vcard')]//*[contains(@class, 'locality')]");
            if (node)
                self.DefaultCity = node.nodeTypedValue;
            
            node = hCardXmlNode.selectSingleNode("//*[contains(@class, 'vcard')]//*[contains(@class, 'region')]");
            if (node)
                self.DefaultState = node.nodeTypedValue;
                
            node = hCardXmlNode.selectSingleNode("//*[contains(@class, 'vcard')]//*[contains(@class, 'postal-code')]");
            if (node)
                self.DefaultZip = node.nodeTypedValue;           
                
            node = hCardXmlNode.selectSingleNode("//*[contains(@class, 'vcard')]//*[contains(@class, 'country-name')]");
            if (node)
                self.DefaultCountry = node.nodeTypedValue;   
                
            node = hCardXmlNode.selectSingleNode("//*[contains(@class, 'vcard')]//*[contains(@class, 'geo')]/abbr[contains(@class, 'latitude')]/@title");
            if (node)
                self.DefaultLatitude = node.nodeTypedValue;
                
            node = hCardXmlNode.selectSingleNode("//*[contains(@class, 'vcard')]//*[contains(@class, 'geo')]/abbr[contains(@class, 'longitude')]/@title");
            if (node)
                self.DefaultLongitude = node.nodeTypedValue;       
                
        }
        // Mozilla etc.
        else if (typeof DOMParser != "undefined")
        {
            if (document.evaluate)
            {               
                var node;
                
                node = document.evaluate("//*[contains(@class, 'vcard')]//*[contains(@class, 'given-name')]", hCardXmlNode, null, 0 /*XPathResult.ANY_TYPE*/, null).iterateNext();
                if (node)
                    self.FirstName = node.textContent;
                    
                node = document.evaluate("//*[contains(@class, 'vcard')]//*[contains(@class, 'uid')]", hCardXmlNode, null, 0 /*XPathResult.ANY_TYPE*/, null).iterateNext();
                if (node)
                    self.UID = node.textContent;
                    
                node = document.evaluate("//*[contains(@class, 'vcard')]//*[contains(@class, 'url')]/@href", hCardXmlNode, null, 0 /*XPathResult.ANY_TYPE*/, null).iterateNext();
                if (node)
                    self.URL = node.textContent;
                    
                node = document.evaluate("//*[contains(@class, 'vcard')]//*[contains(@class, 'org')]", hCardXmlNode, null, 0 /*XPathResult.ANY_TYPE*/, null).iterateNext();
                if (node)
                    self.Org = node.textContent;                                   
                
                node = document.evaluate("//*[contains(@class, 'vcard')]//*[contains(@class, 'family-name')]", hCardXmlNode, null, 0 /*XPathResult.ANY_TYPE*/, null).iterateNext();
                if (node)
                    self.LastName = node.textContent;
                
                node = document.evaluate("//*[contains(@class, 'vcard')]//a[contains(@class, 'email')]", hCardXmlNode, null, 0 /*XPathResult.ANY_TYPE*/, null).iterateNext();
                if (node)
                    self.Email = node.textContent;
                    
                node = document.evaluate("//*[contains(@class, 'vcard')]//*[contains(@class, 'tel')]//*[contains(@class, 'value')]", hCardXmlNode, null, 0 /*XPathResult.ANY_TYPE*/, null).iterateNext();
                if (node)
                    self.Phone1 = node.textContent;   
				
				node = document.evaluate("//*[contains(@class, 'vcard')]//*[contains(@class, 'tel')]//*[contains(@class, 'value')]", hCardXmlNode, null, 0 /*XPathResult.ANY_TYPE*/, null).iterateNext();
                if (node)
                    self.Phone2 = node.textContent;   
                    
                node = document.evaluate("//*[contains(@class, 'vcard')]//*[contains(@class, 'street-address')]", hCardXmlNode, null, 0 /*XPathResult.ANY_TYPE*/, null).iterateNext();
                if (node)
                    self.DefaultStreet = node.textContent;
                
                node = document.evaluate("//*[contains(@class, 'vcard')]//*[contains(@class, 'locality')]", hCardXmlNode, null, 0 /*XPathResult.ANY_TYPE*/, null).iterateNext();
                if (node)
                    self.DefaultCity = node.textContent;
                
                node = document.evaluate("//*[contains(@class, 'vcard')]//*[contains(@class, 'region')]", hCardXmlNode, null, 0 /*XPathResult.ANY_TYPE*/, null).iterateNext();
                if (node)
                    self.DefaultState = node.textContent;
                    
                node = document.evaluate("//*[contains(@class, 'vcard')]//*[contains(@class, 'postal-code')]", hCardXmlNode, null, 0 /*XPathResult.ANY_TYPE*/, null).iterateNext();
                if (node)
                    self.DefaultZip = node.textContent;           
                    
                node = document.evaluate("//*[contains(@class, 'vcard')]//*[contains(@class, 'country-name')]", hCardXmlNode, null, 0 /*XPathResult.ANY_TYPE*/, null).iterateNext();
                if (node)
                    self.DefaultCountry = node.textContent;
                    
                node = document.evaluate("//*[contains(@class, 'vcard')]//*[contains(@class, 'geo')]/abbr[contains(@class, 'latitude')]/@title", hCardXmlNode, null, 0 /*XPathResult.ANY_TYPE*/, null).iterateNext();
                if (node)
                    self.DefaultLatitude = node.textContent;
                    
                node = document.evaluate("//*[contains(@class, 'vcard')]//*[contains(@class, 'geo')]/abbr[contains(@class, 'longitude')]/@title", hCardXmlNode, null, 0 /*XPathResult.ANY_TYPE*/, null).iterateNext();
                if (node)
                    self.DefaultLongitude = node.textContent;        
				}
        }
    }
    
    self.buildHtml();
    self.initFromXmlString(self.HTML);
}