﻿var xmlDoc;
var rulesDoc;
var codeDoc;
var open_window;

function loadXOML()
{
open_window = window.open("Upload.aspx",null,
    "left=450,top=300,height=150,width=250,status=yes,toolbar=no,menubar=no,location=no");

}

function openFile(filename)
{

if(false == open_window.closed) 
{
    open_window.close();
}
//load xml file
// code for IE
if (window.ActiveXObject)
  {
          xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
          xmlDoc.async=false;
          xmlDoc.load("workflows\\"+filename);
          openXoml()
          
          if (filename.indexOf(".xoml")>0)
          {
              var extIndx = filename.indexOf(".xoml");
              try
              {
                  var rulesfilename = filename.substring(0,extIndx)+".rules";
                  rulesDoc = new ActiveXObject("Microsoft.XMLDOM");
                  rulesDoc.async=false;
                  rulesDoc.load("workflows\\"+rulesfilename);
                  openRules();
              }
              catch(err)
              {      
              }
          }
          else
          {
              alert("file should have a xoml extension");
          }
  }
// code for Mozilla, etc.
else if (document.implementation &&
document.implementation.createDocument)
  {
  xmlDoc= document.implementation.createDocument("","",null);
  xmlDoc.load(filename);
  xmlDoc.onload=openXoml
  }
else
  {
  alert('Your browser cannot handle this script');
  }
}


function EditWorkflow(wfname)
{
if (window.ActiveXObject)
  {
          xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
          xmlDoc.async=false;
          xmlDoc.load("GetField.ashx?field=xoml&wfname="+wfname);
          
          rulesDoc = new ActiveXObject("Microsoft.XMLDOM");
          rulesDoc.async=false;
          rulesDoc.load("GetField.ashx?field=rules&wfname="+wfname);

          codeDoc = new ActiveXObject("Microsoft.XMLDOM");
          codeDoc.async=false;
          codeDoc.load("GetField.ashx?field=code&wfname="+wfname);
          
          openXoml();
          openRules();                    
          openCode();
          AddAllBinds();
  }
else
  {
  alert('Your browser cannot handle this script');
  }
}

function SaveSuccess()
{
    var saveResult = document.getElementById("saveResult").innerText;
    if (saveResult=="success")
    {
        setProperty(workflowActivity.Properties["Name"],"Name",document.getElementById("wfname").value);
        UI.DialogForm.Close();
    }
    if (saveResult=="NoUser")
    { 
        NoUser();
    }   
}

function save()
{
        if (document.getElementById("user").innerText=="")
        {
            Login(save);
            return;
        }
        UI.ShowProgressBar("Saving...");
        UI.DialogForm.SetUrl("Save.aspx");
        UI.DialogForm.onSuccess = SaveSuccess;
        UI.DialogForm.afterShow = AfterShow;       
        UI.DialogForm.XOML = RemoveLineBreaks(Serialize());
        UI.DialogForm.Rules = rules;
        UI.DialogForm.Code = serializeCode();
        UI.DialogForm.cancelButton = true;
        UI.DialogForm.Show("Save / Execute","wfname="+workflowActivity.Properties["Name"]);       
}

function serializeCode()
{
    var result = "";
    for(var i=0;i<EventHandlers.length;i++)
    {
        result+="<CODEHANDLER Name=\""+EventHandlers[i]+"\">";
        result+="<![CDATA[";
        result+=EventHandlerValues[EventHandlers[i]];
        result+="]]>";
        result+="</CODEHANDLER>";
    }
    for(var i=0;i<BindNames.length;i++)
    {
        var x = BindElements[BindNames[i]].offsetLeft;
        var y = BindElements[BindNames[i]].offsetTop;
        result+="<BIND Name=\""+BindNames[i]+"\" Type=\""+BindTypes[BindNames[i]]+"\" x=\""+x+"\" y=\""+y+"\">";
        result+=BindValues[BindNames[i]];
        result+="</BIND>";
    }
    return result;
}

function AfterShow()
{
    toggleScheduled();
}
function compile()
{
        UI.ShowProgressBar("Compiling...");
        var parameters = "";
        parameters +="<PXOML>";
        parameters +=RemoveLineBreaks(Serialize());
        parameters +="</PXOML>";
        parameters +="<PRULES>";
        parameters += rules;
        parameters +="</PRULES>";
        parameters +="<PCODE>";
        parameters += serializeCode();
        parameters +="</PCODE>";
        makePOSTRequest("Compile.aspx", parameters, alertCompileResults);
}

function NoUser()
{
        document.getElementById("user").innerText="";
        Login();
}

function run()
{
    if (document.getElementById("user").innerText=="")
    {
        Login(run);
        return;
    }
    UI.ShowProgressBar("Starting...");
    statusBar.innerHTML = "Starting...";
    var parameters = "wfname="+workflowActivity.Properties["Name"];     
    makePOSTRequest("Run.aspx", parameters, alertRunResults);
}

function alertRunResults() {
  if (http_request.readyState == 4) {
     if (http_request.status == 200) {
            if (http_request.responseText == "NoUser")
            {
                NoUser();
                return;
            }
            alert("Workflow started. \nInstance:"+http_request.responseText);               
        UI.HideProgressBar();
     } else {
        alert('Start failed. Make sure workflow is saved before starting.'+http_request.responseText);
        UI.HideProgressBar();
     }
     statusBar.innerHTML = "Ready";     
  }
} 

function newWorkflowMenuItem()
{
    var menudiv = document.getElementById("newwfdiv")
    menudiv.style.display="block"
    document.getElementById("newwfname").focus()
}

function newWorkflowMenuItemOut()
{
    var menudiv = document.getElementById("newwfdiv")
    menudiv.style.display="none"
}


function newWorkflow()
{    
    activityList.length = 0;
    connectors.length = 0;
    activityCount = 0;
    workflowActivity.Clear();
    rulesdiv.innerHTML = "";
    workflowActivity.Initialize("Workflow1");
    Quanticks.activityFactory()._Select(workflow);
}

function openCode()
{
    var root = codeDoc.selectSingleNode("//PCODE");
    if (root==null) return;
    var codeNodes = root.getElementsByTagName("CODEHANDLER");
    EventHandlers = new Array();
    EventHandlerValues = new Array();
    if (codeNodes!=null && codeNodes.length!=0)
    {
        for(var aa=0;aa<codeNodes.length; aa++)
        {
            var evHand = codeNodes[aa].getAttribute("Name");
            var evHandVal = codeNodes[aa].text;
            if (evHand!="")
            {
                EventHandlers[EventHandlers.length]=evHand;
                EventHandlerValues[evHand]=evHandVal;            
            }
        }
    }
    var bindNodes = root.getElementsByTagName("BIND");
    BindNames.length=0;
    BindTypes.length=0;
    BindElements.length=0;
    BindValues.length=0;
    if (bindNodes!=null && bindNodes.length!=0)
    {
        for(var aa=0;aa<bindNodes.length; aa++)
        {
            var bindName = bindNodes[aa].getAttribute("Name");
            var bindType = bindNodes[aa].getAttribute("Type");
            var x = bindNodes[aa].getAttribute("x");
            var y = bindNodes[aa].getAttribute("y");
            var bindValue = bindNodes[aa].text;
            if (bindName!="")
            {
                BindNames[BindNames.length]=bindName;
                BindTypes[bindName]=bindType;
                BindValues[bindName]=bindValue;
                BindElements[bindName]=CreateNewBindElement(bindName,x,y);            
            }
        }
    }
}

function openXoml()
{
    activityList.length = 0
    connectors.length = 0
    activityCount = 0
    var seqWorkflow = xmlDoc.selectSingleNode("//SequentialWorkflowActivity")
    workflowActivity.Clear()
    rules = ""
    DisplayEncodedRules()
        if (seqWorkflow==null)
        {
            alert("Invalid XOML.");
            return;
        }
    workflowActivity.Initialize(seqWorkflow.getAttribute("x:Name"))
    setProperty(workflowActivity.Properties["Name"],"Enabled",(seqWorkflow.getAttribute("Enabled")!=null)?seqWorkflow.getAttribute("Enabled"):"")
    setProperty(workflowActivity.Properties["Name"],"Description",(seqWorkflow.getAttribute("Description")!=null)?seqWorkflow.getAttribute("Description"):"")
    setProperty(workflowActivity.Properties["Name"],"Name",seqWorkflow.getAttribute("x:Name"))
    
    if (seqWorkflow!=null)
    {
        for(var aa=seqWorkflow.childNodes.length-1; aa >=0 ; aa--)
            addNode(seqWorkflow.childNodes[aa],workflow);
    }
    else
    {
        alert('Not a valid xoml file'+xmlDoc.xml);
    }
}

function openRules()
{
    var ruleDef = rulesDoc.selectSingleNode("//RuleDefinitions")
    if (ruleDef!=null)
    {
        rules = ruleDef.xml
        DisplayEncodedRules();
    }
}

function SerializeParameters(sActivity)
{
    var result = "";
    if (sActivity.Parameters == "undefined") return result;
    if (sActivity.Parameters.length == 0) return result;
    result+="<"+sActivity.Properties["Name"]+".ParameterBindings>";
    for (var propi = 0;propi<sActivity.Parameters.length;propi++)
    {
        var pName = sActivity.Parameters[propi];
        result+="<WorkflowParameterBinding ParameterName=\""+pName+"\">";
        if (typeof sActivity.ParameterValues[pName] != "undefined" && sActivity.ParameterValues[pName]!="")
        {
            var pVal = sActivity.ParameterValues[pName];
            if (pVal!=null)
            {
                result+="<WorkflowParameterBinding.Value>";
                var aBindIndex = pVal.indexOf("{ActivityBind ");
                if (aBindIndex>=0)
                {
                    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 res ="<ActivityBind Name=\""+pVal.substring(aBindIndex+14,aBindIndex+14+leng)+"\" Path=\""+path.substring(0,closeIndex)+"\" />";
                    result+= res;
                }
                else
                {
                    var nsIndex = namespaces.length;
                    namespaces[namespaces.length] = "xmlns:ns"+nsIndex+"=\"clr-namespace:System;Assembly=mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\"";
                    result+= "<ns"+nsIndex+":String>"+pVal+"</ns"+nsIndex+":String>";
                }    
                result+="</WorkflowParameterBinding.Value>";                
            }
        }
        result+="</WorkflowParameterBinding>";
    }
    result+="</"+sActivity.Properties["Name"]+".ParameterBindings>";
    return result;
}

function addParameter(node, parentElement)
{
/*
      		<SequentialWorkflowActivity.ParameterBindings>  
    		<WorkflowParameterBinding ParameterName="fdsfsdfd">
				<WorkflowParameterBinding.Value>
					<ns2:String xmlns:ns2="clr-namespace:System;Assembly=mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">fdsfsdfd</ns2:String>
				</WorkflowParameterBinding.Value>
			</WorkflowParameterBinding>
			<WorkflowParameterBinding ParameterName="parentContext">
				<WorkflowParameterBinding.Value>
					<ActivityBind Name="Workflow1" Path="Description" />
				</WorkflowParameterBinding.Value>
			</WorkflowParameterBinding>
			<WorkflowParameterBinding ParameterName="parentEventHandler" />
		    </SequentialWorkflowActivity.ParameterBindings>
*/
    var parentActivity = Quanticks.activityFactory().getActivity(parentElement);
    if (parentActivity.Parameters == "undefined")
    {
        parentActivity.Parameters = new Array();
        parentActivity.ParameterValues = new Array();
    }

    for(var pi=0;pi<node.childNodes.length;pi++)
    {
        var paramName = node.childNodes[pi].getAttribute("ParameterName");
        if (paramName!=null)
        {
            var pBindingValue = node.childNodes[pi].childNodes[0];
            parentActivity.Parameters[parentActivity.Parameters.length] = paramName;
            if (pBindingValue != null && pBindingValue.tagName=="WorkflowParameterBinding.Value")
            {
                 if (pBindingValue.childNodes[0]!=null && pBindingValue.childNodes[0].tagName=="ActivityBind")                    
                    parentActivity.ParameterValues[paramName] = "{ActivityBind "+pBindingValue.childNodes[0].getAttribute("Name")+",Path="+pBindingValue.childNodes[0].getAttribute("Path")+"}";
                 else
                    parentActivity.ParameterValues[paramName] = pBindingValue.childNodes[0].text;
            }
        }
    }        
}

function addNode(node, parentElement)
{
    if (!node.tagName) return;
	var parameterIndex = node.tagName.indexOf(".ParameterBindings");
	if (parameterIndex>0)
	{
	    addParameter(node, parentElement);
	    return;	    
	}
    var nameAtt = node.getAttribute("x:Name")
    var firstConnector = null
    for(cc=0;cc<parentElement.children.length;cc++)
    {
        if (parentElement.children[cc].className=="connector")
            {
                firstConnector = parentElement.children[cc]
                break
            }
    }
    var activityName = node.tagName;
    if (activityName.indexOf(":")>=0)
        activityName=activityName.substring(activityName.indexOf(":")+1);
    var newActivity = addActivityByName(parentElement, activityName, firstConnector, nameAtt)    
    var sElement = selectedElement

        if (typeof newActivity.Deserialize !="undefined")
        {
            newActivity.Deserialize(node,sElement);
        }
        else
        {
            var attList = node.attributes;

            for(var att=0;att<attList.length;att++)
            {
                if (attList[att].nodeName!="x:Name")
                {
                    newActivity.Properties[attList[att].nodeName] = attList[att].nodeValue;
                }
            }
            if (node.hasChildNodes()) 
            {
                for(var aa=node.childNodes.length-1; aa>=0; aa--)
                {
                    addNode(node.childNodes[aa],sElement);
                }
            }
            newActivity.Initialize();       
        }
        Quanticks.activityFactory()._Select(newActivity.element);                       
    
}

function Serialize()
{
    return workflowActivity.Serialize();
}

function UpdateSourceCode()
{
    sourcecodediv.innerHTML = ""
    var s = Serialize()
    DisplayEncodedHtml(s)
}

var rules = "";
var errors = "";

function DisplayEncodedRules() 
{
     var encodedHtml = rules;
     encodedHtml = encodedHtml.replace(new RegExp(/</g),"&lt;");
     encodedHtml = encodedHtml.replace(new RegExp(/>/g),"&gt;");
     encodedHtml = encodedHtml.replace(new RegExp(/\n/g),"<br>");     
     
     rulesdiv.innerHTML = encodedHtml;
}

function DisplayErrors()
{
    var errorReader = errors;
    errorList.innerHTML = "";
    var errorHTML = "<TABLE>";
    var startError = errorReader.indexOf("<ERROR>");
    var endError = errorReader.indexOf("</ERROR>");
    var errorNr =0;
    while(startError >=0)
    {
        errorNr++;
        errorHTML += "<TR><TD>"+errorReader.substring(startError+7,endError)+"</TD></TR>";
        errorReader = errorReader.substring(endError+8);
        startError = errorReader.indexOf("<ERROR>");
        endError = errorReader.indexOf("</ERROR>");
    }    
    errorHTML +="</TABLE>";
    
    var warningReader = errors;
    var warningHTML = "<TABLE>";
    var startWarning = warningReader.indexOf("<WARNING>");
    var endWarning = warningReader.indexOf("</WARNING>");
    var warningNr =0;
    while(startWarning >=0)
    {
        warningNr++;
        warningHTML += "<TR><TD>"+warningReader.substring(startWarning+9,endWarning)+"</TD></TR>";
        warningReader = warningReader.substring(endWarning+10);
        startWarning = warningReader.indexOf("<WARNING>");
        endWarning = warningReader.indexOf("</WARNING>");
    }    
    warningHTML +="</TABLE>";
    
    errorList.innerHTML = errorHTML;
    warningList.innerHTML = warningHTML;
    document.getElementById("errorNumber").innerHTML = errorNr;
    document.getElementById("warningNumber").innerHTML = warningNr;
    if (errorNr>0)
        statusBar.innerHTML = "Build failed";
    else
        statusBar.innerHTML = "Build succeeded";
}


function RemoveLineBreaks(inputString) 
{
     var result = inputString;
     inputString = inputString.replace(new RegExp(/\n/g),"");     
     return inputString;
}

function DisplayEncodedHtml(xomlValue) 
{
     var encodedHtml = xomlValue
     encodedHtml = encodedHtml.replace(new RegExp(/</g),"&lt;");
     encodedHtml = encodedHtml.replace(new RegExp(/>/g),"&gt;");
     encodedHtml = encodedHtml.replace(new RegExp(/\n/g),"<br>");     
     //encodedHtml = encodedHtml.replace(/\//g,"%2F");
     //encodedHtml = encodedHtml.replace(/\?/g,"%3F");
     //encodedHtml = encodedHtml.replace(/=/g,"%3D");
     //encodedHtml = encodedHtml.replace(/&/g,"%26");
     //encodedHtml = encodedHtml.replace(/@/g,"%40");
     
     sourcecodediv.innerHTML = encodedHtml;
}

var http_request = false;  
   
function makePOSTRequest(url, parameters, callback) {
      http_request = false;
      if (window.XMLHttpRequest) { // Mozilla, Safari,...
         http_request = new XMLHttpRequest();
         if (http_request.overrideMimeType) {
         	// set type accordingly to anticipated content type
            //http_request.overrideMimeType('text/xml');
            http_request.overrideMimeType('text/html');
         }
      } else if (window.ActiveXObject) { // IE
         try {
            http_request = new ActiveXObject("Msxml2.XMLHTTP");
         } catch (e) {
            try {
               http_request = new ActiveXObject("Microsoft.XMLHTTP");
            } catch (e) {}
         }
      }
      if (!http_request) {
         alert('Cannot create XMLHTTP instance');
         return false;
      }
      
      http_request.onreadystatechange = callback;
      http_request.open('POST', url, true);
      http_request.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
      http_request.setRequestHeader("Content-length", parameters.length);
      http_request.setRequestHeader("Connection", "close");
      http_request.send(parameters);
   }

   function alertCompileResults() {
      if (http_request.readyState == 4) {
         if (http_request.status == 200) {
            //alert(http_request.responseText);           
            result = http_request.responseText;
            if (result=="NoUser")
            {
                NoUser();
                return;
            }
            var errorsStart = result.indexOf("<ERRORS>")
            var errorsEnd = result.indexOf("</ERRORS>")
            var rulesStart = result.indexOf("<RULES>")
            var rulesEnd = result.indexOf("</RULES>")            
            rules = result.substring(rulesStart+7,rulesEnd);
            errors = result.substring(errorsStart+8,errorsEnd);           
            DisplayEncodedRules();
            DisplayErrors();                
            UI.HideProgressBar();
         } else {
            alert('There was a problem with the request. Status'+http_request.responseText);
            statusBar.innerHTML = "Ready";
            UI.HideProgressBar();
         }
      }
   }  
   
   function getRules(obj) {
      var poststr = "newwfname=" + encodeURI( document.getElementById("newwfname").value );
      makePOSTRequest('newwf.php', poststr);
   }

   function toggleScheduled()
   {
        if (document.getElementById("scheduled").checked)
        {
            document.getElementById("timehour").disabled = false;
            document.getElementById("timezone").disabled = false;
            document.getElementById("startdate").disabled = false;
            document.getElementById("recurrence").disabled = false;
        } 
        else
        {
            document.getElementById("recurrence").disabled = true;
            document.getElementById("timehour").disabled = true;
            document.getElementById("timezone").disabled = true;
            document.getElementById("startdate").disabled = true;
        }       
   }