Monday, March 27, 2006

Make Any HTML Form Print Friendly With JavaScript

 
The following code snipet loops over all the form elements looking for "text" form inputs and converts them into wrapping DIV tags.  This browser-based transformation makes printable confirmation pages easy to generate on the server using the same HTML form generation techniques that are used to display the data in an edit-ready format.
 
 
 
var replaced = 0;    
var reDigit = /^\s*\d*\s*$/;
for (var i=0; i < this.document.forms[0].elements.length; i++) {
     if( document.forms[0].elements[i].type == "text" ) {
          var text = this.document.forms[0].elements[i].value;
          if( text == "" ) {
               var newP = document.createElement("p");
               newP.style.fontFamily = "Arial, Verdana, Helvetica, sans-serif";
               newP.style.fontSize = ".90em";
               var txtNode = document.createTextNode("--");
               newP.appendChild(txtNode);
               document.getElementById(document.forms [0].elements[i].id).parentElement.appendChild(newP);
               document.getElementById(document.forms[0].elements[i].id).style.display='none';
          } else {
               var newP = document.createElement ("div");
               newP.style.fontFamily = "Arial, Verdana, Helvetica, sans-serif";
               newP.style.fontSize = ".90em";

               if( this.document.forms[0].elements[i].value.search(reDigit) == -1 ) {
                    newP.style.border = "solid black 1px";
                    newP.style.width = "179px";
                    newP.style.padding = "2px";
                }
               var txtNode = document.createTextNode(text);
               newP.appendChild(txtNode);
               document.getElementById(document.forms[0].elements[i].id).parentElement.appendChild(newP);
               document.getElementById (document.forms[0].elements[i].id).style.display='none';
          }
    }

Saturday, March 04, 2006

The Good, the Bad and the Ugly

I've had some feedback about my growing appreciation of .Net development and Visual Studio.  I must admit, it is true -- I am growing to really enjoy .Net development.
 
The Good
  • .Net lets you catch a lot of errors at compile time
  • The FCL is an amazing collection of utilities.  Spend a lot less time considering alternatives and researching available software modules (CPAN.)
  • The .Net debugging tools and package analysis tools are great when you're in "debugging" mode
  • The Visual Studio IDE has a vast number of extremely useful third-party plug-ins that can really speed up development
  • Generic .Net features such as "region" and XML Comments greatly increase organization and documentation efficiency within large implementations
The Bad
  • .Net makes you wait for a compile before you can test most changes.  This results in much slower development vs. dynamic languages, especially if the required compile gets Ugly (see below) and you have to reboot.
  • .Net, under Windows, is tightly coupled with the OS.  This results in a lot of confusion and non-.Net (OS specific) knowledge is required for many complex implementations
  • The tools development companies that partner with Microsoft to produce VS.Net plug-ins ignore a lot of open-source/industry-standard solutions, opting instead to support Microsoft-centric technologies and approaches (SCM integration, for example)
  • The ASP.Net web development environment contains many foriegn (to the classic web developer) concepts.  This is the result of .Net's attempt to unify the programming model for Win32 and Web application development.  While this decreases the learning curve for developers already familiar with one, it increases and complicates the learning curve for non-.Net developers.  This because a problem when people unfamiliar with ASP.Net perform page and widget design (Human Factors Engineering team) from the perspective of form-post based applications without considering the various complexities of translating concepts to ASP.Net pages and user controls.
  • Visual Studio tries to be all things for all people.  It includes a database designer, an image editor, an XML editor, a CSS editor, a WYSIWYG XHTML editor and countless other edit modes and supported file formats.  While this is useful, the overall quality of each mode suffers.  For example, the XML editor does not provide a "pretty print" feature for XML files that are not human readable (indented) and the CSS editor has limited support for anything but CSS 1.1
The Ugly
  • .Net on Windows involves a lot of file lock related reboots, DLL versioning nightmares and Visual Studio Crashes
  • I am considerable more skilled with XHTML than the Visual Studio designer in 2003.  VS.Net messes up my HTML constantly and I spend an inordinate amount of time fixing it.  I have found ways to introduce "errors" into my XHTML so that the Visual Studio designer won't load them, but that results in further slow-downs because without the designer no auto-vivification of server-side controls occurs.
  • My "development environment", Visual Studio 2003, SQL Server, IE and Visual Studio 6.0sp6 consumes about 1G of RAM while under heavy (debugging) use.  This is an excessive amount of system resources!

Thursday, March 02, 2006

Formatting Date Output in C# with System.DateTime

Here is great page:

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfsystemglobalizationdatetimeformatinfoclasstopic.asp

The quick and dirty is, pass the following strings to DateTime.ToString( ); to get these outputs

d 1/3/2002
M/d/yyyy (ShortDatePattern)

D Thursday, January 03, 2002
dddd, MMMM dd, yyyy (LongDatePattern)

f Thursday, January 03, 2002 12:00 AM

F Thursday, January 03, 2002 12:00:00 AM
dddd, MMMM dd, yyyy h:mm:ss tt (FullDateTimePattern)

g 1/3/2002 12:00 AM

G 1/3/2002 12:00:00 AM

m January 03
MMMM dd (MonthDayPattern)

M January 03
MMMM dd (MonthDayPattern)

r Thu, 03 Jan 2002 00:00:00 GMT
ddd, dd MMM yyyy HH':'mm':'ss 'GMT' (RFC1123Pattern)

R Thu, 03 Jan 2002 00:00:00 GMT
ddd, dd MMM yyyy HH':'mm':'ss 'GMT' (RFC1123Pattern)

s 2002-01-03T00:00:00
yyyy'-'MM'-'dd'T'HH':'mm':'ss (SortableDateTimePattern)

t 12:00 AM
h:mm tt (ShortTimePattern)

T 12:00:00 AM
h:mm:ss tt (LongTimePattern)

u 2002-01-03 00:00:00Z
yyyy'-'MM'-'dd HH':'mm':'ss'Z' (UniversalSortableDateTimePattern)

U Thursday, January 03, 2002 8:00:00 AM

y January, 2002
MMMM, yyyy (YearMonthPattern)

Y January, 2002
MMMM, yyyy (YearMonthPattern)