

	//----------------------------- Window ----------------------------------
	/**
	*	Popup Window (Center screen)
	* 
	*	@param theURL		taget url
	*	@param	 Name			popup window name
	*	@param	 popW			width
	*	@param	 popH			height
	*	@param	 scroll			Scrollbar yes, no
	*/
	function winBRopen(theURL, Name, popW, popH, scroll) { // V 1.0
		//var Name = "myProfile";
		//var popW = 650;
		//var popH = 250;
		//var scroll = "yes";
		var winleft = (screen.width - popW) / 2;
		var winUp = (screen.height - popH) / 2;
		winProp = 'width='+popW+',height='+popH+',left='+winleft+',top='+winUp+',scrollbars='+scroll+',resizable';
		Win = window.open(theURL, Name, winProp);
		if (parseInt(navigator.appVersion) >= 4) { Win.window.focus(); }
	}

	function js_getObject(strObjName) {
		if (eval("document.forms['frm_main'].elements['"+strObjName+"']") != null) {
			return eval("document.forms['frm_main'].elements['"+strObjName+"']");
		}else if (eval("document.getElementById('"+strObjName+"')") != null) {
			return eval("document.getElementById('"+strObjName+"')");
		}else{
			//alert(strObjName+" is not exist!");	
			return false;
		}
	}

	function js_getString(strObjName, df) {
		return (js_getObject(strObjName)==false)?df:js_getObject(strObjName).value;
	}

	function js_getValue(strObjName, df) {
		return (js_getObject(strObjName)==false)?df:js_getObject(strObjName).value;
	}

	function js_getText(strObjName, df) {
		return (js_getObject(strObjName)==false)?df:(js_getObject(strObjName).options[js_getObject(strObjName).selectedIndex].text);
	}

	function js_setValue(strObjName, val) {
		if (js_getObject(strObjName) != false) {
			js_getObject(strObjName).value = val;
		}
	}

	function js_setText(strObjName, val) {
		if (js_getObject(strObjName) != false) {
			js_getObject(strObjName).innerHTML = val;
		}
	}


	function js_parseValue(value, type) {
		switch (type) {
			case 'int':
				return (value=='' || value==undefined)?0:parseInt(value);
			break;

			case 'float':
				return (value=='' || value==undefined)?0:parseFloat(value);
			break;
		}
	}

	function js_parseObject(strObjName, type) {
		var obj = eval("document.forms['frm_main'].elements['"+strObjName+"']");
		
		if (obj == null) {
			alert(strObjName+' is null');
			return false;
		}
		
		switch (type) {
			case 'int':
				return (obj.value=='' || obj.value==NaN)?0:parseInt(obj.value);
			break;

			case 'float':
				return (obj.value=='' || obj.value==NaN)?0:parseFloat(obj.value);
			break;
		}
	}

	function js_disabled(strObjectName, bolDisabled) {
		var obj = js_getObject(strObjectName);

		obj.disabled = bolDisabled;
	}

	function js_hide(strObjectName, hide) {
		var obj = js_getObject(strObjectName);

		obj.style.display = hide;
	}


	
	/**
	* for popup select
	*/
	function js_selectAll(strObjName) {
		var objSelect = eval("document.forms['frm_main'].elements['"+strObjName+"']");
		
		if (objSelect == undefined) {
			alert (strObjName+' is null');
			return false;
		}

		for (i=objSelect.options.length; i>0; i--) {
			objSelect.options[i-1].selected = true;
		}
	}
	
	function js_selectDelete(strObjName) {
		var objSelect = eval("document.forms['frm_main'].elements['"+strObjName+"']");
		
		if (objSelect.selectedIndex < 0) {
			alert('เลือกรายการที่ต้องการลบ');
			objSelect.focus();
			return false;
		}else{
			objSelect.options[objSelect.selectedIndex] = null;
		}
	}

	function js_selectFromPopup(strObj1Name, strObj2Name) {
		var objItems = eval("document.forms['frm_main'].elements['"+strObj1Name+"']");
		var objSelect = eval("window.parent.document.forms['frm_main'].elements['"+strObj2Name+"']");
		 
		with(objSelect) {
			for (i=options.length; i>0; i--) {
				//options[i] = null;
			}
			k = -1;
			total = options.length;
			//alert(objItems.length);
			for (j=0; j<objItems.length; j++) {
				if (objItems[j].checked) {
					k++;
					val = new String(objItems[j].value);
					newVal = val.split('|');
					options[k+total] = new Option(newVal[1], newVal[0]);
				}
			}
		}
	}

	function js_setFocus(strObjName) {
		js_getObject(strObjName).focus();
	}


	function js_copyValue(strObj1Name, strObj2Name) {
		var obj1 = js_getObject(strObj1Name);
		var obj2 = js_getObject(strObj2Name);

		obj2.value = obj1.value;
	}

	function js_copySelect(strObj1Name, strObj2Name) {
		var obj1 = js_getObject(strObj1Name);
		var obj2 = js_getObject(strObj2Name);

		obj2.selectedIndex = obj1.selectedIndex;
	}

	
	
	function js_CreateText(name, val, lock) {
		var el = document.createElement('input');
	  el.setAttribute('type', 'text');
	  el.setAttribute('name', name);
	  el.setAttribute('id', name);
	  el.setAttribute('value', val);
	  // event
	  el.onchange = function() {
		  js_DynElement_onChange(el, name);
	  }
	  el.onkeyup = function() {
		  js_DynElement_onKeyUp(el, name);
	  }
	  if (lock) {
		el.setAttribute('readonly', true);
	  }
	  el.style.width = '95%';
	  
	  return el;
	}
	
	function js_CreateHidden(name, val) {
		var el = document.createElement('input');
	  el.setAttribute('type', 'hidden');
	  el.setAttribute('name', name);
	  el.setAttribute('id', name);
	  el.setAttribute('value', val);
	  el.style.width = '95%';
	  
	  return el;
	}
	
	
	function js_CreateLabel(val, align) {
		var el = document.createElement('span');
		el.innerHTML = val;
		el.style.textAlign = align;
	  
	  return el;
	}
	
	function js_DynElement_onChange(obj) {
		//alert(obj.value);
		//calculatePrice();
	}
	
	function js_DynElement_onKeyUp(obj, name) {
		//alert(obj.value);
		calculatePrice();
	}


	function js_formatCurrency(num) {
		num = num.toString().replace(/\$|\,/g,'');
		if(isNaN(num))
		num = "0";
		sign = (num == (num = Math.abs(num)));
		num = Math.floor(num*100+0.50000000001);
		cents = num%100;
		num = Math.floor(num/100).toString();
		if(cents<10)
		cents = "0" + cents;
		for (var i = 0; i < Math.floor((num.length-(1+i))/3); i++)
		num = num.substring(0,num.length-(4*i+3))+','+
		num.substring(num.length-(4*i+3));
		return (num + '.' + cents);
	}


	/*
	Calendar
	*/
	
	function js_changeView(task) {
		js_setValue('c_view', task);
		js_setValue('s_task', task);
		js_submit();
	}
	
	function js_changeMonth(month, year) {
		var objMonth = document.forms['frm_main'].elements['CMonth'];
		var objYear = document.forms['frm_main'].elements['CYear'];
		
		objMonth.value = month;
		objYear.value = year;
		
		js_submit();
	}
	
	function js_changeWeek(wdate) {
		var objDay = document.forms['frm_main'].elements['CDay'];
		var objMonth = document.forms['frm_main'].elements['CMonth'];
		var objYear = document.forms['frm_main'].elements['CYear'];
		
		wdates = wdate.split('-');
		objYear.value = wdates[0];
		objMonth.value = wdates[1];
		objDay.value = wdates[2];
		
		js_submit();
	}
	
	function js_changeDay(wdate) {
		var objDay = document.forms['frm_main'].elements['CDay'];
		var objMonth = document.forms['frm_main'].elements['CMonth'];
		var objYear = document.forms['frm_main'].elements['CYear'];
		
		wdates = wdate.split('-');
		objYear.value = wdates[0];
		objMonth.value = wdates[1];
		objDay.value = wdates[2];
		
		js_submit();
	}
	
	function js_addEvent(edate) {
		js_setValue('EventDate', edate);
		js_setValue('s_task', 'add');
		js_submit();
	}
	
	function js_editEvent(id) {
		js_setValue('s_id', id);
		js_setValue('s_task', 'edit');
		js_submit();
	}
	
	function js_viewEvent(id) {
		js_setValue('s_id', id);
		js_setValue('s_task', 'view');
		js_submit();
	}

	// Add the selected items from the source to destination list
function addSrcToDestList(desc, src) {
destList = window.document.forms['frm_main'].elements[desc];
srcList = window.document.forms['frm_main'].elements[src];
var len = destList.length;
for(var i = 0; i < srcList.length; i++) {
if ((srcList.options[i] != null) && (srcList.options[i].selected) && (srcList.options[i].value != "")) {
//Check if this value already exist in the destList or not
//if not then add it otherwise do not add it.
var found = false;
for(var count = 0; count < len; count++) {
if (destList.options[count] != null) {
if (srcList.options[i].value == destList.options[count].value) {
found = true;
break;
      }
   }
}
if (found != true) {
destList.options[len] = new Option(srcList.options[i].text,srcList.options[i].value); 
len++;
         }
      }//if ((srcList.options[i] != null) && (srcList.options[i].selected)) {
   }// for(var i = 0; i < srcList.length; i++) {
}// end function

// Deletes from the destination list.
function deleteFromDestList(desc) {
var destList  = window.document.forms['frm_main'].elements[desc];
alert(destList);
var len = destList.options.length;
for(var i = (len-1); i >= 0; i--) {
if ((destList.options[i] != null) && (destList.options[i].selected == true)) {
destList.options[i] = null;
      }
   }
}


function js_checked(strObjectName, b) {
	var obj = js_getObject(strObjectName);
	
	obj.checked = b;
}

function js_checked_all(strObjectName, b) {
	var obj = js_getObject(strObjectName);
	
	if (obj) {
		if (obj.length > 1) {
			for (var i=0; i<obj.length; i++) {
				obj[i].checked = b;
			}
		}else{
			obj.checked = b;
		}
	}
}

function chkbox_master_action(b) {
	js_checked_all('chkbox_items', b);
}

function chkbox_items_action() {
	var obj = js_getObject('chkbox_items');
	
	if (obj) {
		if (obj.length > 1) {
			for (var i=0; i<obj.length; i++) {
				if(!obj[i].checked) {
					js_checked('chkbox_master', false);
					break;
				}
				js_checked('chkbox_master', true);
			}
		}else{
			if(obj.checked) {
				js_checked('chkbox_master', true);
			}else{
				js_checked('chkbox_master', false);
			}
		}
	}
}




// F. Permadi 2008.
// Highlights table row
// (C) F. Permadi

// These variables are for saving the original background colors
var previousElements=new Array();
var previousColors=new Array();
var previousColorAvailable=new Array();
var previousClassNames=new Array();
var elementCount=0;

/////////////////////////////////////////////////////
// This function takes an element as a parameter and 
//   returns an object which contain the saved state
//   of the element's background color.
/////////////////////////////////////////////////////
function saveBackgroundStyle(myElement)
{
  var saved=new Object();
  saved.element=myElement;
  saved.className=myElement.className;
  if (myElement.style && myElement.style["backgroundColor"])
  {
    saved.hasBackgroundColor=1; 
    saved.backgroundColor=myElement.style["backgroundColor"];
  }
  else
    saved.hasBackgroundColor=0;      
}

/////////////////////////////////////////////////////
// This function takes an element as a parameter and 
//   returns an object which contain the saved state
//   of the element's background color.
/////////////////////////////////////////////////////
function restoreBackgroundStyle(savedState, targetElement)
{
  if (targetElement.style && savedState.hasBackgroundColor)
  {
    targetElement.style["backgroundColor"]=savedState.backgroundColor;
  }
  if (savedState.className)
  {
    targetElement.className=savedState.className;    
  }
}

/////////////////////////////////////////////////////
// This function is used by highlightTableRow()
/////////////////////////////////////////////////////
function findNode(startingNode, tagName)
{
  // on Firefox, the TD node might not be the firstChild node of the TR node
  myElement=startingNode;
  var i=0;
  while (myElement && (!myElement.tagName || (myElement.tagName && myElement.tagName!=tagName)))
  {
    myElement=startingNode.childNodes[i];
    i++;
  }  
  if (myElement && myElement.tagName && myElement.tagName==tagName)
  {
    return myElement;
  }
  // on IE, the TD node might be the firstChild node of the TR node  
  else if (startingNode.firstChild)
    return findNode(startingNode.firstChild, tagName);
  return 0;
}

/////////////////////////////////////////////////////
// Highlight table row.
// newElement could be any element nested inside the table
// highlightColor is the color of the highlight
/////////////////////////////////////////////////////
function highlightTableRow(highlightColor)
{
	highlightColor='#ff0000';
  var i=0;
  // Restore color of the previously highlighted row
  for (i; i<elementCount; i++)
  {
    var myElement=previousElements[i];
    if (myElement.style && previousColorAvailable[i])
    {
      myElement.style["backgroundColor"]=previousColors[i];
    }
    previousColors[i]=0;
    previousColorAvailable[i]=0;
    if (previousClassNames[i])
    {
      myElement.className=previousClassNames[i];    
    }
    previousElements[i]=0;
    previousClassNames[i]=0;
  }
  elementCount=0;
  
  // To get the node to the row (ie: the <TR> element), 
  // we need to traverse the parent nodes until we get a row element (TR)
  var myElement=this;

  // If you don't want a particular row to be highlighted, set it's id to "header"
  if (myElement && myElement.id && myElement.id=="header")  
    return;
		  
  // Highlight every cell on the row
  if (myElement)
  {
    var previousRow=myElement;
    
    // Save the backgroundColor style OR the style class of the row (if defined)
    if (previousRow)
    {
      previousElements[elementCount]=previousRow;
      previousClassNames[elementCount]=previousRow.className;
      previousColors[elementCount]=previousRow.style["backgroundColor"];
      previousColorAvailable[elementCount]=1;
      elementCount++;  
    }

    // myElement is a <TR>, then find the first TD
    var tableCell=findNode(myElement, "TD");    

    var i=0;
    // Loop through every sibling (a sibling of a cell should be a cell)
    // We then highlight every siblings
    while (tableCell)
    {
      // Make sure it's actually a cell (a TD)
      if (tableCell.tagName=="TD")
      {
        previousElements[elementCount]=tableCell;      
        // If no style has been assigned, assign it, otherwise Netscape will 
        // behave weird.
        if (!tableCell.style)
        {
          tableCell.style={};
        }
        else
        {
          previousClassNames[elementCount]=tableCell.className;
          previousColors[elementCount]=tableCell.style["backgroundColor"];
          previousColorAvailable[elementCount]=1;
          elementCount++;
        }
        // Assign the highlight color.  Remember this is stored as paramater in propagateEventHandler function
        tableCell.style["backgroundColor"]=this.parameter["onmouseover"];

        // Optional: alter cursor
        tableCell.style.cursor='default';
        i++;
      }
      // Go to the next cell in the row
      tableCell=tableCell.nextSibling;
    }
  }
}

/////////////////////////////////////////////////////
// This function traverses the DOM tree of the currentElement
// When currentElement's tagName matches elementTagNameToAttachHandlerTo
// then that element's eventName is assigned to eventHandlerFunctionToBeCalled.
//
// For example, to traverse a <table> and assigns doSomething onmouseover event handler to every <tr> element,
// the function call is something like this:
// propagateEventHandler(document.getElementById("tableId", "onmouseover", "TR" "doSomething", parameter);
/////////////////////////////////////////////////////
function propagateEventHandler(currentElement, eventName, elementTagNameToAttachHandlerTo, eventHandlerFunctionToBeCalled, eventHandlerFunctionParam)
{
  if (currentElement)
  {
//	alert(elementTagNameToAttachHandlerTo);  
    var j;
    var tagName=currentElement.tagName;

	// save the original handler (this is for illustration purpose, it is not necessary)
	if (currentElement.tagName==elementTagNameToAttachHandlerTo)
	{
		if (currentElement[eventName])
		{
		  if (!currentElement.originalEventHandler)
			 currentElement.originalEventHandler=new Object();
		  currentElement.originalEventHandler[eventName]=currentElement[eventName];
		}
	
		// This is needed because IE 7 chokes when arying to assign event to certain elements
		try
		{
			//alert(currentElement.tagName);  
			currentElement[eventName]=eventHandlerFunctionToBeCalled;
			
			// Store parameter within the element itself
			if (!currentElement.parameter)
				currentElement.parameter=new Object();
			currentElement.parameter[eventName]=eventHandlerFunctionParam;
		}
		catch(error){};
	}
	
    // Traverse the tree and assign the event handler to every descendants
    var i=0;
    var currentElementChild=currentElement.childNodes[i];
    while (currentElementChild)
    {
      propagateEventHandler(currentElementChild,  eventName, elementTagNameToAttachHandlerTo, eventHandlerFunctionToBeCalled, eventHandlerFunctionParam);
      i++;
      currentElementChild=currentElement.childNodes[i];
    }
  }
}



		function getKeyValue(e) {
			if( !e ) {
				//if the browser did not pass the event information to the
				//function, we will have to obtain it from the event register
				if( window.event ) {
					//DOM
					e = window.event;
				} else {
					//TOTAL FAILURE, WE HAVE NO WAY OF REFERENCING THE EVENT
					return;
				}
			}
			if( typeof( e.which ) == 'number' ) {
				//NS 4, NS 6+, Mozilla 0.9+, Opera
				e = e.which;
			} else if( typeof( e.keyCode ) == 'number'  ) {
				//IE, NS 6+, Mozilla 0.9+
				e = e.keyCode;
			} else if( typeof( e.charCode ) == 'number'  ) {
				//also NS 6+, Mozilla 0.9+
				e = e.charCode;
			} else {
				//TOTAL FAILURE, WE HAVE NO WAY OF OBTAINING THE KEY CODE
				return;
			}
			//alert(e);
			return e;
			//window.alert('The key pressed has keycode ' + e +
				//' and is key ' + String.fromCharCode( e ) );
		}

		function isReturnKey() {
			return (this.getKeyValue() == 13)?true:false; 
		}

		function isSpaceKey() {
			return (this.getKeyValue() == 32)?true:false; 
		}

function calendar_after_selected(y,m,d,e) {
	
}


function check_personal_id(id) { 
		if(id.length != 13) return false; 
		for(i=0, sum=0; i < 12; i++) 
			sum += parseFloat(id.charAt(i))*(13-i); 
			if((11-sum%11)%10!=parseFloat(id.charAt(12))) return false; 
				return true; 
} 

function trim(str, chars) {
return ltrim(rtrim(str, chars), chars);
}

function ltrim(str, chars) {
chars = chars || "\\s";
return str.replace(new RegExp("^[" + chars + "]+", "g"), "");
}

function rtrim(str, chars) {
chars = chars || "\\s";
return str.replace(new RegExp("[" + chars + "]+$", "g"), "");
}

function insertAtCaret(areaId,text) { 
	var txtarea = document.getElementById(areaId); 
	var scrollPos = txtarea.scrollTop; 
	var strPos = 0; 
	var br = ((txtarea.selectionStart || txtarea.selectionStart == '0') ? "ff" : (document.selection ? "ie" : false ) ); 

	if (br == "ie") { 
		txtarea.focus(); 
		var range = document.selection.createRange(); 
		range.moveStart ('character', -txtarea.value.length); 
		strPos = range.text.length; 
	} else if (br == "ff") 
		strPos = txtarea.selectionStart; 

	var front = (txtarea.value).substring(0,strPos); 
	var back = (txtarea.value).substring(strPos,txtarea.value.length); 
	txtarea.value=front+text+back; 
	strPos = strPos + text.length; 
	if (br == "ie") { 
		txtarea.focus(); 
		var range = document.selection.createRange(); 
		range.moveStart ('character', -txtarea.value.length); 
		range.moveStart ('character', strPos); 
		range.moveEnd ('character', 0); 
		range.select(); 
	} else if (br == "ff") { 
		txtarea.selectionStart = strPos; 
		txtarea.selectionEnd = strPos; 
		txtarea.focus(); 
	} 
	txtarea.scrollTop = scrollPos; 
} 
