 var CJGA = {};
 CJGA.Page = {
	_fontDefault: 1.2,
	_maxFontSize: 1.6,
	_minFontSize: 0.8,
	fontRatio: 1.2,
	
	/**
	 * @method Page Load Initialize method.
	 */
	load: function()
	{
		var fontPanel = $('#hdr_font_mbr, #hdr_font_pub');
		if(fontPanel.length > 0)
		{
			var cookieFont = CJGA.Page.readCookie('fontRatio');
			if(cookieFont)
			{
				CJGA.Page.applyFont(cookieFont + 'em');
			}
		}
	},
	
	/**
	 * @method Resize Page Font Size.
	 * @param {Number} p_adjSize the new size integer format 1,0,-1
	 */
	resizeFont: function(p_adjSize)
	{
	    var isUpdatedFontSize = false;
		p_adjSize = p_adjSize * 0.1;
		if(p_adjSize === 0)
		{
			//Restore font-size;
			this.fontRatio = this._fontDefault;
			isUpdatedFontSize = true;
		}
		else
		{
			var newRatio = this.fontRatio + p_adjSize;
			if((newRatio >= this._minFontSize) && (newRatio <= this._maxFontSize))
			{
				this.fontRatio = newRatio;
				isUpdatedFontSize = true;
			}
		}
		
		//Force font-size to #wrapper
		this.applyFont(this.fontRatio + 'em');
		
		//Save to cookie (30 days expiration).
		this.createCookie('fontRatio', this.fontRatio, 30);
		
		//Fix 2424: [NavigationMenu Control] When user change text size, layout of this control render improperly.
		if(isUpdatedFontSize && typeof(NavigationMenu) != 'undefined' 
		    && NavigationMenu != null && NavigationMenu != undefined)
		{
		    //recalculate width of NavigationMenu's items.
		    NavigationMenu.Initialize();
		}
	},
	
	/**
	 * @method apply font size by css
	 * @param {String} p_newFontSize.
	 */
	applyFont: function(p_newFontSize)
	{
		$('#wrapper').css('font-size', p_newFontSize);
	},
	
	/**
	 * @method Create cookie
	 * @param {String} p_name cookie key.
	 * @param {String} p_value
	 * @param {Number} p_days expiration day.
	 */
	createCookie: function(p_name, p_value, p_days)
	{
		if (p_days) {
			var date = new Date();
			date.setTime(date.getTime()+(p_days*24*60*60*1000));
			var expires = '; expires='+date.toGMTString();
		}
		else var expires = '';
		document.cookie = p_name+'='+p_value+expires+'; path=/';
	},
	
	/**
	 * @method Read cookie
	 * @param {String} p_name
	 * @return {String} cookie value or null.
	 */
	readCookie: function(p_name)
	{
		var nameEQ = p_name + "=";
		var ca = document.cookie.split(';');
		for(var i=0;i < ca.length;i++) {
			var c = ca[i];
			while (c.charAt(0)==' ') c = c.substring(1,c.length);
			if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length);
		}
		return null;
	},
	
	/**
	 * @method Erase cookie
	 * @param {String} p_name
	 */
	eraseCookie: function(p_name)
	{
		createCookie(p_name,"",-1);
	}	
 };
 
 $(document).ready(CJGA.Page.load);
 
 /**
 * @projectDescription containts Cross-Browser Fns
 * @namespace Com.Osellus.Iris.Plv.Common
 * @author Khwanchai Thongloy
 * @version $Revision: 1.11 $  $Date: 2009/01/21 10:25:29 $
 * @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.11 $ $Date: 2009/01/21 10:25:29 $
 * @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();
		}
	}
};


/**
 * 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");
	}
};


/**
 * @classDescription ArrayList.
 * @author Khwanchai Thongloy
 * @version $Revistion$ $Date: 2009/01/21 10:25:29 $
 * @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;
};


/**
 * @classDescription Indexer Utility Class.
 * @author Khwanchai Thongloy
 * @version $Revision: 1.11 $ $Date: 2009/01/21 10:25:29 $
 * @history
 * 	03/08/2007 - Khwanchai Thongloy - Create this class.
 * 	03/09/2007 - Khwanchai Thongloy - Implement toCommaSeparatorString.
 * 	03/11/2007 - Khwanchai Thongloy - Add getKey, getValue method.
 * 									- Remove to file common.js
 * 	03/13/2007 - Khwanchai Thongloy - Reimplement Indexer with ArrayList.
 * 									- Refactoring Indexer.getItemCount to getLength.
 * 
 * 
 * @constructor
 * @return {Indexer} New Indexer instance.
 */
var Indexer = function(){
	var m_className = "Indexer";
	var m_keyArrayList = new ArrayList();
	var m_valueArrayList = new ArrayList();
	
	
	/**
	 * @method addItem 
	 * Add/Update Item to Indexer
	 * If p_key is not string this method will ignore.
	 * If p_key is duplicate this method will overwrite.
	 * @param {String} p_key KeyString.
	 * @param {Object} p_value Value.
	 */
	this.addItem = function(p_key, p_value){
		//If key and value is not readly skip.		
		if(String.isNullOrEmpty(p_key)){
			return;
		}
		
		//Check duplicate.
		if(!m_keyArrayList.contain(p_key)){
			//Add new item to array.
			m_keyArrayList.add(p_key);
			m_valueArrayList.add(p_value);
		}else{
			//Update existing value.
			var index = m_keyArrayList.getIndexOf(p_key);
			m_valueArrayList.updateByIndex(index, p_value);
		}
	};
	
	/**
	 * @method getItem + 2 Overloads.
	 * @param {String/Number} p_indexer key.
	 * @return {Object} Object that matched with key or null.
	 */
	this.getItem = function(p_indexer){
		var returnValue = null;
		//Handle 2 Overloads.
		switch(typeof(p_indexer)){
			case "number":
				if(p_indexer <= m_valueArrayList.getLength()){
					returnValue = m_valueArrayList.getItem(p_indexer);
				}
				break;
			case "string":
				var targetIndex = m_keyArrayList.getIndexOf(p_indexer);
				if(targetIndex > -1){
					returnValue = m_valueArrayList.getItem(targetIndex);
				}
				break;
		}
		//return resutl
		return returnValue;
	};
	
	/**
	 * @method removeItem + 2 Overloads.
	 * Remove key-value pair from current instance.
	 * @param {Number/String/Object} p_indexer ObjectId or Number.
	 */
	this.removeItem = function(p_indexer){
		var realIndex = -1;
		
		//Overload method with Number and String.
		switch(typeof(p_indexer)){
			case "string": 
				realIndex = m_keyArrayList.getIndexOf(p_indexer);
				break;
				
			case "number":	
				if(p_indexer< m_keyArrayList.getLength()){
					realIndex = p_indexer;
				}
				break;
		}
		
		//If index was found do removing process.
		if(realIndex !== -1){
			m_keyArrayList.remove(m_keyArrayList.getItem(realIndex));
			m_valueArrayList.remove(m_valueArrayList.getItem(realIndex));	
		}
	};
	
	/**
	 * @method getKey
	 * @param {Number} p_indexNumber
	 * @return {String} matched key.
	 */
	this.getKey = function(p_indexNumber){
		return m_keyArrayList.getItem(p_indexNumber);
	};
	
	/**
	 * @method getKeys
	 * Get readonly key's Array in current indexer.
	 * @return {Object} KeyArray (Cloned).
	 */
	this.getKeys = function(){
		return m_keyArrayList.toArray();
	};
	
	
	/**
	 * @method getValue
	 * @param {Number} p_indexNumber
	 * @return {Object} Matched Value.
	 */
	this.getValue = function(p_indexNumber){
		return m_valueArrayList.getItem(p_indexNumber);
	};
	
	/**
	 * @method getValues
	 * Get readonly value's Array in current indexer.
	 * @return {Object} Value Array (Cloned).
	 */
	this.getValues = function(){
		return m_valueArrayList.toArray();
	};

	/**
	 * @method getLength
	 * @return {Number} Total keypairs.
	 */
	this.getLength = function(){
		return m_valueArrayList.getLength();
	};
	
	/**
	 * @method containKey Check key exists in indexer.
	 * @param {String} p_key KeyString.
	 * @return {Boolean} Check result.
	 */
	this.containKey = function(p_key){
		return m_keyArrayList.contain(p_key);
	};
	
	/**
	 * @method containValue Check if value exists in current indexer.
	 * @param {Object} p_value Object to be checked.
	 * @return {Boolean} Check result. 
	 */
	this.containValue = function(p_value){
		return m_valueArrayList.contain(p_value);
	};
	
	/**
	 * @method getType
	 * @return {String} Get Current InstantType.
	 */
	this.getType = function(){
		return m_className;
	};
	
	
	/**
	 * @method forEach
	 * @param {Object} p_fn Function in format fn(p_value, p_key, p_indexer)
	 * @param {Object} p_bindingParam
	 */
	this.forEach = function(p_fn){
		var m_keyArrayListLength= m_keyArrayList.getLength();
		for(var i=0; i<m_keyArrayListLength; i++){
			var currentItem = m_valueArrayList.getItem(i);
			var currentKey = m_keyArrayList.getItem(i);
			p_fn(currentItem, currentKey, this);
		}
	};
	
	/**
	 * @method toObject
	 * @return {Object} Convert to Json Object.
	 */
	this.toObject = function(){
		if(!m_keyArrayList.getLength()){
			return null;
		}
		
		var jsonObj = {};
		var m_keyArrayListLength = m_keyArrayList.getLength();
		for(var i=0; i<m_keyArrayListLength; i++){
			var iKey = m_keyArrayList.getItem(i);
			var iValue = m_valueArrayList.getItem(i);
			jsonObj[iKey] = iValue;			
		}		
		return jsonObj;
	};
	
	/**
	 * @method toCommaSeparatorString
	 * @return {String} Comma separated string.
	 */
	this.toCommaSeparatorString = function(){
		var output= String.empty;
		var m_keyArrayListLength = m_keyArrayList.getLength();
		for(var i=0; i<m_keyArrayListLength; i++){
			output += String.format("{0}={1}",
				m_keyArrayList.getItem(i), m_valueArrayList.getItem(i));
				
			if(i < (m_keyArrayList.getLength() -1)){
				output += ",";
			}
		}
		
		return output;
	};
	
	/**
	 * @method toString Override Object.toString()
	 * @return {String} Indexer's information.
	 */
	this.toString = function(){		
		return String.format("{0}: contains {1} items.", 
			m_className, this.getItemCount());
	};
	
	//Initailize section.	
	return this;	
};

/**
 * @classDescription Static javascriptUtil class contains General Purpose functions.
 * @author Khwanchai Thongloy
 * @version $Revision: 1.11 $ $Date: 2009/01/21 10:25:29 $
 * @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 BrowserUtil Util Static Class.
 * @author Khwanchai Thongloy
 * @version $Revistion$ $Date: 2009/01/21 10:25:29 $
 * @history
 * 	03/11/2007 - Khwanchai Thongloy - Add documentation for this class.
 */
var BrowserUtil = function() {
    var agt = navigator.userAgent.toLowerCase();
    this.osver = 1;
    if (agt) {
        var stOSVer = agt.substring(agt.indexOf("windows ") + 11);
        this.osver = parseFloat(stOSVer);
    }
    this.major = parseInt(navigator.appVersion);
    this.nav = agt.indexOf("mozilla") != -1 &&
        agt.indexOf("spoofer") == -1 && agt.indexOf("compatible") == -1;
    this.nav6 = this.nav && this.major == 5;
    this.nav6up = this.nav && this.major >= 5;
    this.nav7up = false;
    if (this.nav6up) {
        var navIdx = agt.indexOf("netscape/");
        if (navIdx >= 0) {
            this.nav7up = parseInt(agt.substring(navIdx + 9)) >= 7;
        }
    }
    this.ie = agt.indexOf("msie") != -1;
    this.aol = this.ie && agt.indexOf(" aol ") != -1;
    if (this.ie) {
        var stIEVer = agt.substring(agt.indexOf("msie ") + 5);
        this.iever = parseInt(stIEVer);
        this.verIEFull = parseFloat(stIEVer);
    } else {
        this.iever = 0;
    }
    this.ie4up = this.ie && this.major >= 4;
    this.ie5up = this.ie && this.iever >= 5;
    this.ie55up = this.ie && this.verIEFull >= 5.5;
	this.ie6 = this.ie55up && this.iever < 7;
    this.ie6up = this.ie && this.iever >= 6;
    this.winnt = agt.indexOf("winnt") != -1 || agt.indexOf("windows nt") != -1;
    this.win32 = this.major >= 4 && navigator.platform == "Win32" ||
        agt.indexOf("win32") != -1 || agt.indexOf("32bit") != -1;
    this.mac = agt.indexOf("mac") != -1;
    this.w3c = this.nav6up;
    this.safari = agt.indexOf("safari") != -1;
    this.safari125up = false;
    if (this.safari && this.major >= 5) {
        var navIdx = agt.indexOf("safari/");
        if (navIdx >= 0) {
            this.safari125up = parseInt(agt.substring(navIdx + 7)) >= 125;
        }
    }
};



/**
 * @classDescription Create CookieStateManager Object.
 * @author Khwanchai Thongloy
 * @version $Revision: 1.11 $ $Date: 2009/01/21 10:25:29 $
 * @hitory
 * 	03/11/2007 - Khwanchai Thongloy - Reimplement with Indexer.
 * 	03/13/2007 - Khwanchai Thongloy - Refactoring Inner Indexer.
 * 
 * @constructor
 * @param {String} p_cookieKey Cookie key.
 * @return {CookieStateManager} New CookieStateManager instance.
 */
var CookieStateManager = function(p_cookieKey){
      /*private members*/
      var m_cookieId = p_cookieKey;
      var m_this = this;
	  var m_items = new Indexer();
      var m_expireDay = 1;      
      
                            
      /*Public Methods*/
      /**
       * @method Add key value to current cookie.
       * @param {String} p_subKey cookie subkey.
       * @param {String} p_value subkey value.
       */ 
      this.add = function(p_subKey, p_value){
          //Validate input.
          if(!p_subKey || !p_value || (typeof(p_subKey) != "string")){
            return;
          }
		  //Add new item to indexer.
		  m_items.addItem(p_subKey, p_value);
      }; 
	  
	  /**
	   * @method clear
	   * Remove all key/value .
	   */
	  this.clear = function(){
	  	m_items = new Indexer();
	  };  
      
      /**
       * Write SubKey-SubValue to cookie +1 Overload.
       * @param {String} p_singleValue single value string.
       * @param {Boolean} p_useBase64 Encode with Base64.
       */
      this.saveState = function(p_useBase64){       
             //Prepare values.
             var allValues = String.empty;
			 var m_itemsLength = m_items.getLength();
             for(var i=0; i < m_itemsLength; i++){
                 allValues += String.format("{0}={1}",
				 	m_items.getKey(i), m_items.getValue(i));
                 if(i != (m_items.getLength() -1)){
                     allValues += "&";
                 }
             }
             
			 //Use Base64
			 if(p_useBase64){
			 	var base64 = new Base64();
				allValues = base64.encode(allValues);
			 }
			 
             //Write Cookie
             if(allValues != String.empty){
		        var date = new Date();
		        date.setTime(date.getTime()+(m_expireDay*24*60*60*1000));
		        expires = "; expires="+date.toGMTString();
    	        document.cookie = m_cookieId + "=" + allValues + expires + "; path=/";
             } 
      };
      
      /*Initialize section*/     
      return this; 
};



/**
 * @classDescription Base64 encode / decode
 * @author http://www.webtoolkit.info/
 * @version $Revision: 1.11 $ $Date: 2009/01/21 10:25:29 $
 * @history
 * 	03/23/2007 - Khwanchai Thongloy - Create This Class.
 */
var Base64 = function(){
	var _keyStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
	
	/**
	 * private method for UTF-8 encoding
	 * @param {Object} string
	 */
	 function _utf8_encode(string) {
		string = string.replace(/\r\n/g,"\n");
		var utftext = "";

		for (var n = 0; n < string.length; n++) {

			var c = string.charCodeAt(n);

			if (c < 128) {
				utftext += String.fromCharCode(c);
			}
			else if((c > 127) && (c < 2048)) {
				utftext += String.fromCharCode((c >> 6) | 192);
				utftext += String.fromCharCode((c & 63) | 128);
			}
			else {
				utftext += String.fromCharCode((c >> 12) | 224);
				utftext += String.fromCharCode(((c >> 6) & 63) | 128);
				utftext += String.fromCharCode((c & 63) | 128);
			}

		}

		return utftext;
	}	
	
	/**
	 * private method for UTF-8 decoding
	 * @param {String} utftext
	 */ 
	 function _utf8_decode(utftext) {
		var string = "";
		var i = 0;
		var c = c1 = c2 = 0;

		while ( i < utftext.length ) {

			c = utftext.charCodeAt(i);

			if (c < 128) {
				string += String.fromCharCode(c);
				i++;
			}
			else if((c > 191) && (c < 224)) {
				c2 = utftext.charCodeAt(i+1);
				string += String.fromCharCode(((c & 31) << 6) | (c2 & 63));
				i += 2;
			}
			else {
				c2 = utftext.charCodeAt(i+1);
				c3 = utftext.charCodeAt(i+2);
				string += String.fromCharCode(((c & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63));
				i += 3;
			}

		}
		return string;
	}
	
	/**
	 * @method encode
	 * @param {String} input PlainText to be encoded.
	 * @return {String} Base64 String.
	 */
	this.encode = function(input){
		var output = "";
		var chr1, chr2, chr3, enc1, enc2, enc3, enc4;
		var i = 0;

		input = _utf8_encode(input);

		while (i < input.length) {

			chr1 = input.charCodeAt(i++);
			chr2 = input.charCodeAt(i++);
			chr3 = input.charCodeAt(i++);

			enc1 = chr1 >> 2;
			enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);
			enc3 = ((chr2 & 15) << 2) | (chr3 >> 6);
			enc4 = chr3 & 63;

			if (isNaN(chr2)) {
				enc3 = enc4 = 64;
			} else if (isNaN(chr3)) {
				enc4 = 64;
			}

			output = output +
			_keyStr.charAt(enc1) + _keyStr.charAt(enc2) +
			_keyStr.charAt(enc3) + _keyStr.charAt(enc4);
		}
		return output;
	};
	
	/**
	 * @method decode
	 * @param {String} input Base64 String.
	 */
	this.decode = function(input){
		var output = "";
		var chr1, chr2, chr3;
		var enc1, enc2, enc3, enc4;
		var i = 0;

		input = input.replace(/[^A-Za-z0-9\+\/\=]/g, "");

		while (i < input.length) {

			enc1 = _keyStr.indexOf(input.charAt(i++));
			enc2 = _keyStr.indexOf(input.charAt(i++));
			enc3 = _keyStr.indexOf(input.charAt(i++));
			enc4 = _keyStr.indexOf(input.charAt(i++));

			chr1 = (enc1 << 2) | (enc2 >> 4);
			chr2 = ((enc2 & 15) << 4) | (enc3 >> 2);
			chr3 = ((enc3 & 3) << 6) | enc4;

			output = output + String.fromCharCode(chr1);

			if (enc3 != 64) {
				output = output + String.fromCharCode(chr2);
			}
			if (enc4 != 64) {
				output = output + String.fromCharCode(chr3);
			}

		}
		output = _utf8_decode(output);
		return output;
	};

	/**
	 * @method toString
	 * @return {String} Current instance information.
	 */
	this.toString = function(){
		return "Base64 Encoder/Decoder";
	};

	//Initialize
	return this;	
};

/**
 * @classDescription Handle load configuration Helper(Static Class).
 * @author Khwanchai Thongloy
 * @version $Revision: 1.11 $ $Date: 2009/01/21 10:25:29 $
 * @history
 * 	04/01/2007 - Khwanchai Thongloy - Create this class.
 * 
 */
var ConfigurationManager= {
	loadKeyValueSeparator: function(p_nameValueString, p_separator){
		if(String.isNullOrEmpty(p_separator)){
			p_separator = "=";
		}
		//find offset.
		var offset = p_nameValueString.indexOf(p_separator);
		if((offset > 0)  && offset < (p_nameValueString.length -2)){
			var keyValue = {key:null, value:null};
			keyValue.key = p_nameValueString.subString(0, offset);
			keyValue.value = p_nameValueString.subString(offset+1);
			return keyValue;
		}else{
			return null;
		}
	}
	
};

/**
 * @classDescription Create PageLoader for loading status.
 * @param {String} p_htmlDivId HtmlDivElement.ID on page.
 * @return {PageLoader} New instance of pageloader. 
 */
 var PageLoader = function(p_htmlDivId){
 	//Private Members.
	var m_objectId = p_htmlDivId;
	var m_this = this;
	var m_domNode = null;
	var m_browser = new BrowserUtil();
	var m_refreshRate = 100;	//Miliseconds.
	var m_clearRate = 500;		//Miliseconds.
	var m_refreshHandler = null;
	var m_pageX = null;
	var m_pageY = null;
	var m_state = "";
	
	/**
	 * Handle Create domNode in first time.
	 */
	function initialize(){
		//Find HtmlDiv.
		m_domNode = document.getElementById(m_objectId);
		if(!m_domNode){
			alert (String.format("HtmlDiv {0} does not exist.", m_objectId));
			return false;
		}
		//Set Appearance.
		m_domNode.className = "pageLoader";
		
		//Set Inner content.
		m_domNode.innerHTML = 
			"<table width=\"100%\">"
		+		"<tr>"
		+			"<td width=\"80%\">&nbsp;</td>"
		+			"<td id=\"pageLoadLabel\">"
		+				"<span>Loading...<span>"
		+			"</td>"
		+		"</tr>"	
		+	"</table>";

		//Register Event.
		m_domNode.onclick = function(e){return false;};
		m_domNode.oncontextmenu = function(e){return false;};
		
		//Disable selection - Drag on this layer.
		javascriptUtil.disableSelection(m_domNode);
		
		return true;
	}
	
	/**
	 * Handle full screen for IE 6.0
	 * Because IE6.0 doesn't support fully css 2.1
	 */
	function fullScreen(){
		var currentScreen = javascriptUtil.getScreenDimension();
		m_domNode.style.top = currentScreen.scrollY; 
		if((currentScreen.scrollX + currentScreen.windowX) < m_pageX){
			m_domNode.style.left = currentScreen.scrollX;
		}
		
		//Fix ie bug.
		if(!DataType.isNumber(m_pageY)){
			m_pageY = 2 * currentScreen.scrollY;
		}
		m_domNode.style.height = m_pageY - currentScreen.scrollY + "px";
		m_domNode.style.width = currentScreen.windowX + "px";
	}
	
	/**
	 * Handle restoreHtmlVisible function reference.
	 */
	function restoreHtmlVisible(){
		//Restore HtmlDropDownList in IE6.0
		if(m_browser.ie6){
			javascriptUtil.showHtmlDropDownList(true);
		}
		m_domNode.style.display = m_state;
	}
	
	/**
	 * @method hide - Hide PageLoader.
	 */
	this.hide = function(){
		m_state = "none";
		setTimeout(restoreHtmlVisible, m_clearRate);
		if(m_refreshHandler != null){
			clearInterval(m_refreshHandler);
		}
	};
	
	/**
	 * @method show - Show PageLoader. 
	 **/
	this.show = function(){
		//Protect overlapse invoking.
		if(m_state != "none"){
			return;
		}
		
		//IE6 Section
		if(m_browser.ie6){
			var currentScreen = javascriptUtil.getScreenDimension();
			m_pageX = (currentScreen.pageX > currentScreen.windowX)?
						currentScreen.pageX:
						currentScreen.windowX;
			m_pageY = (currentScreen.pageY > currentScreen.windowY)?
						currentScreen.pageY: 
						currentScreen.windowY;

			m_domNode.style.height = m_pageX + "px";						
			m_domNode.style.height = m_pageY + "px";	
			
			//SetVisible to HtmlDropDownList.
			//javascriptUtil.showHtmlDropDownList(false);
			
			//Invoke fullScreen function.
			setInterval(fullScreen, m_refreshRate);	
		}
		
		//SetVisible to Layer.
		m_state = "";
		m_domNode.style.display = m_state;		
	};
	
	/**
	 * @method setText
	 * @param {String} p_text Message in Loader.
	 */
	this.setText = function(p_text){
		if(!String.isNullOrEmpty(p_text)){
			//m_domNode.innerHTML = p_text;
		}
	};
	
	/**
	 * @method toString
	 * @return {String} PageLoader Information.
	 */
	this.toString = function(){
		return "PageLoader Object";
	};
	
	//Initialize
	if(initialize()){
		if(m_browser.ie6){
			fullScreen();
		}	
		this.hide();
		return this;
		
	}else{
		return null;
	}
 };
 
 function CheckMarkInCheckBox(p_isCheck, p_checkBox)
 {
    var checkBox = document.getElementById('ctl00_content_' + p_checkBox);
    
    if(p_isCheck){
        checkBox.checked = true;
    }
    else{
        checkBox.checked = false;
    }
 }
 
 function SetStyleControl(p_controlId, p_disable){
    var control = $(p_controlId);
    if(p_disable){
        control.disabled = true;  
        control.style.color = "#A7A6AA";
        control.style.backgroundColor = "#F0F0F0";  
    }  
    else{
        control.disabled = false;  
        control.style.color = "";
        control.style.backgroundColor = "FFFFFF";
    }    
}


function clientSideReloadPageHeader(p_id, p_callbackData)
{
    if(String.isNullOrEmpty(p_id) || String.isNullOrEmpty(p_callbackData) || p_callbackData == "null"){
	    return;
	}

    //get CurrentNode
    var currentNode = document.getElementById(p_id);
    var div = currentNode.getElementsByTagName("div");
    
    if(div.length > 1){
        var currentDiv = div[1];
    }
    else
    {
        var currentDiv = div[0];
    }
    
    //replace with new html Data
    currentDiv.innerHTML = p_callbackData;
}






/* START Callback Events */
/* Move to Osellus.DotNetNuke.UI.Resources.JS.WebInstance.js */

