 /*
   Openbiz client utility file includes
   @author rockys swen
 */
 
 // ****** change the bin path. ******
 var rootPath = "/"
 var binPath = rootPath+"bin/";
 var bizsrvr = binPath+"controller.php";
 var HtmlEdit = false;

 // **********************************
 
 var RPC_DEBUG = false;
 
 var objectArray = new Array();
 var onElement = null;
 
 function js_getControl(pk,container) {
    var string = pk+"("+container+")";
    
    CallFunction(string); 
//alert(document.getElementById(container));
    if (document.getElementById(container)) 
    {
      if (document.getElementById(container).onchange) {
      	document.getElementById(container).onchange();
      }
    }
}

 function SetOnElement(elmName)
 {
   onElement = elmName;
   //todo : change to new function
   if(HtmlEdit){
	  tinyMCE.triggerSave();
	  tinyMCE.isNotDirty = true;
   }
 }
 
 function NewObject(objname, classname)
 {
   //alert(objname);
   if (objectArray[objname])
      return;
   else
   {
     if (!classname) return;
     try 
     {
       var newobj  = eval("new "+classname+"('"+objname+"')");
       if (newobj)
         objectArray[objname] = newobj;
     }
     catch(e) {}
   }
 } 
 function GetObject(objname)
 {
   if (objectArray[objname])
      return objectArray[objname];
   else
      return null;
 }
 
 function GoToView(view, rule, loadPageTarget, id, section)
 {
   var param = "";
   if (typeof(mod)!= 'undefined' &&  mod )  param +="&mod="+mod;
   if (typeof(form)!= 'undefined' && form) param +="&form="+form;
   if (rule) param +="&rule="+rule;
   if (id)   param +="&p="+id;
   if (section) param += section;
   URL = bizsrvr+"?view="+view+param;
   loadPage(URL, loadPageTarget);
 }
 
 function GoToModule(view, rule, loadPageTarget, form, additionParameter)
 {
   var param = "";
   if (form) param +="&form="+form;
   if (rule) param +="&rule="+rule;
   if (additionParameter) param +="&rule="+additionParameter;
   URL = bizsrvr+"?view="+view+param;
   loadPage(URL, loadPageTarget);
 }
 
 function DrillDownToView(view, rule, loadPageTarget)
 {
   var param = "";
   if (typeof(section) != "undefined" && section ) param = "&section=" + section;
   URL = bizsrvr+"?view="+view+"&form=";
   if (rule && typeof(section) != "undefined") URL += "&rule="+rule;
   URL += param;   // plus a history flag. Is it usefule in 2.0?
   loadPage(URL, loadPageTarget);
 }
 
 // obj_method_params as format "obj.method('string',value)"
 // service, method, params, ...
 // funcType can be 
 //   'RPC'(default)
 //   'Page'(reload url), 
 //   'Form'(submit form with post), 
 //   'Popup'(open popup with url), 
 //   'FormPopup'(open popup with form submit)
 function CallFunction(obj_method_params, funcType, loadPageTarget)
 {
   document.body.style.cursor = "wait";
   if (funcType == null || funcType == '')
      funcType = "RPC";

   // find the first "(" 
   var pos0 = obj_method_params.indexOf("("); 
   var obj_method = obj_method_params.substring (0,pos0); 
   
   pos0 = obj_method.lastIndexOf(".");
   // parse object name
   var obj = "NULL";
   var attachData= null;
   if (pos0>0)
      obj = obj_method.substring(0,pos0);
   // parse method/function name
   var pos1 = obj_method_params.indexOf("(");
   if (pos1>pos0)
   {
      var method = obj_method_params.substring(pos0+1,pos1); 
      var pos2 = obj_method_params.indexOf(")");
      if (pos1>pos0)
      {
         // get parameters
         var params = obj_method_params.substring(pos1+1,pos2);
         var params_array = new Array(); 
         if (params) 
            params_array = params.split(","); 
         var paramArray = new Array(2+params_array.length);
         paramArray[0] = obj;
         paramArray[1] = method;
         for(i=0;i<params_array.length;i++)  paramArray[2+i] = params_array[i];
         
         // try to call client object function
         var client_obj = GetObject(obj);
         if (client_obj)
            return CallObjectMethod(client_obj, method, funcType, loadPageTarget, params_array);
         
         if (funcType=="RPC") {
            XmlHttpRPC(bizsrvr, CallbackFunction, "RPCInvoke", paramArray, null);
            document.body.style.cursor = "default";
            return;
         }
         
         URL = composeURL(bizsrvr, "Invoke", paramArray, null, funcType, loadPageTarget);        
         if (funcType=="Page") 
            loadPage(URL, loadPageTarget); 
         else if (funcType=="Popup")
            loadPopup(URL);
         else if (funcType=="Form") 
            alert("Cannot submit an unknown form."); 
         else if (funcType=="FormPopup")
            alert("Cannot submit an unknown form to show a popup.");
         else
            alert("invalid function type '"+funcType+"'");
      }
    }
 }

function CallObjectMethod(client_obj, method, funcType, loadPageTarget, params_array)
{
   client_obj.m_FunctionType = funcType;
   client_obj.m_LoadPageTarget = loadPageTarget;
   if (client_obj[method])
      client_obj[method](params_array);
   else
      client_obj.CallFunction(method,params_array);
   document.body.style.cursor = "default";
}
 
function dummy_callback(returval) {}

function CallbackFunction(returval) 
 {
   document.body.style.cursor = "default";
   // extract an item from type:value string
   //var tmp = ExtractItem(returval, "PARENT", 0);
   //if (!tmp) return;
   //var prtname = tmp[0];
   //alert("callback"+returval);
   var tmp = new Array(2);
   tmp[0] = ""; // store the content
   tmp[1] = 0; // store the next start position
 for (i=0;i<10;i++)
 {
   tmp = ExtractItem(returval, "<___TARGET___>", tmp[1]);
   if (!tmp) return;
   var tgtname = tmp[0];
   tmp = ExtractItem(returval, "<___CONTENT___>", tmp[1]);
   if (!tmp) return;
   var content = tmp[0];
   
   if (tgtname == "ERROR") {
      popupErrorText(content);
      return;
   }
   if (tgtname == "POPUP") {
      popupWindow(content,600,500);
      return;
   }
   if (tgtname == "FUNCTION") {
      eval(content);
      continue;
      //return;
   }
   
   // try to call client object function
   var client_obj = GetObject(tgtname);
   if (client_obj)
   {
      client_obj.CallbackFunction(content);
      CallbackFunction(returval.substring(tmp[1], returval.length));
      return;
   }
   else if (window.opener)     // for popup window
   {
      var client_obj = window.opener.window.GetObject(tgtname);
      if (client_obj)
      {
         client_obj.CallbackFunction(content);
         CallbackFunction(returval.substring(tmp[1], returval.length));
         self.close();  // update parent opener form, close the popup itself
         return;
      }
   }
   /*else     // see if other frames have the target. bug: other frame may not has clientUtil.js
   {
      for (i=0; i<top.frames.length; i++)
      {
         var client_obj = top.frames[i].window.GetObject(tgtname);
         if (client_obj)
         {
            client_obj.CallbackFunction(content);
            CallbackFunction(returval.substring(tmp[1], returval.length));
            return;
         }
      }
   }*/
   
   // if no client object, default handle the return content
   //var containerName = this.m_Name+"_container";
   var containerName = tgtname;
   var dt = document.getElementById(containerName);
   if (dt)
      dt.innerHTML = content;
   else
      alert("Cannot find html object with name as "+containerName);
 }
}
 /*
 var str = "TARGET:7:LCOrder;CONTENT:13:<html></html>;";
 var r = ExtractItem(str, "TARGET", 0);
 alert(r);
 var r = ExtractItem(str, "CONTENT", r[1]);
 alert(r);
 */
  function ExtractItem(str, startTag, start)
 {
   var endTag = startTag.substring(0,1)+"/"+startTag.substring(1,startTag.length);
   var pos0 = str.indexOf(startTag, start);
   if (pos0>=0)
   {
      pos0 += startTag.length;
      var pos1 = str.indexOf(endTag, start);
      if (pos1>pos0)
      {  
         var tmparray = Array(2);
         tmparray[0] = str.substring(pos0, pos1);
         tmparray[1] = pos1 + endTag.length;
         return tmparray;
      }
   }
   return null;
   /*var pos0 = str.indexOf(type, start);
   if (pos0>=0)
   {
      pos0 += type.length+1;
      pos1 = str.indexOf(":", pos0);
      if (pos1>pos0)
      {  
         len = parseInt(str.substring(pos0, pos1+1),10);
         if (len>0)
         {
            strval = str.substring(pos1+1, pos1+1+len);
            var tmparray = Array(2);
            tmparray[0] = strval;
            tmparray[1] = pos1+1+len+1;
            return tmparray;
         }
      }
   }*/
   return null;
 }
 
 
// collect form data from controls in the form
function CollectData(formName)
{
   var myform = document.getElementById(formName);
   var tmpName = "";
   if (!myform)
   {
      //alert("Cannot find the form with name "+formName);
      return null;
   }
   var rtdata = "";
   var eqObj = false;
   // need add multiple selection support

   if (myform.elements.length > 0)
      rtdata += GetCtrlData(myform.elements[0],false);
   for (e=1;e<myform.elements.length;e++)
   {
      if(myform.elements[e].name == tmpName) {
	      ctrlData = GetCtrlData(myform.elements[e],true);
	      eqObj = true;
	  } else {
	      ctrlData = GetCtrlData(myform.elements[e],false);
	      if (ctrlData)  {
	          tmpName = myform.elements[e].name;
	          eqObj = false;
	      }
	  }
      
      if (ctrlData)
          rtdata = AppendFormData(rtdata, ctrlData, myform.elements[e].type, eqObj);
      
   }

   if (onElement) {  // get onfocus element, may not necessary
      rtdata = AppendFormData(rtdata, "__this=" + onElement);
      onElement = null;
   }
   // rtdata = escape(rtdata);
   return rtdata;
}
function AppendFormData(formData, appendData, objType, eqObj, hashValue)
{ 
   if (objType == 'checkbox' && eqObj)
       return formData + "||" + appendData ;
   else
       return formData + "^-^-^" + appendData;
}

function AppendTextData(preFixName)
{
    var CtrlObj,valTxt;
    preFixName = preFixName.replace("[","");
    preFixName = preFixName.replace("]","");
    if (!(CtrlObj=document.getElementById(preFixName+"_text"))) return;
    valTxt = "~~~" + CtrlObj.value + "~~~";
    return valTxt;
}

function GetCtrlData(Ctrl, valueOnly)
{
   // alert(Ctrl.name+","+Ctrl.value+","+Ctrl.type+","+Ctrl.checked);
   var strTemp = "";
   var strTempN = "";
   var strTempV = "";
   // 
   if (!valueOnly) {
       if (Ctrl.type == "checkbox")
           strTempN = Ctrl.name.replace(/\[\]/i,'')+"=";
       else
           strTempN = Ctrl.name+"=";
   } else {
       if (Ctrl.type == "radio" && Ctrl.checked)
           strTempN = Ctrl.name+"=";
   }
   // 
   if (Ctrl.type == "checkbox") {
      if (Ctrl.checked) strTempV = Ctrl.value;
      if (strTempV == "o") {
          var tmp = AppendTextData(Ctrl.name);
          strTempV += "||" + tmp;
      }
   }
   else if (Ctrl.type == "radio") {
      if (Ctrl.checked) {
          strTempV = Ctrl.value;
          if (strTempV == "o") {
	          var tmp = AppendTextData(Ctrl.name);
	          strTempV += "||" + tmp;
	      }
      }
      else return null;
   } 
   else if (Ctrl.type == "listbox") {
      strTempV = Ctrl.value;
      if (strTempV == "o") {
	     var tmp = AppendTextData(Ctrl.name);
	     strTempV += "||" + tmp;
	  }
   }
   else if (Ctrl.type == "select-multiple") {
      for (var i = 0; i < Ctrl.options.length; ++i){
          if (Ctrl.options[i].selected){
               if (strTempV=="") strTempV += Ctrl.options[i].value;
               else strTempV += "||" + Ctrl.options[i].value;
          }
      }
   }
   else if (Ctrl.type == "select-one" && Ctrl.value == "search_all") {
      for (var i = 1; i < Ctrl.options.length; ++i){
          if (strTempV=="") strTempV += Ctrl.options[i].value;
          else strTempV += "||" + Ctrl.options[i].value;
      }
   }
   
   else
      strTempV = Ctrl.value; 
   if (strTempV) strTemp = strTempN + strTempV; 
   return strTemp;
   
   /**
   case "select-multiple":
         this.values = new Array();
         for (var i = 0; i < element.options.length; ++i){
            if (element.options[i].selected && (!this.exclude || element.options[i].value != this.exclude)){
               this.values[this.values.length] = element.options[i].value;
            }
         }
   */
   
   
   /*
   if (Ctrl.length==1)
      return Ctrl.value;
   for(var i = 0;i < Ctrl.length;i++){
      if(Ctrl.options[i].selected == true)
         strTemp += Ctrl.options[i].value+"#";
   }*/
   // return data with format CTRLDATA:DataLength:DataString
   //return "CTRLDATA:"+strTemp.length+":"+strTemp;
}
// --------- AjaxForm ----------- //

Function.prototype.inheritsFrom = function( parentClassOrObject ){ 
	if ( parentClassOrObject.constructor == Function ) 
	{ 
		this.prototype = new parentClassOrObject;
		//this.prototype.constructor = this;
		//this.prototype.parent = parentClassOrObject.prototype;
		//this.prototype.parent = parentClassOrObject;
	} 
} 

function AjaxForm(name)
{
   this.m_Name = name;
   this.m_FunctionType = "RPC"
   this.m_LoadPageTarget = null;
}
//set methods
AjaxForm.prototype.GetFormControl = function (controlName)
{
   var myform = document.getElementById(this.m_Name);
   return myform[controlName];
}
AjaxForm.prototype.CallFunction = function (method, params_array)
{
   funcType = this.m_FunctionType;
   loadPageTarget = this.m_LoadPageTarget;
   if(params_array[0] !='READ')
   formData = this.CollectFormData();

   var paramArray = new Array(2+params_array.length);
   obj = this.m_Name;
   paramArray[0] = obj;
   paramArray[1] = method;
   for(i=0;i<params_array.length;i++)  paramArray[2+i] = params_array[i];
   
   if (funcType=="RPC") {	 
	    removeAllTiny();
       XmlHttpRPC(bizsrvr, CallbackFunction, "RPCInvoke", paramArray, formData);
      return;
   }
   
   URL = composeURL(bizsrvr, "Invoke", paramArray, formData, funcType, loadPageTarget);
   if (funcType=="Page")
      loadPage(URL, loadPageTarget);
   else if (funcType=="Popup")
      loadPopup(URL);
   else if (funcType=="Form"){
      submitForm(this.m_Name, URL, loadPageTarget);
      removeAllTiny();
   }else if (funcType=="FormPopup")
      alert("not support FormPopup yet...");
   else
      alert("invalid function type '"+funcType+"'");
}
AjaxForm.prototype.CallbackFunction = function (retContent) 
{
   this.Show(retContent);
}
AjaxForm.prototype.CollectFormData = function ()
{
   if (funcType=="RPC")
      return CollectData(this.m_Name); 
}
AjaxForm.prototype.Show = function (retContent)
{
   if (retContent.indexOf("UPD_FLDS")==0)
   {
      var myform = document.getElementById(this.m_Name);
      if (!myform)
      {
         alert("Cannot find the form with name "+formName);
         return;
      }
      pos0=0; pos1=0;
      while(1)
      {
         fld=""; val="";
         pos0 = retContent.indexOf("[", pos1);
         if (pos0<0) break;
         pos1 = retContent.indexOf("]", pos0);
         if (pos0>0 && pos1>pos0)
            fld = retContent.substring(pos0+1,pos1);
         pos0 = retContent.indexOf("<", pos1);
         if (pos0<0) break;
         pos1 = retContent.indexOf(">", pos0);
         if (pos0>0 && pos1>pos0)
            val = retContent.substring(pos0+1,pos1);
         form_fld = myform.elements[fld];
         if (form_fld)  form_fld.value = val;
      }
   }
   else {
      var containerName = this.m_Name+"_container";
      var dt = document.getElementById(containerName);
      if (dt) {
         dt.innerHTML = retContent;
         var tbody = document.getElementById(this.m_Name+"_tbody");
         if (tbody) {
            var selrow = tbody.getAttribute("SelectedRow");
            if (selrow)
               this.m_SelectedRow = selrow;
         }
      }
      else
         alert("Cannot find html object with name as "+containerName);  
   }
}

// --------- jbForm ----------- //

function jbForm(name) 
{
   jbForm.prototype.AjaxForm = AjaxForm;
   this.AjaxForm(name);
   
   //set properties
   this.m_FreshLoad = true;
   this.m_SelectedRow = 1;
   this.m_SectionId = 0;
   this.m_HasSubCtrls = 0;
   this.m_SortColumn = null;
   this.m_ReverseSort = 0;
}
//set inheritance
jbForm.inheritsFrom(AjaxForm);
//set methods
jbForm.prototype.CollectFormData = function () 
{
   if (funcType=="RPC") {
      formData = CollectData(this.m_Name); 
      formData = AppendFormData(formData, "__SelectedRow=" + this.m_SelectedRow);   // append selectedrow to formdata
      return formData;
   }
}
jbForm.prototype.SelectRecord = function (params_array)
{
   if (this.m_FreshLoad == true) {
      var tbody = document.getElementById(this.m_Name+"_tbody");
      if (tbody) {
         var selrow = tbody.getAttribute("SelectedRow");
         if (selrow)
            this.m_SelectedRow = selrow;
      }
      this.m_FreshLoad = false;
   }
   var index = params_array[0];
   var clntOnly = params_array[1];  if(!clntOnly)  clntOnly=0;
   new_elem_id = this.m_Name+"_data_"+index;
   cur_elem_id = this.m_Name+"_data_"+this.m_SelectedRow;
   FocusOn(new_elem_id, cur_elem_id);
   this.m_SelectedRow = index;
   if(params_array[3]){ 
    this.m_SectionId = params_array[3];
    document.forms[this.m_Name].elements['section_id'].value = this.m_SectionId;
   }
   if (clntOnly==1) return;
   this.CallFunction("SelectRecord", params_array);
}
jbForm.prototype.OverRecord = function (index)
{
   var elem_id = this.m_Name+"_data_"+index;
   OverOn(elem_id);
}
jbForm.prototype.OutRecord = function (index)
{ 
   var selrow = false;	
   var elem_id = this.m_Name+"_data_"+index;
    if(parseInt(this.m_SelectedRow) == parseInt(index)) selrow = true;
    OverOff(elem_id,selrow);
}

jbForm.prototype.SortRecord = function (params_array)
{
   var sort_col = params_array[0];
   if (this.m_SortColumn == sort_col)
   this.m_ReverseSort = 1 - this.m_ReverseSort;
   else
   this.m_ReverseSort = 0;
   this.m_SortColumn = sort_col;
   params_array[0] = sort_col+","+this.m_ReverseSort;
   
   this.CallFunction("SortRecord", params_array);
}

jbForm.prototype.DeleteRecord = function (params_array)
{
   if (!confirm("คุณต้องการลบรายการนี้ใช่หรือไม่ ?")) 
      return; 
   
   this.CallFunction("DeleteRecord", params_array);
}
jbForm.prototype.RemoveRecord = function (params_array)
{ 
   if (!confirm("คุณต้องการลบรายการนี้ใช่หรือไม่ ?")) 
      return; 
   
   this.CallFunction("RemoveRecord", params_array);
}

var browserType = BrowserSniff();
function BrowserSniff(){
  if (document.layers) return "NS";
  if (document.all) return "IE";
  if (document.getElementById) return "MOZ";
  return "OTHER";
}


// RPC call using XMLHTTP
function XmlHttpRPC(rspage, callback, func, parms, formdata)
{
   var XmlHttp;
   if (browserType == "IE") {
      
      try { XmlHttp = new ActiveXObject("Msxml2.XMLHTTP"); }
      catch (e) { alert(e); }
   }
   //else if (browserType == "MOZ")
   else if (window.XMLHttpRequest)
   {
      try { XmlHttp = new XMLHttpRequest(); }
      catch (e) { alert(e);}
   }
   if (!XmlHttp) {
      alert("Your browser doesn't support XMLHttpRequest. The request is not sent successfully.")
      return;
   }

   try {
      XmlHttp.open("POST", rspage, false);
   }
   catch (e) { 
      alert("Can't open http connection due to the reason:\n"+e); 
      XmlHttp.abort();
      return;
   }

   XmlHttp.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');   // _POST[]
   
   var msg = "RPC=1&"+composeURLString(func, parms, formdata);

   XmlHttp.send(msg);
   
   if (XmlHttp.responseText.indexOf("Fatal error") > 0 || XmlHttp.responseText.indexOf("User error") > 0 )
      popupWindow(XmlHttp.responseText, 600, 500);
   
   if (XmlHttp.status != 200) {
      alert("There was a problem with the request.");
      return;
   }
   
   if (RPC_DEBUG)
      debugWindow(XmlHttp.responseText);
   
   callback(XmlHttp.responseText);
}

function jescape(str)
{
   tmp = str.replace(/\+/g, '%2B');
   return tmp;
}

function composeURL(rsPage, func, parms, formdata, funcType, loadPageTarget)
{
   base_url = composeURLString(func, parms, formdata);
   // insert __tgt="other" if popup or targetframe
   if (funcType == "Popup" || loadPageTarget)
      base_url = "_tgt=other&"+base_url;
   return rsPage+"?"+base_url;
}

function composeURLString(func, parms, formdata)
{
  urlStr = "";
  // func and parms are optional
  if (func != null) {
    urlStr += "F=" + escape(func);
    if (parms != null){
      if (typeof(parms) == "string"){
        // single parameter
        urlStr += "&P0=[" + escape(parms+'') + "]";
      } else {
        // assume parms is array of strings
        for( var i=0; i < parms.length; i++ ){
          urlStr += "&P" + i + "=[" + escape(parms[i]+'') + "]";
        }
      } // parm type
    } // parms
  } // func
  else
    return urlStr;
  
  if (formdata != null) {
      urlStr += "&__FormData=[" + escape(formdata+'') + "]";
  }
  return urlStr;
}

function loadPage(URL, targetFrame)
{
   if (!targetFrame)
   {
     window.location = URL;
   }
   else
   {
    tgtFrm = FindFrame(targetFrame);
    if (tgtFrm)
      tgtFrm.location = URL;   // traverse all frames
   }
}
 
// the following functions are added for popup function call
function loadPopup(URL)
{
  w = 800;
  h = 600;
  LeftPosition = (screen.width) ? (screen.width-w)/2 : 0;
  TopPosition = (screen.height) ? (screen.height-h)/2 : 0;
  settings = 'height='+h+',width='+w+',top='+TopPosition+',left='+LeftPosition+',scrollbars=1,resizable=1,status=1';

  // open a window with name as form_popup and submit form to this new popup as target
  window.open (URL, "", settings);
}

function submitForm(formName, URL, target)
{
   formobj = document.forms[formName];
   if (!formobj) {
      alert("Cannot locate form "+formName);
      return;
   }
   formobj.method = "post";
   formobj.action = URL;
   if (target) formobj.target = target;
   formobj.submit();
}

function FindFrame(targetFrame)
{
   for (i=0; i<top.frames.length; i++)
   {
      if (top.frames[i].name == targetFrame)
         return top.frames[i];
   }
   return null;
}

function RedirectPage(sTargetURL)
{
   window.top.location.replace(sTargetURL);
}

var showmenu = false;

function DrawMenu(menu_div)
{
   HideMenu();
   var menuItems = document.getElementById(menu_div);
   //alert(menuItems.innerHTML);
   var menu_array = menuItems.childNodes;
   if (menu_array) {
      shtml = "<table cellspacing=0 cellpadding=2>";
      for (i=0;i<menu_array.length;i++) {
         shtml += "<tr onmouseover=\"className='menuitem_mouseover'\" onmouseout=\"className='menuitem_mouseout'\"><td><img src='../images/"+menu_array[i].getAttribute("icon")+"' border=0></td>";
         shtml += "<td><a href=\""+menu_array[i].getAttribute("link")+"\">"+menu_array[i].getAttribute("text")+"</a></td></tr>";
      }
      shtml += "</table>";
      divStyle = "top: "+(window.event.clientY)+"px; left: "+(window.event.clientX+10)+"px;";
      var newDiv = document.createElement("<div id='_popmenu' class='menuskin' style='"+divStyle+"'>");
	   newDiv.innerHTML = shtml;
      document.body.appendChild(newDiv);
      if (document.body.clientWidth-window.event.clientX < newDiv.offsetWidth)
         newDiv.style.left = (window.event.clientX - newDiv.offsetWidth) + "px";
      if (document.body.clientHeight-window.event.clientY < newDiv.offsetHeight)
         newDiv.style.top = (window.event.clientY - newDiv.offsetHeight) + "px";
      showmenu = true;
   }
}

function HideMenu()
{
   if(!showmenu)
   {
      var obj = document.getElementById("_popmenu");
   	if(obj) {
   	   document.body.removeChild(obj);
   		obj = null;
   	}
   }
   showmenu = false;
}

function FocusOn(elemId, hltId)
{
   var elem = document.getElementById(elemId);
   if (elem) {
      if (hltId) {
         var hlt_elem = document.getElementById(hltId);
         if (hlt_elem) {
            var normalAttr = hlt_elem.getAttribute("normal");
            if (!normalAttr) 
               hlt_elem.style.background = "white";
            else
               hlt_elem.className = normalAttr;
         }
      }
      var selAttr = elem.getAttribute("select");
      if (!selAttr)
         elem.style.background = selAttr ? selAttr : "#A4D3EE";
      else
         elem.className = selAttr;
   }
}
function OverOn(elemId)
{
	var elem = document.getElementById(elemId);
    var selAttr = elem.getAttribute("over");			
    elem.className = selAttr;
}
function OverOff(elemId,selrow)
{
	var elem = document.getElementById(elemId);
	 if(selrow == true) {
	  var selAttr = elem.getAttribute("select");	
	 }else{
	  var selAttr = elem.getAttribute("normal");
	 }
    elem.className = selAttr;
}

function popupErrorText(text)
{
   w = 500;
   h = 200;
   LeftPosition = (screen.width) ? (screen.width-w)/2 : 0;
   TopPosition = (screen.height) ? (screen.height-h)/2 : 0;
   settings = 'height='+h+',width='+w+',top='+TopPosition+',left='+LeftPosition+',scrollbars=0,resizable=1';
   
   debugWindow = window.open("","",settings);
   body = "<body bgcolor=#D9D9D9>";
   body += text;
   body += "<center><p><input type=button value='Close Window' onclick='window.close();'></center></body>";
   debugWindow.document.writeln("<head><title>error</title>"+body+"</head>"); 
}

function moveToCenter(win, w, h)
{
   LeftPosition = (screen.width) ? (screen.width-w)/2 : 0;
   TopPosition = (screen.height) ? (screen.height-h)/2 : 0;
   win.resizeTo(w,h);
   win.moveTo(LeftPosition, TopPosition);
   return;
}

function popupWindow(content, w, h)
{
   LeftPosition = (screen.width) ? (screen.width-w)/2 : 0;
   TopPosition = (screen.height) ? (screen.height-h)/2 : 0;
   settings = 'height='+h+',width='+w+',top='+TopPosition+',left='+LeftPosition+',scrollbars=1,resizable=1,menubar=0,status=0';
   
   popupWindow = window.open("","",settings);
   popupWindow.document.writeln(content); 
   return false;
}

function debugWindow(content)
{
   w=600; h=480;
   LeftPosition = (screen.width) ? (screen.width-w)/2 : 0;
   TopPosition = (screen.height) ? (screen.height-h)/2 : 0;
   settings = 'height='+h+',width='+w+',top='+TopPosition+',left='+LeftPosition+',scrollbars=1,resizable=1';
   
   dbgWindow = window.open("","rpc_debug",settings);
   dbgWindow.document.writeln(content); 
}

function popupIWin(content, w, h)
{
   xi = document.body.clientWidth/2-w/2;
   yi = document.body.clientHeight/2-h/2;
	divStyle = "position: absolute; border:2 outset white; width:"+w+";height:"+h+";top: "+xi+"px; left: "+yi+"px;";
   var newDiv = document.createElement("<div id='tempbox' style='"+divStyle+"'>");

   shtml = "<div id='title' class='handle' handlefor='tempbox'>title</div>";
   shtml += content;
   newDiv.innerHTML = shtml;
   
   document.body.appendChild(newDiv);
      
   //obj = document.getElementById(objId);
   //if (obj)
   //{
   //   obj.style.display = '';
   //   obj.style.left=document.body.clientWidth/2-obj.offsetWidth/2+'px';
   //   obj.style.top=document.body.clientHeight/2-obj.offsetHeight/2+'px';
   //}
}

function resizeFrame(rows, cols)
{
   if (rows)
      top.document.body.rows = rows;
   if (cols)
      top.document.body.cols = cols;
}

function popupConfirm(question, yesFunc, noFunc)
{
   answer = confirm(question);
   if (answer)
   // do yesFunc
   eles
   // do noFunc
}

// keyboard handler code

var SHIFT_KEY  = 16;
var CTRL_KEY   = 17;
var ALT_KEY    = 18;
var SHIFT_DOWN = false;
var CTRL_DOWN  = false;
var ALT_DOWN   = false;

function KeyUp(evt) {
  evt = (evt) ? evt : window.event
  var keyCode = evt.keyCode;

  if ( keyCode == SHIFT_KEY )
    SHIFT_DOWN = false;
  if ( keyCode == CTRL_KEY )
    CTRL_DOWN = false;
  if ( keyCode == ALT_KEY ) 
    ALT_DOWN = false;
}

function KeyDown(evt) {
  evt = (evt) ? evt : window.event;
  var keyCode = evt.keyCode;

  if ( keyCode == SHIFT_KEY )
    SHIFT_DOWN = true;
  if ( keyCode == CTRL_KEY )
    CTRL_DOWN = true;
  if ( keyCode == ALT_KEY ) 
    ALT_DOWN = true;

   //if(CTRL_DOWN && keyCode == 83) { // Ctrl+S, save
     //alert("Ctrl+S"); CTRL_DOWN = false;
   //}
   if (keyCode != SHIFT_KEY && keyCode != CTRL_KEY && keyCode != ALT_KEY) {
      // search the cmd from the key_cmd map, and trigger the cmd
      
      // reset the Shift,Ctrl,Alt to be false
   }
}

var loadedobjects=""
function loadobjs(){
if (!document.getElementById)
return
for (i=0; i<arguments.length; i++){
    var file=arguments[i]
     var fileref=""
    if (loadedobjects.indexOf(file)==-1){ //Check to see if this object has not already been added to page before proceeding
      if (file.indexOf(".js")!=-1){ //If object is a js file
		fileref=document.createElement('script')
		fileref.setAttribute("type","text/javascript");
		fileref.setAttribute("src", file);
		}
		else if (file.indexOf(".css")!=-1){ //If object is a css file
		fileref=document.createElement("link")
		fileref.setAttribute("rel", "stylesheet");
		fileref.setAttribute("type", "text/css");
		fileref.setAttribute("href", file);
		}
    }
   if (fileref!=""){
      document.getElementsByTagName("head").item(0).appendChild(fileref)
      loadedobjects+=file+" " //Remember this object as being already added to page
   }
 }
}

function setHtmlEdit()
{
   HtmlEdit = true;
   return;
}

/// Firefox DEBUG ////
function printfire()
{
    if (document.createEvent)
    {
        printfire.args = arguments;
        var ev = document.createEvent("Events");
        ev.initEvent("printfire", false, true);
        dispatchEvent(ev);
    }
}

function removeAllTiny(){
	if (typeof(tinyMCE) != "undefined") {
	    for (var n in tinyMCE.instances) 
		    TinyMCE.prototype.removeMCEControl(n);
	}
}

function MO(elm)
{
	var S=elm;	
	while (S.tagName!="TD")
	{S=S.parentNode;}
	S.className="T";
}

function MU(elm)
{
	var S=elm;	
	while (S.tagName!="TD")
	{S=S.parentNode;}
	S.className="P";
}

function MO1(elm)
{
	var S=elm;	
	while (S.tagName!="TD")
	{S=S.parentNode;}
	S.className="T1";
}

function MU1(elm)
{
	var S=elm;	
	while (S.tagName!="TD")
	{S=S.parentNode;}
	S.className="P1";
}

function MO(elm)
{
var S=elm;	
while (S.tagName!="TD")
{S=S.parentNode;}
S.className="T";
}
function MU(elm)
{
var S=elm;	
while (S.tagName!="TD")
{S=S.parentNode;}
S.className="P";
}
function MO1(elm)
{
var S=elm;	
while (S.tagName!="TD")
{S=S.parentNode;}
S.className="T1";
}
function MU1(elm)
{
var S=elm;	
while (S.tagName!="TD")
{S=S.parentNode;}
S.className="P1";
}
