﻿/**
 * @author Vashira Ravipanich
 * @version $Revision: 1.3 $ $Date: 2009/06/11 07:58:58 $
 *  
 * Name: Main client-script for Osellus.DotNetNuke.UI framework
 * Description: Common functions for client-side behavior on Osellus.DotNetNuke.UI
 */ 
 /* Global Variables */
var Page_PopupReference;
var Page_PopupSettings;

/**
 * Create WebInstance Object, which represent the whole DNN Site in client-context.	 
 * @return {WebInstance} WebInstance Object.
 * @constructor
 */
var WebInstance = function() {
    /**
	 * @property m_pageTitle
	 * Store WebInstance.PageTitle on client side.
	 */
	var m_pageTitle;
	var m_isModalPopup = false;
	
	/**
	 * @method getPageTitle
	 * @return {string} PageTitle
	 */
	this.getPageTitle = function(){
		return m_pageTitle;
	};
	
	/**
	 * @method setPageTitle
	 * set the page title
	 * @param {string} Page Title of the WebInstance
	 */
	this.setPageTitle = function(p_pageTitle){
		m_pageTitle = p_pageTitle;
	};
	
	/**
	 * @method setIsModalPopup
	 * Should the overlay be shown or not. Will be shown if current opening popup is a modal one. Also the modal one will force user to focus on popup
	 * @param {bool}  does the overlay be shown or not, will effect when open/close popup
	 */
	this.setIsModalPopup = function(p_isModalPopup) {
		m_isModalPopup = p_isModalPopup;
	};
	
    /**
     * @method initialized
	 */	
    this.initialized = function() {
        //alert('WebInstance.initialized()'); 
        
        /*if(m_pageTitle){
            jQuery.facebox('There is page title specified: ' + m_pageTitle);
        }*/
        
        //setupFaceBox();
		/*$(window).bind('load', function(e) {
			alert('Hook on window.load');
		});*/
		
		//setupLightBox();
		setupDnnRichTextEditor();
		setupFileUpload();
		
		//comment this block because there is error when unload event has raised by closing opener and have to close child popup too.
		//Error: the callee (server [not server application]) is not available and disappeared; all connection are invalid. the call is not excuted.
		/*$(window).bind('unload', function(e) {
			if(window.opener) {
				window.opener.Global_WebInstance.closePopup(e);
			}
		});*/
		
    };
   
    /**
     * private method: setupFaceBox
     */   
    function setupFaceBox() {
        if($('a[rel*=facebox]').facebox) {
            $('a[rel*=facebox]').facebox({
                loading_image : Global_DNNSkinPath + 'loading.gif',
                close_image : Global_DNNSkinPath + 'closelabel.gif', 
                overlay: true, 
                opacity: 0.6  
            });
        } 
    };
    
    /**
     * private method: setupLightBox
     */   
    function setupLightBox() {
   
        if($('a[@rel*=lightbox]').lightBox) {
            $('a[@rel*=lightbox]').lightBox({
				imageLoading: Global_DNNSkinPath + 'images/skin/lightbox-ico-loading.gif', 
				imageBtnPrev: Global_DNNSkinPath + 'images/skin/lightbox-btn-prev.gif', 
				imageBtnNext: Global_DNNSkinPath + 'images/skin/lightbox-btn-next.gif', 
				imageBtnClose: Global_DNNSkinPath + 'images/skin/lightbox-btn-close.gif', 
				imageBlank: Global_DNNSkinPath + 'images/skin/lightbox-blank.gif'
			}); 
        }
    };
    
    /**
     * private method: setupDnnRichTextEditor
     */ 
    function setupDnnRichTextEditor() {
        $('.RichTextContent a').each(function(i, item) { 
	        if($(item).attr('target') == '') {
		        $(item).attr('target', '_blank');
	        }
        });
    };
   
   /**
    * private method Disable file path editing in fileupload for IE and firefox 2.x below.
    * Using gecko rev number 1.9 = firefox 3.0 
    */
   function setupFileUpload() {
		if($.browser.msie || ($.browser.mozilla && parseFloat($.browser.version) < 1.9))
		{
			function preventDefault(e)
			{
				return false;
			}
		
			jQuery(':file').each(function(i){
				jQuery(this).bind('keydown', preventDefault);
				jQuery(this).bind('beforeeditfocus', preventDefault);
				jQuery(this).bind('contextmenu', preventDefault);
			});
		}
   }
	
	/**
	* @method showOverlay
	* @desc Show the overlay background (dimmed), used when open a new modal popup
	*/
	this.showOverlay = function() {
		if(!m_isModalPopup) return;
		if ($('webInstance_overlay').length == 0) {
			$("body").append('<div id="webInstance_overlay" class="overlay_hide"></div>')
		}
		// Opacity should be read from PageFlow.config
		$('#webInstance_overlay').hide().addClass("overlay_background")
	      .css('opacity', 0.6)
	      .fadeIn(100);
	    return false;
	};
	
	/**
	* @method hideOverlay
	* @desc Hide the overlay background (dimmed), used when close a modal popup
	*/
	this.hideOverlay = function() {
		if (!m_isModalPopup) return;
		if($('#webInstance_overlay').length != 0) {
		    $('#webInstance_overlay').fadeOut(100, function(){
		      $("#webInstance_overlay").removeClass("overlay_background")
		      $("#webInstance_overlay").addClass("overlay_hide") 
		      $("#webInstance_overlay").remove()
		    });
		}
	    return false;
	};
	
	this.closePopup = function(e) {
		setTimeout('Global_WebInstance.completeClosePopup()', 100);
	};
	
	this.completeClosePopup = function() {
		if(Page_PopupReference) {
			if(!Page_PopupReference.closed) {
				//alert('Popup not close, just reloading!');
				Page_PopupReference.focus();
				return;
			}
		}
		this.hideOverlay();
	};
};


/*********** Extension Functions & Classes *************/
/**
*  Name: StringFormat
*  Desc: Replaces parameters ({0}, {1} etc...) in a string with arguments
*/
function StringFormat(p_string){
	var regexp = new RegExp();
	var modifiedString = p_string;
	var argument;

	for (var i=0; argument = StringFormat.arguments[i+1]; i++) {
		regexp.compile("\\{"+i+"\\}","g");
		modifiedString = modifiedString.replace(regexp, argument);
	}

	return modifiedString;
}

 /**
  * @classDescription XmlDocument for Javascript.
  * @author Khwanchai Thongloy
  * @version $Revision: 1.3 $ $Date: 2009/06/11 07:58:58 $
  * @history
  *	05/01/2007 - Khwanchai Thongloy - Create this class.
  *	
  *	@constructor
  *	@return {XmlDocument}
  */
 var XmlDocument = function(){
 	//Private members.
	var m_this = this;
	var m_childNodes = [];
	
	//Public members.
	this.encoding = "utf-8";
	this.version = "1.0";
		
	/**
	 * @method appendChild Add XmlNode as root node.
	 * @param {XmlNode} p_xmlNode XmlNode Object.
	 */
	this.appendChild = function(p_xmlNode){
		if(p_xmlNode instanceof XmlNode){
			m_childNodes[0] = p_xmlNode;
		}
	};
	
	/**
	 * @method toString Convert XmlDocument to XML String.
	 * @return {String} XML String.
	 */
	this.toString = function(){
		var xmlInfo = String.format(
			"<?xml version=\"{0}\" encoding=\"{1}\"?>\n",
			this.version, this.encoding);
		var childNodesString = String.empty;
		if(m_childNodes.length >0){
			childNodesString = m_childNodes[0].toString();
		} 
		return String.format("{0}\n{1}", xmlInfo, childNodesString);	
	};
	
	//Initiailize Section.
	return this;
 }
 
 /**
  * @classDescription XmlNode Object.
  * @author Khwanchai Thongloy
  * @version $Revision: 1.3 $ $Date: 2009/06/11 07:58:58 $
  * @history
  * 05/01/2007 - Khwanchai Thongloy - Create this class.
  * 
  * @constructor
  * @param {String} p_nodeName NodeName
  * @param {String} p_value Inner Value.
  * @return {XmlNode} Xml Node Object.
  */
 var XmlNode = function(p_nodeName, p_value){
 	//Private Members.
	var m_this = this;
	var m_childNodes = [];
	var m_attributes = [];
	
	//Public Members.
	this.nodeName = p_nodeName;
	this.nodeValue = String.empty;	
	
	/**
	 * @method addAttribute
	 * @param {String} p_attributeName
	 * @param {String} p_attributeValue
	 */
	this.addAttribute = function(p_attributeName, p_attributeValue){
		m_attributes[p_attributeName] =  Convert.toString(p_attributeValue);
	}
	
	/**
	 * @method appendChild Add XmlNode as this childNodes.
	 * @param {XmlNode} p_xmlNode ChildNode.
	 */
	this.appendChild = function(p_xmlNode){
		if(p_xmlNode instanceof XmlNode){
			m_childNodes.push(p_xmlNode);
		}
	};
	
	/**
	 * @method toString Render XmlNode to string.
	 * @return {String} XmlNode in string format.
	 */
	this.toString = function(){
		var attributesString = String.empty;
		for(var key in m_attributes){
			var currentAttribute = m_attributes[key];
			if(typeof(currentAttribute) != "function"){
				attributesString += String.format(" {0}={1}",
					key, currentAttribute.quote());
			}
		}
		
		var nodeValueString = String.empty;
		for(var i=0; i< m_childNodes.length; i++){
			var child = m_childNodes[i];
			nodeValueString += child.toString();
		}
		if(String.isNullOrEmpty(nodeValueString)){
			nodeValueString = this.nodeValue;
		}else{
			nodeValueString += "\n";
		}
		
		var nodeInfo = String.format(
			"\n<{0}{2}>{1}</{0}>", 
			this.nodeName, nodeValueString, attributesString);
		return nodeInfo;	
	};
	
	//Initialization Section.
	if(String.isNullOrEmpty(p_nodeName)){
		return null;
	}
	if(p_value !== undefined){
		this.nodeValue = p_value;	
	}
	return m_this;
 }

/*********** Core Callback API **************/
/**
 * Handle generic callback event from any Control that support callback
 *     param p_callbackResult: string which already processed from BaseView.RaiseCallbackEvent
 *     param p_context: usually null
 */ 
function HandleGenericCallbackEvent(p_callbackResult, p_context) {
    if(p_callbackResult) {
        setTimeout(p_callbackResult, 1); // sliding delay of asynchronous event 1 millisec to avoid collision problem.
    } 
}

function HandleGenericCallbackError(p_callbackError, p_context) {
    alert('Callback Error: ' + p_callbackError);
}

/**
 * Evaluate
 *     param p_control: control to be evaluated has the following format { ClientId: '{0}', ClientAttribute: '{1}' }
 */ 
function EvaluateClientArgs(p_control) {
    // Prepare id selector
    var controlId = '#' + p_control.ClientId;
    var args = $(controlId).attr(p_control.ClientAttribute);
    
    if(args == "null")
        args = "";
    
    if((typeof(args) == 'undefined') || (args == null)) {
        return p_control.ClientId + ':&^' + $(controlId).attr('value');
    }
    
    return p_control.ClientId + ':&^' + args; 
}

/**
 * Evaluate
 *     param p_controls: control to be evaluated has the following format 
 *     [ { ClientId: '{0}', ClientAttribute: '{1}' }, { ClientId: '{0}', ClientAttribute: '{1}' }, ... ]
 */ 
function EvaluateClientArgsMultiple(p_controls){
    var callbackString = '';
    
    $.each( p_controls, function(i, control){
        var result = EvaluateClientArgs(control);
                
        if(callbackString != '') {
            callbackString += ':&^';
        }
            
        callbackString += result;
    });
    
    return callbackString;
}

/** FIX ASP.NET Callback bug **/
if(typeof(WebForm_CallbackComplete) == 'function') { 
    WebForm_CallbackComplete = function() {
        for (var i = 0; i < __pendingCallbacks.length; i++) {
            callbackObject = __pendingCallbacks[i];
            if (callbackObject &&
                callbackObject.xmlRequest &&
                callbackObject.xmlRequest.readyState == 4) {
                WebForm_ExecuteCallback(callbackObject);
                if (!__pendingCallbacks[i].async) {
                    __synchronousCallBackIndex = -1;
                }
                __pendingCallbacks[i] = null;
                var callbackFrameID = "__CALLBACKFRAME" + i;
                var xmlRequestFrame = document.getElementById(callbackFrameID);
                if (xmlRequestFrame) {
                    xmlRequestFrame.parentNode.removeChild(xmlRequestFrame);
                }
            }
        }
    }
}

/** FIX ASP.NET Validator with jQuery DatePicker **/
if(typeof(ValidatorOnChange) == 'function') {
    ValidatorOnChange = function(event) {
        if (!event) {
            event = window.event;
        }
        Page_InvalidControlToBeFocused = null;
        var targetedControl;
        if ((typeof(event.srcElement) != "undefined") && (event.srcElement != null)) {
            targetedControl = event.srcElement;
        }
        else {
            targetedControl = event.target;
        }
        var vals;
        if (typeof(targetedControl.Validators) != "undefined") {
            vals = targetedControl.Validators;
        }
        else {
            if (targetedControl.tagName.toLowerCase() == "label") {
                targetedControl = document.getElementById(targetedControl.htmlFor);
                vals = targetedControl.Validators;
            }
        }
        if(typeof(vals) != 'undefined') {
            var i;
            for (i = 0; i < vals.length; i++) {
                ValidatorValidate(vals[i], null, event);
            }
        }
        ValidatorUpdateIsValid(); 
    }
}


/************ Client Script Util *************/
var ClientScriptUtil = new Object();

/**
 * Set value to particular field on the page
 *     param p_controlId: client id of target Server Control
 *     param p_value: value to be set 
 */ 
ClientScriptUtil.SetControlValue = function(p_controlId, p_value) {
    $(p_controlId).attr('value', p_value);
}

/**
 * Get value of particular field on the page
 *     param p_controlIds: collection of client id of target Server Controls
 */ 
ClientScriptUtil.GetControlsValue = function(p_controlIds){
    var callbackString = '';
    $.each( p_controlIds, function(i, controlId){
        var key = controlId;
        var value = $('#' + controlId).attr('value');
        if(callbackString != '')  callbackString += '&';
        callbackString += key + '=' + value;
    });
    
    return callbackString;
}

/**
 * Reset value of particular field on the page
 *     param p_controlIds: collection of client id of target Server Controls
 */
ClientScriptUtil.ClearControlsValue = function(p_controlIds) {
    $.each( p_controlIds, function(i, controlId){
        var control = document.getElementById(controlId);
        if(control.tagName == 'INPUT' && control.type == 'text'){
           $('#' + controlId).attr('value','');
        }else  if(control.tagName == 'INPUT' && control.type == 'checkbox'){
           $('#' + controlId).attr('checked',false);
        }else if(control.tagName == 'SELECT'){
            control.value = '';
        }
    });
}

/**
 * Populates the given list list with a set of options
 *     param p_controlId: client id of target Server Control
 *     param p_listItemCollection: collection of list item in the following format [{ Text: '{0}', Value: '{1}' }, ...]
 */ 
ClientScriptUtil.PopulateListControl = function(p_controlId, p_listItemCollection) {
    var element = $(p_controlId).get()[0];
    var oldSelectedValue = $(p_controlId).attr('value');
   
    element.length = 0; // clear options
   
    $.each(p_listItemCollection, function(i, listItem) {
        var option = new Option(listItem.Text, listItem.Value);
        element.options.add(option);
    });
    
    /*p_listItemCollection.each(function(listItem) { 
        var option = new Option(listItem.Text, listItem.Value);
        element.options.add(option);
    });*/
   
    if(oldSelectedValue)
        element.value = oldSelectedValue;
}

/**
 * Open the target page in a popup
 *     param p_popupUrl: target url
 *     param p_popupWidth: width of the popup window
 *     param p_popupHeight: height of the popup window
 *     param p_isResizable: does the popup window resizable?
 *     param p_popupSettings: JSON object of PopupSettings instance
 *     param p_hasScrollBar: does the popup window contain scrollbar
 *     param p_isModal: is the popup open in modal or non-modal (Not implement now)
 */
ClientScriptUtil.OpenPopup = function(p_popupUrl, p_popupWidth, p_popupHeight,
 p_isResizable, p_popupSettings, p_hasScrollBar, p_isModal) {
    
    Page_PopupSettings = p_popupSettings;
	Global_WebInstance.setIsModalPopup(p_isModal);
	
	// Show overlay if in modal mode
	Global_WebInstance.showOverlay();
	
    var enabledToolBar = Page_PopupSettings.EnabledBrowserToolBar ? 'yes' : 'no';
    var resizable = p_isResizable ? 'yes' : 'no';
    var scrolling = (p_hasScrollBar != false) ? 'yes' : 'no';
    
    Page_PopupReference = window.open("", "", 
	    StringFormat("toolbar={0}, location=no, status=yes, menubar=no, scrollbars={6}, resizable={1}, copyhistory=no, width={2}, height={3}, top={4}, left={5}", 
	    enabledToolBar,
	    resizable,
	    p_popupWidth,
	    p_popupHeight,
	    ((screen.availHeight-p_popupHeight)/2),
	    ((screen.availWidth-p_popupWidth)/2),
	    scrolling
	));
	
	if (Page_PopupReference) {		
	    Page_PopupReference.document.location.href = StringFormat("{0}//{1}{2}?command=popup&popupUrl={3}", 
	        document.location.protocol, 
	        document.location.host + Global_AppRootPath, 
	        'PageHandler.ashx', 
	        p_popupUrl);
	} else {
		// Alert if they have a popup blocker running!!! TODO: Create exception id for ClientScript!!
		alert("Error: Could not launch popup. If you have a popup-blocking utility installed, please allow popups for this application.");
	}
    
}


/**
 * @classDescription ArrayList.
 * @author Khwanchai Thongloy
 * @version $Revistion$ $Date: 2009/06/11 07:58:58 $
 * @history
 * 	03/10/2007 - Khwanchai Thongloy - Create this class.
 * 	03/11/2007 - Khwanchai Thongloy - Remove this class from GridView.js to Common.js
 * 	03/12/2007 - Khwanchai Thongloy - Add ArrayList.removeDuplicate();
 * 									- Implement ArrayList.sort() ArrayList.rSort()
 * 	03/13/2007 - Khwanchai Thongloy - Implement ArrayList.getIndexOf() method.
 * 	03/16/2007 - Khwanchai Thongloy - Implement ArrayList.getIndexByObjectId() method.
 * 
 * @constructor
 * @param {Array} p_nativeArray Native Array.
 * @return {ArrayList} ArrayList instance.
 */
var ArrayList  = function(p_nativeArray){
	var m_classType = "ArrayList";
	var m_items = [];
	
	/**
	 * @method add
	 * @param {Object} p_args Item to be store in ArrayList.
	 */
	this.add = function(p_args){
		for(var i=0; i<arguments.length; i++){
			var item = arguments[i];
			m_items.push(arguments[i]);		
		}
	};
	
	/**
	 * @method addRange
	 * @param {Object} p_array Array to be added.
	 */
	this.addRange = function(p_array){
		if(!DataType.isArray(p_array)){
			return;
		}
		
		for(var i=0; i<p_array.length; i++){
			m_items.push(p_array[i]);
		}
	};
	
	/**
	 * @method updateByIndex
	 * @param {Number} p_index ItemIndex.
	 * @param {Object} p_newObject New Item to be updated.
	 */
	this.updateByIndex = function(p_index, p_newObject){
//		if(!p_index || !DataType.isNumber(p_index)){
//			return;
//		}
//		
		//Check index overflow
		if(p_index < m_items.length && (p_index >= 0)){
			m_items[p_index] = p_newObject;				
		}
	};
		
	/**
	 * @method remove
	 * @param {Object} p_item Item to be removed.
	 */
	this.remove = function(p_item){
		var newItems = [];
		for(var i=0; i<m_items.length; i++){
			if(m_items[i] !== p_item){
				newItems.push(m_items[i]);
			}
		}
		m_items = newItems;
	};
	
	/**
	 * @method removeDuplicate
	 * Remove Duplicated Items in ArrayList.
	 */
	this.removeDuplicate = function(){
		var tmpArray = new ArrayList();
		var foundDuplicate = false;
		for(var i=0; i < m_items.length; i++){
			var currentItem = m_items[i];
			if(tmpArray.contain(currentItem)){
				//Duplicate set flag.
				foundDuplicate = true;				
			}else{
				//Not duplicate copy to tempArray.
				tmpArray.add(currentItem);
			}
		}
		
		if(foundDuplicate){
			m_items = tmpArray.toArray();
		}
	};
	
	/**
	 * @method contain
	 * @param {Object} p_checkItem Item to check.
	 * @return {Boolean} Contain item ?
	 */
	this.contain = function(p_checkItem){
		return (this.getIndexOf(p_checkItem) != -1);
	};
	
	/**
	 * @method getIndexOf
	 * @param {Object} p_object Object to fine index.
	 * @return {Number} Index in current ArrayList, -1 if not exists.
	 */
	this.getIndexOf = function(p_object){
		var itemIndex = -1;
		var m_itemsLength = m_items.length;
		for(var i=0; i<m_itemsLength; i++){
			if(p_object === m_items[i]){
				itemIndex = i;
				break;
			}
		}
		return itemIndex;
	};
	
	/**
	 * @method getIndexByObjectId Find IndexNumber of object in ArrayList.
	 * @param {String} p_objectId ObjectId of object in ArrayList.
	 * @return {Object} Index number of object or -1 in case not found.
	 */
	this.getIndexByObjectId = function(p_objectId){
		var indexNumber = -1;
		var m_itemsLength = m_items.length;
		for(var i=0; i< m_itemsLength; i++){
			var obj = m_items[i];
			var objectId = obj.objectId;
			if(objectId == p_objectId){
				indexNumber = i;
				break;
			}
		}
				
		return indexNumber;
	};
	
	/**
	 * @method getItem
	 * @param {Number} p_indexer Number of index. 
	 * @return {Object} Item that match p_indexer or null.
	 */
	this.getItem = function(p_indexer){		
		if(DataType.isNumber(p_indexer) && 
			this.getLength() > p_indexer && p_indexer > -1){
			return m_items[p_indexer];
		}
		return null;
	};
	
	/**
	 * @method getItemByFieldValue
	 * @param {String} p_fielName Object.fieldname and this field shoud be uniqued.
	 * @param {String} p_fieldValue condition.
	 * @return {Object} first matched condition.
	 */
	this.getItemByFieldValue = function (p_fieldName, p_fieldValue){
		if(!DataType.isString(p_fieldName)){
			return;
		}
		
		var matchValue = null;
		var m_itemsLength = m_items.length;
		for(var i=0; i<m_itemsLength; i++){
			var item = m_items[i];
			if(DataType.isObject(item) && (item[p_fieldName] === p_fieldValue)){
				matchValue = item;
				break;
			}
		}
		
		return matchValue;
	};
	
	/**
	 * @method getLength
	 * @return {Number} Total items in ArrayList.
	 */
	this.getLength = function(){
		return m_items.length;
	};
	
	/**
	 * @method clear
	 * Empty Item in ArrayList.
	 */
	this.clear = function(){
		m_items = [];
	};
	
	/**
	 * @method
	 * @param {Object} p_funciton Function.
	 * @param {Object} p_bindingParam Binding Param.
	 */
	this.forEach = function(p_funciton, p_bindingParam){
		if(m_items.forEach){
			m_items.forEach(p_funciton, p_bindingParam);
		}else{
			var m_itemsLength = m_items.length;
			for(var i = 0; i < m_itemsLength; i++){
				p_funciton.call(p_bindingParam, m_items[i], i, m_items);
			}
		}
	};
	
	/**
	 * @method getType
	 * @return {String} ArrayList Type.
	 */
	this.getType = function(){
		return m_classType;
	};
	
	
	/**
	 * @method sort
	 * @param {Function} p_fnComparer Custom Comparer.
	 * Sort item in array.
	 */
	this.sort = function(p_fnComparer){
		if(DataType.isFunction(p_fnComparer)){
			m_items.sort(p_fnComparer);
		}else{
			m_items.sort();
		}
	};
	
	/**
	 * @method rsort
	 * @param 
	 */
	this.rSort = function(p_fnComparer){
		//Call asc sort.
		this.sort(p_fnComparer);
		
		//Do desc sort.		
		var reverseArr = [];
		var m_itemsLength = m_items.length-1;
		for(var i = m_itemsLength; i >= 0; i--){
			reverseArr.push(m_items[i]);
		}
		//Update private list.
		m_items = reverseArr;
		
	};	
	
	/**
	 * @method toCommaSeparatorString
	 * @return {String} CommaSeparator string format.
	 */
	this.toCommaSeparatorString = function(){
		var retString = String.empty;
		for(var i=0; i<m_items.length; i++){
			var item = m_items[i];
			switch(typeof(item)){
				case "undefined":
					retString += "undefined";
					break;
				
				case "object":
					if(item === null){
						retString += "null";
					}
					break;
				case "string":
					retString += item.quote();
					break;
				case "number":
				default:
					retString += item.toString();
			}
			
			if(i < m_items.length -1){
				retString+= ",";
			}
		}
		return retString;
	};
	
	/**
	 * @method toArray
	 * @return {Object} Inner Array.
	 */
	this.toArray = function(){
		return m_items;
	};
	
	/**
	 * @method toString
	 * @return {String} ArrayList inforamtion.
	 */
	this.toString = function(){
		return String.format("{0} contains {1} items", m_classType, this.getLength());
	};
	
	/**
	 * @method initialize
	 */
	if(p_nativeArray && p_nativeArray.length){
		this.addRange(p_nativeArray);		
	}
	
	return this;
};
	
/**
 * General DataType Enumeration.
 */
var DataType = {
    sortMode: {
        none: 0,
        asc: 1,
        desc: -1    
    },
    compareResult: {
        equal: 0,
        lower: -1,
        greater: 1
    },	
	isUndefined: function(p_obj){
	    // still has bug!!!
		return (undefined === p_obj);
	},
	isNull: function(p_obj){
		return (p_obj === null);
	},
	isNumber: function(p_obj){
		return (typeof(p_obj) === "number");
	},
	isString: function(p_obj){
		return typeof(p_obj) === "string";
	},
	isArray: function(p_obj){
		if(!p_obj){
			return false;
		}
		return (typeof(p_obj) === "object" && (p_obj.length >=0));
	},
	isObject: function(p_obj){
		return typeof(p_obj) === "object";
	},
	isBoolean: function(p_obj){
		return (typeof(p_obj) === "boolean");
	},
	isFunction: function(p_obj){
		return (typeof(p_obj) === "function");
	}
};

 
 
 /**
 * @projectDescription containts Cross-Browser Fns
 * @namespace Com.Osellus.Iris.Plv.Common
 * @author Khwanchai Thongloy
 * @version $Revision: 1.3 $  $Date: 2009/06/11 07:58:58 $
 * @history
 *  02/15/2007 - Khwanchai Thongloy - Create this file.
 *  02/22/2007 - Khwanchai Thongloy - Merge to lastest version.
 *  02/26/2007 - Khwanchai Thongloy - Add getComputedStyle() method.
 *                                  - Add setOpacity() method.
 *  03/01/2007 - Khwanchai Thongloy - Add ensureClientId() method.
 *                                  - Add String.isNullOrEmpty() method.
 *                                  - Add String Utility methods.
 *	03/08/2007 - Khwanchai Thongloy - Add clone() method.
 *	03/11/2007 - Khwanchai Thongloy - Separate Class Documentation from file'docs.
 *									- Add ArrayList and Indexer Class. 
 *	03/22/2007 - Khwanchai Thongloy - Add Alias String.subString() method. 
 *	03/22/2007 - Khwanchai Thongloy - Add String.quote() method.
 *	04/04/2007 - Khwanchai Thongloy - Add String.trim() method.
 *									- Edit String.remove() method.
 *	04/20/2007 - Khwanchai Thongloy - Optimize getLength() in for Loop.
 *	04/24/2007 - Khwanchai Thongloy - Fix undefine in String.Add() Method.
 *	05/01/2007 - Khwanchai Thongloy - Update Cleanable Tag.                         
 */


/**
 * Enpty String Constant.
 */
String.empty = "";

/**
 * @method Implement String.format() as normal syntax.
 * @param {String} p_format
 * @param {String} p_args
 */
String.format = function(){
    if( arguments.length === 0 ){
        return null;
    }
        
    var str = arguments[0];
    for(var i=1; i<arguments.length; i++) {
        var re = new RegExp('\\{' + (i-1) + '\\}','gm');
        str = str.replace(re, arguments[i]);
    }
    return str;
};

/**
 * @method Trim Space at end of string.
 * @return {String} Trimmed String.
 */
String.prototype.trim = function(){
	var trimString = String.empty;
	var trimState = false;
	var thisLength = this.length -1;
	for(i=thisLength; i>=0; i--){
		var c = this.substr(i, 1);
		if((!trimState) && (c != " ")){
			trimString = String.format("{0}{1}", c, trimString);
			trimState = true;
		}else if(trimState){
			trimString = String.format("{0}{1}", c, trimString);
		}
	}
	return trimString;
};

/**
 * @method Check String is null or empty.
 * If testVariable is not string will return false.
 * @param {String} p_testVariable
 * @return {Boolean} test result.
 */
String.isNullOrEmpty = function(p_testVariable){
    if(typeof p_testVariable != "string"){
        return true;        
    } else if(p_testVariable.length <= 0){
        return true;
    } else {
        return false;
    }
};


/**
 * @method quote Create SafeString for evaluate.
 * @return {String} Quoted String.
 */
String.prototype.quote = function(){
 return '"' + this.replace(/[\\"\r\n]/g,
	 function(s){
		 switch(s){
			 case "\\":return "\\\\";
			 case "\r":return "\\r";
			 case "\n":return "\\n";
			 case '"':return '\\"';
		 }
	 }
 	)+'"';
 };


/**
 * @method trim Remove All space in string.
 * @return {String}  Trimmed String.
 */
String.prototype.removeSpace = function(){
	return this.replace(/ /g, "");
};

/**
 * @method Append Unique String If newEntry exists adding will take no effect.
 * @param {String} p_newEntry added string.
 */
String.prototype.add = function(p_newEntry){
    var fullString = this.toString();
	if(fullString.indexOf(p_newEntry) == -1){
        return fullString + " " + p_newEntry;
    }else{
		return fullString;
	}
};

/**
 * @method Delete String in string.
 * @param {String} p_deletedString
 */
String.prototype.remove = function(p_deletedString){
    return this.replace(p_deletedString, String.empty).trim();
};

/**
 * @method Find string in current string.
 * @param {Object} p_findString String to find for.
 * @return {Boolean} Search result.
 */
String.prototype.contain = function(p_findString){
    return (this.indexOf(p_findString) > -1);
};

/**
 * @method SubString
 * @param {Number} startNumber
 * @param {Number} LengthNumber
 * @return {String} SubString.
 */
String.prototype.subString = String.prototype.substr;

/**
 * @method toLower
 * @return {String} Return String.toLowerCase()
 */
String.prototype.toLower = function(){
	return this.toLowerCase();
};


/**
 * @classDescription Convert Utility like C# Convert.
 * @author Khwanchai Thongloy
 * @version $Revision: 1.3 $ $Date: 2009/06/11 07:58:58 $
 * @history
 * 05/01/2007 - Khwanchai Thongloy - Create this class.
 */
var Convert = {
	toString: function(p_obj){
		if(DataType.isNull(p_obj)){
			return "null";
		}else if(DataType.isFunction(p_obj)){
			return "function";
		}else if(DataType.isUndefined(p_obj)){
			return "undefine";
		}else{
			return p_obj.toString();
		}
	}
};


/**
 * @classDescription Static javascriptUtil class contains General Purpose functions.
 * @author Khwanchai Thongloy
 * @version $Revision: 1.3 $ $Date: 2009/06/11 07:58:58 $
 * @history
 * 	03/11/2007 - Khwanchai Thongloy - Separate history from file history.
 * 	03/16/2007 - Khwanchai Thongloy - Add javascriptUtil.generateClientId();
 * 	04/06/2007 - Khwanchai Thongloy - Add tick, tock methods.
 * 	04/09/2007 - Khwanchai Thongloy - Add RemoveAllchild() method.
 * 	04/10/2007 - Khwanchai Thongloy - Add getMousePosition() method.
 * 	04/11/2007 - Khwanchai Thongloy - Add showHtmlDropDownList() method.
 * 	04/24/2007 - Khwanchai Thongloy - Remove Unused method and Add cleanableHtmlNode().
 * 	05/03/2007 - Khwanchai Thongloy - Add getElementPosition() method and remove unused methods.
 * 	05/28/2007 - Khwanchai Thongloy - Add disableElementById() method.
 * 
 */
var javascriptUtil = new Object();

	/**
	 * @method Clone Object.
	 * @param {Object} p_srcObject Source Object to be cloned.
	 * @return {Object} Cloned Object.
	 */
	javascriptUtil.clone = function(p_srcObject){
		//Return primitive type.
		if(typeof(p_srcObject) != 'object'){
			return p_srcObject;
		} 
		if(p_srcObject === null){
			return p_srcObject;
		} 
	
		//Recursive Clone.
		var myNewObj = {};
		for(var i in p_srcObject){
			myNewObj[i] = javascriptUtil.clone(p_srcObject[i]);
		}
		return myNewObj;
	};	

	
	/**
	 * @method Cross-browser unregister event handling.
	 * @param {Object} p_element
	 * @param {String} p_eventType
	 * @param {Function} p_fn
	 * @param {Boolean} p_useCapture default false
	 */
	javascriptUtil.unregisterEvent = function(p_element, p_eventType, p_fn, p_useCapture){
	    if(p_element.removeEventListener){
	        p_element.removeEventListener(p_eventType, p_fn, p_useCapture);
	        return true;
	    } else if (p_element.detachEvent){
	        var r = p_element.detachEvent('on' + p_eventType, p_fn);
	        return r;
	    } else {
	        p_element['on' + p_eventType] = null;
	    }
	};

	/**
	 * @method cross-browser event handling for IE5+, NS6+, and Mozilla/Gecko.
	 * @param {Object} p_element
	 * @param {String} p_eventType
	 * @param {Function} p_fn
	 * @param {Boolean} p_useCapture default false
	 */
	javascriptUtil.registerEvent = function(p_element, p_evType, p_fn, useCapture){
		if(p_element.addEventListener){
			p_element.addEventListener(p_evType, p_fn, useCapture);
			return true;
		}else if(p_element.attachEvent){
			var r = p_element.attachEvent('on' + p_evType, p_fn);
			return r;
		}else{
			p_element['on' + p_evType] = p_fn;
		}
	};

	/**
	 * @method Cross-browser cancel event bubble.
	 * @param {Object} p_event
	 */
	javascriptUtil.cancelEventBubble = function(p_event){
		//Cancel Event buble
		p_event = p_event || window.event;
	    if(p_event.stopPropagation){
	        p_event.stopPropagation();
	    } else {
	        p_event.cancelBubble = true;
	    }
	};

	/**
	 * @method Cancel Default Action for current event
	 * @param {Object} p_event eventArg
	 */
	javascriptUtil.cancelDefaultAction = function(p_event){
		//Cancel Default Action
		if(p_event.preventDefault){
			p_event.preventDefault();
		} else {
			p_event.returnValue = false;
		}
	};

	/**
	 * Copy from http://codylindley.com/Webdev/295/javascript-get-page-height-with-scroll
	 * @method getScreenDimension
	 * @return {Object} JSON Object.
	 */
	javascriptUtil.getScreenDimension = function(){
		var wx = (document.documentElement && document.documentElement.clientWidth) || 
			window.innerWidth || self.innerWidth || document.body.clientWidth; 
			
		var wy = (document.documentElement && document.documentElement.clientHeight) || 
			window.innerHeight || self.innerHeight || document.body.clientHeight; 
			
		var sx = (document.documentElement && document.documentElement.scrollLeft) || 
			window.pageXOffset || self.pageXOffset || document.body.scrollLeft; 
			
		var sy = (document.documentElement && document.documentElement.scrollTop) || 
			window.pageYOffset || self.pageYOffset || document.body.scrollTop; 
			
		var px = (document.documentElement && document.documentElement.scrollWidth) ? 
			document.documentElement.scrollWidth : 
			(document.body.scrollWidth > document.body.offsetWidth) ? 
				document.body.scrollWidth : document.body.offsetWidth; 
				
		var py = (document.documentElement && document.documentElement.scrollHeight) ? 
			document.documentElement.scrollHeight : 
			(document.body.scrollHeight > document.body.offsetHeight) ? 
				document.body.scrollHeight : document.body.offsetHeight;
		
		return {windowX: wx, windowY: wy, scrollX: sx, scrollY: sy, pageX: px, pageY: py};
	};

	/**
	 * @method getMousePosition
	 * @param {Event} e Event Object.
	 * @return {Object} Position format {x:?, y:?} relative to Page Position.
	 */
	javascriptUtil.getMousePosition = function(e){
		var absX, absY;
		if(e.pageX){
			absX = e.pageX;
			absY = e.pageY;
		}else{
			absX = e.clientX + document.body.scrollLeft + 
				(document.documentElement ? 
					document.documentElement.scrollLeft : 0);
					
			absY = e.clientY + document.body.scrollTop + 
				(document.documentElement ? 
					document.documentElement.scrollTop : 0);
		}
		return {x: absX, y: absY}; 
	};

	/**
	 * @method showHtmlDropDownList For IE6.
	 * @param {Boolean} p_isShow
	 */
	javascriptUtil.showHtmlDropDownList = function(p_isShow){
		var htmlSelectElements = document.getElementsByTagName("select");
		var styleString = (p_isShow)? "visible": "hidden";
		for(var i=0; i<htmlSelectElements.length; i++){
			htmlSelectElements[i].style.visibility = styleString;
		}
	};

	/**
	 * @method Cross-browser get source element.
	 * @param {Event} p_eventArg
	 * @return {HtmlElement} dom node.
	 */
	javascriptUtil.getObjectSender = function(p_eventArg){
		if(p_eventArg.target){
			return p_eventArg.target;
		} else {
			return p_eventArg.srcElement;
		}
	};

	/**
	 * @method Cross-browser disable user drag/select text inside element
	 * @param {HtmlElement} p_element
	 */
	javascriptUtil.disableSelection = function(p_element){
		if(!p_element || (typeof p_element != "object")){
            return;
        }        
        //For Explorer.
		p_element.onselectstart = function(){return false;};
        
		//For Mozilla.
		p_element.onmousedown = function(){return false;};
	};


    /**
     * @method Get ElementPosition + 2 Overloads.
     * @param {HtmlElement/String} p_element HtmlElement or ObjectId.
     * @return {Object} {topleft:{x:?,y:?}, topright:{x:?,y:?}, bottomLeft:{x:?,y:?}, bottomRight:{x:?,y:?}};
     */
    javascriptUtil.getElementPosition = function(p_element){
    	//Overload function management.
		if(DataType.isString(p_element)){
			p_element = document.getElementById(p_element);
		}
        if(!p_element){
           return null; 
        }
		
		//If element.style.display (none) we cannot calculate position.     
        var curDisplayStyle = p_element.style.display || String.empty;
		var curVisibilityStyle = p_element.style.visibility || String.empty;
		var styleChange = false;
		if(curDisplayStyle == "none"){
			p_element.style.display = "inline";
			p_element.style.visibility = "hidden";
			styleChange = true;
		}
		
		//Position Object.
		var position = {
			topLeft:{x:0, y:0}, 
			topRight:{x:0, y:0}, 
			bottomLeft:{x:0, y:0}, 
			bottomRight:{x:0, y:0},
			offsetWidth: 0,
			offsetHeight: 0
		};		
		
		var curLeft = curTop = curWidth = curHeight = 0;
		
		//Find Width, Height of element.
		curWidth = p_element.clientWidth || p_element.offsetWidth;
		curHeight = p_element.clientHeight || p_element.offsetHeight;
		position.offsetHeight = curHeight;
		position.offsetWidth = curWidth;		
		
		//Find Top, Left of element.
		var dummyElement = p_element;
		if (dummyElement.offsetParent) {
			curLeft = dummyElement.offsetLeft
			curTop = dummyElement.offsetTop
			while (dummyElement = dummyElement.offsetParent){
				curLeft += dummyElement.offsetLeft
				curTop += dummyElement.offsetTop
			}
		}
		
		//Restore style if this element was changed.
		if(styleChange){
			p_element.style.display = curDisplayStyle;
			p_element.style.visibility = curVisibilityStyle;
		}

		//Calculate all position.
		position.topLeft = {x: curLeft, y: curTop};
		position.topRight = {x: curLeft + curWidth, y: curTop};
		position.bottomLeft = {x: curLeft, y: curTop+ curHeight};
		position.bottomRight = {x: curLeft + curWidth, y: curTop + curHeight};
		
		//Return final calculation position.
    	return position;
    };

    /**
     * @method Get Position X for element.
     * @param {Object} p_element Html element.
     */
    javascriptUtil.findPosX = function(p_element){
    	var curleft = 0;
    	if(p_element.offsetParent){
    		while(1){
    		  curleft += p_element.offsetLeft;
    		  if(!p_element.offsetParent){
                  break;
              }
    		  p_element = p_element.offsetParent;
    		} 
        }

    	else if(p_element.x){
            curleft += p_element.x;
        }
    	return curleft;
    };

    /**
     * @method Get Position y for element.
     * @param {Object} p_element Html element.
     */
    javascriptUtil.findPosY = function(p_element){
    	var curtop = 0;
    	if(p_element.offsetParent){
    		while(1){
    		  curtop += p_element.offsetTop;
    		  if(!p_element.offsetParent){
                  break;
              }
    		  p_element = p_element.offsetParent;
    		}
        }else if(p_element.y){
            curtop += p_element.y;
        }
        
    	return curtop;
    };
    
    /**
     * @method Get Computed css from element + 2 Overloads.
     * @param {HtmlElement/String} p_element Html element or ObjectId.
     * @return {Object} Computed Style Object.
     */
    javascriptUtil.getComputedStyle = function(p_element){
        if(DataType.isString(p_element)){
            p_element = document.getElementById(p_element);
        }
        if(!p_element){
            return null;
        } 
        if(p_element.currentStyle){
            return p_element.currentStyle;
        } else {
            return window.getComputedStyle(p_element, null);
        }
    };


    /**
     * @method Set Element Opacity, Transparent Support Cross Browsers.
     * @param {Object} target Element.
     * @param {Object} opacity multiplier 0.0 - 1.0
     */
    javascriptUtil.setOpacity = function(p_element, p_opacity){
        //Check if no element exists.
        if(!p_element){
            return;
        } 
        
        //Set Opacity.
        if(p_element.filter){
            //IE Alpha.
            try {
              p_opacity *= 100;
              p_element.filters.item("DXImageTransform.Microsoft.Alpha").opacity = p_opacity;
            } catch(e){
              // If it is not set initially, the browser will throw an error. 
              // This will set it if it is not set yet.
              p_element.style.filter = 
                  'progid:DXImageTransform.Microsoft.Alpha(opacity='+ p_opacity +')';
            }
        } else {
            //W3C Opacity.
            p_element.style.opacity = p_opacity;
        }
    };


    /**
     * Use for store number of generated ids.
     * Invoked by generateClientId.
     */
    javascriptUtil.generatedIds = 0;
    
	/**
	 * @method generateClientId
	 * @return {String} Unique ClientId
	 */
	javascriptUtil.generateClientId = function(){
		javascriptUtil.generatedIds++;
		return String.format("clientId{0}", javascriptUtil.generatedIds);
	};
	
    /**
     * @method Ensure selected element has unique id if id not found this method will auto generate new id.
     * @param {Object} p_element HtmlElement to be checked.
     */
    javascriptUtil.ensureClientId = function(p_element){
        //Check object exi
        if(!p_element){
            return;
        } 
        
        if(!p_element.id || !p_element.id.length){
            p_element.id = javascriptUtil.generateClientId(); 
        }   
    };
	
	/**
	 * Store start time of tick method.
	 */
	javascriptUtil.timeStamp = null;
	
	/**
	 * @method record Start time.
	 */
	javascriptUtil.tick = function(){
		javascriptUtil.timeStamp = new Date();
	};
	
	/**
	 * @method show difference time sice tick to tock.
	 * @param {String} p_description Message
	 */
	javascriptUtil.tock = function(p_description){
		var diff = ((new Date() -  javascriptUtil.timeStamp)/1000);
		alert(String.format("{1} \n{0} seconds.", diff, p_description));
	};
	
	/**
	 * @method removeAllChild
	 * @param {Object} p_domElement Element that will be remove childs (ref).
	 */
	javascriptUtil.removeAllChild = function(p_domElement){
		p_domElement.innerHTML = "";
	};
	
	
	javascriptUtil.cleanableHtmlNode = new ArrayList(
		["table", "colgroup", "col", "thead", "tbody", "tr", "ul"]);	
	/**
	 * @method cleanWhiteSpaceChild Remove textNode for childs.
	 * @param {HtmlElement} p_domElement Element that will be used.
	 */
	javascriptUtil.cleanWhiteSpaceChild = function(p_domElement){	
		//Check object and valid NodeName.
		if(!p_domElement || 
			!javascriptUtil.cleanableHtmlNode.contain(
				p_domElement.nodeName.toLowerCase())){
			return;
		}
		
		//Remove Childs.
		var currentChild = p_domElement.firstChild;
		while(currentChild != null){
			var nextSiblingChild = currentChild.nextSibling;			
			if(currentChild.nodeType == 3){
				//this node is TextNode(WhiteSpace).
				p_domElement.removeChild(currentChild);
			}else{
				//this node is normal htmlElement.
				javascriptUtil.cleanWhiteSpaceChild(currentChild);
			}
			currentChild = nextSiblingChild;
		}
	};
	
	/**
	 * @method disableElementById for html form elements.
	 * @param {String} p_elementId
	 * @param {Boolean} p_isEnabled 
	 */
	javascriptUtil.disableElementById  = function(p_elementId, p_isEnabled){
		var element = document.getElementById(p_elementId);
		if(element){
			element.disabled = (p_isEnabled === true);
		}
	};
	

 
 /**
  * @classDescription XmlDocument for Javascript.
  * @author Khwanchai Thongloy
  * @version $Revision: 1.3 $ $Date: 2009/06/11 07:58:58 $
  * @history
  *	05/01/2007 - Khwanchai Thongloy - Create this class.
  *	
  *	@constructor
  *	@return {XmlDocument}
  */
 var XmlDocument = function(){
 	//Private members.
	var m_this = this;
	var m_childNodes = [];
	
	//Public members.
	this.encoding = "utf-8";
	this.version = "1.0";
		
	/**
	 * @method appendChild Add XmlNode as root node.
	 * @param {XmlNode} p_xmlNode XmlNode Object.
	 */
	this.appendChild = function(p_xmlNode){
		if(p_xmlNode instanceof XmlNode){
			m_childNodes[0] = p_xmlNode;
		}
	};
	
	/**
	 * @method toString Convert XmlDocument to XML String.
	 * @return {String} XML String.
	 */
	this.toString = function(){
		var xmlInfo = String.format(
			"<?xml version=\"{0}\" encoding=\"{1}\"?>\n",
			this.version, this.encoding);
		var childNodesString = String.empty;
		if(m_childNodes.length >0){
			childNodesString = m_childNodes[0].toString();
		} 
		return String.format("{0}\n{1}", xmlInfo, childNodesString);	
	};
	
	//Initiailize Section.
	return this;
 }
 
 /**
  * @classDescription XmlNode Object.
  * @author Khwanchai Thongloy
  * @version $Revision: 1.3 $ $Date: 2009/06/11 07:58:58 $
  * @history
  * 05/01/2007 - Khwanchai Thongloy - Create this class.
  * 
  * @constructor
  * @param {String} p_nodeName NodeName
  * @param {String} p_value Inner Value.
  * @return {XmlNode} Xml Node Object.
  */
 var XmlNode = function(p_nodeName, p_value){
 	//Private Members.
	var m_this = this;
	var m_childNodes = [];
	var m_attributes = [];
	
	//Public Members.
	this.nodeName = p_nodeName;
	this.nodeValue = String.empty;	
	
	/**
	 * @method addAttribute
	 * @param {String} p_attributeName
	 * @param {String} p_attributeValue
	 */
	this.addAttribute = function(p_attributeName, p_attributeValue){
		m_attributes[p_attributeName] =  Convert.toString(p_attributeValue);
	}
	
	/**
	 * @method appendChild Add XmlNode as this childNodes.
	 * @param {XmlNode} p_xmlNode ChildNode.
	 */
	this.appendChild = function(p_xmlNode){
		if(p_xmlNode instanceof XmlNode){
			m_childNodes.push(p_xmlNode);
		}
	};
	
	/**
	 * @method toString Render XmlNode to string.
	 * @return {String} XmlNode in string format.
	 */
	this.toString = function(){
		var attributesString = String.empty;
		for(var key in m_attributes){
			var currentAttribute = m_attributes[key];
			if(typeof(currentAttribute) != "function"){
				attributesString += String.format(" {0}={1}",
					key, currentAttribute.quote());
			}
		}
		
		var nodeValueString = String.empty;
		for(var i=0; i< m_childNodes.length; i++){
			var child = m_childNodes[i];
			nodeValueString += child.toString();
		}
		if(String.isNullOrEmpty(nodeValueString)){
			nodeValueString = this.nodeValue;
		}else{
			nodeValueString += "\n";
		}
		
		var nodeInfo = String.format(
			"\n<{0}{2}>{1}</{0}>", 
			this.nodeName, nodeValueString, attributesString);
		return nodeInfo;	
	};
	
	//Initialization Section.
	if(String.isNullOrEmpty(p_nodeName)){
		return null;
	}
	if(p_value !== undefined){
		this.nodeValue = p_value;	
	}
	return m_this;
 }
 