locked
Web service to integrate CRM 2011 and AX 2009 ? RRS feed

  • Question

  • Hello,

    I want to make a web service that can integrate Ms Dynamics CRM 2011 and Ms Dynamics AX 2009.

    Any helpful links... Please.

    Wednesday, October 17, 2012 10:15 AM

Answers

  • Hi,

    Please find the following links which will be helpful to you,

    http://inventcrm.wordpress.com/2012/06/06/ms-crm-2011-custom-integration-with-dynamics-ax-2009-using-custom-web-services-2/

    http://inventcrm.wordpress.com/category/integration/


    Thanks & Regards, MS CRM Consultant, V.Surya. My Blog: http://inventcrm.wordpress.com/

    • Proposed as answer by SuryaMSCRMEditor Wednesday, October 17, 2012 10:37 AM
    • Marked as answer by DynamicsCRM31 Monday, November 19, 2012 9:44 AM
    Wednesday, October 17, 2012 10:37 AM
    Answerer
  • Hi Milan,

    In my previous i have given the links for pulling the data from CRM and push into AX via web service

    The following link will be take the data from AX and insert into CRM via web service.

    http://blogs.msdn.com/b/apurvghai/archive/2011/08/26/create-your-custom-web-service-and-integrate-with-crm-2011-online.aspx


    Thanks & Regards, MS CRM Consultant, V.Surya. My Blog: http://inventcrm.wordpress.com/

    Thursday, October 18, 2012 7:17 AM
    Answerer
  • Hi,

    Yes we want to create two web service one is for AX to CRM and another is CRM to AX. In CRM we can call in ribbon button or JavaScript event (onsave) better way is calling web service in ribbon button. 

    Yes first you want to create one web service for AX (AIF web services) (publish in IIS). Then call that web service method (which method you need) in CRM via JSON. (That is code i have posted in my blog).


    Thanks & Regards, MS CRM Consultant, V.Surya. My Blog: http://inventcrm.wordpress.com/

    • Marked as answer by DynamicsCRM31 Monday, November 19, 2012 9:45 AM
    Thursday, October 25, 2012 6:04 AM
    Answerer
  • Hi,

    What entity you going to integrate with CRM to AX and Same way AX to CRM.

    Sample Code:  submitting CRM (Account) to AX (customer).

    SubmitToAx = function ()            // In ribbon button or in jscript save event (call SubmitToAX)

    {
        var customername = Xrm.Page.getAttribute("name").getValue();
        var ocustomergroup = Xrm.Page.getAttribute("accounttypes");
        var customergroup = '';
        if (ocustomergroup != null)

       {
            customergroup = ocustomergroup.getSelectedOption().text;
        }

        var oDeliveryTerm = Xrm.Page.getAttribute("address1_shippingmethodcode");
        var DeliveryTerm = '';
        if (oDeliveryTerm != null) {
            DeliveryTerm = oDeliveryTerm.getSelectedOption().text;
        }

        var oDeliveryMode = Xrm.Page.getAttribute("address1_freighttermscode");
        var DeliveryMode = '';
        if (oDeliveryMode != null) {
            DeliveryMode = oDeliveryMode.getSelectedOption().text;
        }

        var oCurrency = Xrm.Page.getAttribute("transactioncurrencyid");
        var Currency = ''
        if (oCurrency != null) {
            var lookUpObjectValue = oCurrency.getValue();
            if (lookUpObjectValue != null) {
                var Currency = lookUpObjectValue[0].name;
            }
        }

        var oPaymMode = Xrm.Page.getAttribute("paymenttermscode");
        var PaymMode = '';
        if (oPaymMode != null) {
            PaymMode = oPaymMode.getSelectedOption().text;
        }

        var oNameAlias = Xrm.Page.getAttribute("primarycontactid");
        var NameAlias = ''
        if (oNameAlias != null) {
            var lookUpObjectValue = oNameAlias.getValue();
            if (lookUpObjectValue != null) {
                var NameAlias = lookUpObjectValue[0].name;
            }
        }

        var EmailId = Xrm.Page.getAttribute("emailaddress1").getValue();
        var Mobile = Xrm.Page.getAttribute("telephone2").getValue();
        var Extension = Xrm.Page.getAttribute("address1_telephone1").getValue();
        var Phone = Xrm.Page.getAttribute("telephone1").getValue();
        var TelefaxNo = Xrm.Page.getAttribute("fax").getValue();
        var URL_InternalAddress = Xrm.Page.getAttribute("websiteurl").getValue();
        var City = Xrm.Page.getAttribute("address1_city").getValue();
        var Street = Xrm.Page.getAttribute("address1_line1").getValue();

        var xml = '' +
        '<?xml version="1.0" encoding="utf-8"?>' +
        '<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">' +
          '<soap:Body>' +
            '<ACustomerDetails xmlns="http://tempuri.org/">' +
              '<CRMCustomerAccount>' + customername + '</CRMCustomerAccount>' +
              '<CustomerGroup>' + customergroup + '</CustomerGroup>' +
              '<DeliveryTerm>' + DeliveryTerm + '</DeliveryTerm>' +
              '<DeliveryMode>' + DeliveryMode + '</DeliveryMode>' +
              '<Currency>' + Currency + '</Currency>' +
              '<PaymMode>' + PaymMode + '</PaymMode>' +
              '<NameAlias>' + NameAlias + '</NameAlias>' +
              '<EmailId>' + EmailId + '</EmailId>' +
              '<Mobile>' + Mobile + '</Mobile>' +
              '<Extension>' + Extension + '</Extension>' +
              '<Phone>' + Phone + '</Phone>' +
              '<TelefaxNo>' + TelefaxNo + '</TelefaxNo>' +
              '<URL_InternalAddress>' + URL_InternalAddress + '</URL_InternalAddress>' +
              '<Address>' + Street + '</Address>' +
              '<Name>' + customername + '</Name>' +
              '<City>' + City + '</City>' +
              '<Street>' + Street + '</Street>' +
            '</ACustomerDetails>' +
          '</soap:Body>' +
        '</soap:Envelope>';

        xmlHttp = new ActiveXObject('Msxml2.XMLHTTP');
        xmlHttp.open('POST', 'http://localhost:95/Service1.asmx?op=ACustomerDetails', false);
        xmlHttp.setRequestHeader('Content-Type', 'text/xml; charset=utf-8');
        xmlHttp.setRequestHeader('Content-Length', xml.length);
        xmlHttp.setRequestHeader('SOAPAction', 'http://tempuri.org/ACustomerDetails');
        xmlHttp.send(xml);

        var resultXml = xmlHttp.responseXML;

        if (resultXml.text == 'Unable to connect to the remote server') {
            alert('Unable to connect to the remote server');
        }
    }

    AX (Item) to CRM (Product)

                           

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Web.Services;
    using System.ServiceModel.Description;
    using Microsoft.Xrm.Sdk;
    using Microsoft.Xrm.Sdk.Client;
    using Microsoft.Xrm.Sdk.Query;
    using Microsoft.Xrm.Sdk.Messages;

    namespace CutomWebApplication
    {
        /// <summary>
        /// Summary description for CRMWebService
        /// </summary>
        [WebService(Namespace = "http://tempuri.org/")]
        [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
        [System.ComponentModel.ToolboxItem(false)]
        // To allow this Web Service to be called from script, using ASP.NET AJAX, uncomment the following line. 
        // [System.Web.Script.Services.ScriptService]

           

        public class CRMWebService : System.Web.Services.WebService
        {

    [WebMethod]

            public string CreateCurrency(string cname, string ccode, string cexch, string csymbol, string cpre)
            {
                //decimal cexch,
                string message = string.Empty;
                try
                {
                    OrganizationServiceProxy serviceProxy;
                    ClientCredentials deviceCredentials = null;
                    ClientCredentials clientCredentials = null;
                    Guid currencyname = Guid.Empty;


                    //Organization URL
                    Uri OrganizationUri = new Uri(String.Format("http://chnascsrv02:5555/CRM/XRMServices/2011/Organization.svc"));
                    //Discovery URL
                    Uri HomeRealmUri = new Uri(String.Format("http://chnascsrv02:5555/XRMServices/2011/Discovery.svc"));
                    //Setting Client Credentials
                    clientCredentials = this.GetCredentials("admin", "xxx@x123");  // (username =admin, Pwd: xxx@x123)    //Get the Device Id and Password
                    //  deviceCredentials = this.GetDeviceCredentials();
                    //Using Organization Service Proxy to instantiate the CRM Web Service
                    using (serviceProxy = new OrganizationServiceProxy(OrganizationUri, HomeRealmUri, clientCredentials, deviceCredentials))
                    {
                        // This statement is required to enable early-bound type support.
                        serviceProxy.ServiceConfiguration.CurrentServiceEndpoint.Behaviors.Add(new ProxyTypesBehavior());
                        IOrganizationService service = (IOrganizationService)serviceProxy;
                        //Define Entity Object
                        Entity currency = new Entity("transactioncurrency");

                        //Specify the attributes
                        currency.Attributes["currencyname"] = cname;
                        currency.Attributes["isocurrencycode"] = ccode;
                        currency.Attributes["exchangerate"] = Convert.ToDecimal(cexch);
                        currency.Attributes["currencysymbol"] = csymbol;
                        currency.Attributes["currencyprecision"] = Convert.ToInt32(cpre);


                        //Execute the service
                        currencyname = service.Create(currency);


                        //Confirmation Message
                        message = "Currency Created with Curreny Name:- " + cname + " Guid is" + currencyname.ToString();

                    }
                }
                catch (Exception ex)
                {
                    message = ex.Message;
                }
                //returns the message
                return message;
            }



            protected virtual ClientCredentials GetCredentials(string username, string password)
            {
                ClientCredentials credentials = new ClientCredentials();
                credentials.UserName.UserName = username;
                credentials.UserName.Password = password;
                return credentials;
            }



    Thanks & Regards, MS CRM Consultant, V.Surya. My Blog: http://inventcrm.wordpress.com/

    • Marked as answer by DynamicsCRM31 Monday, November 19, 2012 9:45 AM
    Thursday, October 25, 2012 9:55 AM
    Answerer

All replies

  • Hi,

    Please find the following links which will be helpful to you,

    http://inventcrm.wordpress.com/2012/06/06/ms-crm-2011-custom-integration-with-dynamics-ax-2009-using-custom-web-services-2/

    http://inventcrm.wordpress.com/category/integration/


    Thanks & Regards, MS CRM Consultant, V.Surya. My Blog: http://inventcrm.wordpress.com/

    • Proposed as answer by SuryaMSCRMEditor Wednesday, October 17, 2012 10:37 AM
    • Marked as answer by DynamicsCRM31 Monday, November 19, 2012 9:44 AM
    Wednesday, October 17, 2012 10:37 AM
    Answerer
  • Hi Milan,

    I am using Javascript code(Client-side) to call a Webservice in Crm 2011.

    I am using xmlhttp request and getting xmlHttp.responseXML as response.

    mention webservice url in xmlHttprequest.open method.

    //Calling WebService :JavaScript
    
                
                var xmlHttp;
                var input=Xrm.Page.getAttribute("new_value").getValue();
                xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
                xmlHttp.open('POST', 'http://servername/Numbers2WordsConversion/Service.asmx/GetWords', false);
                xmlHttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
                xmlHttp.send("number=" + input);
                var xmlDoc = xmlHttp.responseXML;
                var responseElement = xmlDoc.getElementsByTagName("string")[0];
                var exch = responseElement.firstChild.nodeValue;
                Xrm.Page.getAttribute("new_valueinwords").setValue(exch);

    In the above code ,,number in xmlHttp.send() is parameter to webservice. and assigning response value to crm field new_valueinwords

    I hope this would be helpful to you.



    Wednesday, October 17, 2012 10:53 AM
  • Hi,

    Sasank ,Thanks for your response but your answer is not related to my question.

    And Thanks SuryaCRM ,I would like to implement your solution... and will let you know if any query arise.

    Thursday, October 18, 2012 4:41 AM
  • Hi,

    Microsoft Ax provides Application Integration Framework (AIF) , so you should be able to implement your requirement easily.

    Check: http://msdn.microsoft.com/en-us/library/bb496530%28v=ax.50%29.aspx


    Contact Me
    Follow me on Twitter
    Make sure to "Vote as Helpful" and "Mark As Answer",if you get answer of your question.

    Thursday, October 18, 2012 6:16 AM
    Moderator
  • Hi Milan,

    In my previous i have given the links for pulling the data from CRM and push into AX via web service

    The following link will be take the data from AX and insert into CRM via web service.

    http://blogs.msdn.com/b/apurvghai/archive/2011/08/26/create-your-custom-web-service-and-integrate-with-crm-2011-online.aspx


    Thanks & Regards, MS CRM Consultant, V.Surya. My Blog: http://inventcrm.wordpress.com/

    Thursday, October 18, 2012 7:17 AM
    Answerer
  • Hello Surya,

    As far i have studied your post tell me how to call web service ...

    But then i have to make that web service first.

    So i am not getting exact solution.. What i understand is if i want to integrate CRM 2011 and AX 2009 through web service then i have to make two web service ,one is for CRM and one is for AX. And then i will call CRM web service on AX when save or update event fires and vice-versa in AX.Am i going in right direction ?

    Please Suggest.


    Monday, October 22, 2012 8:48 AM
  • What i understand is correct way or any other way.. Please suggests.
    Tuesday, October 23, 2012 10:02 AM
  • Hi,

    Yes we want to create two web service one is for AX to CRM and another is CRM to AX. In CRM we can call in ribbon button or JavaScript event (onsave) better way is calling web service in ribbon button. 

    Yes first you want to create one web service for AX (AIF web services) (publish in IIS). Then call that web service method (which method you need) in CRM via JSON. (That is code i have posted in my blog).


    Thanks & Regards, MS CRM Consultant, V.Surya. My Blog: http://inventcrm.wordpress.com/

    • Marked as answer by DynamicsCRM31 Monday, November 19, 2012 9:45 AM
    Thursday, October 25, 2012 6:04 AM
    Answerer
  • Hello Surya,

    Thanks for your kind reply.

    Ya.. I am going to create a CRM web service first which i will call on AX.

    Then i will create AX web service (AIF as you said) and will call that on CRM (on save button).

    And i dont know JSON... Can i call it through normal javascript ? or is there any other way to call ?

    Thursday, October 25, 2012 6:45 AM
  • Hi,

    What entity you going to integrate with CRM to AX and Same way AX to CRM.

    Sample Code:  submitting CRM (Account) to AX (customer).

    SubmitToAx = function ()            // In ribbon button or in jscript save event (call SubmitToAX)

    {
        var customername = Xrm.Page.getAttribute("name").getValue();
        var ocustomergroup = Xrm.Page.getAttribute("accounttypes");
        var customergroup = '';
        if (ocustomergroup != null)

       {
            customergroup = ocustomergroup.getSelectedOption().text;
        }

        var oDeliveryTerm = Xrm.Page.getAttribute("address1_shippingmethodcode");
        var DeliveryTerm = '';
        if (oDeliveryTerm != null) {
            DeliveryTerm = oDeliveryTerm.getSelectedOption().text;
        }

        var oDeliveryMode = Xrm.Page.getAttribute("address1_freighttermscode");
        var DeliveryMode = '';
        if (oDeliveryMode != null) {
            DeliveryMode = oDeliveryMode.getSelectedOption().text;
        }

        var oCurrency = Xrm.Page.getAttribute("transactioncurrencyid");
        var Currency = ''
        if (oCurrency != null) {
            var lookUpObjectValue = oCurrency.getValue();
            if (lookUpObjectValue != null) {
                var Currency = lookUpObjectValue[0].name;
            }
        }

        var oPaymMode = Xrm.Page.getAttribute("paymenttermscode");
        var PaymMode = '';
        if (oPaymMode != null) {
            PaymMode = oPaymMode.getSelectedOption().text;
        }

        var oNameAlias = Xrm.Page.getAttribute("primarycontactid");
        var NameAlias = ''
        if (oNameAlias != null) {
            var lookUpObjectValue = oNameAlias.getValue();
            if (lookUpObjectValue != null) {
                var NameAlias = lookUpObjectValue[0].name;
            }
        }

        var EmailId = Xrm.Page.getAttribute("emailaddress1").getValue();
        var Mobile = Xrm.Page.getAttribute("telephone2").getValue();
        var Extension = Xrm.Page.getAttribute("address1_telephone1").getValue();
        var Phone = Xrm.Page.getAttribute("telephone1").getValue();
        var TelefaxNo = Xrm.Page.getAttribute("fax").getValue();
        var URL_InternalAddress = Xrm.Page.getAttribute("websiteurl").getValue();
        var City = Xrm.Page.getAttribute("address1_city").getValue();
        var Street = Xrm.Page.getAttribute("address1_line1").getValue();

        var xml = '' +
        '<?xml version="1.0" encoding="utf-8"?>' +
        '<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">' +
          '<soap:Body>' +
            '<ACustomerDetails xmlns="http://tempuri.org/">' +
              '<CRMCustomerAccount>' + customername + '</CRMCustomerAccount>' +
              '<CustomerGroup>' + customergroup + '</CustomerGroup>' +
              '<DeliveryTerm>' + DeliveryTerm + '</DeliveryTerm>' +
              '<DeliveryMode>' + DeliveryMode + '</DeliveryMode>' +
              '<Currency>' + Currency + '</Currency>' +
              '<PaymMode>' + PaymMode + '</PaymMode>' +
              '<NameAlias>' + NameAlias + '</NameAlias>' +
              '<EmailId>' + EmailId + '</EmailId>' +
              '<Mobile>' + Mobile + '</Mobile>' +
              '<Extension>' + Extension + '</Extension>' +
              '<Phone>' + Phone + '</Phone>' +
              '<TelefaxNo>' + TelefaxNo + '</TelefaxNo>' +
              '<URL_InternalAddress>' + URL_InternalAddress + '</URL_InternalAddress>' +
              '<Address>' + Street + '</Address>' +
              '<Name>' + customername + '</Name>' +
              '<City>' + City + '</City>' +
              '<Street>' + Street + '</Street>' +
            '</ACustomerDetails>' +
          '</soap:Body>' +
        '</soap:Envelope>';

        xmlHttp = new ActiveXObject('Msxml2.XMLHTTP');
        xmlHttp.open('POST', 'http://localhost:95/Service1.asmx?op=ACustomerDetails', false);
        xmlHttp.setRequestHeader('Content-Type', 'text/xml; charset=utf-8');
        xmlHttp.setRequestHeader('Content-Length', xml.length);
        xmlHttp.setRequestHeader('SOAPAction', 'http://tempuri.org/ACustomerDetails');
        xmlHttp.send(xml);

        var resultXml = xmlHttp.responseXML;

        if (resultXml.text == 'Unable to connect to the remote server') {
            alert('Unable to connect to the remote server');
        }
    }

    AX (Item) to CRM (Product)

                           

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Web.Services;
    using System.ServiceModel.Description;
    using Microsoft.Xrm.Sdk;
    using Microsoft.Xrm.Sdk.Client;
    using Microsoft.Xrm.Sdk.Query;
    using Microsoft.Xrm.Sdk.Messages;

    namespace CutomWebApplication
    {
        /// <summary>
        /// Summary description for CRMWebService
        /// </summary>
        [WebService(Namespace = "http://tempuri.org/")]
        [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
        [System.ComponentModel.ToolboxItem(false)]
        // To allow this Web Service to be called from script, using ASP.NET AJAX, uncomment the following line. 
        // [System.Web.Script.Services.ScriptService]

           

        public class CRMWebService : System.Web.Services.WebService
        {

    [WebMethod]

            public string CreateCurrency(string cname, string ccode, string cexch, string csymbol, string cpre)
            {
                //decimal cexch,
                string message = string.Empty;
                try
                {
                    OrganizationServiceProxy serviceProxy;
                    ClientCredentials deviceCredentials = null;
                    ClientCredentials clientCredentials = null;
                    Guid currencyname = Guid.Empty;


                    //Organization URL
                    Uri OrganizationUri = new Uri(String.Format("http://chnascsrv02:5555/CRM/XRMServices/2011/Organization.svc"));
                    //Discovery URL
                    Uri HomeRealmUri = new Uri(String.Format("http://chnascsrv02:5555/XRMServices/2011/Discovery.svc"));
                    //Setting Client Credentials
                    clientCredentials = this.GetCredentials("admin", "xxx@x123");  // (username =admin, Pwd: xxx@x123)    //Get the Device Id and Password
                    //  deviceCredentials = this.GetDeviceCredentials();
                    //Using Organization Service Proxy to instantiate the CRM Web Service
                    using (serviceProxy = new OrganizationServiceProxy(OrganizationUri, HomeRealmUri, clientCredentials, deviceCredentials))
                    {
                        // This statement is required to enable early-bound type support.
                        serviceProxy.ServiceConfiguration.CurrentServiceEndpoint.Behaviors.Add(new ProxyTypesBehavior());
                        IOrganizationService service = (IOrganizationService)serviceProxy;
                        //Define Entity Object
                        Entity currency = new Entity("transactioncurrency");

                        //Specify the attributes
                        currency.Attributes["currencyname"] = cname;
                        currency.Attributes["isocurrencycode"] = ccode;
                        currency.Attributes["exchangerate"] = Convert.ToDecimal(cexch);
                        currency.Attributes["currencysymbol"] = csymbol;
                        currency.Attributes["currencyprecision"] = Convert.ToInt32(cpre);


                        //Execute the service
                        currencyname = service.Create(currency);


                        //Confirmation Message
                        message = "Currency Created with Curreny Name:- " + cname + " Guid is" + currencyname.ToString();

                    }
                }
                catch (Exception ex)
                {
                    message = ex.Message;
                }
                //returns the message
                return message;
            }



            protected virtual ClientCredentials GetCredentials(string username, string password)
            {
                ClientCredentials credentials = new ClientCredentials();
                credentials.UserName.UserName = username;
                credentials.UserName.Password = password;
                return credentials;
            }



    Thanks & Regards, MS CRM Consultant, V.Surya. My Blog: http://inventcrm.wordpress.com/

    • Marked as answer by DynamicsCRM31 Monday, November 19, 2012 9:45 AM
    Thursday, October 25, 2012 9:55 AM
    Answerer
  • I would suggest Scribe

    http://scribesoft.com/Microsoft

    Thursday, October 25, 2012 1:32 PM
  • Hello Sasank,

    Thanks for your valuable information about how calling web service through javascript.

    But here you have calles asp.net web service (ext. .asmx) ..i have wcf (ext. .svc) web service.. How can i call that in javascript ?

    Wednesday, October 31, 2012 9:02 AM
  • Hello Surya,

    Very thankful to you for sharing this.

    I am working on this. But i stuck at one thing that i have provided AIF (AX) web service in .svc format. And here we are calling .asmx format.

    How can i call .svc web service in below line of your code. ?

    xmlHttp.open('POST', 'http://localhost:95/Service1.asmx?op=ACustomerDetails', false);

    Wednesday, October 31, 2012 9:14 AM
  • Hi Milan,

    They want to invoke the AIF web services (AX) into .net and after that they can make it has separate web service in .NET and publish in IIS then you will get an the web service in this format.

    xmlHttp.open('POST', 'http://localhost:95/Service1.asmx?op=ACustomerDetails', false);


    Thanks & Regards, MS CRM Consultant, V.Surya. My Blog: http://inventcrm.wordpress.com/

    Thursday, November 1, 2012 5:41 AM
    Answerer
  • Hi Surya,

    Thanks.

    But for this i think rework is needed. They wont make again the same thing in .Net.

    I will have to call .svc web service instead of .asmx .

    Is there any way if you know.? Will be great help to me.

    Thursday, November 1, 2012 6:11 AM
  • Hi milan,

    Did you try like this....

     xmlHttp.open('POST', 'http://servername/Numbers2WordsConversion/Service.asmx/GetWords', false);

     place your wcf url and also name of the method in the above....

    if it is not working , kindly please inform i ll try that one.

    Thanks,

    SASANK K

    Thursday, November 1, 2012 6:33 AM