//create the wolf namespace if not already created by another include
var evalText = "var wolf = {}";
try{if(wolf)evalText = "";}catch(e){}
eval(evalText);

if(!wolf.callbacks) wolf.callbacks = {};

//*******************
//utility functions
//*******************
wolf.attachEvent = function(element, eventName, ptrEventHandler)
{
    if(eventName.indexOf("on") == 0)
    {
        eventName = eventName.substring(2)
    }
    
    // DOM
    if (element.addEventListener) 
    {
        element.addEventListener(eventName, ptrEventHandler, false);
    }
    // IE
    else if (element.attachEvent) 
    {
        element.attachEvent("on" + eventName, ptrEventHandler);
    }        
}            

//initialise local collections
wolf.enableOnValid  = new Array();
wolf.controls       = new Array();
wolf.comboSortXSL   = null;

wolf.validateInput = function(evt)
{
    var element = (evt.srcElement?evt.srcElement:evt.target);
    
    
    if(element.tagName == "SELECT")
    {
        element = element.parentNode;
    }
    
    var charMask = element.getAttribute("charmask");
    
    element.setAttribute("valid", "true");
    element.className = element.className.replace("wf_invalidinput","");
    
    if(charMask != null && charMask.length > 0)
    {
        var regEx   = new RegExp(charMask);
        var sValue  = element.value.toString();
        
        var match   = regEx.exec(sValue);                    
        if(match == null)
        {
            element.setAttribute("valid", "false");
            element.className += " wf_invalidinput";
        }
    }
    
    wolf.checkFormValid(element.getAttribute("valid") == "true");
    
}

//*******************
//Form Functions
//*******************

    //  checkFormValid
//  The function checks whether all inputs are valid and 
//  enables all other controls that have been 
//  registered to be enabled on valid
wolf.checkFormValid = function(valid)
{
    if(valid)
    {
        for(var i=0; i< wolf.controls.length; i++)
        {
            //check valid
            if(wolf.controls[i].getAttribute("valid") == "false")
            {
                valid = false;
                break;
            }
            
            //check required
            
            var elementValue = wolf.controls[i].value.toString();
            if(wolf.controls[i].getAttribute("required") == "true" && elementValue.replace(/\s/g,"") == "")
            {
                valid = false;
                break;
            }
            
        }
    }    
    
    
    try
    {
        if(!wolf.formFieldsValidator())
        {
            valid = false;
        }
    } 
    catch(e)
    {
    
    }
    
    for(var i=0; i < wolf.enableOnValid.length; i++)
    {
        wolf.enableOnValid[i].disabled = !valid;
    }
}

//  Form valid registration function. 
//  All controls registered will be enabled or disabled based on form validity
wolf.registerOnValid =  function(element)
{
    wolf.enableOnValid[wolf.enableOnValid.length] = element;
}

wolf.setCookie = function(sName, sValue)
{
  document.cookie = sName + "=" + escape(sValue);
  // Expires the cookie in one month
  var date = new Date();
  date.setMonth(date.getMonth()+1);
  document.cookie += ("; expires=" + date.toUTCString()); 
}            


wolf.getCookie = function(c_name)
{
    if (document.cookie.length>0)
    {
        c_start = document.cookie.indexOf(c_name + "=");
        if (c_start!=-1)
        {
            c_start =   c_start + c_name.length+1;
            c_end   =   document.cookie.indexOf(";",c_start);
            if (c_end == -1) c_end = document.cookie.length;
            return unescape(document.cookie.substring(c_start,c_end));
        }
    }
    return "";
}

wolf.deleteCookie = function(c_name)
{
    if ( wolf.getCookie( c_name ) ) 
    {
        document.cookie = "wolf_" + c_name + "=x;expires=Thu, 01-Jan-1970 00:00:01 GMT;path=/;";
    }
}


wolf.checkError = function()
{
    if(typeof(wolf.errorDisplay) == "string")
    {
        wolf.errorDisplay = document.getElementById(wolf.errorDisplay)
    } 
 
    
    
    var errorText = wolf.getCookie("wolf_error");
    var successText = wolf.getCookie("wolf_success");
    
    if(errorText.length > 0)
    {
        if(wolf.errorDisplay == null)
        {
            alert(errorText);
        }
        else
        {
            wolf.errorDisplay.innerHTML = errorText;
            wolf.errorDisplay.className = "formerrors";
        }
    }
    else if(successText != "")
    {
        if(wolf.errorDisplay == null)
        {
            alert(successText)
        }
        else
        {
            wolf.errorDisplay.innerHTML = successText;
            wolf.errorDisplay.className = "formsuccess";
        }
    }
    
    wolf.deleteCookie("success");
    wolf.deleteCookie("error");
}

wolf.callbacks.fetchObjectData = function(wsfDocument)
{
    wolf.record = wsfDocument.record;
    
    for(var i = 0; i< wolf.controls.length; i++)
    {
        var element = wolf.controls[i];
        var key     = element.getAttribute("inputid");
        
        if(key.indexOf("."))
        {
            key = key.substring(key.indexOf(".") + 1)
        }
        
        var value = eval("wsfDocument.record." + key);
        
        if(value)
        {
            //replace email
            value = customReplace("<a *\\b[^>]*>(.*?)</a>", value, "#replace#", 0, 1);
            value = unescape(value.replace(/<!\[CDATA\[/g, "").replace(/\]\]>/g, "").replace(/<br\/>/g,"%0D%0A"))
            element.setValue(value)
            
        }
        
    }
}

wolf.fetchObjectData = function(objectName)
{
    
    
   addScript("service=getobjectrecord&callback=wolf.callbacks.fetchObjectData&objectHeader.UniqueID=" + wolf.objectUniqueID + "&objectHeader.objectName=" + objectName ); 
}

function customReplace(regexString, value, replaceWith, matchIndex, replaceIndex)
{
    var regex = new RegExp(regexString);
    var matches = regex.exec(value);
    if(matchIndex == null) matchIndex = 0;
    if(replaceIndex == null) replaceIndex = 0;
    var newValue = "";
    
    while (matches != null)
    {
        var matchedValue = matches[matchIndex].toString()
        var replaceValue = matches[replaceIndex].toString()
        
        newValue += value.substr(0,matches.index) + replaceWith.replace(/#replace#/g, replaceValue);
        
        value = value.substr(matches.index + matchedValue.length)
        matches = regex.exec(value);
    }
    
    if(value.length >0)
    {
        newValue += value
    }
    
    return newValue;
}

wolf.preSubmitCheck = function()
{
    
    for(var i = 0; i < wolf.controls.length ; i++)
    {
         wolf.controls[i].disabled = false;
         
         if(wolf.controls[i].tagName == "TEXTAREA")
         {
            var value = wolf.controls[i].value
            
            var objXML = window.XMLLib.objXMLDocTemplate.cloneNode(true);
            value = value.replace(/&/g , "%26")
            
            objXML.loadXML("<record>" + value + "</record>");
            
            if(value != "" && objXML.xml == "")
            {
                alert("Some tags may not have been closed.");
                return false;
            }
            
            value = unescape(escape(value).replace(/%0D%0A/g,'<br/>'));
            value = unescape(escape(value).replace(/%0A/g,' '));
            
            value = customReplace("[a-zA-Z][\\w\\.-]*[a-zA-Z0-9]@[a-zA-Z0-9][\\w\\.-]*[a-zA-Z0-9]\\.[a-zA-Z][a-zA-Z\\.]*[a-zA-Z]", value, "<a href='mailto:#replace#'>#replace#</a>")
            value = customReplace("[^\"']http(s)?://?([\\w-]+\\.)+[\\w-]+(/[\\w- ;,./?%&=]*)?", value, "<a href='#replace#'>#replace#</a>")
            
            wolf.controls[i].value = value
         }
    }
    return true
}

//rendering functions
wolf.currentForm;

wolf.drawForm = function(appId, key, ruleName, redirectURL, objectName)
{
    using("XMLLib", window);
    
    wolf.checkError()
    
    addScript("service=getfile&xmlfilename=/widgets/runtime/xsl/combosort.xsl&callback=comboSortLoaded&mode=xml");
    
    var formElement     = document.createElement("form");

    if(wolf.objectUniqueID != null)
    {
        formElement.appendChild(addHiddenInput("objectHeader.UniqueID"    , wolf.objectUniqueID));
        wolf.fetchObjectData(objectName);
    }

    if(!wolf.formIndex)
    {
        wolf.formIndex = 0;
    }
    formElement.name    = "wf_form" + wolf.formIndex++;
    formElement.className = "wf_form"
    formElement.setAttribute("method", "post");
    
    formElement.setAttribute("action", wolf.hostURL + "/webservices/wf.handlers/formpost.ashx");
    formElement.encoding    = "multipart/form-data";
    
    formElement.appendChild(addHiddenInput("appid"      , appId));
    formElement.appendChild(addHiddenInput("key"        , key));
    formElement.appendChild(addHiddenInput("rulename"   , "commit"));
    formElement.appendChild(addHiddenInput("redirect"   , redirectURL));
    formElement.appendChild(addHiddenInput("service"    , "commit"));
    formElement.appendChild(addHiddenInput("objectHeader.objectName"    , objectName));
    formElement.onsubmit = wolf.preSubmitCheck;
    
    if(wolf.queryString != null)
    {
        var reservedwords = ",appid,publickey,formredirecturl,uid,successmsg,"
        for(var k in wolf.queryString)
        {
        
            if(reservedwords.indexOf("," + k + ",") == -1)
            {
                formElement.appendChild(addHiddenInput("param" + k.toString()    , wolf.queryString[k.toString()]));
            }
            
        }
        
        if(wolf.queryString.successmsg)
        {
            formElement.appendChild(addHiddenInput("wolf_success_message" , wolf.queryString.successmsg));
        }
    }
    
    
    
    if(wolf.useExistingSession == true)
    {
        formElement.appendChild(addHiddenInput("wfs" , 1));
    }
    
    wolf.currentForm    = formElement;
    wolf.currentForm.currentGroup = formElement;
    document.getElementById(wolf.formContainerId).appendChild(formElement);
    
}

wolf.drawGroup = function(groupTitle)
{
    var element     = document.createElement("div");
    var legend      = document.createElement("span");
    legend.className = "legend"
    legend.innerHTML = groupTitle;
    element.appendChild(legend);
    wolf.currentForm.appendChild(element);
    wolf.currentForm.currentGroup = element;
}

function addHiddenInput(name, value)
{
    var element     = document.createElement("input");
    element.type    = "hidden";
    element.name    = name;
    element.setAttribute("id", name);
    element.value   = value;
    return element;
}

  
wolf.formReset = function()
{
    wolf.currentForm.reset();
}  

wolf.drawTask = function(name, type)
{
    var element;
    switch(type)
    {
        case "submit":
            element = document.createElement("input");
            element.className   =   "wf_submitbutton";
            element.type    = "submit";
            element.value   = "Submit";
            element.disabled = true;
            wolf.registerOnValid(element)
            break;
        case "reset":
            element = document.createElement("input");
            element.className   =   "wf_resetbutton"
            element.type    = "button";
            element.value   = "Reset";
            wolf.attachEvent(element, "onclick", wolf.formReset)
            break;     
        case "task":
            element = document.createElement("button");
            element.className   =   "wf_taskbutton"
            element.setAttribute("type", "button");
            element.innerHTML   = name;
            wolf.attachEvent(element, "onclick", wolf.taskHandler)
            break;  
        case "cancel":
            element = document.createElement("input");
            element.className   =   "wf_cancelbutton"
            element.type    = "button";
            element.value   = "Cancel";
            wolf.attachEvent(element, "onclick", wolf.cancelHandler)
            break;                                               
    }
    if(element)
    {
        wolf.currentForm.appendChild(element);
    }
    return element;
}  
  

  
wolf.drawInput = function(name, id, type, charMask, required, readonly)
{

    var elementContainer        = document.createElement("div");
    elementContainer.id         = id + "_container";
    elementContainer.className  = "wf_inputContainer";
    
    var element;
    if(type != "label")
    {
        drawLabel(name, elementContainer, required);
    }
    
    switch(type)
    {
        case "text":
        case "password":
            element = drawTextInputs(id, elementContainer, charMask, required, readonly);
            break;
        case "longtext":
            element = drawLongTextInput(id, elementContainer, charMask, required, readonly);
            break;
        case "attachment":
            element = drawAttachment(id, elementContainer, charMask, required);
            break;
        case "select":
            element = drawSelectInput(id, elementContainer, charMask, required, arguments);
            break;
        case "date":
            element = drawDateInput(id, elementContainer, charMask, required, readonly);
            break;
        case "time":
            element = drawTimeInput(id, elementContainer, charMask, required, readonly);
            break;
        case "boolean":
            element = drawCheckBox(id, elementContainer, readonly);
            break;
        case "label":
            element = drawDisplayLabel(id, elementContainer, arguments);
            break;
    }
    
    element.setAttribute("inputid" , id);
    wolf.controls[wolf.controls.length] = element;
    wolf.currentForm.currentGroup.appendChild(elementContainer);

    function drawLabel(name, elementContainer, required)
    {
        var element = document.createElement("span");
        var className = "wf_inputlabel";
        if(required == "true")
        {
            className += " " + "wf_labelrequired";
        }
        element.className = className;
        element.innerHTML = name;
        elementContainer.appendChild(element);
    }

    function drawAttachment(id, elementContainer, charMask, required)
    {
        var input         = document.createElement("input");
        input.id          = id;
        input.name        = id;
        input.type        = "file";
        input.className   = "wf_input";
        input.setAttribute("required",    required);
        wolf.attachEvent(input, "onchange", wolf.validateInput)
        elementContainer.appendChild(input);
        return input
    }  


    function drawLongTextInput(id, elementContainer, charMask, required)
    {
        var element         = document.createElement("textarea");
        element.id          = id;
        element.name        = id;
        element.className   = "wf_input wf_file";
        element.setAttribute("datafieldid",    id);
        element.setAttribute("required",    required);
        element.setAttribute("charmask",    charMask);
        element.setValue    = _setValue;
        var previousValue = wolf.getCookie(id);
        if(previousValue.length > 0)
        {
            element.value = previousValue;
        }
        wolf.deleteCookie(id)
        wolf.attachEvent(element, "onchange", wolf.validateInput)
        wolf.attachEvent(element, "onkeyup", wolf.validateInput)
        elementContainer.appendChild(element);
        return element
    }

    function drawDisplayLabel(id, elementContainer, args)
    {
        var element         = document.createElement("div");
        element.id          = id;
        element.className   = "wf_label";
        element.type        = "label";
        element.value       = "";
        element.innerHTML   = args[3].replace(/&lt;/g, "<").replace(/&gt;/, ">");
        elementContainer.appendChild(element);
        return element;
    }

    function drawCheckBox(id, elementContainer)
    {
        var element         = document.createElement("input");
        element.id          = id;
        element.name        = id;
        element.setValue    = _setValue;
        element.className   = "wf_inputcheck";
        element.type        = "checkbox";
        var previousValue = wolf.getCookie(id);
        if(previousValue.length > 0)
        {
            element.value = previousValue;
        }
        wolf.deleteCookie(id)
        wolf.attachEvent(element, "onchange", wolf.validateInput);
        
        elementContainer.appendChild(element);
        return element;
    }

    function _setValue(value)
    {
        this.value = value;
    }

    function drawTextInputs(id, elementContainer, charMask, required, readonly)
    {
        //will work for numbers, emails, urls, decimals
        var element         = document.createElement("input");
        element.id          = id;
        element.name        = id;
        element.className   = "wf_input wf_readonly_" + readonly;
        element.type        = type;
        element.setValue    = _setValue;
        element.setAttribute("datafieldid",    id);
        element.setAttribute("required",    required);
        element.setAttribute("charmask",    charMask);
        if(readonly == "true")
        {
            element.disabled = true;
        }
        var previousValue = wolf.getCookie(id);
        if(previousValue.length > 0)
        {
            element.value = previousValue;
        }
        wolf.deleteCookie(id)
        wolf.attachEvent(element, "onchange", wolf.validateInput)
        wolf.attachEvent(element, "onkeyup", wolf.validateInput)
        elementContainer.appendChild(element);
        return element
    }
    
    function drawTimeInput(id, elementContainer, charMask, required, readonly)
    {
        //will work for numbers, emails, urls, decimals
        var element         = document.createElement("input");
        element.id          = id;
        element.name        = id;
        element.className   = "wf_input wf_readonly_" + readonly;
        element.type        = type;
        element.setValue    = _setValue;
        element.setAttribute("datafieldid",    id);
        element.setAttribute("required",    required);
        element.setAttribute("charmask",    charMask);
        if(readonly == "true")
        {
            element.disabled = true;
        }
        var previousValue = wolf.getCookie(id);
        if(previousValue.length > 0)
        {
            element.value = previousValue;
        }
        wolf.deleteCookie(id)
        wolf.attachEvent(element, "onchange", wolf.validateInput)
        wolf.attachEvent(element, "onkeyup", wolf.validateInput)
        elementContainer.appendChild(element);
        return element
    }
    
    function drawSelectInput(id, elementContainer, source, required, callerArguments)
    {
        var multi = callerArguments[5];
        
        var element         = document.createElement("div");
        element.className   = "wf_selectContainer";
        element.setAttribute("datafieldid",    id);
        
        element.setAttribute("multi", multi)
        element.id          = "container_" + id;
        
        elementContainer.appendChild(element);
        
        window.helperLib.hostPrefix = wolf.hostURL;
        
        
        if(source.indexOf("/") != 0 && source.indexOf("businessrule.")!= 0)
        {
            source = "$application/tcombos/" + source;
        }
        
        if(source.indexOf("businessrule.") == 0)
        {
            addScript("service=processbusinessrule&rulename=" + source.substr(source.indexOf(".") + 1) + "&callback=selectLoaded&mode=xml&callbackparam=" + id);
        }
        else
        {
            addScript("service=getfile&xmlfilename=" + source + ".xml&callback=selectLoaded&mode=xml&callbackparam=" + id);
            
            
            
        }
        

        //window.cacheUtil.loadXMLFromCache("notrelevent", selectLoaded, id, window.helperLib.wsfMapPath(source, wolf.appId) + ".xml")
        
        wolf.currentForm.currentGroup.appendChild(addHiddenInput(id + "_displayvalue" , ""));
        wolf.currentForm.currentGroup.appendChild(addHiddenInput(id, ""));
        element.value           =   {};
        element.value.toString  = function(){return getDropDownValue(element)};
        element.setValue        = function(value){return setDropDownValue(element, value)};
        element.setAttribute("required",    required);
        
        return element
    }
    
    function drawDateInput(id, elementContainer, charMask, required)
    {
        var element         = document.createElement("div");
        element.className   = "wf_dateContainer";
        element.setAttribute("datafieldid",    id);
        
        elementContainer.appendChild(element);

        var dayCombo    = "<select onchange='wolf.validateInput(event)' id='d_" + id + "'><option value=''>Day</option>";
        for(var i = 1; i < 32; i++)
        {
            dayCombo += "<option value='" + i + "'>" + i + "</option>"
        }
        dayCombo += "</select>"

        var monthCombo    = "<select onchange='wolf.validateInput(event)' id='m_" + id + "'><option value=''>Month</option>";
        var arrMonthName = new Array("Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec")
        for(var i = 1; i < 13; i++)
        {
            monthCombo += "<option value='" + i + "'>" + arrMonthName[i-1] + "</option>"
        }
        monthCombo += "</select>"

        var yearCombo    = "<select onchange='wolf.validateInput(event)' id='y_" + id + "'><option value=''>Year</option>";
        var startYear    = (new Date()).getFullYear() - 75
        for(var i = startYear; i < startYear + 100; i++)
        {
            yearCombo += "<option value='" + i + "'>" + i + "</option>"
        }
        yearCombo += "</select>"
        
        
        element.innerHTML = dayCombo + monthCombo + yearCombo;
        
        element.value   =   {};
        element.value.toString = function(){return getDateValue(element)};
        wolf.currentForm.currentGroup.appendChild(addHiddenInput(id, ""));
        element.setAttribute("required",    required);
        element.setAttribute("charmask",    charMask);

        return element;
    }
    
}


function getDateValue(element)
{
    var selects = element.getElementsByTagName("SELECT");
    var sDate   = "";
    
    wolf.currentForm[element.getAttribute("datafieldid")].value = "";
    try
    {
        var d = new Date(selects[2].value, parseInt(selects[1].value - 1), selects[0].value)
        if(d.getDate() != parseInt(selects[0].value) || d.getMonth() != parseInt(selects[1].value - 1) || d.getFullYear() != parseInt(selects[2].value))
        {
            sDate = "x";
        }
        else
        {
            sDate = selects[2].value + "-" + selects[1].value + "-" + selects[0].value;
            wolf.currentForm[element.getAttribute("datafieldid")].value = sDate;
        }
    }
    catch(e)        
    {
        sDate = "";
    }
    
    return sDate;
}

function setDropDownValue(element, value)
{
   var ob = element.getElementsByTagName("SELECT")[0];
   
   if(ob == null)
   {
    setTimeout(function(){setDropDownValue(element, value)}, 500)
    return
   }
   ob.value = value 
}

function getDropDownValue(element)
{
    var arSelected =  new Array();
    var arSelectedDisplay = new Array();
    var ob = element.getElementsByTagName("SELECT")[0];
    var ddValue = "";
    var ddDisplayValue = "";
    
    if(ob.multiple == true)
    {
        for (var i = 0; i < ob.options.length; i++)
        {
            if (ob.options[i].selected)
            {
                arSelected.push(ob.options[ i ].value);
                arSelectedDisplay.push(ob.options[ i ].text);
            }
        }
        ddValue         = arSelected.toString();
        ddDisplayValue  = arSelectedDisplay.toString();
    } 
    else
    {
        ddValue         = ob.value;
        ddDisplayValue  = ob[ob.selectedIndex].text;
    }     
    
    if(ddValue == "")
    {
        ddDisplayValue = "";
    }
    
    wolf.currentForm[element.getAttribute("datafieldid")+ "_displayvalue"].value = ddDisplayValue;
    wolf.currentForm[element.getAttribute("datafieldid")].value = ddValue;
    
    
    return ddValue;
}

function comboSortLoaded(wsfDocument)
{
    wolf.comboSortXSL = window.XMLLib.loadXSL(wsfDocument, null,true);
}

function selectLoaded(selectXML, callbackparam)
{
    if(wolf.comboSortXSL == null)
    {
        setTimeout(function(){selectLoaded(selectXML, callbackparam)}, 100)
        return
    }
    
    var objUnknown = document.getElementById("container_" + callbackparam);
    
    selectXML     = window.XMLLib.transformXML(selectXML, wolf.comboSortXSL, "yes", objUnknown.getAttribute("multi"));
    
    objUnknown.innerHTML = selectXML.replace("id","i_id").replace("<select","<select onchange='wolf.validateInput(event)' id='wfsel_" + callbackparam + "' class='wf_input' ");
    
    var previousValue = wolf.getCookie(callbackparam);
    
    if(wolf.record)
    {
        previousValue = eval("wolf.record." + callbackparam);
    }
    
    
    var element = objUnknown.getElementsByTagName("SELECT")[0];
    
    if(previousValue.length > 0)
    {
        element.value = previousValue;
    }
    wolf.deleteCookie(callbackparam)
    
}

function addScript(queryString)
{
    var scriptSource  =   wolf.hostURL + "/webservices/wf.handlers/javascript.ashx?appid=" + wolf.appId + "&key=" + wolf.publicKey +  "&" + queryString
    
    if(wolf.queryString != null)
    {
        var reservedwords = ",appid,publickey,formredirecturl,uid,successmsg,"
        for(var k in wolf.queryString)
        {
            if(reservedwords.indexOf("," + k + ",") == -1)
            {
               scriptSource += "&param" + k.toString() + "=" + wolf.queryString[k.toString()];
            }
            
        }
    }

    var scriptTag   = document.createElement("script");
    scriptTag.type  = "text/javascript";
    
    scriptTag.src   = scriptSource;
    
    
    document.getElementsByTagName("HEAD")[0].appendChild(scriptTag);
}

