Load JavaScript WebResource at runtime

Update... added Browser-agnosticity


function LoadWebResource(resource)
{
   var httpRequest = _createXMLHttpRequest();
   httpRequest.open("GET", Xrm.Page.context.getServerUrl() + "/webresources/" + resource, false);
   httpRequest.send(null);
   try {
      eval(httpRequest.responseText);
   }
   catch (e) {
      alert("Error loading " + resource + ":\n" + e.description);
   }
}

// Browser-agnostic factory function
function _createXMLHttpRequest()
{
   if (window.XMLHttpRequest) {
      return new XMLHttpRequest();
   } else if (window.ActiveXObject) {
      return new ActiveXObject('Microsoft.XMLHTTP')
   } else {
      _error("Could not create XMLHttpRequest on this browser");
      return null;
   }
} 


------



function LoadWebResource(resource) {    var orgName = Xrm.Page.context.getOrgUniqueName();    var httpRequest = new ActiveXObject("Msxml2.XMLHTTP");    httpRequest.open("GET", "/" + orgName + "/webresources/" + resource, false);    httpRequest.send(null); try {       eval(httpRequest.responseText); } catch (e) {       alert("Error loading " + resource + ":\n" + e.description);    } }

JQuery Mobile Web Client on SharePoint – The Source Code

After numerous requests of publishing the source code of my demo as showed before in JQuery Mobile Web Client on SharePoint enabled I have decided to do so.
You lucky bastards… from the goodness of my hart… and for the good of community… and for world peace.

Please be aware that the solution has not left the alpha stage.
Download the code here … SharePoint4Mobile… this is a .DOC file, cause WP didn’t allow me to upload an archive.
So …  rename the download from .DOC to .ZIP and you’ll be all set.

Things you wanna know:

  • It was developed against SharePoint 2007 in an BPOS environemnt… so you come across some BPOS specific tag in the ASPX  pages.
  • It is mainly JavaScript, cause of the BPOS SharePoint 2007 restrictions… you can make this work using .NET better and faster I’ll bet.
  • An important component I used was the 2008 SPAPI by Darren Johnstone (http://darrenjohnstone.net).

Good luck and feel free to let me know what the experiences were with this piece of code.
I’m allways open for feedback.

 

You may wonder why I stopped developing futher.
This has a fairly simple reason.

My goal was developing an App that enabled a user on at least iPhone or iPad to not just Open and Edit MS Office files… but Save modified files back to SharePoint.
This last feature … saving changed files back to SharePoint – is not possible with iPhone or iPad.
Read one of many articles stating what Apple had NOT done to to leverage SharePoint functionality with an iPhone or iPad.
http://blog.wortell.nl/jasper/the-ipad-and-sharepoint-%E2%80%93-what-can-and-can%E2%80%99t-you-do-%E2%80%93-part-1/

 

Pass a ListItemId to SharePoint workflow

In SharePoint Designer 2007 open the page where an action is needed.

Right click the control the wher you want to start the workflow from… click Form Actions.

Add Custom Action and click Settings and the Workflow Wizard will start.

Click Variables and add a variable called something like MyListItemId.

Finish the workflow and see that the code around your control will be updated somewhat like this:

<a href=”javascript: {ddwrt:GenFireServerEvent(‘__workflowStart={{FA532C23-6F80-4266-868D-1EBC219A7E11},New,{8F0B8599-4B45-421A-A4A2-9BD2817078DE},}’)}”>
//MyControl//
</a>

 

Here’s what you need to do to pass the variable MyListItemId

<a href=”javascript: {ddwrt:GenFireServerEvent(concat(‘__workflowStart={{FA532C23-6F80-4266-868D-1EBC219A7E11},New,{8F0B8599-4B45-421A-A4A2-9BD2817078DE},MyListItemId=’,@ID, ‘}’))}”>
//MyControl//
</a>

 

EASY AS PIE

Preview JavaScript files in Windows7 Explorer

For all you JS-hackers out there… here’s the way to make Windows7 to show a preview of a JavaScript file.
In the registry add a STRING value to the HKEY_CLASSES_ROOT\.js node called PerceivedType with the value text.
That’s all there’s to it.

Like this..!

 

Or make a registry file containing:

 

Windows Registry Editor Version 5.00

 

[HKEY_CLASSES_ROOT\.js]

“PerceivedType”=”text”

Copying Dynamics CRM form values to the clipboard

For multiple records MS CRM options like mail merge and Excel exports are mighty handy.
For single record data export the Clipboard is more the way to go.

If you need the name and address of a certain account or contact … you want that to be directly available… in your CTRL-V.
If you want to print using a label printer… perhaps.
Exporting it to Excel or starting the Mail Merge may be a bit much to do… you for one record.

Start using this option… an ISV button “Copy name and address to clipboard” executing a JavaScript copying certain values to the clipboard.

OnLoad

CopyToClipboard =

    function () {

        // Construct the string you want on the clipboard.

        var sClipBoard = crmForm.all.firstname.DataValue + ” ” + crmForm.all.lastname.DataValue + “\n” +

                       crmForm.all.address1_line1.DataValue + “\n” +

                       crmForm.all.address1_city.DataValue + “, ” + crmForm.all.address1_stateorprovince.DataValue + ” ” + crmForm.all.address1_postalcode.DataValue;

        // Use/Create a input area

        var oClipBoard = document.getElementById(“ClipBoard”);

        if (oClipBoard == null) {

           oClipBoard = document.createElement(“input”);

           oClipBoard.setAttribute(“id”, “ClipBoard”);

           oClipBoard.setAttribute(“type”, “hidden”);

            document.getElementById(“crmForm”).appendChild(oClipBoard);

            }

        // Put in the clipboard string

        oCopyArea.innerText = sClipBoard;

        // Now copy to the string clipboard

        var oCopyText = oCopyArea.createTextRange();

        oCopyText.execCommand(“Copy”);

        };

 

Make the function available as an ISV button:

 
 

        <Entity name=”contact” >

          <ToolBar>

            <Button JavaScript=” CopyToClipboard ();” Icon=”/_imgs/ico_16_132.gif” ValidForCreate=”1″ ValidForUpdate=”1″ AvailableOffline=”true”>

              <Titles>

                <Title LCID=”1033″ Text=” Copy name and address to clipboard ” />

              </Titles>

              <ToolTips>

                <ToolTip LCID=”1033″ Text=” Copy name and address to clipboard ” />

              </ToolTips>

            </Button>

          </ToolBar>

        </Entity>

How is this for a cool MS CRM 2011 feature explanation?

I love it when people make blog posts like these
http://blogs.msdn.com/b/crm/archive/2010/10/25/bing-maps-and-microsoft-dynamics-crm-online.aspx

Like this you can learn to use and understand MS CRM 2011 Solutions, Dashboard, JQuery, BingMaps, CRM Discovery Service, usage of REST services, Web Resources,.

Here’s the direct download link of the source code.

All I needed.

DateJS.js and MS CRM

My customer had a wish of calculating estimated revenue based on hour per week, amount per hour and calculated based on business days between start date and the end data.
There was a tiny little detail that caused some thinking… which was that the end data is most cases start date + 3 months… so I needed to calculate the end data.


Problem #1 was the calculation of business days between two dates.
This wasn’t too hard, since Google found me an answer that looked like this:

Solution #1

function calcBusinessDays(dDate1, dDate2) { // input given as Date objects

var iWeeks, iDateDiff, iAdjust = 0;

if (dDate2 < dDate1) return -1; // error code if dates transposed

var iWeekday1 = dDate1.getDay(); // day of week

var iWeekday2 = dDate2.getDay();

iWeekday1 = (iWeekday1 == 0) ? 7 : iWeekday1; // change Sunday from 0 to 7

iWeekday2 = (iWeekday2 == 0) ? 7 : iWeekday2;

if ((iWeekday1 > 5) && (iWeekday2 > 5)) iAdjust = 1; // adjustment if both days on weekend

iWeekday1 = (iWeekday1 > 5) ? 5 : iWeekday1; // only count weekdays

iWeekday2 = (iWeekday2 > 5) ? 5 : iWeekday2;

// calculate difference in weeks (1000mS * 60sec * 60min * 24hrs * 7 days = 604800000)

iWeeks = Math.floor((dDate2.getTime() – dDate1.getTime()) / 604800000)

if (iWeekday1 <= iWeekday2) {

iDateDiff = (iWeeks * 5) + (iWeekday2 – iWeekday1)

} else {

iDateDiff = ((iWeeks + 1) * 5) – (iWeekday1 – iWeekday2)

}

iDateDiff -= iAdjust // take into account both days on weekend

return (iDateDiff + 1); // add 1 because dates are inclusive

}

Problem #2 was the calculation of the end date.
Adding a month is not a function in standard JS… so I tried

Let’s say the start date was December 1st this year, which in CRM looks like this:

Wed Dec 1 10:27:00 UTC+0100 2010 [Object]

If I calculate my end date in the old school fashion JS:

New Date.setDate(startDate.getDate() + 90) 
My date will look like this 
"Wed Dec 1 10:27:00 UTC+0100 201090" [string] 
MS CRM will handle this string, when a field is set to this value. 
However de calcBusinessDays function required a Date Object and not a string. 

Solution #2

http://www.datejs.com/ is the solution here.

Add the Data.js to be loaded in the <CRM Install Folder>\_static\_common\scripts\global.js

document.write(‘<script language=”javascript” src=”\/_customJava\/customDate.js”><\/script>’)

The calculation then looks like this:

crmForm.all.new_expectedrevenue.DataValue = calcBusinessDays(crmForm.all.new_startdate.DataValue, crmForm.all.new_enddate.DataValue.add(3).month()) * crmForm.all.new_rateperhour.DataValue;

The date function in the DateJS library do return Date objects.

Other examples of the DataJS library are below… it’s a very powerful library.

// Get today’s date

Date.today();

// Add 5 days to today

Date.today().add(5).days();

// Get Friday of this week

Date.friday();

// Get March of this year

Date.march();

// Is today Friday?

Date.today().is().friday(); // true|false

// What day is it?

Date.today().getDayName();

// Get the first Monday of the year

Date.january().first().monday()

// Get the last Friday of the year

Date.dec().final().fri()

// Set a date to the 15th of the current month at 4:30 PM,

// then add 90 days and make sure that date is a weekday,

// else move to the next weekday.

var d1 = Date.today()

.set({ day: 15, hour: 16, minute: 30 })

.add({ days: 90 })

if (!d1.isWeekday()) {

d1.next().monday();

}

// Lets start simple. “Today”

Date.parse(‘today’);

// How about tomorrow?

Date.parse(‘tomorrow’);

// July 8?

Date.parse(‘July 8’);

// With a year?

Date.parse(‘July 8th, 2007’);

// And time?

Date.parse(‘July 8th, 2007, 10:30 PM’);

// Get the date, move to Monday (if not already Monday),

// then alert the date to the user in a different format.

var d1 = Date.parse(‘8-Jul-2007’);

if (!d1.is().monday()) {

d1.last().monday();

}

alert(d1.toString(‘dddd, MMMM d, yyyy’));


ISV Buttons reappear after resize

MS CRM 4.0 has a great feature… disappearing ISV button label on a CRM Form when the form is not maximized.

However there is a problem…. the reappearance of ISV buttons after resizing the window.

Only a F5 (refresh) of the window will re-disappear the ISV buttons… since the OnLoad is re-executed.

 

In my case I have five button for Complaint Handling (never mind that).

When I open my complaint record, there is one ISV button… that’s correct

On Resize

Hey… this isn’t right.

Hit F5 and…

Ye… that’s right.

Now maximize again…

No… not good…

 

 

Solution

In the OnLoad handle hiding the ISV buttons in a separate funtion and attach the onresize to the form.

attachEvent(“onresize”,HandleButtons);

 

function HandleButtons() {

    // HandleButtons

    switch (parseInt(crmForm.all.statuscode.DataValue)) {

    case 3:        // Received

        HideIsvButton(new Array(“Assign to Investigator”, “Assign to Coordinator”, “Approve Complaint”, “Close Complaint”));

        break;

    case 6:     // Register

    …

}

 

That’s all there’s to it.