﻿
var lastCommand = null;
var waitTime = 0;
var pageTopology = new PageTopology();
var responseFrameName = "RESPONSE_FRAME";
//var responseFrameName = "_self";
var dialogs = new Array();
var messageBoxMessage = "";




function InvokeCommand(commandName,commandArgument,commandActor)
{
    var drivenActors;
    var tokens;
    var tableName,columnName;
    
    tokens = nodeElement.name.split("____");

    tableName  = tokens[0];
    columnName = tokens[1];
    
       
    drivenActors  = 
        pageTopology.GetDrivenActors
            (
                new FormActor("",tableName,columnName)
            );
 
  
        lastCommand = new FormCommand();
        
        lastCommand.SourceElement = null;
        lastCommand.CommandName   = commandName ;
        lastCommand.CommandArguments  = commandArgument ;
        lastCommand.SorceActor    = null;
        lastCommand.DrivenActors   = drivenActors; 
        
        
        document.forms[0].target = responseFrameName;
         
        document.forms[0].elements["command"].value = commandName ;
        document.forms[0].elements["command_argument"].value = commandArgument ;
        document.forms[0].elements["action_type"].value = "execute_command" ;
        document.forms[0].submit();
        document.forms[0].elements["action_type"].value = "submit" ;

        document.forms[0].target= "_self";
        waitTime = 0;
        ShowPageBlock();
        setTimeout("WaitForResponse()",100);
}


function FormCommand()
{
    this.CommandName;
    this.DrivenActors ;
    this.SourceActor;
    this.SourceElement;
}
 
function DataValidate(val)   
{   
 var dateRegex =/\d{4}\/\d{1,2}\/\d{1,2}/;
 var tokens;
  
    if(!dateRegex.test(val))
    {
        return false;
    }
    return true;
}


function ValidateElement(nodeElement)
{
    var validated = true;
    var minLength;
    var maxLength;
    var isNullable = true;
    var message = "";
 
    lastCommand = null;
    
 
        // nodeElement.value = nodeElement.value.replace(/^\s+/g,"");
        // nodeElement.value = nodeElement.value.replace(/\s+$/g,"");
 
        
        if( nodeElement.value == "" && nodeElement.nullable == "false")
        {
        	  if( nodeElement.type != "hidden" )
        	  {
            	nodeElement.focus();
            	nodeElement.style.backgroundColor="red";
          	}
          	message = "不能為空值";
          	
          	if( nodeElement.title != "" && nodeElement.title != null )
          	{
          		message = nodeElement.title + " " + message;
          	}
              //alert(message);
messageBoxMessage += (message + "\r\n");
//ShowMessage(messageBoxMessage);
            validated = false;
						//return validated;
        }
        else
        {
            nodeElement.style.backgroundColor="";
        }
        
        if( nodeElement.nullable_fun != null )
			  {
			  	 isNullable = eval(nodeElement.nullable_fun);
			  }
	

			  if( !isNullable && nodeElement.value == "" )
			  {
            if( nodeElement.type != "hidden" )
        	  {
	            nodeElement.style.backgroundColor="red";
	            nodeElement.focus();
          	}
          	
          	message = "不能為空值";
          	
          	if( nodeElement.title != "" && nodeElement.title != null )
          	{
          		message = nodeElement.title + " " + message;
          	}
//alert(message);
messageBoxMessage += (message + "\r\n");
//ShowMessage(messageBoxMessage);		


            validated = false;
						//return validated;			  	
			  }

				
        if( nodeElement.min_length != null )
        {
            minLength = new Number(nodeElement.min_length);

					  if( !isNullable || nodeElement.value != "")
					  {
	            if( nodeElement.value.length < minLength )
	            {
	                nodeElement.style.backgroundColor="red";
	                message = nodeElement.title + " 長度必須大於等於 " + minLength ;
	                alert("長度必須大於等於 " + minLength);

							
messageBoxMessage += (message + "\r\n");

	                validated = false;
 
	                //return validated;
	            }
	            else if(validated)
	            {
	                nodeElement.style.backgroundColor="";
	            }
						}

        }
 

        if( validated && nodeElement.max_length != null )
        {
            maxLength = new Number(nodeElement.max_length);

					  if( !isNullable || nodeElement.value != "")
					  {
	            if( nodeElement.value.length > maxLength )
	            {
	                nodeElement.style.backgroundColor="red";
	                message = nodeElement.title + " 長度必須小於等於 " + maxLength;

									messageBoxMessage += ( message + "\r\n");
 	                validated = false;
	                //return validated;
	            }
	            else if(validated)
	            {
	                nodeElement.style.backgroundColor="";
	            }
            }
        }
 
        
 
     
    if( nodeElement.data_type != null )
    {
        switch( nodeElement.data_type  )
        {
            case "number"  :
                if( isNaN(nodeElement.value) )
                {
                    nodeElement.style.backgroundColor="red";
                    
                    message = nodeElement.title + "不是一個數字";

messageBoxMessage += ( message + "\r\n");
                    
                    nodeElement.focus();
                    nodeElement.value = "0"; 
                     validated = false;
                }
                else if(nodeElement.value.indexOf(" ") >= 0)
                {
										nodeElement.style.backgroundColor="red";

                    message = nodeElement.title + " 不能有空白";

messageBoxMessage += ( message + "\r\n");
                    
                    nodeElement.focus();
	            	    nodeElement.style.backgroundColor="red";                    
                    validated = false;                		
                }
                else if(validated)
                {
                    nodeElement.style.backgroundColor="";
                }
            break;
             
            
            case "date" :
            
                 nodeElement.value = nodeElement.value.replace(/^\s+/g,"");
                 nodeElement.value = nodeElement.value.replace(/\s+$/g,"");

                 if( nodeElement.value != "" && nodeElement.value != null )
                 {
                    
                    if ( !DataValidate(nodeElement.value) )
                    {
                       nodeElement.style.backgroundColor="red";
                       message = ( "'" + nodeElement.value + "' 不是日期格式" );
                        
messageBoxMessage += ( message + "\r\n");
                        nodeElement.value = "";
                        nodeElement.focus();
                        
                       validated = false;
                       break;
                    }
                    else 
                    {
                       nodeElement.style.backgroundColor="";
                    }
                 }
            break;
        }
 
    }

    return validated;
}


 
function OnNodeValueChange(nodeElement)
{ 
 
     
 	messageBoxMessage= "";
    
     if( !ValidateElement(nodeElement) ) 
     {
     		alert( messageBoxMessage );
        return;
     }
 
     DoHiddenRequest(nodeElement);
} 


function OnChangeCheckBoxValue(parentElement)
{
    var value = "";
    var values = new Array();
    var onChangeHandler = "";
    var i;
    
      
    for( i = 0 ; i < parentElement.children.length ; i++)
    {
        if( parentElement.children[i].type == "checkbox" )
        {
            if( parentElement.children[i].checked )
            {
                values.push(parentElement.children[i].value);
            }
        }
    }
    value = values.join(",");

    parentElement.children[0].value = value;    

    DoHiddenRequest(parentElement.children[0]);
     
    parentElement.children[0].fireEvent("onchange");
}



function OnChangeRadioValue(parentElement)
{
    var value = "";
    var values = new Array();
    var onChangeHandler;
    var i;
    
      
    for( i = 0 ; i < parentElement.children.length ; i++)
    {
        if( parentElement.children[i].type == "radio" )
        {
            if( parentElement.children[i].checked )
            {
                values.push(parentElement.children[i].value);
            }
        }
    }
    value = values.join(",");
 
    parentElement.children[0].value = value;    

 
    DoHiddenRequest(parentElement);
    
    onChangeHandler = (parentElement.children[0].onchange+"").replace("this","parentElement.children[0].onchange");
 
    eval(onChangeHandler);
} 

function UpdateElements(
    nodeElements
)
{
     var nodeElement;
     var originalActionURL;
     var tokens;
     var drivenActors;
     var panelName,tableName,columnName;
     var panelNameRegex = /^([^#]+)#/;
     var i;
     

     drivenActors = new FormActorCollection();

     for( i = 0 ; i < nodeElements.length ; i++)
     {
     
        nodeElement = nodeElements[i];

        tokens = nodeElement.name.split("____");
        nodeElement.name.search(panelNameRegex);

        panelName = RegExp.$1;
       
        if( tokens.length == 3)
        {
            tableName  = tokens[1];
            columnName = tokens[2];
        }
        else
        {
            tableName  = tokens[0];
            columnName = tokens[1];
        }

       drivenActors  = 
          pageTopology.GetDrivenActors
            (
                new FormActor(panelName,tableName,columnName)
            );
                    
        drivenActors.Add(
            new FormActor(panelName,tableName,columnName)
        );        
     }
     
     if( nodeElements.length > 0 )
     {
        lastCommand = new FormCommand();
        
        lastCommand.SourceElement = nodeElements[0];
        lastCommand.CommandName   = "OnNodeValueChange";
        lastCommand.SorceActor    = null;
        lastCommand.DrivenActors   = drivenActors; 

        originalActionURL = document.forms[0].action; 
 
        if( actionURL = window.location.href.replace(panelName + "_action_type=create","") )
        {
            document.forms[0].action = actionURL;
        }
        
        document.forms[0].target = responseFrameName;
        document.forms[0].elements[panelName + "_action_type"].value = "hidden_request" ;
        document.forms[0].elements[panelName + "_command"].value = "" ;
        
        
        document.forms[0].submit();
        document.forms[0].elements[panelName + "_action_type"].value = "submit" ;

        document.forms[0].action = originalActionURL ;

        document.forms[0].target= "_self";
        waitTime = 0;
 
        ShowPageBolck();
        setTimeout("WaitForResponse()",100);
  
     }
     
    
}

var count = 0;

function DoHiddenRequest(nodeElement)
{
    var drivenActors;
    var tokens;
    var tableName,columnName;
    var panelName;
    var originalActionURL;
    var panelNameRegex = /^([^#]+)#/;
  
try
{
    tokens = nodeElement.name.split("____");

    nodeElement.name.search(panelNameRegex);
    panelName = RegExp.$1;
   
    
    if( tokens.length == 3)
    {
        tableName  = tokens[1];
        columnName = tokens[2];
    }
    else
    {
        tableName  = tokens[0];
        columnName = tokens[1];
    }
    

       
    drivenActors  = 
        pageTopology.GetDrivenActors
            (
                new FormActor(panelName,tableName,columnName)
            );
	   if( document.forms[0].elements[panelName + "_source_name"] != null )
	   {
		   document.forms[0].elements[panelName + "_source_name"].value = tableName + "____" + columnName ;
		 }

    if( drivenActors.Count() > 0 )
    {
        lastCommand = new FormCommand();
        
        lastCommand.SourceElement = nodeElement;
        lastCommand.CommandName   = "OnNodeValueChange";
        lastCommand.SorceActor    = new FormActor(panelName,tableName,columnName);
        lastCommand.DrivenActors   = drivenActors; 
 
        originalActionURL = document.forms[0].action; 
 
        if( actionURL = window.location.href.replace(panelName + "_action_type=create","") )
        {
            document.forms[0].action = actionURL;
        }
        
        document.forms[0].target = responseFrameName;
        document.forms[0].elements[panelName + "_action_type"].value = "hidden_request" ;
        document.forms[0].elements[panelName + "_command"].value = "" ;

        if( document.forms[0].elements[panelName + "_source_name"] != null )
        {
	        document.forms[0].elements[panelName + "_source_name"].value = tableName + "____" + columnName ;
	    }

        if(document.forms[0].elements["source_panel"] != null )
        {
            document.forms[0].elements["source_panel"].value = panelName; 
        }
        else if( document.getElementById("SOURCE_PANEL") != null)
        {
            document.getElementById("SOURCE_PANEL").value = panelName;
        }
        else if( document.forms[0].elements[panelName + "_temp"] != null )
        {
            document.forms[0].elements[panelName + "_temp"].value = panelName;
            document.forms[0].elements[panelName + "_temp"].outerHTML = 
                "<input type=hidden name=source_panel ID=SOURCE_PANEL value='" + panelName + "' />";
        }

        if( GetBrowserType() == "Firefox") 
        {
            if( window.frames[1].SetFirefoxReadyState != null )
            {
                window.frames[1].SetFirefoxReadyState("");
            }
        }
 	    window.frames[1].document.body.innerHTML = "";

        document.forms[0].submit();
        document.forms[0].elements[panelName + "_action_type"].value = "submit" ;
        document.forms[0].action = originalActionURL ;
        if( document.getElementById("SOURCE_PANEL") != null )
        {
            document.getElementById("SOURCE_PANEL").value = "";
        }     
        document.forms[0].target= "_self";
        waitTime = 0;
        ShowPageBlock();
        
        setTimeout("WaitForResponse()",500);
    } 
}
catch(e)
{
    ThrowError(e.description);
}
}


function DoHiddenCommand(commandName,baseTableName,recordNo,nodeElement)
{
    var drivenActors;
    var tokens;
    var tableName,columnName;
    var panelNameRegex = /^([^#]+)#/;
    var actionTypeRegex = /[^\?_&]+_action_type=[^&]+/i;
    var actionUrl;
    var targetFrameName = "";
    var responseFrame;
    tokens = nodeElement.getAttribute("name").split("____");
  
    responseFrame = window.frames[1];
    nodeElement.getAttribute("name").search(panelNameRegex);
    
    panelName = RegExp.$1;
  

    if( tokens.length == 2)
    {
        tableName  = tokens[0];
        columnName = tokens[1];
    } 
    else if( tokens.length >= 3)
    {   
        tableName  = tokens[1];
        columnName = tokens[2];
    }
 
    drivenActors  = 
        pageTopology.GetDrivenActors
            (
                new FormActor(panelName,tableName,columnName)
            ); 


    
    if( drivenActors.Count() > 0 )
    {
        targetFrameName = responseFrameName;
    }
    else
    {
        targetFrameName = "_self";
    }
        lastCommand = new FormCommand();

        lastCommand.SourceElement = nodeElement;
        lastCommand.CommandName   = commandName ;
        lastCommand.SorceActor    = new FormActor(panelName,tableName,columnName);
        lastCommand.DrivenActors   = drivenActors; 
        
        actionUrl = window.location.href.replace(actionTypeRegex,"")  ;
        
        document.forms[0].action =  actionUrl;
        
 
        document.forms[0].elements[panelName + "_command"].value = commandName;
 
	    if( document.forms[0].elements[panelName + "_source_name"] != null )
		{ 
	        document.forms[0].elements[panelName + "_source_name"].value = tableName + "____" + columnName;
	      }    

        document.forms[0].elements[panelName + "_command_record_no"].value = recordNo;
        document.forms[0].elements[panelName + "_command_base_table_name"].value = baseTableName;
        
        //20090606
        if(document.forms[0].elements["source_panel"] != null )
        {
            document.forms[0].elements["source_panel"].value = panelName; 
        }
        else if( document.getElementById("SOURCE_PANEL") != null)
        {
            document.getElementById("SOURCE_PANEL").value = panelName;
        }
        else if( document.forms[0].elements[panelName + "_temp"] != null )
        {
            document.forms[0].elements[panelName + "_temp"].value = panelName;
            document.forms[0].elements[panelName + "_temp"].outerHTML = 
                "<input type=hidden name=source_panel ID=SOURCE_PANEL value='" + panelName + "' />";
        }
            
        
        
        document.forms[0].target = targetFrameName;         
 
        if( drivenActors.Count() > 0 )
        { 
            document.forms[0].elements[panelName + "_action_type"].value = "hidden_command" ;
        }
        else
        {
            document.forms[0].elements[panelName + "_action_type"].value = "command" ;
        }
        
        responseFrame.document.body.innerHTML = "";
        
        document.forms[0].submit();
        
        document.forms[0].target = "_self";         
    
        document.forms[0].elements[panelName + "_action_type"].value = "submit" ;
        document.forms[0].elements[panelName + "_command"].value = "";
        document.forms[0].elements[panelName + "_command_record_no"].value = "";
        document.forms[0].elements[panelName + "_command_base_table_name"].value = "";
        
        if( document.getElementById("SOURCE_PANEL") != null )
        {
            document.getElementById("SOURCE_PANEL").value = "";
        }
        
    if( drivenActors.Count() > 0 )
    {
        waitTime = 0;
        ShowPageBlock();
        setTimeout("WaitForResponse()",500);
    }
  
}


function ParseBranchName(nodeName)
{
try
{
 var branchName = "";
 var tokens;
 var i;
    
    if( nodeName == null )
    {
        ThrowError("nodeName can not be null !");
    }
    tokens = nodeName.split("____");
    
    if( tokens.length >= 3)
    {
        branchName = tokens[0];
    }
    
    return branchName;
}catch(e)
{
    ThrowError(e.description);
}
}


function ParseLeafName(nodeName)
{
 var leafName = "";
 var tokens;
 var i;

try
{
    if( nodeName == null )
    {
        alert("nodeName can not be null !");
       
    }
    
    tokens = nodeName.split("____");
    
    if( tokens.length >= 3)
    {
        leafName = tokens[1] + "____" + tokens[2];
    }
    else
    {
        leafName = nodeName;
    }
    
    return leafName;
}catch(e)
{
    ThrowError(e.description);
}
}


function GetDrivenElements(sourceElementName,tableName,columnName)
{
 var drivenElements = new Array() ;    
 var allElements    = new Array();
 var tempElements    = new Array();
 var branchName;
 var formNodeElemens;
 var leafName;
 var tempBranchName;
 var tempLeafName;
 var i;
 
 try
 {
    branchName = ParseBranchName(sourceElementName);
    leafName   =  tableName + "____" + columnName;

    for( i = 0 ; i < document.forms[0].elements.length ; i++)
    {
        allElements.push(document.forms[0].elements[i]);
    }

    if( GetBrowserType() == "IE" )
    {      
        formNodeElemens = document.getElementsByName("form_node");
    }
    else
    {
        formNodeElemens = new Array();
        tempElements  = document.getElementsByTagName("TABLE");
        for( i = 0 ; i < tempElements.length  ; i++)
        {
            if( tempElements[i].getAttribute("id") == "form_node")
            {
                
                formNodeElemens.push(tempElements[i]);
            }
        }
    }


    for( i = 0 ; i < formNodeElemens.length ; i++)
    {
        allElements.push(formNodeElemens[i]);
    }

    for( i = 0 ; i < allElements.length ; i++)
    {
        if( branchName == "" )
        {
            if( allElements[i].getAttribute("name") == leafName )
            { 
                drivenElements.push(allElements[i]);
            }
        }
        else
        {
            tempBranchName = "";
            if( allElements[i].getAttribute("name") == null )
            {
                continue;
            }
            tempBranchName = ParseBranchName(allElements[i].getAttribute("name"));

            if( tempBranchName.indexOf(branchName) == 0 || branchName.indexOf(tempBranchName) == 0 )
            {
                if( allElements[i].getAttribute("name") != null )
                {
                    tempLeafName = ParseLeafName( allElements[i].getAttribute("name"));
                }
               
                if( leafName == tempLeafName )
                {
                     drivenElements.push(allElements[i]);                    
                }
            }
        }
    }
    

    return drivenElements;
}catch(e)
{
    ThrowError(e.description);
}
}

var tempNodeElement;

function DoResponse()
{
 var responsElementHTML;
 var elements;
 var sourceElementName;
 var formNodes;
// var sourceBranchName;
 var i , j;
 var responsFrame;
//try
//{ 

       if( GetBrowserType() == "Firefox" )
       {
          responsFrame = window.frames[1];
       }
       else
       {
          responsFrame = document.frames[1];
       }

        
       for( i = 0 ; i < lastCommand.DrivenActors.Count() ; i++)
       {
          actor = lastCommand.DrivenActors.GetAt(i);
          //sourceBranchName = ParseBranchName(lastCommand.SourceElement.name);

          elements = GetDrivenElements( lastCommand.SourceElement.getAttribute("name"), actor.TableName , actor.ColumnName);   
       
          for( j = 0 ; j < elements.length ; j++)
          {
              elementName = elements[j].getAttribute("name");

              if( responsFrame.document.forms[0].elements[elementName] != null )
              {
                if( 
                    GetBrowserType() == "IE" &&
                    responsFrame.document.forms[0].elements[elementName].parentElement.id == "compound_control" 
                 )
                 {
                    responsElementHTML = responsFrame.document.forms[0].elements[elementName].parentElement.outerHTML ;
                 }
                 else
                 {
                    if( GetBrowserType() == "IE" )
                    {
                       responsElementHTML = responsFrame.document.forms[0].elements[elementName].outerHTML;
                    }
                    else
                    {
                       responsElementHTML = GetOuterHTML(responsFrame.document.forms[0].elements[elementName]) ;
                    }
                 }
               }
              else
              {
                 
                 if( GetBrowserType() == "IE")
                 {
                    responseElements = responsFrame.document.forms[0].all;
                 }
                 else
                 {
                    responseElements = responsFrame.document.getElementsByTagName("TABLE");
                 }
                 
                 for( k = 0 ; k < responseElements.length ; k++)
                 {
                    if( responseElements[k].getAttribute("name") == elementName)
                    {
                         if( GetBrowserType() == "IE")
                         {
                            responsElementHTML = responseElements[k].outerHTML;
                         }
                         else
                         {
                            responsElementHTML = GetOuterHTML(responseElements[k]);
                         }
                        break;
                    }
                 }                 
              }
              
              if( responsElementHTML != null )
              {
                
                 if( elements[j].parentElement != null )
                 {
		             if(elements[j].parentElement.id == "compound_control" )
                     {
                        elements[j].parentElement.outerHTML =  responsElementHTML;
                     }
                     else
                     {
                        elements[j].outerHTML = responsElementHTML;
                     }
                     
                     AfterDoResponse(elements[j]);
                 }
                 else if( GetBrowserType() == "Firefox" )
                 {
                   elements[j].outerHTML = responsElementHTML;
                 }
               }
          }//end for( j = 0 ; j < elements.length ; j++)
          
       }//enbd for( i = 0 ; i < lastCommand.DrivenActors.Count() ; i++)
       
//}
//catch(e)
//{
    // 2009-01-19
    ////document.frames[1].frameElement.style.display = "block";
    //document.frames[1].frameElement.style.width = "100%";
  //  document.frames[1].frameElement.style.height = "500";
    //ThrowError(e.description);
//}

}

function OnBooleanNodeItemValueChange(nodeElement)
{ 
try
{
    var values;
    
    values = nodeElement.value_list.split(",");
    
    if( nodeElement.checked )
    {
        nodeElement.parentElement.children[0].value = values[0];
    }
    else
    {
        nodeElement.parentElement.children[0].value = values[1];
    }
}
catch(e)
{
    ThrowError(e.description);
}
} 
var index = 0;

function GetBrowserType()
{
    var isIE = navigator.userAgent.search("MSIE") > -1;      
    var isIE7 = navigator.userAgent.search("MSIE 7") > -1;      
    var isFirefox = navigator.userAgent.search("Firefox") > -1;      
    var isOpera = navigator.userAgent.search("Opera") > -1;      
    var isSafari = navigator.userAgent.search("Safari") > -1; 
    

    if( isIE )
    {
        return "IE";
    }    
    else if( isFirefox )
    {
        return "Firefox";
    } 
    else if(isOpera)
    {
        return "Opera";
    }
    else 
    {
        return "Safari";
    }
}


function WaitForResponse()
{
    var readyState;
    var responsFrame;
    waitTime += 100;

    if( GetBrowserType() == "IE" )
    {
        responsFrame = document.frames[1];
    }
    else
    {
        responsFrame = window.frames[1];
     }

    ShowPageBlock();

    if( GetBrowserType() == "IE" )
    {
        readyState = document.frames[1].document.readyState ;
    }
    else
    {
        try
        {
            if( window.frames[1].GetFirefoxReadyState != null &&
                window.frames[1].GetFirefoxReadyState() == "complete"
            )
            {
                readyState = "complete";
            }
        }
        catch(e)
        {
            alert(e);
        }
    }
    
     if( (readyState != "complete" && readyState != "interactive") 
         ||
         responsFrame.document.forms[0] == null
         
     )
    {
        if( waitTime > 10000 )
        //if( waitTime > 300 )
        {
            HiddenPageBlock();
            alert("wait to long");
            lastCommand = null;
        }
        else
        {
            setTimeout("WaitForResponse()",1000);
        }
    }
    else
    {
        //alert( readyState + "," +responsFrame.document.forms[0] );
        setTimeout("RealDoResponse()",1000);
        /*
        HiddenPageBlock();
        DoResponse();
        lastCommand = null;
        */
    }
}


function RealDoResponse()
{
        HiddenPageBlock();
        DoResponse();
        lastCommand = null;
}

function PageTopology()
{
    this.drivenPaths = new DrivenPathCollection;
    this.GetDrivenActors = PageTopology_GetDrivenActors;
    this.AddDependency = PageTopology_AddDependency;
}


function PageTopology_GetDrivenActors(formActor)
{
    var procssedActors    = new FormActorCollection();
    var unProcessedActors = new FormActorCollection();
    var actors = new FormActorCollection();
    var drivenActors = new FormActorCollection();
    var drivenActor ;
    var i;

    path = this.drivenPaths.GetBySourceActor(formActor);
    
    if( path != null )
    {
        for(i = 0 ; i < path.TargetActors.Count() ; i++)
        {
            if( !unProcessedActors.Contains(path.TargetActors.GetAt(i)) )
            {
                unProcessedActors.Add(path.TargetActors.GetAt(i));
            }
        }
    }

    for( i = 0 ; i < unProcessedActors.Count() ; i++)
    {
        actor = unProcessedActors.GetAt(i);

        drivenActors.Add(actor);

        path = this.drivenPaths.GetBySourceActor(actor);
 
        if( path != null )
        {
            for( j = 0 ; j < path.TargetActors.Count() ; j++)
            {
                actor = path.TargetActors.GetAt(j);
         
                if( !unProcessedActors.Contains(actor) )
                {
                    unProcessedActors.Add(actor);
                }
            }
        }
    }
    

    return drivenActors;
}


function PageTopology_AddDependency(sourceActor,targetActor)
{
    var path;
 
    if( (path = this.drivenPaths.GetBySourceActor(sourceActor)) != null )
    {
 
        if( !path.TargetActors.Contains(targetActor) )
        {
            path.TargetActors.Add(targetActor);
        }
    }
    else
    {
        path = new DrivenPath();
        
        path.SourceActor = sourceActor;
        path.TargetActors = new FormActorCollection();
        path.TargetActors.Add(targetActor);

  
        this.drivenPaths.Add(path);
    }
}


function DrivenPathCollection()
{
    this.drivenPaths = new Array();
    this.Count       = DrivenPathCollection_Count;
    this.Add         = DrivenPathCollection_Add;
    this.GetBySourceActor = DrivenPathCollection_GetBySourceActor;
}


function DrivenPathCollection_Count()
{
    var count = 0;
    
    count = this.drivenPaths.length;
    
    return count;
}


function DrivenPathCollection_Add(formActor)
{
    this.drivenPaths.push(formActor);
}

function DrivenPathCollection_GetBySourceActor(formActor)
{
    var path = null;
    var i;
    
    for( i = 0 ; i < this.drivenPaths.length ; i++)
    {
        if( EqualFormActor(this.drivenPaths[i].SourceActor,formActor) == true )
        {
              path = this.drivenPaths[i];              
         }
    }

    return path;
}


function DrivenPath()
{
    this.DourceActor = null;
    this.TargetActors = new FormActorCollection();
}


function FormActorCollection()
{
    this.formActors = new Array();
    
    this.Add        = FormActorCollection_Add;
    this.GetAt      = FormActorCollection_GetAt;
    this.Count      = FormActorCollection_Count;     
    this.Contains   = FormActorCollection_Contains;
}


function FormActorCollection_Add(formActor)
{
    this.formActors.push(formActor);
}


function FormActorCollection_GetAt(index)
{
   var formActor;
   
   formActor = this.formActors[index];

   return formActor;
}


function FormActorCollection_Count()
{
   var count;
   
   count = this.formActors.length;
   
   return count;
}


function FormActorCollection_Contains(formActor)
{
   var contains = false;
   var i;
   
   for( i = 0 ; i < this.formActors.length ; i++)
   {
        if( EqualFormActor(this.formActors[i],formActor) )
        {
            contains = true;
        }
        else
        {
            contains = false;
        }
   }
   
   return contains;
}


function EqualFormActor(formActor1,formActor2)
{
    var equal = false;

    if(
        formActor1.PanelName   == formActor2.PanelName  &&
        formActor1.TableName  == formActor2.TableName &&
        formActor1.ColumnName == formActor2.ColumnName 
    )
    {
        equal = true;
    }
    else
    {
        equal = false;
    }

    return equal;
}//end function EqualFormActor(formActor1,formActor2)


function FormActor(panelName,tableName,columnName)
{
    this.PanelName   = panelName;
    this.TableName  = tableName ;
    this.ColumnName = columnName;
}


 
 
function OnNodeItemValueChange(itemElement)
{
    var nodeElement = itemElement.parentElement;
    var valueElement;
    var values = new Array();
    var i;
        
    
    valueElement = nodeElement.children[0];

    for( i = 1; i < nodeElement.children.length ; i++)
    {
        if( nodeElement.children[i].checked )
        {
            values.push(nodeElement.children[i].value);
        }
    }

    valueElement.value = values.join(",");
}


function ValidatePanel(panelName)
{
    var validated = true;
    var allElements = new Array();
    var i;
    
    elements = document.forms[0].elements;
    
    for( i = 0 ; i < document.forms[0].elements.length ; i++)
    {
        if( document.forms[0].elements[i].name != null &&
            document.forms[0].elements[i].name.indexOf(panelName + "#") == 0
        )
        {    
            allElements.push(document.forms[0].elements[i]);
        }
    }

	  messageBoxMessage = "";
    
    for( i = 0 ; i < allElements.length ; i++)
    {
        if( !ValidateElement(allElements[i]))
        {
            validated = false;
						//break;
						
						if( i >= 3 )
						{
							  //break;
						}
        }
    }
    
    if( !validated )
    {
    		alert( messageBoxMessage );
    }
    
    if( validated )
    {
    	validated = AfterValidatePanel(panelName);
    }
    
    return validated;
}


function SendCommand(commandName,baseTableName,recordNo,commandElement)
{ 
     var panelName;
     var validated;

     if( commandElement != null )
     {
        if(commandElement.name != null )
        {
            panelName = commandElement.name.substr(0 ,commandElement.name.indexOf("#"));
            if( commandName != "cancel" && commandName != "paging" && commandName != "search" )
            {
            		messageBoxMessage = "";
        	      validated = ValidatePanel(panelName);
        	 
                if( !validated )
                {
                    return;
                }
            }
        }
     }
     DoHiddenCommand(commandName,baseTableName,recordNo,commandElement);
}


function ConfirmDialog()
{
	  var isValidate;	  
	  
 	  isValidate = ValidatePanel("P1");
	  
	  if( isValidate )
	  {
	    dialogName = unescape( window.name.replace(/PERCENT/g,"%") );	    
	   
 	    window.opener.DialogResult(
	        dialogName ,
	        window   
	    );
 	 
	    window.close();
  }
}

function DialogResult(dialogName,dialogWindow)
{
    var elementNameRE = /([^#]+)#([^\[]+)/;
    var panelName;
    var mainTableName;
    var dialog = null;
    var nodeElements = new Array();
    var i;
     
    for( i = 0 ; i < dialogs.length ; i++)
    {
       
        if( dialogs[i].Name == dialogName )
        {
            dialog = dialogs[i];
            break;
        }
    }
    
    if( dialog == null )
    {
        alert("can not find dialog '"  + dialogName +  "'");
        return ;
    }
    
    

    for( i = 0 ; i < dialogWindow.document.forms[0].elements.length ; i++)
    {
        index = dialogWindow.document.forms[0].elements[i].name.search( elementNameRE );
        if( index == 0 )
        {
            panelName = RegExp.$1;
            mainTableName = RegExp.$2;
            break;
        }
     }
     
    
    for( i = 0 ; i < dialog.Callbacks.length ; i++)
    {
        sourceName = panelName + "#" + mainTableName + "[0]____" + dialog.Callbacks[i].Source.replace(".","____");
        
       if( dialogWindow.document.forms["0"].elements[sourceName] == null )
        {
            alert("can not find callback source '" + sourceName + "' !");
            return;
        }
        
        value = dialogWindow.document.forms["0"].elements[sourceName].value;
                  
        if( document.forms[0].elements[dialog.Callbacks[i].Target] == null )
        {
            alert("can not find callback target '" + dialog.Callbacks[i].Target + "' !");
            return;
        }
             
        document.forms[0].elements[dialog.Callbacks[i].Target].value = value;

        nodeElements.push(document.forms[0].elements[dialog.Callbacks[i].Target]);

				if( document.forms[0].elements[panelName + "_source_name"] != null )
				{
				  document.forms[0].elements[panelName + "_source_name"].value = dialog.Callbacks[i].Target;
				}
    }
    

    UpdateElements(nodeElements);
}

function GetScriptTagCode(scriptHTML)
{
	var code;
	var startIndex,endIndex;
	var scriptStartRegex = /<script>/i;
	var scriptEndRegex = /<\/script>/i;
	
	startIndex = scriptHTML.search(scriptStartRegex);
	endIndex = scriptHTML.search(scriptEndRegex);
	
	startIndex += 7;
	code = scriptHTML.substring(startIndex+1,endIndex);
	
	return code;
}

function OpenDialog(dialogName)
{
	var scriptCode;
 	var parentElement;
    var url = "";
    var dialog = null;
    var branchName = null;
    var mainTableNameRE = /([^\[\]]+)\[0\]$/;
    var i;
  
  
  	if( dialogName.search(/\#$/) < 0 )
  	{
	  	dialogName += "#";
  	}
  	
 
  	if( dialogName.indexOf("____") < 0 )
  	{
  		parentElement = event.srcElement.parentElement;

		if( parentElement.children.length > 0 )
		{
			if( parentElement.children[0].id=="compound_control")
			{
	  			branchName = ParseBranchName(parentElement.children[0].children[0].name);
	  		}
	  		else
	  		{
	  			branchName = ParseBranchName(parentElement.children[0].name);
	  		}
		  	branchName.search(mainTableNameRE);
  			dialogName = branchName + "____" + RegExp.$1 + "____" + dialogName;
  			
  			scriptCode = GetScriptTagCode(parentElement.outerHTML);
  			eval(scriptCode);
  		}
  	}
 
  	
   	
  	
  	
    for( i = 0 ; i < dialogs.length ; i++)
    {
        if( dialogs[i].Name == dialogName )
        {
            dialog = dialogs[i];
            break;
        }
    }
 
    if( dialog == null )
    {
        alert("can not find dialog '"  + dialogName +  "'");
        return ;
    }
    
    url = dialog.Path;
    
    
    if( url.indexOf("?") < 0 )
    {
        url += "?" ;
    }
    else
    {
        url += "&";
    }
     
    
    for( i = 0 ; i < dialog.Arguments.length ; i++)
    {
        url += dialog.Arguments[i].Name + "=" + dialog.Arguments[i].Value + "&";
    }
    
    windowName = escape(dialog.Name).replace(/\%/g,"PERCENT");
     
    dialogWindow = window.open(url,windowName,"width=" +dialog.Width + ",height=" + dialog.Height + ",scrollbars=yes");
    
    dialogWindow.focus();
}


function Dialog(dialogName)
{
    this.Name = dialogName;
    this.Width = "400PX";
    this.Height = "300PX";
    this.Arguments = new Array();
    this.Callbacks = new Array();
}

function Argument(name,value)
{
    this.Name  = name;
    this.Value = value;
}

function Callback(target,source)
{
    this.Target = target;
    this.Source = source;
}



var lastErrorDescription ;

function ThrowError( description , number ){
 var e = new Error() ;

	if( number == null )
		number = -1 ;

	if( description == null )
		description = "" ;
	else if( typeof(description) != "string" ){
		description = description + "" ;
	};

	e.number = number ;
	if( description.indexOf("caller path -----") < 0 ){
		e.description = description + "\r\n\r\n" + "caller path -------\r\n" + GetCallerPath( ThrowError.caller ) + "\r\n" ;
		lastErrorDescription = e.description ;
	}else{
		if( lastErrorDescription != null )
			e.description = lastErrorDescription ;
		else
			e.description = description ;
	};
	throw(e);
};


function GetCallerPath( callerFunction ){
 var callerPathStr ; 
 var callerName ; 
 var callerPath = new Array() ;
 var callLevel = 0 ;
 
	while( callerFunction != null ){
//		callerName = GetFunctionName( callerFunction ) ;
		callerName = GetCallerString( callerFunction ) ;
		callerPath = callerPath.concat( callerName ) ;
		callerFunction = callerFunction.caller ;
		callLevel++  ;
		if( callLevel > 10 )
			break ;
	};

	callerPathStr = callerPath.reverse().join("\r\n") ;

	return callerPathStr ;
};


function GetFunctionName( functionObj ){
 var reFunctionName = /function\s+([^{]+)/i ;
 var functionStr ;
 var functionName ;
 
	if( typeof(functionObj) == "function" ){
		functionStr = functionObj.toString() ;
		functionStr = functionStr.search( reFunctionName ) ;
		functionName = RegExp.$1 ;
	};
	return functionName ;
};


function GetCallerString(functionObj){
 var callerString ;
 var reFunctionName = /function\s+([^\(\s]+)/ ; ;
 var argumentsStr = /\(([^)]*)\)/ ;
 var argumentValue , argumentNames = new Array() ;
 var functionStr ;
 var i ;

	functionStr = functionObj.toString() ;
	functionStr.search( reFunctionName ) ;
	functionName = RegExp.$1 ;
	
	functionStr.search( argumentsStr ) ;
	argumentsStr = RegExp.$1 ;
	if( argumentsStr != null )
		argumentNames = argumentsStr.split(",") ;
	callerString = functionName + "(" ;

	for( i = 0 ; i < functionObj.arguments.length ; i++ ){
		argumentValue = functionObj.arguments[i] ;
		if( argumentValue == null )
			argumentValue = "null" ;
		else if( typeof(argumentValue) == "object"){
			argumentValue = "object" ;
		}else if( typeof(argumentValue) == "string" &&  argumentValue.length > 15 ){
			argumentValue = argumentValue.substr(0,15) + "..." ;
		};

		if( i< argumentNames.length )
			callerString += argumentNames[i] ;
		
		callerString += "[" + argumentValue + "]";
		
		if( i < functionObj.arguments.length-1 )
			callerString += "," ;
	};
	
	callerString += ")" ;

	return callerString ;
};



function ClassBase(){
};


function Trim( str ){
 	str = str.replace(/^\s+/,"") ;
 	str = str.replace(/\s+$/,"") ;
 	return str ;
};//Trim( str ){ 


function Exists(array,element){
 var i ;

	for( i = 0 ; i < array.length ; i++)
		if( array[i] == element )
			return true ;

	return false ;
};


function JoinArray(array1,array2){
 var joinedArray = new Array() ;
 var i ;

	if( array1 == null )
		array1 = new Array () ;
	if( array2 == null )
		array2 = new Array() ;

	joinedArray = (new Array()).concat( array1 );

	for( i = 0 ; i < array2.length ; i++){
		if( !Exists( joinedArray , array2[i]) ){
			joinedArray = joinedArray.concat( array2[i] ) ;
		};
	};

	return joinedArray ;
};//end function JoinArray(array1,array2){


function CloneArray( array ){
 var i ;
 var newArray = new Array() ;
 
 	for( i = 0 ; i < array.length ; i++){
 		newArray = newArray.concat(null) ;
 		newArray[i] = array[i] ;
 	};
 	
	return newArray ;
};//end function CloneArray( array ){


function CompactArray( array ){
 var compactedArray = new Array() ;
 var i ;

	for( i = 0 ; i < array.length ; i ++){
		if( array[i] != null )
			compactedArray = compactedArray.concat( array[i] ) ;
	}; 

	return compactedArray ;
};


function OracleToJava( string ){
 var tokens ;
 var javaString ;
 var i ;
 
	if( string.indexOf(string) >= 0 ){
		tokens = string.split("_") ;
		tokens[0] = tokens[0].toLowerCase() ;
		for( i = 1 ; i < tokens.length ; i++ ){
			if( tokens[i].length > 0 ){
				tokens[i] = tokens[i].charAt(0).toUpperCase() + 
							tokens[i].substring(1,tokens[i].length).toLowerCase() ;
			};
		};//end for( i = 0 ; i < tokens.length ; i++ ){
	};//end if( string.indexOf(string) >= 0 ){
	if( tokens[ tokens.length-1 ] == "List" )
		tokens[ tokens.length-1 ] = "s" ;
	javaString = tokens.join("") ;

	return javaString ;
};


function JavaToOracle( string ){
 var tokens ;
 var capitals ;
 var oracleString = "" ;
 var i ;
 
	if( string.length > 0 ){
		capitals = string.match(/[A-Z]/g) ;
		tokens = string.split(/[A-Z]/) ;
		oracleString = tokens[0] ;

		for( i = 1 ; i < tokens.length ; i++ ){
			if( i < tokens.length )
				oracleString += "_" ;

			oracleString += ( capitals[i-1].toLowerCase() + tokens[i]) ;
		};//end for( i = 0 ; i < tokens.length ; i++ ){
	};//end if( string.indexOf(string) >= 0 ) ;
	if( oracleString.search(/[^s]s$/) > 0 )
		oracleString =oracleString.replace(/s$/ , "_list" );

	return oracleString ;
};


function IsArray( object ){
	if( typeof( object ) == "object" &&
		object.length != null  &&
		object.prototype == null )
		return true ;
	else
		return false ;
};


function IsFunction( object ){
 var constructorStr ;

	if( typeof(object) == "function" )
		return true ;
	else
		return false ;
};


function GetStringFormat( object , level ){
 var formatStr = "" ;
 var paddingStr = "" ;
 var i ;

 	if( level == null )
 		level = 0 ;
 
 	for( i = 1; i < level ; i++)
 		paddingStr += "	" ;
 
 	if( IsArray(object) ){
 		formatStr +=  ( " {\r\n" ) ;
 		for( i = 0 ; i < object.length ; i++){
 			formatStr +=  GetStringFormat( object[i] , level + 1 ) ;
 			
 			if(i < object.length - 1)
 				formatStr += paddingStr +",\r\n" ;
 		};
 		formatStr +=  paddingStr + " }\r\n" ;
 	}else if( typeof(object) == "number" || typeof(object) == "string" ){
 		formatStr +=  object  ;
 	}else if( !IsFunction(object) ){

		for(var i in object ){
			if(!IsFunction(object[i])){
				formatStr += (
					paddingStr +
					i + "=" +  
					GetStringFormat(object[i] , level + 1 ) + 
					"\r\n" ) ;
			};
		};//end for(var i in object ){
	};

	return formatStr ;
};//end function GetStringFormat( object , level ){


function IsElement( object , element ){
 var i;

	if( IsArray(object) ){
		for( i = 0 ; i < object.length ; i++){
			if( object[i] == element )
				return true ;
		};
	}else{
		for( var i in object ){
			if( object[i] == element )
				return true ;
		};
	};

	return false ;
};//end function IsElement( elements , element ){


function RemoveElement( object , element ){
 var i;
 var headPart , tailPart ;
 
	if( IsArray(object) ){
		for( i = 0 ; i < object.length ; i++){
			if( object[i] == element ){
				headPart = object.slice(0,i) ;
				tailPart = object.slice(i+1,object.length) ;
				object = headPart.concat( tailPart );
			};
		};
	}else{
		for( var i in object ){
			if( object[i] == element ){
				object[i] = null ;
			};
		};
	};
	
	return object ;
};//end function RemoveElement( object , element ){

	
function IsDate( object ){
	try{
	if( object.getYear != null )
		return true ;
	else
		return false ;
	}catch(e){
		return false ;
	};
};


function IsClass( object ){
 var constructorStr ;

	if( typeof(object) == "object" && object != null ){
		constructorStr = object.constructor.toString() ;
	
		if( constructorStr.search(/function[\s]+(Class|Struct)/i ) >= 0)
			return true ;
		else
			return false ;
	}else
		return false ;

};


function IsSimpleObject( object ){
 var type ;
 var isSimpleObject ;
 
 	type = typeof( object ) ;
 	
 	switch( type ){
 		case "number" :
 		case "string" :
 		case "boolean" :
 			isSimpleObject = true ;
 		break ;
 		default :
 			isSimpleObject = false ;
 		break ;
 	};
 	
 	return isSimpleObject ;
};//end function IsSimpleObject( object ){


function GetClassName( object ){
 var constructorStr ;
 var className = null ;
 var reClassName = /function[\s]+(Class|Struct)([^\s(]+)/i ;

	if( typeof(object) == "object" && object != null ){
		constructorStr = object.constructor.toString() ;
		constructorStr.search( reClassName ) ;
		className = RegExp.$2 ;
	};
	
	return className ;
};


function GetDateStr(dateTime){
 var dateStr ;	
 var year , month , day ;
 var hour , minute , second ; 

	if( dateTime == null )
		dateTime = new Date() ;
	else 
		dateTime = new Date( dateTime ) ;

	month = dateTime.getMonth()+1 ;
	day = dateTime.getDate() ;

	if( month.toString().length==1 )
		month = "0" + month ;
	if( day.toString().length==1 )
		day = "0" + day ;

	hour = dateTime.getHours() ;
	minute = dateTime.getMinutes() ;
	second = dateTime.getSeconds() ;

	if( hour.toString().length==1 )
		hour = "0" + hour ;
	if( minute.toString().length==1 )
		minute = "0" + minute ;
	if( second.toString().length==1 )
		second = "0" + second ;
	
	if( (year = dateTime.getYear()) < 100 )
		year += 1900 ;

	dateStr = year + "/" + 
				month + "/" + day + " " + 
				hour + ":" + minute + ":" +	second ;	
	return dateStr ;
};





function GoToPage(branchName,pageIndex,pagingFormName)
{
    var pagingElement;
    var formElement;
    var currPageIndex = 1;

    if( document.forms.length == 0 )
    {
        alert( "document has no forms ");
        return;
    }

    formElement = document.forms[0];
    

    if(formElement.elements[branchName + "____paging____curr_page_index"] == null )
    {
        alert(
        "form has no element '" + branchName + "____paging____curr_page_index'" + "\r\n\r\n" +
          formElement.outerHTML  
        );
        return;
    }
    

    formElement.elements[branchName + "____paging____curr_page_index"].value = pageIndex;
    
    if( GetBrowserType() == "IE" )
    {
        pagingElement = event.srcElement;
        while( pagingElement.id != "form_node" )
        {
            pagingElement = pagingElement.parentElement;
        }
    }
    else
    {
        pagingElement = formElement.elements[branchName + "____paging____curr_page_index"]
        while( pagingElement.id != "form_node" )
        {
            pagingElement = pagingElement.parentNode;
        }
    }

    SendCommand("paging","","",pagingElement);
    //formElement.submit();
    
}

function OnPagingIndexOut(pagingIndexElement)
{
    pagingIndexElement.style.color = "";
    pagingIndexElement.style.borderColor = "";
}

function OnPagingIndexOver(pagingIndexElement)
{
    pagingIndexElement.style.color = "RGB(255,102,0)";
    pagingIndexElement.style.borderColor = "red";
}

function AfterDoResponse(nodeElement)
{
}

function ShowPageBlock()
{
    if( document.getElementById('PAGE_BLOCK') == null )
    {
        document.body.insertAdjacentHTML(
            "AFTERBEGIN",
            "<img src='/images/transparent.gif' id='PAGE_BLOCK' style='position:absolute;top:0;left:0;width:90%;display:none'></div>"
       );
    }
    
    document.getElementById('PAGE_BLOCK').style.width = document.body.scrollWidth - 10;
    document.getElementById('PAGE_BLOCK').style.height = document.body.scrollHeight ;
    document.getElementById('PAGE_BLOCK').style.display='block';
} 
 
function HiddenPageBlock()
{
    document.getElementById('PAGE_BLOCK').style.display='none';
} 


function AfterValidatePanel(panelName)
{
	return true;
}

function ShowMessage(message)
{
	 var messageElement;
   var messageLeft;
   var messageTop;

try
{      	 
	 if( 	messageTimer != null )
	 {
		 	clearTimeout(messageTimer);
	 }

	 if( event == null || event.srcElement == null )
	 {
	 		return;
	 }
	 
	 messageLeft = GetClientLeft(event.srcElement);
	 messageTop  = GetClientTop(event.srcElement) - 130;

	 if( document.body.all("MESSAGE_BOX") == null )
	 {	  
	 		document.body.insertAdjacentHTML("afterBegin","<DIV ID='MESSAGE_BOX' style='position:absolute;z-index:100px;left:" + messageLeft + "px;top:" + messageTop + "px;height:110px;width:200px;border:4px groove #EA8224;background-color:#F9FD64;filter:alpha(opacity=80);'></DIV>");
	 }
	 
	 messageElement = document.body.all("MESSAGE_BOX");
	 messageElement.style.top = messageTop;
	 
	 messageElement.innerHTML = "<PRE style='margin-top:10px;margin-left:30px;text-align:left;font-weight:bold'>" + message + "</PRE>";
	
	 messageElement.style.left = messageLeft + "px";
	 messageElement.style.display = "block";
	 
	 messageTimer = setTimeout("HiddenMessage()",3000);
	}
	catch(e)
	{
	}
}


function HiddenMessage()
{
	var messageElement;
	
	  messageElement = document.body.all("MESSAGE_BOX");
	  
		messageElement.style.display = "none";
		
		clearTimeout(messageTimer);
		
		messageTimer = null;
}

function GetClientLeft(element){
 var clientTop = element.offsetLeft ;
 
	while( element.tagName != "BODY" ){
		element = element.offsetParent ;
		clientTop += element.offsetLeft ;
	};

	return clientTop ; 
};

function GetClientTop(element){
 var clientTop = element.offsetTop ;
 
	while( element.tagName != "BODY" ){
		element = element.offsetParent ;
		clientTop += element.offsetTop ;
	};

	return clientTop ; 
};



var xmlHTTPs = new Array() ;
var requestObjs = new Array() ;
var callBackFuncs = new Array() ;
var timeSpans = new Array() ;
var requestTimeout = 60000 ;
var callServiceURL ;
var isLastServiceCallError = false ;
var isCallSuccess = true ;

function CallServiceDOM(url , requestObj ){
 var xmlDOM = new ActiveXObject("MICROSOFT.XMLDOM");
 var responseXML ;

	responseXML = CallService(url,requestObj) ;
	xmlDOM.loadXML( responseXML );

	return xmlDOM ;
};


function CallService(url,requestObj,callBackFunc){
 var responseXML ;
 var nodeName , nodeText;
 var isAsync ;
 var errorNode , newNode ;
 var error ;
 var i ;
 var xmlHTTP = new ActiveXObject("MICROSOFT.XMLHTTP");
 var requestDOM = new ActiveXObject("MICROSOFT.XMLDOM");

	isLastServiceCallError = false ;
	callServiceURL = url ;

	isCallSuccess = false ;
	
	if( url == null  ){
		if( typeof("window") != "undefined" ){
			alert( "url 'url' can not be null") ;
			return ;
		}else{
			ThrowError( "parameter 'url' can not be null" ) ;
		};
	};

	if( url.search(/http:/i) < 0 ){
		if( url.charAt(0) == "/" || url.charAt(0) == "\\" )
			url = "http://" + window.location.host +  url ;
	};
	
	if( callBackFunc != null )
		isAsync = true ;
	else
		isAsync = false ;

	xmlHTTP.open("POST", url , isAsync ) ;
	xmlHTTP.setRequestHeader("Content-Type","text/xml");
	//xmlHTTP.setRequestHeader("charset","big5");
	xmlHTTP.setRequestHeader("charset","utf-8");

	if( requestObj == null || requestObj.documentElement == null ){
		
		requestDOM.loadXML("<response></response>" );
		
		if( requestObj != null ){
			for( var i in requestObj ){
				if( requestObj[i] != null ){
					nodeName = i ;
						
					if( nodeName == "methodName" ){
						newNode = requestDOM.createNode(1,"methodName","") ;
						newNode.text = requestObj[i] ;
						requestDOM.documentElement.appendChild( newNode );
					}else{
						newNode = requestDOM.createNode(1,"param","") ;
						newNode.setAttribute("name",i) ;
						newNode.text = requestObj[i] ;
						requestDOM.documentElement.appendChild( newNode );
					};
				};
			};//end for( var i in requestObj ){
		};//end if( requestObj != null ){
	}else{
		requestDOM = requestObj ;
	};

	try{
		xmlHTTP.send( requestDOM.xml  );
		isCallSuccess = true ;
	}catch(e){
		isCallSuccess = false ;
	} ;

	if( !isAsync ){
		error = CheckXMLHTTPError(xmlHTTP) ;
		if( error.number > 0 ){
			isCallSuccess = false ;
			isLastServiceCallError = true ;
			ReportError( error , requestObj) ;	
		}else
			isCallSuccess = true ;
	};

	if( !isAsync )
		responseXML = xmlHTTP.responseXML.documentElement.xml ;

	if( isAsync )
		PrepareService(xmlHTTP,callBackFunc,requestObj);

	return responseXML ;
};//CallService(url,requestObj){


function PrepareService( xmlHTTP , callBackFunc , requestObj , timeSpan ){
 var xmlHTTPIndex ;
 var callBackFuncIndex ;
 var objectIndex ;
 var error ;

	if( timeSpan == null )
		timeSpan = 0 ;

	xmlHTTPIndex = GetElementIndex(xmlHTTPs,xmlHTTP) ;

	if( xmlHTTPIndex < 0 ){
		xmlHTTPIndex = xmlHTTPs.length ;
		xmlHTTPs = xmlHTTPs.concat( xmlHTTP ) ;
		callBackFuncs = callBackFuncs.concat( callBackFunc ) ;
		requestObjs = requestObjs.concat( requestObj ) ;
		timeSpans = timeSpans.concat( timeSpan );
	};

	if( timeSpan > requestTimeout ){
		error = new Error ;
		error.number = 1001 ;
		error.title = "Request Timeout" ;
		ReportError( error , requestObj) ;
	}else if( xmlHTTP.readyState != 4 ){
		timeSpans[xmlHTTPIndex] = timeSpan + 300 ;
		if( requestObj != null ){
			setTimeout( "PrepareService( xmlHTTPs[" + xmlHTTPIndex + "] , callBackFuncs[" + xmlHTTPIndex + "] , requestObjs[" + xmlHTTPIndex + "] , timeSpans[" + xmlHTTPIndex + "])" , 300 );
		}else{
			setTimeout( "PrepareService( xmlHTTPs[" + xmlHTTPIndex + "] , callBackFuncs[" + xmlHTTPIndex + "] , null , timeSpans[" + xmlHTTPIndex + "])" , 300 );
		};
	}else{
		try{
			error = CheckXMLHTTPError(xmlHTTP) ;
			if( error.number > 0 ){
				ReportError( error , requestObj) ;
			}else{
				callBackFunc( xmlHTTP.responseXML.documentElement.xml , requestObj ) ;
			};
		}catch(e){
			error = new Error ;
			error.number = 1003 ;
			error.title = "Callback Function Error" ;
			error.description = 
						"<pre style='font-family:Courier New;font-weight:bold'>\r\n" +
						"call back function '" + 
						GetFunctionName(callBackFunc) + "' error\r\n\r\n" + 
						"<hr>" +
						e.description + 
						"<hr>" + 
						callBackFunc + 
						"</pre>" ;
			ReportError(error,requestObj) ;
		};
	};//end if( timeSpan > requestTimeout )
};//PrepareService( xmlHTTP , callBackFunc ){


function GetElementIndex(requestObj,element){
 var elementIndex = -1 ; 
 var i = -1 ;
	
 	for( i = 0 ; i < requestObjs.length ; i++){
 		if( requestObjs[i] == element )
 			elementIndex = i ; 
 	};

	return elementIndex ;
};


function ReportError( error , requestObj ){
 
 	if(requestObj == null)
 		requestObj = new Object ;
	else if( requestObj.documentElement != null )
		requestObj = new Object ;

 	requestObj.requestURL = callServiceURL ;
	requestObj.errorNumber = error.number ;
	requestObj.errorPageHTML = error.description ;
	requestObj.errorDescription = error.title ;

	isLastServiceCallError = true ;

	if( error.number > 400 ){
		if( typeof(window) != "undefined" ){
			showModalDialog( "/resource/web_component/exception/exception.htm",
				requestObj,
				"resizable:yes;dialogWidth:580px;dialogHeight:230px") ;
			return ;
		}else{
			ThrowError(requestObj.errorDescription + "\r\n\r\n" + error.description ) ;
		};
	};
};


function CheckXMLHTTPError(xmlHTTP){
 var error = new Error ;

	error.number = 0 ;
	
	if( xmlHTTP.status > 400 ){
		error.number = xmlHTTP.status ;
		if( xmlHTTP.status == "404" || xmlHTTP.status == "405" )
			error.title = "Page Not Found" ;
		else if( xmlHTTP.status == 500 )
			error.title = "Internal Server Error" ;
		else
			error.title = "Network Error" ;
		error.description = xmlHTTP.responseText ;
	}else if( (errorNode=xmlHTTP.responseXML.selectSingleNode("//error")) != null ){
		error.number = 1002 ;
		error.title = "Processing Error" ;
		error.description = errorNode.text ;
	}else if( xmlHTTP.responseXML.parseError.errorCode != 0 ){
		error.number =	1004 ;
		error.title = "Response Format Error" ;
		error.description = 
					xmlHTTP.responseXML.parseError.reason + "<br><br>" +
			 		"<textarea style='width:96%;height:96%;font-family:Courier New;font-weight:bold'>\r\n" + 
			 		xmlHTTP.responseText + "\r\n" + 
			 		"</textarea>" ;
	}else if( xmlHTTP.responseXML.xml == ""  ){
		error.number = 1004 ;
		error.title = "Response Format Error" ;
		error.description = 
				"The response content type is not 'text/xml'<br/><br/>" + 
		 		"<textarea style='width:96%;height:96%;font-family:Courier New;font-weight:bold'>\r\n" + 
		 		xmlHTTP.responseText + "\r\n" + 
		 		"</textarea>" ;
	};
	
	return error ;
};


function GetFunctionName( funcObj ){
 var funcName ;
 var funcNameRE = /[^\s]+\s+([^\s(]+)/ ;
 var funcStr ;
 	
 	funcStr = funcObj + "" ;
 
 	funcStr.search(funcNameRE) ;
 	
 	funcName = RegExp.$1 ;
 	return funcName ;
};


function  GetOuterHTML(element)
{
    return  document.createElement("DIV").appendChild(element.cloneNode(true)).parentNode.innerHTML;
}

var fireFoxReadyState = "";

function GetFirefoxReadyState ()
{
    return fireFoxReadyState;
}

function SetFirefoxReadyState(state)
{
    fireFoxReadyState = state;
}

function FirefoxOnLoad()
{
    fireFoxReadyState = "complete";
}

var FirefoxSrcElement = null;

if( GetBrowserType() == "Firefox" )
{
    var setOuterHtml = function(s){
       var range = this.ownerDocument.createRange();
       range.setStartBefore(this);
       var fragment = range.createContextualFragment(s);
       //alert(fragment.xml);
       this.parentNode.replaceChild(fragment, this);
    };

    var getOuterHtml = function(s)
    {
        return document.createElement("DIV").appendChild(this.cloneNode(true)).parentNode.innerHTML;
    };

    var getInnerText = function(s)
    {
        return this.textContent;
    };

    if(window.HTMLElement) {
      HTMLElement.prototype.__defineSetter__("outerHTML", setOuterHtml);
      HTMLElement.prototype.__defineGetter__("outerHTML", getOuterHtml);
      HTMLElement.prototype.__defineGetter__("innerText", getInnerText); 
    }

    window.addEventListener("load", FirefoxOnLoad , false);

  document.onclick = function(e)
  {   
      e   =   window.event   ||   e;   
      var   srcElement   =   e.srcElement   ||   e.target;   
      
      FirefoxSrcElement = srcElement ;
      //alert( srcElement );
  }   

}
 
 
function SwapImageOut(spanElement)
{
    var imgElements = spanElement.getElementsByTagName("IMG");
    var imgElement ;
    if( imgElements.length > 0 )
    {
        imgElement = imgElements[0]; 
        
        tokens = imgElement.src.split("/");
        
        img = tokens[tokens.length-1];
        tokens = img.split(".");
        imgElement.src = 
            imgElement.src.replace(
                tokens[0] + "." + tokens[1] ,
                tokens[0].replace("L","") + "." + tokens[1]
            );
    }    
     
}

function SwapImageOver(spanElement)
{
    var imgElements = spanElement.getElementsByTagName("IMG");
    var imgElement ;
    if( imgElements.length > 0 )
    {
        imgElement = imgElements[0];
        
        tokens = imgElement.src.split("/");
        
        img = tokens[tokens.length-1];
        tokens = img.split(".");
        imgElement.src = 
            imgElement.src.replace(
                tokens[0] + "." + tokens[1] ,
                tokens[0] + "L" + "." + tokens[1]
            );
    }
}


function Install( service_id,sub_id,url,content_id,channel)
{
    var installUrl ;


    if( sub_id == "null" )
    {
        window.open('/home/login.jsp?content_id='+content_id,'_blank','width=410,height=300,left=400,top=300');
    }
    else
    {
        installUrl  = "/push/push.jsp?service_id=" + service_id +  
                            "&sub_id=" +sub_id +
                            "&url=" + url + 
                            "&content_id=" + content_id +
                            "&channel1=" + channel +
                            "&channel2=" ;

        window.open(installUrl,"RESPONSE_FRAME");
     }
}  
 
 


var isShowing = false;
var divElments = new Array();

function GetColumnInfo(nodeName)
{
  var panelNameRegex = /^([^#]+)#/;
  var infoObj = new Object();
  
  tokens = nodeName.split("____");
  nodeName.search(panelNameRegex);

  panelName = RegExp.$1;
       
  if( tokens.length == 3)
  {
      tableName  = tokens[1];
      columnName = tokens[2];
  }
  else
  {
      tableName  = tokens[0];
      columnName = tokens[1];
  }

  
  infoObj.tableName = tableName;
  
  infoObj.columnName = columnName ;
    
  return infoObj;
}



function ShowColumnInfo()
{
    var i = 0;
    var top,left;
    isShowing = true;
    var element = event.srcElement;
    var element2;
    //event.cancelBubble = true;

   
    while( element.tagName != "BODY" )
    {    
        if( element.name !=null || (element.tagName == "SPAN" && element.children.length >= 1 && element.id == "compound_control") )
        {
            element2 = null;
            
            if( element.tagName == "SPAN" )
            {
                element2 = element;
                element = element2.children[0];
            }
            
            left = GetClientLeft(element);
            top =  GetClientTop(element);
            div = document.body.all("DV_" + i);    
            if( element.tagName != "TABLE" )
            {
                div.style.left = left + element.offsetWidth;
                div.style.top = top;
            }
            else
            {
                div.style.left = left;
                div.style.top = top;
            }
            div.style.display = "";
            
            infoNode = GetColumnInfo(element.name);
            if( infoNode.tableName != null && infoNode.columnName != null )
            {
                if( infoNode.columnName.indexOf("AU") < 0 )
                {
                    div.innerHTML = infoNode.tableName + ".<font color='green'>" + infoNode.columnName + "</font>";
                }
                else
                {
                    div.innerHTML = infoNode.tableName ;
                }                    
            }

            if ( element2 != null )
            {
                element = element2; 
            }
            i++;
        }
            
        element = element.parentElement;
    }
    isShowing = false;
}
function OnLoad()
{
    for( i = 0 ; i < 10 ; i++)
    {
        document.body.insertAdjacentHTML("AFTERBEGIN","<div id='DV_" + i + "' style='position:absolute;color:blue;font-size:12px;background-color:white'></div>");
    }
    document.body.attachEvent("onmouseover",ShowColumnInfo);
}
//  setTimeout("OnLoad()",1000);


function GotoTranslogqry(subscr_id)
{
		if( subscr_id == "null" )
		{
			//window.open("/home/login.jsp?is_show_login2=false&return_url=/translogqry/translogqry.jsp",'_blank','width=410,height=250,left=400,top=300');
	    window.open("https://www.catch.net.tw/auth/member_login.jsp?return_url=http://" + window.location.host + "/home/login_callback.jsp"  ,"_blank","width=600,height=600,status=yes");
		}
		else
	  {
			window.open("/translogqry/translogqry.jsp","_self");
		}
}
