﻿// JScript File

function Toggle(node)
{
	// Unfold the branch if it isn't visible
	if (node.nextSibling.style.display == 'none')
	{
		// Change the image (if there is an image)
		var e=node.childNodes[0].childNodes[0].childNodes[0].getElementsByTagName("img");
		for(var ind=0;ind<e.length;ind++)
		{
			if (e[ind].src.substring(e[ind].src.length-8) == "Images/plus.gif")
			{
				e[ind].src = "Images/minus.gif";
			}
		}
        if (node.nextSibling.innerHTML == "")
		    ExpandNode(node.childNodes[0].childNodes[0].childNodes[0].childNodes[1].innerHTML, node.nextSibling)
		
	}
	else
	{
		// Change the image (if there is an image)
        var e=node.childNodes[0].childNodes[0].childNodes[0].getElementsByTagName("img");
        for(var ind=0;ind<e.length;ind++)
		{
			if (e[ind].src.substring(e[ind].src.length-9) == "Images/minus.gif")
			{
				e[ind].src = "Images/plus.gif";
			}
		}
		node.nextSibling.style.display = 'none';
		node.nextSibling.innerHTML = "";
	}

}

function ExpandNode(nodeName, element)
{
    var activityFactory = Quanticks.activityFactory()
    var resultHTML = ""
    var activity = findActivityByName(nodeName)
    
    //0 - no nextSibling 1 - has nextSibling
    var hasNextSiblings = new Array()

    var actElement = activity.element
   
    var currentNode = activity.element
    hasNextSiblings[0] = 0
    while(currentNode!=workflow)
    {
        var connector = currentNode.nextSibling
        if (currentNode.nextSibling && currentNode.nextSibling.tagName=="DIV")
        {
            if (activityFactory.getActivity(connector.nextSibling)!=null || activityFactory.getActivity(currentNode).RegisteredProperties.length>0)
            {
                hasNextSiblings[hasNextSiblings.length] = 1 
            }
            else
            {
                hasNextSiblings[hasNextSiblings.length] = 0 
            }
        }
        else
        {
            //hasNextSiblings[hasNextSiblings.length] = 0
        }
        currentNode = currentNode.parentNode                
    }
    
    //branches
    if (typeof activity.Branches !="undefined")
    {
        for(var br=0;br<activity.Branches.length;br++)
        {
            var branch = activity.Branches[br]
            for (var el=0;el<branch.children.length;el++)
            {
                if (branch.children[el].className != "connector" && branch.children[el].className != "wfbar")
                {
                    var elActivity = activityFactory.getActivity(branch.children[el])
                    
                    if (elActivity != null)
	                {
 	                    resultHTML += "<div class=\"treeitem\" onClick=\"selectNode(this)\"><table cellspacing=0 cellpadding=0><tr><td>"
	                    for(var j=0;j<hasNextSiblings.length;j++)
	                    {
	                        if (hasNextSiblings[j] == 0)
	                        {
	                            resultHTML += "<img src=\"Images/space.gif\">"
	                        }
	                        else
	                        {
	                            if (el == branch.children.length-1 && activity.RegisteredProperties.length==0)
	                                resultHTML += "<img src=\"Images/gline.GIF\">"
	                            else
	                                resultHTML += "<img src=\"Images/line.GIF\">"
	                        }
	                    }
	                    if (branch.children[el])
	                    {

	                            resultHTML += "<img onClick=\"Toggle(this.parentNode.parentNode.parentNode.parentNode.parentNode)\" src=\"Images/plus.gif\"><img src=\"Images/activity.GIF\"></td><td valign=\"middle\">"+elActivity.Properties["Name"]+"</td></tr></table></div>"
	                            resultHTML +="<div class=\"treechildren\"></div>"
  	                    }
  	                }
                } 
            }
        }
    }
    //children
    for (var el=0;el<actElement.children.length;el++)
    {
        if (actElement.children[el].className != "connector" && actElement.children[el].className != "wfbar")
        {
            var elActivity = activityFactory.getActivity(actElement.children[el])
            
            if (elActivity != null)
	        {
 	            resultHTML += "<div class=\"treeitem\" onClick=\"selectNode(this)\"><table cellspacing=0 cellpadding=0><tr><td>"
	            for(var j=0;j<hasNextSiblings.length;j++)
	            {
	                if (hasNextSiblings[j] == 0)
	                {
	                    resultHTML += "<img src=\"Images/space.gif\">"
	                }
	                else
	                {
	                    if (el == actElement.children.length-1 && activity.RegisteredProperties.length==0)
	                        resultHTML += "<img src=\"Images/gline.GIF\">"
	                    else
	                        resultHTML += "<img src=\"Images/line.GIF\">"
	                }
	            }
	            if (actElement.children[el])
	            {

	                    resultHTML += "<img onClick=\"Toggle(this.parentNode.parentNode.parentNode.parentNode.parentNode)\" src=\"Images/plus.gif\"><img src=\"Images/activity.GIF\"></td><td valign=\"middle\">"+elActivity.Properties["Name"]+"</td></tr></table></div>"
	                    resultHTML +="<div class=\"treechildren\"></div>"
  	            }
  	        }
        } 
    } 
    //properties
    for(var i=0;i<activity.RegisteredProperties.length;i++)
	{
	    resultHTML += "<div class=\"treeitem\" onClick=\"selectNode(this)\"><table cellspacing=0 cellpadding=0><tr><td>"
	    for(var j=0;j<hasNextSiblings.length;j++)
	    {
	        if (hasNextSiblings[j] == 0)
	            resultHTML += "<img src=\"Images/space.gif\">"
	        else
	        {
	                if (i == activity.RegisteredProperties.length-1 && j==hasNextSiblings.length)
	                    resultHTML += "<img src=\"Images/gline.GIF\">"
	                else
	                    resultHTML += "<img src=\"Images/line.GIF\">"
	        }
	    }
        if (i == activity.RegisteredProperties.length-1)
            resultHTML += "<img src=\"Images/gline.GIF\">"
        else
            resultHTML += "<img src=\"Images/tline.GIF\">"
	    resultHTML += "<img src=\"Images/property.GIF\"></td><td valign=\"middle\">"+activity.RegisteredProperties[i]+"</td></tr></table></div>"
	    resultHTML +="<div class=\"treechildren\"></div>"
	}
 
    element.innerHTML = resultHTML
    element.style.display = 'block';
}

var selectedTreeNode = null
var selectedGridItem = null

function selectNode(node)
{
    if (selectedTreeNode != null)
        selectedTreeNode.className = "treeitem"
    node.className = "selectedtreeitem"
    selectedTreeNode = node
}

function selectGridItem(item)
{
    if (selectedGridItem != null)
        selectedGridItem.className = "griditem"
    item.className = "selectedgriditem"
    selectedGridItem = item
}

function CloseActivityBind()
{
    if (selectedTreeNode!=null)
    {
        if (selectedTreeNode.parentElement)        
            if (selectedTreeNode.parentElement.previousSibling)            
                elementToBind.value = "{ActivityBind "+selectedTreeNode.parentElement.previousSibling.innerText+",Path="+selectedTreeNode.innerText+"}"
            else
                alert("Can not bind to root element "+selectedTreeNode.innerText);    
        var selActivity = Quanticks.activityFactory().getActivity(selectedElement)
        setProperty(selActivity.Properties["Name"],propToBind,elementToBind.value)
    }
    activityBind.style.visibility = "hidden"
    drappery.style.visibility = "hidden"
    document.getElementById("AddConditionButton").style.visibility = "hidden"
    document.getElementById("RemoveConditionButton").style.visibility = "hidden"
}

function CancelActivityBind()
{
    activityBind.style.visibility = "hidden"
    drappery.style.visibility = "hidden"
    document.getElementById("AddConditionButton").style.visibility = "hidden"  
    document.getElementById("RemoveConditionButton").style.visibility = "hidden"
}
//------------------------
//Connector binds
//------------------------

var bindSldTop=0
var bindSldLeft=0
var bindSldMouseLeft=0
var bindSldMouseTop=0


function AddJacks(activity)
{
    for(var i=0;i<activity.BindableProperties.length;i++)
    {
        AddJack(activity,activity.BindableProperties[i]);     
    }
    if (activity.Parameters!=null)
    {
        for(var i=0;i<activity.Parameters.length;i++)
        {
            AddJack(activity,activity.Parameters[i]);     
        }
    }    
}

function findJacksDiv(a)
{
    for(var i=0;i<a.childNodes.length;i++)
    {
        if (a.childNodes[i].className=="jacks")
        {
            return a.childNodes[i];
        }
        else
        {
            var res = findJacksDiv(a.childNodes[i]);
            if (res!=null)
                return res;
        }
    }
    return null;
}

var movElm = null;

function bindSldMouseDown(e)
{
	if (!e) {e = window.event}
	doDrag=false;
	movElm=e.srcElement;
	bindSldLeft=bindGetAbsLeft(movElm);
	bindSldTop=bindGetAbsTop(movElm);
	bindSldMouseLeft=e.clientX-bindSldLeft;
	bindSldMouseTop=e.clientY-bindSldTop;	
	document.onmousemove = bindSldMouseMove;
	document.onmouseup = bindSldMouseUp;
}
function bindSldMouseMove(e)
{
	if (!e) e = window.event;		
    if (movElm==null) return;
	bindSetPosition(movElm,e.clientX-bindSldLeft-bindSldMouseLeft,e.clientY-bindSldTop-bindSldMouseTop);
	return;
}
function bindSldMouseUp(e)
{
    if (movElm==null) return;
    setPosition(movElm,0,0);
	if (!e) e = window.event;    
	BindDrop(movElm.id,GetOffsetLeft(e.clientX),GetOffsetTop(e.clientY));
    movElm = null;
    document.onmousemove = null;	
}

function GetOffsetLeft(x)
{
    return x-Quanticks.getWorkflowView().offsetLeft-document.getElementById("mapdiv").offsetLeft;
}

function GetOffsetTop(y)
{
    return y-Quanticks.getWorkflowView().offsetTop-document.getElementById("mapdiv").offsetTop;
}

function bindSetPosition(o,oLeft,oTop) {
	if (o==null) return;
	o.style.top = oTop + "px";
	o.style.left = oLeft + "px";
}

var BindNames = new Array();
var BindTypes = new Array();
var BindElements = new Array();
var BindValues= new Array();

function getNewBindName()
{
    var ind=0;
    var found = false;
    do
    {
        ind++;
        found = false;
        for(var i=0;i<BindNames.length;i++)
        {
            if (BindNames[i]==("Bind"+ind))
            {
                found=true;
                break;
            }
        }
     }
     while(found);
     return "Bind"+ind;
}

function FindBindByPosition(x,y)
{
    for(var i=0;i<BindNames.length;i++)
    {
        var curEl = BindElements[BindNames[i]];
        if (x>curEl.offsetLeft-12 && x<curEl.offsetLeft+24)
        {
            if (y>curEl.offsetTop-20 && y<curEl.offsetTop+48)
            {
                return BindNames[i];
            }
        }
    }
    return null;
}

var bElm = null;
var bSldTop=0
var bSldLeft=0
var bSldMouseLeft=0
var bSldMouseTop=0

function hidecontextmenu()
{
    contextMenu.style.visibility = "hidden";
}

function showcontextmenu(x,y,text,callback)
{
    if (contextMenu==null) return;
    if (contextMenu.style.visibility = "hidden")
    {
        contextMenu.style.top = y;
        contextMenu.style.left = x;
        contextMenu.style.visibility = "visible";
        contextMenu.innerHTML = "";
        var item=document.createElement("div");
	    item.className="contextmenuitem";
        item.innerText = text;
        item.onclick=callback;
        item.onmouseover=contextMenuItemOver;
        item.onmouseout=contextMenuItemOut;        
        contextMenu.appendChild(item);
    }   
}

function contextMenuItemOver(e)
{
    if (!e) {e = window.event}
    e.srcElement.style.backgroundColor="#9999FF";
}

function contextMenuItemOut(e)
{
    if (!e) {e = window.event}
    e.srcElement.style.backgroundColor="lightyellow";
}


function bSldMouseDown(e)
{
	if (!e) {e = window.event}
	doDrag=false;
	bElm=e.srcElement;
	var rightclick = false;
	if (e.which) rightclick = (e.which == 3);
	else if (e.button) rightclick = (e.button == 2);
	bSldLeft=bGetAbsLeft(bElm);
    bSldTop=bGetAbsTop(bElm);
    bSldMouseLeft=e.clientX-bSldLeft;
    bSldMouseTop=e.clientY-bSldTop;	
	if (rightclick)
	{
        showcontextmenu(GetOffsetLeft(e.clientX)-8,GetOffsetTop(e.clientY)-8,"Delete",DeleteBind);
        e.cancelBubble = true;	
        bElm=null;
        return;
	}
	else
	{	

	    document.onmousemove = bSldMouseMove;
	    document.onmouseup = bSldMouseUp;
	}
}

function DeleteBind()
{
    hidecontextmenu();
    var bindId = FindBindByPosition(contextMenu.offsetLeft,contextMenu.offsetTop); 
    var bindElement = null;   
    if (bindId!=null) 
    {
        for (var i = 0; i<BindNames.length;i++)
        {
            if(BindNames[i] == bindId)
                BindNames[i]=null;
        }
        var newArray = new Array();
        for (var i = 0; i<BindNames.length;i++)
        {
            if (BindNames[i]!=null)           
                newArray[newArray.length]=BindNames[i];
        }
        BindNames=newArray;
        BindTypes[bindId]=null;
        workflow.removeChild(BindElements[bindId]);
        BindElements[bindId]=null;
        AddAllBinds();
    }
}

function bSldMouseMove(e)
{
	if (!e) e = window.event;		
    if (bElm==null) return;
	//setPosition(bElm,e.clientX-bSldLeft-bSldMouseLeft,e.clientY-bSldTop-bSldMouseTop);
	setPosition(bElm,GetOffsetLeft(e.clientX)-12,GetOffsetTop(e.clientY)-10);
	return;
}
function bSldMouseUp(e)
{
    if (bElm==null) return;
	if (!e) e = window.event;  
	//setPosition(bElm,0,0); 
	setPosition(bElm,GetOffsetLeft(e.clientX)-12,GetOffsetTop(e.clientY)-10);
    bElm.style.backgroundColor="lightyellow"; 
    bElm = null;
    document.onmousemove = null;	
    AddAllBinds();
}
function bGetAbsLeft(o) {
    return o.offsetLeft + o.parentElement.offsetLeft;
}

function bGetAbsTop(o) {

	return o.offsetTop + o.parentElement.offsetTop;
}

function bMouseOver(e)
{
	if (!e) {e = window.event}
	o=e.srcElement;
	o.style.backgroundColor="red";
}


function bMouseOut(e)
{
	if (!e) {e = window.event}
	o=e.srcElement;
	o.style.backgroundColor="lightyellow";
}


function BindDrop(jackName,dropX,dropY)
{
    var x = dropX;
    var y = dropY;
    var bindId = FindBindByPosition(x,y); 
    var bindElement = null;   
    if (bindId==null) 
    {
        var newBind = CreateNewBindElement(null,x,y);
        BindNames[BindNames.length] = newBind.id;
        BindTypes[newBind.id]="string";
        BindElements[newBind.id]=newBind;
        bindId = newBind.id;
    }
    else
    {
        x = BindElements[bindId].offsetLeft+2;
        y = BindElements[bindId].offsetTop+2;        
    }
    var jack=document.getElementById(jackName);
    var bindVal = "{ActivityBind "+workflowActivity.Properties["Name"]+",Path="+bindId+"}"
    setProperty(jack.parentActivity.Properties["Name"],jack.title,bindVal);
    DrawConnectors(jackName,x,y);
}

function isBoundToBind(pVal)
{
        var aBindIndex = pVal.indexOf("{ActivityBind ");
        if (aBindIndex<0) return "";
        var commaIndex = pVal.indexOf(",");
        var leng = commaIndex - aBindIndex - 14;
        var pathIndex = pVal.indexOf(",Path=");
        var path = pVal.substring(pathIndex+6);
        var closeIndex = path.indexOf("}");
        var bName = pVal.substring(aBindIndex+14,aBindIndex+14+leng);
        var bPath = path.substring(0,closeIndex);
        if (bName = workflowActivity.Properties["Name"])
        {
            for(var i=0;i<BindNames.length;i++)
            {
                if (BindNames[i]==bPath)
                    return bPath;
            }
            return "";
        }
        else
            return "";
}

function AddAllBinds()
{
    	for(var j=0;j<workflow.children.length;j++)
    	{
    	    if (workflow.children[j]!=null && workflow.children[j].className=="pipe")
    	        workflow.removeChild(workflow.children[j]);
    	}
    	for(var i=0;i<activityList.length;i++)
    	{
    	    DrawActivityBinds(activityList[i]);
        }
}

function DrawActivityBinds(activity)
{
    if (activity.BindableProperties==null) return;
    for(var i=0;i<activity.BindableProperties.length;i++)
    {
        var val = activity.Properties[activity.BindableProperties[i]];
        if (val!=null)
        {
            var path = isBoundToBind(val);
            if (path!="")
            {
                var jackName = "jack"+activity.element.id+activity.BindableProperties[i];
                var bindEl = BindElements[path];
                if (bindEl!=null)
                {
                    var x = bindEl.offsetLeft+2;
                    var y = bindEl.offsetTop+2;
                    DrawConnectors(jackName,x,y)
                }
            }
        }
    }
    if (activity.Parameters!=null)
    {
        for(var i=0;i<activity.Parameters.length;i++)
        {
            var val = activity.ParameterValues[activity.Parameters[i]];
            if (val!=null)
            {
                var path = isBoundToBind(val);
                if (path!="")
                {                
                    var jackName = "jack"+activity.element.id+activity.Parameters[i];
                    var bindEl = BindElements[path];
                    if (bindEl!=null)
                    {                    
                        var x = bindEl.offsetLeft+2;
                        var y = bindEl.offsetTop+2;
                        DrawConnectors(jackName,x,y);
                    }
                }
             }     
        }
    } 
}

function RemoveActivityBinds(activity)
{
    if (!activity) return;
    if (activity.BindableProperties==null) return;
    for(var i=0;i<activity.BindableProperties.length;i++)
    {
        var val = activity.Properties[activity.BindableProperties[i]];
        if (val!=null)
        {
            var path = isBoundToBind(val);
            if (path!="")
            {
                var jackName = "jack"+activity.element.id+activity.BindableProperties[i];
                var bindEl = BindElements[path];
                if (bindEl!=null)
                {
                    RemoveConnectors(jackName)
                }
            }
        }
    }
    if (activity.Parameters!=null)
    {
        for(var i=0;i<activity.Parameters.length;i++)
        {
            var val = activity.ParameterValues[activity.Parameters[i]];
            if (val!=null)
            {
                var path = isBoundToBind(val);
                if (path!="")
                {                
                    var jackName = "jack"+activity.element.id+activity.Parameters[i];
                    var bindEl = BindElements[path];
                    if (bindEl!=null)
                    {                    
                        RemoveConnectors(jackName);
                    }
                }
             }     
        }
    } 
}

function RemoveConnectors(jackName)
{   

    var jack=document.getElementById(jackName);
    var c1=document.getElementById(jackName+"pipe1");
    var c2=document.getElementById(jackName+"pipe2");
    if (c1!=null)
    {
        workflow.removeChild(c1);
    }
    if (c2!=null)
    {
        workflow.removeChild(c2);
    }
}

function DrawConnectors(jackName,x,y)
{   

    var jack=document.getElementById(jackName);
    if (jack==null) return;
    var bind=document.getElementById(jackName);
    var c1=document.getElementById(jackName+"pipe1");
    var c2=document.getElementById(jackName+"pipe2");
    if (c1==null)
    {
	    c1=document.createElement("DIV");
        c1.className="pipe";
	    c1.id=jackName+"pipe1";
        workflow.appendChild(c1);
    }
    if (c2==null)
    {
	    c2=document.createElement("DIV");
        c2.className="pipe";
        c2.id=jackName+"pipe2";
        workflow.appendChild(c2);
    }

    var fromX = bindGetAbsLeft(jack)+30;
    var fromY = bindGetAbsTop(jack)+6;

    var toX = x;
    var toY = y;
    
    if (fromX <= toX)
    {
        var wpe = toX-fromX;	

        c1.style["left"]=fromX+"px";
        c1.style["top"]=fromY+"px";
        c1.style["width"]=wpe+"px";
        c1.style["height"]=2+"px"
    }
    else
    {
        var wpe = fromX-toX;
        c1.style["left"]=toX+"px"; 
        c1.style["top"]=fromY+"px";
        c1.style["width"]=wpe+"px";
        c1.style["height"]=2+"px"
    }
    
    if (fromY<=toY)
    {
        var wpe = toY-fromY;
        c2.style["left"]=toX+"px";
        c2.style["top"]=fromY+"px";
        c2.style["width"]=2+"px"
        c2.style["height"]=wpe + "px";
    }
    else
    {
        var wpe = fromY-toY;
        c2.style["left"]=toX+"px";
        c2.style["top"]=toY+"px";
        c2.style["width"]=2+"px"
        c2.style["height"]=wpe + "px";
    }
}

