Welcome to MSDN Blogs Sign in | Join | Help

Using Javascript to Manipulate a List Form Field

The following blog entry is a cross-posting from the SharePoint Designer Team Blog. It has received lots of kudos, so I thought that it deserves a bit more visibility.

<Lawrence />

 

Hi, my name is Rob Howard, and I’m a Program Manager with the SharePoint Designer team. Like several of the other people posting here, I also built many of the Application Templates for Windows SharePoint Services.

If you’re familiar with them, you may have noticed that in several of the application templates we use a bit of Javascript to set default form values based on the query string. Because we found this to be useful in many different cases throughout our applications, I wanted to share our method with you guys so that you can include it in the applications you develop.

When might you use this?

It’s pretty easy to set a field’s default value through the list settings in the browser UI, so why might you need Javascript to set a default field value? The reason is that field default values can only take static values or simple formulae based on the current user or today’s date. If that meets your needs, then I’d definitely recommend sticking with that method. Sometimes, though, you may want the form to fill with default values based on the user’s interaction with the previous page, and that’s exactly where this method comes in.

How does it work?

In short, we add some Javascript to the page that runs when the body is loaded. This Javascript parses the page’s query string, locates the HTML objects that are rendered by the relevant SharePoint fields, and sets their value based on the information in the query string.

getTagFromIdentifierAndTitle

The most important part of our solution is the “getTagFromIdentifier” function. This function finds the HTML element rendered by a given SharePoint FormField control. It takes the following parameters:

  • tagName – The name of the tag rendered in the form’s HTML
  • identifier – The string associated with the SharePoint type of the relevant field
  • title – The value of the relevant HTML tag’s “title” attribute, which also matches the field’s display name

Here’s a partial table of SharePoint column types and their corresponding “identifiers” and “tagNames”:

SharePoint Field Type identifier tagName
Single Line of Text TextField input
Multiple Lines of Text TextField input
Number TextField input
Currency TextField input
Choice (dropdown) DropDownChoice select
Lookup (single)* Lookup select
Lookup (multiple) SelectCandidate; SelectResult select
Yes/No BooleanField input

*Lookups are a bit more complicated because Lookup FormFields render differently when the target list contains more than 20 items. See the end of the post for an example.

function getTagFromIdentifierAndTitle(tagName, identifier, title) {

  var len = identifier.length;

  var tags = document.getElementsByTagName(tagName);

  for (var i=0; i < tags.length; i++) {

    var tempString = tags[i].id;

    if (tags[i].title == title && (identifier == "" || tempString.indexOf(identifier) == tempString.length - len)) {

      return tags[i];

    }

  }

  return null;

}

fillDefaultValues

Now that we have the HTML elements that we want to set, we need the values with which to set them. In our solution, we wrote the “fillDefaultValues” function, which parses the page’s querystring and then uses the values to set the field defaults.

function fillDefaultValues() {

  var qs = location.search.substring(1, location.search.length);

  var args = qs.split("&");

  var vals = new Object();

  for (var i=0; i < args.length; i++) {

    var nameVal = args[i].split("=");

    var temp = unescape(nameVal[1]).split('+');

    nameVal[1] = temp.join(' ');

    vals[nameVal[0]] = nameVal[1];

  } 

  // Set HTML element default values here

}

_spBodyOnLoadFunctionNames

In most cases SharePoint pages are based on a master page that contains the “body” element. These content pages can’t directly add a function to the body’s onload event. In order to work around this limitation, SharePoint provides the “_spBodyOnLoadFunctionNames” array. When the body is loaded, the onload event handler executes each function whose name is contained in this array. We added “fillDefaultValues” to the array so that it would run when the body’s onload event fires.

_spBodyOnLoadFunctionNames.push("fillDefaultValues");

All Together Now

With the script above, you can set most different field types to any value from the querystring – or any other source that javascript can access. Below is a full example of the script we use to set the default value of a Lookup field based on an ID stored in the querystring. You’ll notice that setting a Lookup field is a bit more complicated than some other field types. The reason is that Lookup FormFields are rendered with different HTML when the target list contains more than 20 items.

Enjoy!

<script type="text/javascript">

 

// This javascript sets the default value of a lookup field identified

// by <<FIELD DISPLAY NAME>> to the value stored in the querysting variable

// identified by <<QUERYSTRING VARIABLE NAME>>

 

 

// Customize this javascript by replacing <<FIELD DISPLAY NAME>> and

// <<QUERYSTRING VARIABLE NAME>> with appropriate values.

// Then just paste it into NewForm.aspx inside PlaceHolderMain

 

_spBodyOnLoadFunctionNames.push("fillDefaultValues");

 

function fillDefaultValues() {

  var qs = location.search.substring(1, location.search.length);

  var args = qs.split("&");

  var vals = new Object();

  for (var i=0; i < args.length; i++) {

    var nameVal = args[i].split("=");

    var temp = unescape(nameVal[1]).split('+');

    nameVal[1] = temp.join(' ');

    vals[nameVal[0]] = nameVal[1];

  } 

  setLookupFromFieldName("<<FIELD DISPLAY NAME>>", vals["<<QUERYSTRING VARIABLE NAME>>"]);

}

 

function setLookupFromFieldName(fieldName, value) {

  if (value == undefined) return;

  var theSelect = getTagFromIdentifierAndTitle("select","Lookup",fieldName);

 

// if theSelect is null, it means that the target list has more than

// 20 items, and the Lookup is being rendered with an input element

 

  if (theSelect == null) {

    var theInput = getTagFromIdentifierAndTitle("input","",fieldName);

    ShowDropdown(theInput.id); //this function is provided by SharePoint

    var opt=document.getElementById(theInput.opt);

    setSelectedOption(opt, value);

    OptLoseFocus(opt); //this function is provided by SharePoint

  } else {

    setSelectedOption(theSelect, value);

  }

}

 

function setSelectedOption(select, value) {

  var opts = select.options;

  var l = opts.length;

  if (select == null) return;

  for (var i=0; i < l; i++) {

    if (opts[i].value == value) {

      select.selectedIndex = i;

      return true;

    }

  }

  return false;

}

 

function getTagFromIdentifierAndTitle(tagName, identifier, title) {

  var len = identifier.length;

  var tags = document.getElementsByTagName(tagName);

  for (var i=0; i < tags.length; i++) {

    var tempString = tags[i].id;

    if (tags[i].title == title && (identifier == "" || tempString.indexOf(identifier) == tempString.length - len)) {

      return tags[i];

    }

  }

  return null;

}

</script>

Published Thursday, June 21, 2007 3:02 AM by LLiu

Comment Notification

If you would like to receive an email when updates are made to this post, please register here

Subscribe to this post's comments using RSS

Comments

# re: Using Javascript to Manipulate a List Form Field

Great post...worked like a charm!

Thursday, June 21, 2007 11:47 AM by Pirooz

# re: Using Javascript to Manipulate a List Form Field

I placed the javascript after the placeholder main sharepoint tag like below

<asp:Content ContentPlaceHolderId="PlaceHolderMain" runat="server">

<script type="text/javascript">

  ...

and the javascript does not seem to fire, I placed and alert("test"); tag in the fillDefaultValues function as the first thing to run when the _spBodyOnLoadFunctionNames.push("fillDefaultValues"); tells the fillDefaultValues to run and I do not receive an alert box. What am I doing wrong?

Saturday, June 30, 2007 11:12 AM by Jay Walker

# re: Using Javascript to Manipulate a List Form Field

the following values for a people picker field do not seem to work - something am missing perhaps - did anyone encounter this?

tagName = "textarea"

identifier="TextField"

title="People Picker"

(the 'Title' property for this textarea seems to be hard coded to People Picker and not the 'display name')

Friday, July 27, 2007 12:10 PM by rsriram22

# Adding Javascript functions to the OnLoad event

This posting is a bit of a note to self, apologies if you&#39;ve seen this before (and you probably should

Friday, July 27, 2007 6:01 PM by Mirrored Blogs

# re: Using Javascript to Manipulate a List Form Field

Works Excellent. Thanks for the _spBodyOnLoadFunctionNames.push() tip.

Wednesday, August 01, 2007 5:54 PM by Cassie Schmidt

# re: Using Javascript to Manipulate a List Form Field

when i tried above things to my SharePoint Field Type who renders me checkbox it seems attribute title is not comming in rendered html...

Any idea

?

Friday, August 03, 2007 3:57 PM by Hardik

# re: Using Javascript to Manipulate a List Form Field

Hi,

ii am try to add client side script to Dropdown contorl in the Editpage. but it fire he event.

And what this <span dir='none'>  specifies.

Thnaks

Jayakumar.R

Jayakumar.RAJENDRAN@sg.calyon.com

Monday, August 27, 2007 10:10 PM by Jayakumar

# re: Using Javascript to Manipulate a List Form Field

Hi! I am new to this.  Pls. help me add my javascript to work with the form webpart. I tried to use _spBodyOnLoadFunctionNames.push("fillDefaultValues"); but its not working...it's not doing anything, just gives me an error. It shows the actual form I created but not performing anything. Help pls!!! thanks!

Tuesday, August 28, 2007 2:35 AM by Yan Alonzo

# re: Using Javascript to Manipulate a List Form Field

I don't have a PlaceHolderMain. All I have is a PlaceHolder. It put it after that line but I just get a javascript error. I put it in the <HEAD> and nothing happens, no errors, no fields pre-filled. We have WSS 2.0. Is that too old for this code to work?

Thursday, August 30, 2007 12:05 PM by Lisa Kirkeby

# re: Using Javascript to Manipulate a List Form Field

I have the same problem as Jay Walker had. The java script is not fire. Any idea???

Friday, August 31, 2007 12:34 PM by Alan Tang

# re: Using Javascript to Manipulate a List Form Field

I placed the javascript after the placeholder main sharepoint tag like below

<asp:Content ContentPlaceHolderId="PlaceHolderMain" runat="server">

<script type="text/javascript">

 ...

and the javascript does not seem to fire

am I doing wrong?

Wednesday, September 12, 2007 5:34 AM by sheetal

# re: Using Javascript to Manipulate a List Form Field

I am having the same issue.  On some pages it fires, on others it does not.

Wednesday, October 03, 2007 4:08 PM by Thebriarsage

# re: Using Javascript to Manipulate a List Form Field

How can I set a bdc field value?

Thursday, October 04, 2007 8:10 AM by Nelly

# re: Using Javascript to Manipulate a List Form Field

i placed javascript code after PlaceHolderMain

but is happen no result on site's newpage.aspx page

actually i need to inherit data from one list fields and add it or copy it to subsite list fields what to do please help me.

Tuesday, October 09, 2007 6:30 AM by minaz

# re: Using Javascript to Manipulate a List Form Field

I am not having any luck with this either. I put it in the placeholder main and it won't fire.

Is there something we need to do in the site settings or the web.config to make it work?

Thursday, October 18, 2007 1:58 PM by Tom B

# re: Using Javascript to Manipulate a List Form Field

For me, sometimes the script runs sometimes it does not. It looks like several of us are having the same issue. Either we do not know where to place the script (I do it on a content web part) or something else.

Wednesday, November 07, 2007 1:42 PM by Eric Rios

# re: Using Javascript to Manipulate a List Form Field

Hi,

Got a solution for the checkbox...

function setYesNoFromFieldName(fieldName) {

  var theInput = getTagFromIdentifierAndTitle("input","BooleanField",fieldName);

  if (theInput.checked=="True") {

  theInput.checked="False";

  } else {

  theInput.checked="True";  

  }

}

Example usage:

  setYesNoFromFieldName("Show In Calendar");

Checks the box if unchecked by default; unticks the box if already checked.

Thursday, November 22, 2007 6:22 AM by Tim Staddon

# re: Using Javascript to Manipulate a List Form Field

How would this apply to a date picker control field?

Thursday, January 03, 2008 6:49 PM by elielizondo21

# re: Using Javascript to Manipulate a List Form Field

I found a way to set a BDC value:

[code]

function getBDCTagFromIdentifierAndTitle(tagName, title, count) {

     var tags = document.getElementsByTagName(tagName);

var myCount = 0;

     for (var i=0; i < tags.length; i++) {

       var tempString = tags[i].id;

       if (tags[i].title == title){

myCount++;

if(count = myCount){

         return tags[i];

         }

}

   }

   return null;

}

getBDCTagFromIdentifierAndTitle("TEXTAREA","Object Picker", 1).value = 'Field Value';

getBDCTagFromIdentifierAndTitle("DIV","Object Picker", 1).innerText = 'Field Value';

getBDCTagFromIdentifierAndTitle("A","Check Names", 1).onclick();

[/code]

Note:  the function gets the bdc field by location... in the case above, the first BDC field will be set to 'Field Value'.  To set the second BDC field in a list item, you would pass 2 instead of 1 to the getBDCTagFromIdentifierAndTitle function.

Wednesday, January 16, 2008 5:25 PM by Pablo Gazmuri

# re: Using Javascript to Manipulate a List Form Field

Oops... there is a bug in that function... here is the correct function:

[code]

function getBDCTagFromIdentifierAndTitle(tagName, title, count) {

     var tags = document.getElementsByTagName(tagName);

var myCount = 0;

     for (var i=0; i < tags.length; i++) {

       var tempString = tags[i].id;

       if (tags[i].title == title){

myCount++;

if(count == myCount){

         return tags[i];

         }

}

   }

   return null;

}

[/code]

Wednesday, January 16, 2008 5:40 PM by Pablo Gazmuri

# re: Using Javascript to Manipulate a List Form Field

If you are having problems getting it to work then make sure the body tag looks like this

<body onload="javascript:if (typeof(_spBodyOnLoadWrapper) != 'undefined') _spBodyOnLoadWrapper();">

Rather than this

<body>

Friday, January 18, 2008 2:40 AM by Damian

# re: Using Javascript to Manipulate a List Form Field

Tried changing the body tag to <body onload="javascript:if (typeof(_spBodyOnLoadWrapper) != 'undefined') _spBodyOnLoadWrapper();">

No luck. Can't get it to fire. Keep getting _spBodyOnLoadFunctionNames undefined.

Ideas?

Monday, January 28, 2008 5:14 PM by Jay

# Javascript on a sharepoint page

Hi all,

I want to register a javascript function in a sharepoint site (MySite link) which creates a cookie for the first login of the site user. I tried editing the

12\template\global\default.master asp.net page and am able to do that. but the problem is the javascript function executes every time when the user clicks any link on his mysite page. i want it only for the first time when the user clicks on the mysite link.

If any of you can help/suggest please put me a mail at sreejesh.chakkaran@wipro.com

Thanx in advance.

Sreejesh.

Thursday, January 31, 2008 6:53 AM by Sreejesh

# Javascript to reference a Radio Buttons Choice field

I've also found a way to get a reference to a Radio Buttons Choice field type that was tricky to get at since it doesn't use the 'Title' attribute. Please see below:

<A HREF="http://blog.markuso.com/posts/9/using-javascript-to-access-a-list-form-field-in-sharepoint-designer/" REL="nofollow">http://blog.markuso.com/posts/9/using-javascript-to-access-a-list-form-field-in-sharepoint-designer/</A>

Wednesday, February 06, 2008 6:26 AM by Markuso

# Javascript to reference a Radio Buttons Choice field

I've also found a way to get a reference to a Radio Buttons Choice field. It was tricky to get at since it doesn't use the 'Title' attribute. Please see below:

http://blog.markuso.com/posts/9/using-javascript-to-access-a-list-form-field-in-sharepoint-designer/

Wednesday, February 06, 2008 12:41 PM by Markuso

# re: Using Javascript to Manipulate a List Form Field

Hi

This is a great post, I have implemented some aspects of it and it works well. However, is there a way using javascript to get the currently selected option in a child drop down field.

I would like to display some ojectives in a separate textarea based on the course that the user selects from the child drop down but cannot work out how.

Any ideas....

Thanks

Tuesday, February 19, 2008 12:32 PM by Daniel

# re: Using Javascript to Manipulate a List Form Field

Add the folloving code to your NewForm.aspx, DispForm.aspx and EditForm.aspx and use this syntax to create headings from ordinary one line textfield:

#H#20#Name Of Heading

#H# Marks as heading and the following number is the Font-size

This code also removed the <nobr> tag from the title column to allow textwrap. The beauty of this approuch is the list accepts attachements and are fully customizable from the SharePoin UI.

NewForm.aspx:

<script type="text/javascript">

_spBodyOnLoadFunctionNames.push("removeNOBRAndShowHeadings");

//_spBodyOnLoadFunctionNames.push("removeNOBRAndShowHeadings", "hideFields");

function getTagFromIdentifierAndTitle(tagName, identifier, title) {

 var len = identifier.length;

 var tags = document.getElementsByTagName(tagName);

 for (var i=0; i < tags.length; i++) {

   var tempString = tags.id;

   if (tags.title == title && (identifier == "" || tempString.indexOf(identifier) == tempString.length - len)) {

     return tags;

   }

 }

 return null;

}

function findacontrol(FieldName) {

 var ctrl = null;

 var arr = document.getElementsByTagName('!');//get all comments

for (var i=0;i < arr.length; i++ )

 {

    // now match the field name

     if (arr.innerHTML.indexOf(FieldName) > 0) {

        return arr;

     }      

 }

}

function removeNOBRAndShowHeadings(){

brs = document.getElementsByTagName('nobr');

while (brs.length) {

var br = brs[brs.length - 1];

var newdiv = document.createElement('div');

newdiv.style.width = '300px';

//Sjekker om dette skal være en overskrift

if (br.innerHTML.substring(0,3)=="#H#"){

//Skjul tekstfeltet som representerer overskriften

var td = getTagFromIdentifierAndTitle("input","TextField",br.innerHTML);

td.style.display="none";

//Setter overskriften til angott størrelse

//newdiv.style.color = '#d63908';

newdiv.style.fontSize = br.innerHTML.substring(3,5);

newdiv.style.verticalAlign = 'sub';

br.innerHTML = br.innerHTML.substring(6);

}

//Setter innholdet i den nye DIV'en til selve overskriften

newdiv.innerHTML = br.innerHTML;

//var replacement = newdiv;

br.parentNode.replaceChild(newdiv, br);

}

}

function hideFields() {

//Angi visningsnavnet til kolonenn som skal skjules

    var control = findacontrol('NameOfFieldToHide');

    control.parentNode.parentNode.style.display="none";

}

</script>

DispForm.aspx

<script type="text/javascript">

_spBodyOnLoadFunctionNames.push("ShowHeadings");

function getTagFromIdentifierAndTitle(tagName, identifier, title) {

 var len = identifier.length;

 var tags = document.getElementsByTagName(tagName);

 for (var i=0; i < tags.length; i++) {

   var tempString = tags.id;

   if (tags.title == title && (identifier == "" || tempString.indexOf(identifier) == tempString.length - len)) {

     return tags;

   }

 }

 return null;

}

function ShowHeadings(){

brs = document.getElementsByTagName('H3');

var x = 1;

while (x < brs.length) {

var br = brs[x];

if (br.innerHTML.match(new RegExp(/#H#/))){

br.innerHTML = '<FONT size="4"><br>' + br.innerHTML +'</FONT>';

}

x++;

}

document.body.innerHTML = document.body.innerHTML.replace(new RegExp(/#H#/g), "");

document.body.innerHTML = document.body.innerHTML.replace(new RegExp(/\d\d#/g), "");

}

</script>

EditForm.aspx

<script type="text/javascript">

_spBodyOnLoadFunctionNames.push("removeNOBRAndShowHeadings");

//_spBodyOnLoadFunctionNames.push("removeNOBRAndShowHeadings", "hideFields");

function getTagFromIdentifierAndTitle(tagName, identifier, title) {

 var len = identifier.length;

 var tags = document.getElementsByTagName(tagName);

 for (var i=0; i < tags.length; i++) {

   var tempString = tags.id;

   if (tags.title == title && (identifier == "" || tempString.indexOf(identifier) == tempString.length - len)) {

     return tags;

   }

 }

 return null;

}

function findacontrol(FieldName) {

 var ctrl = null;

 var arr = document.getElementsByTagName('!');//get all comments

for (var i=0;i < arr.length; i++ )

 {

    // now match the field name

     if (arr.innerHTML.indexOf(FieldName) > 0) {

        return arr;

     }      

 }

}

function removeNOBRAndShowHeadings(){

brs = document.getElementsByTagName('nobr');

while (brs.length) {

var br = brs[brs.length - 1];

var newdiv = document.createElement('div');

newdiv.style.width = '300px';

//Sjekker om dette skal være en overskrift

if (br.innerHTML.substring(0,3)=="#H#"){

//Skjul tekstfeltet som representerer overskriften

var td = getTagFromIdentifierAndTitle("input","TextField",br.innerHTML);

td.style.display="none";

//Setter overskriften til angott størrelse

//newdiv.style.color = '#d63908';

newdiv.style.fontSize = br.innerHTML.substring(3,5);

newdiv.style.verticalAlign = 'sub';

br.innerHTML = br.innerHTML.substring(6);

}

//Setter innholdet i den nye DIV'en til selve overskriften

newdiv.innerHTML = br.innerHTML;

//var replacement = newdiv;

br.parentNode.replaceChild(newdiv, br);

}

}

function hideFields() {

//Angi visningsnavnet til kolonenn som skal skjules

    var control = findacontrol('NameOfFieldToHide');

    control.parentNode.parentNode.style.display="none";

//To prevent editing of listitem you must have a checkbox type yes/no called "Closed" - or change the code in tehe field below

var theInput = getTagFromIdentifierAndTitle("input","BooleanField",'Closed');

 if (theInput.checked==true) {

   document.body.innerHTML = "Access denied!";

   alert("You cannot change reports that are closed.\n\nContact an administrator...");

window.location = "javascript:history.back()"

 }

}

</script>

Most of the comments in the code are in Norwegian - sorry - ask me if something is unclear.

Regards

Alexander

Saturday, March 01, 2008 5:06 AM by Alexander Bautz

# Review if the DispForm-code in previous post

<script type="text/javascript">

//DispForm.aspx

_spBodyOnLoadFunctionNames.push("ShowHeadings");

function getTagFromIdentifierAndTitle(tagName, identifier, title) {

 var len = identifier.length;

 var tags = document.getElementsByTagName(tagName);

 for (var i=0; i < tags.length; i++) {

   var tempString = tags[i].id;

   if (tags[i].title == title && (identifier == "" || tempString.indexOf(identifier) == tempString.length - len)) {

     return tags[i];

   }

 }

 return null;

}

function ShowHeadings(){

brs = document.getElementsByTagName('H3');

var x = 1;

while (x < brs.length) {

var br = brs[x];

// Sjekk om det er en overskrift

if (br.innerHTML.match(new RegExp(/#H#/))){

// Finn størrelsen på overskriften

var size = br.innerHTML.match(new RegExp(/#\d\d#/));

// Konverter til srting

strSize = size.toString();

// Fjern #

var newSize = strSize.replace(new RegExp(/#/g), "");

// Angi ny br.innerHTML

br.innerHTML = br.innerHTML.replace(new RegExp(/#H#/g), "")

br.innerHTML = br.innerHTML.replace(new RegExp(/\d\d#/g), "")

br.innerHTML = '<div ' + 'style=font-size:' + newSize + 'px><br>' + br.innerHTML + '</div>';

}

x++;

}

}

</script>

Sunday, March 02, 2008 1:39 PM by Alexander

# re: Using Javascript to Manipulate a List Form Field

Hello

I added your code in newform.aspx but getting following error

Only Content controls are allowed directly in a content page that contains Content controls.

Please let me know whats arong I am doing?

Wednesday, May 28, 2008 2:00 PM by ashishkanoongo

# re: Using Javascript to Manipulate a List Form Field

any ideas on getting the date control to work with this?

Friday, July 11, 2008 3:08 PM by dolomite

# re: Using Javascript to Manipulate a List Form Field

Has anyone solved the problem with the Javascript not firing ?

I had it working yesterday but something has changed and now it doesn't fire - I have been testing with Alert messages and not working.

Thanks

Thursday, July 31, 2008 3:26 PM by bev

# re: Using Javascript to Manipulate a List Form Field

I've found the problem, finally.

There is a little typo in the setSelectedOption function. You need to change the opts[i].value with opts[i].text.

Here is the correct one:

function setSelectedOption(select, value) {

 var opts = select.options;

 var l = opts.length;

 if (select == null) return;

 for (var i=0; i < l; i++) {

   if (opts[i].text == value) {

     select.selectedIndex = i;

     return true;

   }

 }

 return false;

}

Sunday, September 21, 2008 2:59 PM by Ahody

# re: Using Javascript to Manipulate a List Form Field

Thanks. It was too much helpfull in my development.

Ferdous

Wednesday, December 10, 2008 4:34 AM by ferdous_cs

# Multi-column Layout in Sharepoint using a single Layout Page

Today I worked on the layout of a news article roll-up. One of the goals was to spread the text across multiple columns. At first I thought to create a Layout Page with two columns, each containing a Rich HTML Field. Then, when creating new articles,

Wednesday, March 18, 2009 5:50 AM by Baris Wanschers

Leave a Comment

(required) 
required 
(required) 

  
Enter Code Here: Required
 
Page view tracker