﻿
var framework_commands = null;
var framework_callback = null;
var framework_subid = null;
var framework_baseurl = '';
var framework_starturl = '';
var framework_watchdog = 0;
var newwindow = '';
var framework_dialog_base="#framework";


if ($.browser.mozilla)
{
    // emulate IE Model stuff
	HTMLElement.prototype.__defineGetter__("outerHTML", function() {
	    var span = document.createElement("span"); span.appendChild(this.cloneNode(true));
	    return span.innerHTML;
	});
	
	HTMLElement.prototype.__defineSetter__("outerHTML", function(html) {
	    var range = document.createRange();
	    this.innerHTML = html;
	    range.selectNodeContents(this);
	    var frag = range.extractContents();
	    this.parentNode.insertBefore(frag, this);
	    this.parentNode.removeChild(this);
	});
}

function _doCallBackGenerate(eventname, synchrone, newWin, callback)
{
    parms = "event=WF_" + eventname + "&_subid_=" + framework_subid;
    for (count=4; count<_doCallBackGenerate.arguments.length; count++)
    {
        var parm = _doCallBackGenerate.arguments[count];
        if (parm != undefined)
        {
            if (parm.constructor == Array )
            {
                for (cnt = 0; cnt < parm.length; cnt++)
                    parms += "&" + jQuery.param(parm[cnt]);
            }
            else if ( parm.constructor == Object)
                parms += "&" + jQuery.param(parm);
            else
//                parms += "&arg" + "" +(count-4) + "=" + $.URLEncode(_doCallBack.arguments[count]);
                parms += "&arg" + "" +(count-4) + "=" + _doCallBackGenerate.arguments[count].replace(/\&/gi, "%26"); // alleen &-teken encoden
        }
    }
    return framework_callback + "?" + parms;
}

function _doCallBack(eventname, synchrone, newWin, callback)
{
    // build url
        
    parms = "event=WF_" + eventname + "&_subid_=" + framework_subid;
    for (count=4; count<_doCallBack.arguments.length; count++)
    {
        var parm = _doCallBack.arguments[count];
        if (parm != undefined)
        {
            if (parm.constructor == Array )
            {
                for (cnt = 0; cnt < parm.length; cnt++)
                    parms += "&" + jQuery.param(parm[cnt]);
            }
            else if ( parm.constructor == Object)
                parms += "&" + jQuery.param(parm);
            else
//                parms += "&arg" + "" +(count-4) + "=" + $.URLEncode(_doCallBack.arguments[count]);
                parms += "&arg" + "" +(count-4) + "=" + _doCallBack.arguments[count].replace(/\&/gi, "%26"); // alleen &-teken encoden
        }
    }
    
    var xmlhttp=false;
    /*@cc_on @*/
    /*@if (@_jscript_version >= 5)
    // JScript gives us Conditional compilation, we can cope with old IE versions. 
    // and security blocked creation of the objects.
    try {
    xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
    } catch (e) {
    try {
    xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
    } catch (E) { 
    xmlhttp = false;
    }
    }
    @end @*/
    if (newWin)
    {
        try {
            // JK: this code is inserted to get round the popup blockers
            // not yet tested!
            // source: http://blog.xebia.com/2009/01/04/getting-through-popup-blockers-with-windowopen-in-flex/
            if (!newwindow.closed && newwindow.location) {
                newwindow.close();
                newwindow=window.open(framework_callback + "?" + parms,'awi'+Math.random(),'location=0, resizable=1');
            }
            else {
                newwindow=window.open(framework_callback + "?" + parms,'awi','location=0, resizable=1');
                if (!newwindow.opener) newwindow.opener = self;
            }
            return false;
//            window.open (framework_callback + "?" + parms, 'awi', 'location=0, resizable=1')
        } 
        catch (e) {}
        return;
    }
    if (!xmlhttp && typeof XMLHttpRequest!='undefined') 
    {
        xmlhttp = new XMLHttpRequest();
    }
    if (xmlhttp)
    {
        if (!synchrone)
        {
            xmlhttp.open("POST", framework_callback , true);
            xmlhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");      

            xmlhttp.onreadystatechange=
            function() 
            {
                if (xmlhttp.readyState!=4) 
                {
                    return;
                }
                if (!callback)
                    handleRunCode( xmlhttp.responseText);
                else
                    callback( xmlhttp.responseText);
                 
            }
            try
            {
                xmlhttp.send(parms + "&xmlhttp=1")
            }
            catch (e) {}
            return xmlhttp;
        }
        try
        {
            $.blockUI({ message : '', css: {}, fadeIn: 0, fadeOut:0, overlayCSS : { opacity: 0, cursor: 'wait'}});

            ShowWait(true);
            oldcursor = document.body.style.cursor ;
            document.body.style.cursor = "wait";
            xmlhttp.open("POST", framework_callback , true);
            xmlhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");      
            
            xmlhttp.onreadystatechange=
            function() 
            {
                if (xmlhttp.readyState!=4) 
                    return;
                if (!callback)
                    handleRunCode( xmlhttp.responseText);
                else
                    callback( xmlhttp.responseText);
                //$("#framework_wait").hide();
                ShowWait(false);
                document.body.style.cursor = "default";
                $.unblockUI();
            }
            
            xmlhttp.send(parms + "&xmlhttp=1")
            
        }
        catch (e) {}

        return xmlhttp; // return object to allow abort.

    }

}

$.extend({URLEncode:function(c){var o='';var x=0;c=c.toString();var r=/(^[a-zA-Z0-9_.]*)/;
  while(x<c.length){var m=r.exec(c.substr(x));
    if(m!=null && m.length>1 && m[1]!=''){o+=m[1];x+=m[1].length;
    }else{if(c[x]==' ')o+='+';else{var d=c.charCodeAt(x);var h=d.toString(16);
    o+='%'+(h.length<2?'0':'')+h.toUpperCase();}x++;}}return o;},
URLDecode:function(s){var o=s;var binVal,t;var r=/(%[^%]{2})/;
  while((m=r.exec(o))!=null && m.length>1 && m[1]!=''){b=parseInt(m[1].substr(1),16);
  t=String.fromCharCode(b);o=o.replace(m[1],t);}return o;}
});

function fw_watchdog()
{
    _doCallBack("watchdog", false, false);    
}


function runCommands()
{
   try
    {

        var commandlines = framework_commands;
        
        for (var i = 0; i < commandlines.length; i++) 
        { 
            if (commandlines[i] != null && commandlines[i] != "" && commandlines[i] != ";")
            {
                var line =  commandlines[i];
                
                var commands;
                if (line.indexOf("|!~|") > -1)
                    commands = line.split("|!~|");
                else
                    commands = line.split("|");

                var command = commands[0];

                try
                {
                    switch(command.toUpperCase())
                    {
                    case "ERROR.FIND.CANVAS":
                    case "ERROR.SESSION.TIMEOUT":
                        handleRunCode("confirmUnloadEnabled = false;if (framework_watchdog > 0) {clearInterval(framework_watchdog);framework_watchdog=0;}|~~|MESSAGE|Uw sessie is verlopen, de pagina wordt herladen.|Sessie verlopen|Ok|~~|history.go(0);");
//                        framework_commands[i] = null;
//                        i = framework_commands.length +1;
//                        return;

                        break;
                    case "SETVALUE":
                        if (commands.length == 3)
                            setValue(commands[1], commands[2]);
                        if (commands.length == 4)
                            setValue(commands[1], commands[2], commands[3]);
                        break;
                    case "SETINNERHTML":
                        setInnerHtml(commands[1],commands[2]);
                        break;
                    case "ADDINNERHTML":
                        addInnerHtml(commands[1],commands[2]);
                        break;
                    case "SETOUTERHTML":
                        setOuterHtml(commands[1],commands[2]);
                        break;
                    case "HIDE":
                        if (commands.length == 3)
                        {
                            framework_commands[i] = null;
                            if (hideelement(commands[1],commands[2], runCommands))
                            {
                                return;
                            }
                        }
                        else
                            hideelement(commands[1]);
                        break;
                    case "SHOW":
                        if (commands.length == 3)
                        {
                            framework_commands[i] = null;
                            if (showelement(commands[1],commands[2], runCommands))
                            {
                                return;
                            }
                        }
                        else
                            showelement(commands[1]);
                        break;
                    case "MESSAGE":
                        if (commands.length == 2)
                            message(commands[1]);
                        else if (commands.length == 3)
                            message(commands[1], commands[2]);
                        else if (commands.length == 4)
                            message(commands[1], commands[2], commands[3]);
                        framework_commands[i] = null;
                        i = framework_commands.length +1;
                        return;
                        break;
                    case "AUTOCOMPLETE":
                        autocomplete(commands[1], commands[2]);
                        break;
                    case "JQGRIDADDDATA":
                        jqGrid_AddData(commands[1], commands[2]);
                        break;
                    case "FLEXBOXCALLBACK":
                        flexboxOptions(commands[1], commands[2]);
                        break;
                    case "TABLOADHTML":
                        $(commands[1] + " ul").eq(0).tabs("loadhtml",commands[2], commands[3]);
                        break;
                    case "TABADD":
                        //$(commands[1] + " ul").eq(0).tabs();
                        if (commands.length != 6)
                            break;
                        $(commands[1] + " ul").eq(0).tabs("addpage",commands[2], commands[3], commands[4], commands[5]);
                        //tabAdd(commands[1], commands[2], commands[3]);
                        break;
                    default: 
                        eval (line);
                        break;
                    }
                }
                catch (e)
                {
                    alert(line+ '\r\n' + e.message);
                }
                if (framework_commands != null)
                    framework_commands[i] = null;
            }
        }    
        framework_commands = null
    }
    catch (e) {}

}
function handleRunCode(runcode)
{
   try
    {
        if (!runcode || runcode.length == 0)
            return;
            
        if (framework_commands == null || framework_commands.length == 0)
        {
            framework_commands = runcode.split("|~~|");
            runCommands();
        }   
        else
        {
            var commandlines = runcode.split("|~~|");
            for (var i = 0; i < commandlines.length; i++) 
            {
                if (commandlines[i] != "")
                    framework_commands[framework_commands.length] = commandlines[i];
            }
        }

    }
    catch (e) {}
}

function ShowWait( bShow )
{
    if ($(framework_dialog_base + " #framework_wait").length == 0)
    {
        addInnerHtml( framework_dialog_base, "<div id=\"framework_wait\"/>");
        $("#framework_wait").hide();        
    }
    if ( bShow )
        $("#framework_wait").show().center();
    else
        $("#framework_wait").hide();
}

function insertAtCursor(element, value) {
  //IE support
  if (document.selection) {
    element.focus();
    sel = document.selection.createRange();
    sel.text = value;
  }
  //MOZILLA/NETSCAPE support
  else if (element.selectionStart || element.selectionStart == '0') {
    var startPos = element.selectionStart;
    var endPos = element.selectionEnd;
    element.value = element.value.substring(0, startPos)
                  + value
                  + element.value.substring(endPos, element.value.length);
  } else {
    element.value += value;
  }
}

function setTextLimit( obj )
{
    var nMaxLength = obj.getAttribute("maxlength");
    if( obj.value.length > nMaxLength )
    {
       obj.value = obj.value.substring(0,nMaxLength);
    }              
}


function getSelText(elem)
{
    var txt = '';
    
    if (window.getSelection)
    {
        txt = elem.value.substring(elem.selectionStart, elem.selectionEnd);
    }
    else if (document.getSelection)
    {
        txt = document.getSelection();
    }
    else if (document.selection)
    {
        txt = document.selection.createRange().text;
    }
    return txt;
}


function keyPressKeyCode(evt) {
    var keycode;
 
    if (evt)
        ;
    else if (window.event)
        evt = window.event;
    else if (event)
        evt = event;
    else
        return 0;
 
    if (evt.charCode)
        keycode = evt.charCode;
    else if (evt.keyCode)
        keycode = evt.keyCode;
    else if (evt.which)
        keycode = evt.which;
    else
        keycode = 0;
    return keycode;
}

var confirmUnloadEnabled = false;
var confirmUnloadMessage = '';

function setConfirmUnload(enable, message)
{
    confirmUnloadEnabled = enable;
    confirmUnloadMessage = message;
}

function confirmUnload()
{
    if (confirmUnloadEnabled)
        return confirmUnloadMessage;
}

function keyPressEnterAsTab(evt)
{
    if (evt)
        ;
    else if (window.event)
        evt = window.event;
    else if (event)
        evt = event;
    else
        return true;
     var l, i, f, j, o;
     if (evt.srcElement)
        o = evt.srcElement;
     else
        o = evt.target;
     
     if (!o || !o.form)
     {
        evt.returnValue = false;
        return;
     }

     try
     {
         var keycode = keyPressKeyCode(evt);
         if(keycode == 13 && (!/textarea/i.test(o.type)))
         {
            canvas = document.getElementById("framework_canvas");
            var f;
            if (canvas.all)
                f=canvas.all;
            else
                f=canvas.getElementsByTagName('*');
            for(i = l = f.length; i >0 && f[--i] != o;);
            for(j = i; (j = (j + 1) % l) != i ;)
            { 
             
             if (!f[j].type || f[j].disabled || f[j].readOnly || f[j].type.toLowerCase() == "hidden" || f[j].style.display=="none" || f[j].style.visibility == "hidden")
                continue;
             var element = f[j];    
             var ok = true;
             while (element.parentElement && element.parentElement.style)
             {
                element= element.parentElement;

                if (element.style.display=="none" || element.style.visibility == "hidden")
                {
                   ok = false;
                   break;
                }
                    
             }
             if (ok)
                 break;         
            }
            evt.returnValue = false;
            if (evt.preventDefault)
                evt.preventDefault();
            if ( j != i )
               f[j].focus();
         }
      }
      catch (e) {}
      
}

function keyPressDecimal(evt) {
    var keycode = keyPressKeyCode(evt);
    return (keycode == 13 || keycode == 45 || 
            keycode == 46 || keycode == 8 || keycode == 9 ||
            ( keycode >= 48 && keycode <= 57));
}

function keyPressInt(evt) {
    var keycode = keyPressKeyCode(evt);
    return (keycode == 13 || keycode == 45 || 
            keycode == 8 || keycode == 9 ||
            (keycode >= 48 && keycode <= 57));
}

function keyPressDate(oElem, evt) {
    var keycode = keyPressKeyCode(evt);
    var keyChar = String.fromCharCode(keycode)
    if (keycode == 13 || keycode == 46 || keycode == 8 || keycode == 9)
        return true;
    if (keycode == 45)
    {
        var re =/(^[0-9][0-9]?)$|(^[0-9][0-9]?\-[0-9][0-9]?)$/;
        return re.test(oElem.value);
            
    }
    if (keycode < 48 || keycode > 57)
        return false;
    var selText = getSelText(oElem);
    if (selText != "")
    {
        oElem.value = oElem.value.replace(selText, "");
        if (document.selection)
            document.selection.clear();
    }
    var oldvalue = oElem.value;
    insertAtCursor(oElem, keyChar);
    var txtAssumedDate = oElem.value;
    
    var re1=/(^[0-2]\d{1}|^3[0-1]|^[1-9]\-)|(^[0-9])$/g;
    if (!re1.test(txtAssumedDate)&& !re1.test(txtAssumedDate)) 
    {
        oElem.value = oldvalue;
        return false;
    }
        
    var re2 = /(^[0-9][0-9]?)\-(1[3-9])$/g;        
    if (re2.test(txtAssumedDate)&& re2.test(txtAssumedDate)) 
    {
        oElem.value = oldvalue + '-' + keyChar ;
        return false;
    }
    
    var re3 = /(^[0-9][0-9]?)$|(^[0-9][0-9]?)\-(0|0[1-9]|1[0-2])\-|(^[0-9][0-9]?)\-([0-9][0-9]?)[\-]?$|(^[0-9][0-9]?)\-([1-9]\-)/g;
    if (!re3.test(txtAssumedDate)&& !re3.test(txtAssumedDate)) 
    {
       oElem.value = oldvalue;
        return false;
    }
    var re4 =/(^[4-9])$|(^[0-9][0-9])$|(^[0-9][0-9]?\-[0-9][0-9])$|(^[0-9][0-9]?\-[2-9])$/;
    if (re4.test(txtAssumedDate) && re4.test(txtAssumedDate)) 
    {
        oElem.value = oldvalue + keyChar + '-';
        return false;
    }
    
    return false;
}

function message(text, title, buttonText)
{
    var width = "60%";
	if (text.length < 300)
	    width = "300px";

	if (!title)
	    title = "Let op:";
	    
	if (!buttonText)
	    buttonText = "Sluiten";
    
    createDialog();
    
    $("#framework_dialog .content").html(text.replace(/\r\n/g,'<br>'));
    $("#framework_dialog .buttons").css("display", "block");
    $("#framework_dialog .buttons").html("<button class=\"btn\" onclick=\"hideDialog('none');runCommands();return false;\"><span>"+buttonText+"</span></button>");
        
    var pos = {
          sTop : function() {
            return window.pageYOffset || document.documentElement && document.documentElement.scrollTop ||	document.body.scrollTop;
          },
          wHeight : function() { 
            return window.innerHeight || document.documentElement && document.documentElement.clientHeight || document.body.clientHeight;
          },
          wWidth : function() {            
            return document.documentElement.clientWidth;            
          }
        };
        
    var sHeight="'200px'";    
    if( pos.wHeight()> 100 ) 
    {
        sHeight = "" + (pos.wHeight()-100) + "px";
    }
    else
    {
        if( pos.wHeight() > 0 )
        {
            sHeight = "" + pos.wHeight() + "px";
        }
    }
    
    $("#framework_dialog").css('max-height',sHeight);    
    showDialog(width, "auto", "none", title);
    if(!$.browser.msie)
    {
        var nContentHeight = $("#framework_dialog .box").height();
        if( nContentHeight > (pos.wHeight()-100) )
        {
            nContentHeight = (pos.wHeight()-100);
        }
        var sContentHeight = "" + nContentHeight + "px";        
        $("#framework_dialog").css('height',sContentHeight);
        $("#framework_dialog").center();
    }    

/*	d = document;
	if(d.getElementById("framework_alert")) return;

	// create the modalContainer div as a child of the BODY element
	mObj = d.getElementsByTagName("body")[0].appendChild(d.createElement("div"));
	mObj.id = "framework_alert";
    mObj.onclick = function() { document.getElementsByTagName("body")[0].removeChild(document.getElementById("framework_alert"));runCommands();return false; }
	mObj.style.height = document.documentElement.scrollHeight + "px";
	alertObj = mObj.appendChild(d.createElement("div"));
	alertObj.id = "framework_alerttext";
	if (text.length < 300)
	    alertObj.style.width = "300px";
	else
	    alertObj.style.width = "60%";
	if (document.documentElement.scrollHeight < 500)
        alertObj.style.top = "10px";
    else
        alertObj.style.top = "200px";
	alertObj.style.left = (d.documentElement.scrollWidth - alertObj.offsetWidth)/2 + "px";
	if (!title)
	    title = "Let op:";
    h1 = alertObj.appendChild(d.createElement("h1"));
    h1.appendChild(d.createTextNode(title));

	msg = alertObj.appendChild(d.createElement("p"));
	encodedtext = text.replace(/\r\n/g,'<br>');
	msg.id = "framework_alertinnertext";
	msg.innerHTML = encodedtext;
	//msg.appendChild(d.createTextNode(text));

	btn = alertObj.appendChild(d.createElement("a"));
	btn.id = "framework_alertbutton";
	if (!buttonText)
	    buttonText = "Sluiten";
	btn.appendChild(d.createTextNode(buttonText));
	btn.href = "#";
	btn.onclick = function() { document.getElementsByTagName("body")[0].removeChild(document.getElementById("framework_alert"));runCommands();return false; }
	
    // show the shim to prevent comboboxes shining through the message box
	shimBox(alertObj);*/
}

function showPdf(id, pdfId, name)
{
    var url = location.href;
    //url = url.substring(0, url.indexOf(location.hostname )) + location.host + "/download.ctsx?event=WF_showpdf&arg0=" + id + "&arg1=" + pdfId + "&arg2=" + name ;
    url = url.substring(0, url.lastIndexOf("/")) + "/download.ctsx?event=WF_showpdf&arg0=" + id + "&arg1=" + pdfId + "&arg2=" + name ;    

    //window.open('','fw_pdf' , 'height=450,width=450,scrollbars=yes,resizable=yes,location=no');
    //return;
    //if ($("#framework_download").length == 0)
        //addInnerHtml("body", "<iframe height=0px width=0px id=\"framework_download\" src=\"" + url + "\"></iframe>");
        //addInnerHtml("body", "<a onclick='confirmUnloadEnabled = false; window.location=\"" + url + "\";confirmUnloadEnabled = true;'>Klik om rapport te openen</a>");
    //else
       // $("#framework_download").attr("src",url);
    //handleRunCode("confirmUnloadEnabled = false; window.location=\"" + url + "\";confirmUnloadEnabled = true;");
    //_doCallBack("showpdf", true, true, pdfId);    
    createDialog();
    //$("#framework_dialog .content").html("Uw rapport is gereed.");
    //$("#framework_dialog .buttons").css("display", "block");
    $("#framework_dialog .content").html("<div class=\"pdfdown\"><div class=\"pdfdown_left\"></div><div class=\"pdfdown_right\"><h3>Uw document is gereed</h3><br><input type=button value='Document ophalen' onclick=\"confirmUnloadEnabled = false;hideDialog('none');window.location='" + url + "';confirmUnloadEnabled = true;\"/><br><br><br>Indien u geen beschikking heeft over Adobe Acrobat Reader kunt u deze <a href=\"http://www.adobe.com/go/EN_US-H-GET-READER\" target=\"_blank\">hier</a> downloaden.</div></div>");
     //Klik <a onclick=\"confirmUnloadEnabled = false;hideDialog('none');setTimeout('confirmUnloadEnabled = true', 1000);\" href=\"" + url + "\">hier</a> om het rapport te openen.");
    showDialog(400,170,"none", "");
    
}

function createDialog()
{    
    if ($(framework_dialog_base + " #framework_dialog").length == 1)
        return;   
    addInnerHtml( framework_dialog_base, "<div id=\"framework_dialog\" style=\"display:none\"><div class=\"box\"><div class=\"title\"></div><div class=\"closebox\" onclick=\"hideDialog('none');runCommands();return false;\"></div><div class=\"content\"></div><div class=\"buttons\"></div></div></div><div id=\"framework_dialog_background\"></div>");
}


function centerDialog()
{   //request data for centering   
    
    var windowHeight = document.documentElement.clientHeight;   
    //centering   
    $("#framework_dialog").center();

    //only need force for IE6     
    $("#framework_dialog_background").css({"height": windowHeight});         
}  
   
    
function showDialog(width, height, mode, title)
{
    var base = $("#framework_dialog");
    var background = $("#framework_dialog_background");

    if (base.length == 0)
        return;

    if (background.length == 0)
        return;
    
    background.css("opacity", "0.6");
    
    if (!width)
        width = "500";
    if (!height)
        height = "200";

    if (title)
        $("#framework_dialog .title").html(title);
    else
        $("#framework_dialog .title").css("display", "none");

    base.css("width", width);
    base.css("height", height);
    shimBox(base[0]);

    centerDialog();
    showelement("#framework_dialog_background", mode);
    showelement("#framework_dialog", mode);
//    showelement("#framework_dialog .box", mode);
}

function hideDialog(mode)
{
    if (mode == 'none')
    {
        $("#framework_dialog_background").remove();
        $("#framework_dialog").remove();
    }
    else
    {
        hideelement("#framework_dialog_background", mode);
        hideelement("#framework_dialog", mode, function() {$("#framework_dialog").remove();});
    }
}

function getPos (ele)
{
	var obj = ele;

	var curleft = 0;
	if (obj.offsetParent)
	{
		while (obj.offsetParent)
		{
			curleft += obj.offsetLeft
			obj = obj.offsetParent;
		}
	}
	else if (obj.x)
		curleft += obj.x;


	var obj = ele;
	
	var curtop = 0;
	if (obj.offsetParent)
	{
		while (obj.offsetParent)
		{
			curtop += obj.offsetTop
			obj = obj.offsetParent;
		}
	}
	else if (obj.y)
		curtop += obj.y;

	return {x:curleft, y:curtop, height:ele.height, width:ele.width}
}
 
function autocomplete(elementid, options)
{
   doWithElement(elementid, 
        function(element, options)
        {
            element.ac.setSuggestions(options)
        }
        , options);

    // Set autocomplete options
//    var elements = getElements(elementid);
//    
//    for ( var i in elements )
//    {
//        var element = elements[i];
//        if (!element.ac)
//            continue;
//        element.ac.setSuggestions(options);
//    }
//    return "";
}

function flexboxOptions(elementid, options)
{
       if (!options)
        return;

       doWithElement(elementid, 
        function(element, options)
        {
            element.fb.callback(options, '')
        }
        , options);

//    $(elementid).flexbox.callback(options, '');
}

function dtObject_GotFocus(element, event)
{
    if (element == null)
        return;
    if (!getAttributeCustom(element, "ac"))
    {
        
        var maxheight = getAttributeCustom(element, "autocomplete_maxheight")
        var options = {
        offsety: 2,
        offsetx: 2,
        maxheight: maxheight,
        limittolist: true,
        callback: function (obj, fld) { syncValue(fld, "value_id")}
	    }; 
        element.ac = new _fw.AutoSuggest(element, options);
        
    }
}
function dtObject_OnBlur(element, property)
{
    if (element == null)
        return;
        
    var boxId = 'Control_' + property;
    var box = getElement(boxId); // element.parentElement.children(boxId);
    if ( box.selectedIndex > -1)
    {
        element.value = box.options(box.selectedIndex).text;
        syncValue(box);
    }
    setVisibilityAndDisplay(box.id, false);

}
function dtObject_KeyPress(element, e, canvas, property)
{
    if (element == null)
        return;
    if (e == null)
        return;
 
   if(e.which)
        keycode=e.which;  //Netscape
    else
        keycode=e.keyCode; //Internet Explorer
    
    if (keycode == 40)
        e.keyCode = '';
}
function dtObject_KeyUp(element, e, canvas, property)
{
    if (element == null)
        return;
    if (e == null)
        return;
    
    if(e.which)
        keycode=e.which;  //Netscape
    else
        keycode=e.keyCode; //Internet Explorer
    
    if (!element.oldvalue)
        element.oldvalue = "";
    var boxId = 'Control_' + property;
    var box = getElement(boxId); //element.parentElement.children(boxId);

    if (keycode == 13 || (keycode > 33 && keycode < 41))
    {
    //alert("FindKeyCode"+ keycode);
    
        
        if (keycode == 40 && box.selectedIndex < box.length-1)
            box.selectedIndex++;
        else if (keycode == 38 && box.selectedIndex > 0)
            box.selectedIndex--;
        else if (keycode == 36)
            box.selectedIndex = 0;
        else if (keycode == 35)
            box.selectedIndex = box.length -1;
        else if (keycode == 33)
            {
            if (box.selectedIndex > box.size)
                box.selectedIndex = box.selectedIndex - box.size;
            else 
                box.selectedIndex = 0;
            }
        else if (keycode == 34 )
        {
            if (box.selectedIndex < box.length-1 - box.size)
                box.selectedIndex = box.selectedIndex + box.size;
            else
                box.selectedIndex = box.length -1;
            
        }
        else if (keycode == 13)
        {
            if ( box.selectedIndex > -1)
            {
                element.value = box.options(box.selectedIndex).text;
                syncValue(box);
            }
            setVisibilityAndDisplay(box.id, false);
        }
        
        

        return;
    }

    if (element.oldvalue != element.value)
    {
        propertyEvent(canvas, property, 'UpdateList', element.value);
        if (box.style.display == "none")
        {
            var pos = getPos(element)
            box.style.left = pos.x + "px";
            box.style.top = (pos.y + pos.height) + "px";
            box.style.width = 200;
            box.style.display='block';
            box.style.visibility='visible';
        }
    }
        
    
        
}

// Gets options for <select> element (Property Object)
function getOptions(element)
{

    if (element == null)
        return;

   //element = $('select', element).eq(0);
    element = $(element);
    
    if (element == null)
        return;
    
    var id = element.attr("propcode");
    
    if (id == null || id == '')
        id = element.attr("name");
             
    if (id == null || id == '')
        return;
        
    var canvasID= element.attr("canvas");
/*    if (getAttributeCustom(element, "canvas"))
        canvasID = getAttributeCustom(element, "canvas");*/
    
    propertyEvent(canvasID, id, "getoptions", null, false, true);
}


function hideelement(id, mode, callback)
{
    if ($(id).length == 0)
        return false;
    /*    
    if (mode == "slow" || mode == "fast")
        $(id).hide(mode, callback);
    else
        $(id).hide();
    */    
   
    if (mode == "slow" || mode == "fast")
        $(id).slideUp(mode, callback);
    else    
        $(id).hide();

    return true;
}

function showelement(id, mode, callback)
{
    if ($(id).length == 0)
        return false;
    if (mode == "slow" || mode == "fast")
        //$(id).animate({height: "show", width: "show"}, mode, callback); 
        $(id).slideDown(mode, callback);        
    else        
        $(id).show();
}

function webredirect(url, newWindow)
{
    if (url == '')
    {
        window.location.reload();
        return;
    }
    
    if (top != self)
    {
        if (url == '')
        {
            parent.window.location.reload();
            return;
        }
        var newUrl;
        if (url.substr(0,7) == "http://" || url.substr(0,8) == "https://")
            newUrl = url;
        else 
            newUrl = framework_baseurl + url;

        if (newWindow)
            window.open (newUrl)
        else
        {
            confirmUnloadEnabled = false;
            parent.window.location = newUrl;
        }
    }
    else
    {
        if (url == '')
        {
            window.location.reload();
            return;
        }
        var newUrl;
        if (url.substr(0,7) == "http://" || url.substr(0,8) == "https://")
            newUrl = url;
        else 
            newUrl = framework_baseurl + url;

        if (newWindow)
            window.open (newUrl)
        else
        {
            confirmUnloadEnabled = false;
            window.location = newUrl;
        }
    }
}

function doWithElement(id, callback, args)
{
    
    var elements = getElements(id);
    
    if (elements == null || elements.length == 0)
        return;
    for (var x=0; x< elements.length; x++)
    {
        callback(elements[x], args);
    }
}
function getElement(id, filter)
{
    var elements = getElements(id, filter);
    if (elements != null && elements.length >0)
        return elements[0];
    return null;
}
function getElements(id, filter)
{
    if (id == null)
        return null;
        
    var ids = id.split("~");
    
    if (filter == null)
    {
        if (ids.length == 1)
            return $(id);
        if (ids.length == 2)
            return $("#framework fw_" + ids[0] + " " + ids[1] );
        if (ids.length == 3)
            return $("#" + ids[0] + " fw_" + ids[1] + " " + ids[2]);
    }
    else
    {
        if (ids.length == 1)
            return $(id).filter(filter);
        if (ids.length == 2)
            return $("#framework fw_" + ids[0] + " " + ids[1] ).filter(filter);
        if (ids.length == 3)
            return $("#" + ids[0] + " fw_" + ids[1] + " " + ids[2]).filter(filter);
    }
        
    return null;
}

function getElementsFromWorkflow(workflowid, canvasid, id)
{ 
    try
    {

        var element = getElement('framework_workflow_' + workflowid);
        if (element == null)
            return null;
        var s, i, e; 

        s = element.getElementsByTagName('*'), i = s.length; 

        var result = [];
        var count = 0;
        while (i--) 
        { 
            e = s[i]; 
            try
            {
            if ((e.id == id || e.name == id) && getAttributeCustom(e, "canvas") && getAttributeCustom(e, "canvas") == canvasid) 
                result[count++] = e;
            }
            catch (e) {}
        }
        return result;
       
    }
    catch (e) {}

    return null;
}

function getElementsFromCanvas(canvasid, id)
{ 
    try
    {

        var element = getElement('framework_canvas_' + canvasid);
        if (element == null)
            return null;
        var s, i, e; 

        s = element.getElementsByTagName('*'), i = s.length; 
        var result = [];
        var count = 0;

        while (i--) 
        { 
            e = s[i]; 
            try
            {
            if ((e.id == id || e.name == id) && getAttributeCustom(e, "canvas") && getAttributeCustom(e, "canvas") == canvasid) 
                result[count++] = e;
            }
            catch (e) {}
        }
        return result;
       
    }
    catch (e) {}

    return null;
}

function syncValueClear(element)
{
    if (element == null)
        return;

    var canvas = null;
    if (getAttributeCustom(element, "canvas"))
        canvas = document.getElementById('framework_canvas_' + getAttributeCustom(element, "canvas"));
    else
        canvas = document.getElementById('framework_canvas');
    
    if (canvas == null)
        return;
    
    var canvasID= "";
    if (getAttributeCustom(element, "canvas"))
        canvasID = getAttributeCustom(element, "canvas");
    
    _doCallBack("syncvalueclear", false, false,null,canvasID, id);    
}

function syncValue(element, field, synchrone )
{
    if (element == null)
        return;
    
    if (synchrone == undefined)
        synchrone=true;
        
    if (getAttributeCustom(element, "value_sync_bool"))
    {
        if (element.checked)
            element.value = '1';
            
        else
            element.value = '0';
    }
    var valueNew = null;
    if (!field)
        valueNew = element.value;
    else
        valueNew = getAttributeCustom(element, field);
    

//    if (!element.getAttribute("value_sync_nocheck"))
    if (!getAttributeCustom(element, "value_sync_nocheck"))
    {
        //if (!element.getAttribute("value_sync"))
        if (!getAttributeCustom(element, "value_sync"))
            element.value_sync = '';
            
        if (getAttributeCustom(element, "value_sync") == valueNew)
            return;
            
        element.value_sync = valueNew;
    }
    
    /*
    var id = element.propcode;    
    if ((id == null || id == '' || id == undefined) && $(element).attr)
        id = $(element).attr('propcode');
    */    
    var id = $(element).attr('propcode');

    if (id == null || id == '')
        id = element.name;
             
    if (id == null || id == '')
        return;
        
    //id = id.substring(id.indexOf('_') + 1);

    
    if (getAttributeCustom(element, "sync_date") && valueNew != "")
    {
        valueNew = getDateFromFormat(valueNew, getAttributeCustom(element, "sync_date"));
        if (valueNew == 0)
            valueNew = element.value;
        else
            valueNew = formatDate(new Date(valueNew), 'MM/dd/yyyy');
    }
    
    //
    if (element.value_sync && (element.value_sync !='undefined') && (valueNew == element.value_sync))
    //    return;
//    var canvas = null;
//    if (getAttributeCustom(element, "canvas"))
//        canvas = document.getElementById('framework_canvas_' + getAttributeCustom(element, "canvas"));
//    else
//        canvas = document.getElementById('framework_canvas');
//    
//    if (canvas == null)
//        return;
//    
    var canvasID= "";
    if (getAttributeCustom(element, "canvas"))
        canvasID = getAttributeCustom(element, "canvas");
    
    _doCallBack("syncvalue", synchrone, false,null,canvasID, id, valueNew);    

}

function propertyEvent(canvasID, property, eventName, eventArguments, newWin, sync, callback)
{
	
   if (!newWin)
        newWin = false;

    
    _doCallBack("propertyevent", sync, newWin,callback, canvasID, property, eventName, eventArguments);    

}

function propertyEventGetPdfNewWin(canvasID, property, eventName, eventArgument)
{
    propertyEventGetPdf(canvasID, property, eventName, eventArgument, true)
}
function propertyEventGetPdf(canvasID, property, eventName, eventArgument, newWin)
{
    if (!newWin)
        newWin = false;
    var canvas = getElement('#framework .fc_' + canvasID);
    
    if (canvas == null)
        return;

    
    _doCallBack("propertyeventgetpdf", true, newWin,null, canvasID, property, eventName, eventArgument, newWin);    
}

function logoff(canvasID, eventName, eventArgument)
{
    _doCallBack("logoff", true, false,null);    
}

function canvasEvent(canvasID, eventName, eventArgument)
{
    
    _doCallBack("canvasevent", true, false,null,canvasID, eventName, eventArgument);    
}

function isGuid(str)
{
	if(!str) return false;
	GuidRegExp = /^[{|\(]?[0-9a-fA-F]{8}[-]?([0-9a-fA-F]{4}[-]?){3}[0-9a-fA-F]{12}[\)|}]?$/
	return GuidRegExp.test(str);
}

function getWorkflowID(element)
{
    if (!element.toString)
        return null;
    var parent = $(element).parent();
    while(parent.length ==1 && parent.attr("class").indexOf("fw_") != 0)
        parent = $(parent).parent();
    if (parent.length == 0)
        return null;
    var workflowID = parent.attr("class").replace("fw_","");
    var sSpacePos = workflowID.indexOf(" ");
    if( sSpacePos > -1 )
        workflowID = workflowID.substring(0,sSpacePos);
    return workflowID;
}


function workflowEventGenerateGetPDF(workflowID, eventName, eventArgument)
{
    if (isObject( workflowID))
    { 
        // is sender, find workflowID from element.
        workflowID = getWorkflowID(workflowID);
        if (workflowID == null)
            return;
    }
    return _doCallBackGenerate("workfloweventgetpdf", true, false,null,workflowID, eventName, eventArgument);    
}

function workflowEvent(workflowID, eventName, eventArgument)
{
    if (isObject( workflowID))
    { 
        // is sender, find workflowID from element.
        workflowID = getWorkflowID(workflowID);
        if (workflowID == null)
            return;
    }
    _doCallBack("workflowevent", true, false,null,workflowID, eventName, eventArgument);    
}


function closeCanvas(canvasID)
{
     var canvas = document.getElementById('framework_canvas_' + canvasID);

    if (canvas == null)
        return;

    _doCallBack("closecanvas", true,false,null,canvasID);    
    //_doSubmitEventTarget('framework_manager', canvas.sync_page, 'syncinstance', null, null, true);
}
function editInstance(canvasID)
{
     var canvas = document.getElementById('framework_canvas_' + canvasID);

    if (canvas == null)
        return;

    _doCallBack("editinstance", true,false,null,canvasID);    
    //_doSubmitEventTarget('framework_manager', canvas.sync_page, 'syncinstance', null, null, true);
}

function cancelEdit(canvasID)
{
     var canvas = document.getElementById('framework_canvas_' + canvasID);

    if (canvas == null)
        return;

    _doCallBack("canceledit", true,false,null,canvasID);    
    //_doSubmitEventTarget('framework_manager', canvas.sync_page, 'syncinstance', null, null, true);
}


function syncInstance(canvasID)
{
    var canvas = document.getElementById('framework_canvas_' + canvasID);

    if (canvas == null)
        return;

    _doCallBack("syncinstance", true,false,null,canvasID);    
    //_doSubmitEventTarget('framework_manager', canvas.sync_page, 'syncinstance', null, null, true);
}

function setFormatted(id, formattedvalue)
{
    var element = getElement(id);
    
    if (element == null)
        return;
        
    element.value_sync = value;
    
    if (!getAttributeCustom(element, "value_sync_bool") && element.type != 'radio' && element.type != 'select_one')
	    element.formatvalue = formattedvalue;
}

function setValue(id, value, valuetostring)
{
   doWithElement(id, 
        function(element,value, valuetostring)
        {
            setValueOnElement(element, value, valuetostring);
        }
        , value, valuetostring);
}

function setValueOnElement(element, value, valuetostring)
{
    if (element == null)
        return;
        
    element.value_sync = value;
    
    if (getAttributeCustom(element, "value_sync_bool"))
    {
        element.value = value;
        if (element.value == '1')
            element.checked = true;
            
        else
            element.checked = false;
    } 
    else if (element.type == 'radio')
    {
        // edit by JK: werkte niet goed icm controls binnen canvas zoeken
    
    	var aObj = document.getElementsByName(element.name);
	    if(aObj.length == undefined) {
		    element.checked = (element.value == value.toString());
		    return;
	    }

        var ids = id.split("~");
        var canv = null;
        if (ids.length == 2)
            canv = ids[0];

	    for(var i = 0; i < aObj.length; i++) {
		    if (canv && getAttributeCustom(aObj[i], "canvas") != canv)
		        continue;
		    aObj[i].checked = false;
		    if(aObj[i].value == value.toString()) {
			    aObj[i].checked = true;
		    }
	    }
    }
    else if (element.type== "select-one") 
    {
        
		for (n= 0; n< element.options.length; n++) {
		    
			if (element.options[n].value == value) 
				element.options[n].selected = true;
			else
				element.options[n].selected = false;
			
		}
		if (element.controlsub)
		{
            var elementsub = getElement(element.controlsub);
            if (elementsub != null && element.selectedIndex > -1)
                elementsub.value = element.options(element.selectedIndex).text;;
		}
	}
	else if ($('#flexbox_input', element).length == 1)
	{
	    $('#flexbox_input', element).attr("value", value);
	}
	else if (valuetostring)
	{
	    element.valueid = value;
	    element.value = valuetostring;
	}
	else
	    element.value = value;
}

function setFocus(id)
{
    $(id).eq(0).focus();
}

function setDisable(id, value)
{
    var element = getElement(id);
    
    if (element == null)
        return;

    if (value)            
    {
        element.disabled = "disabled";
        element.readonly = "readonly";
    }
    else
    {
        element.disabled = false
        element.readonly = false;
    }
}

function setVisibility(id, value)
{
    doWithElement(id, 
        function(element,value)
        {
            if (value)
                element.style.visibility='visible';
            else
                element.style.visibility='hidden';
        },
        value);
    return;

    var element = getElement(id);
    
    if (element == null)
        return;
        
    if (value)
        element.style.visibility='visible';
    else
        element.style.visibility='hidden';
}
function setVisibilityAndDisplay(id, value)
{
    var element = getElement(id);
    
    if (element == null)
        return;
        
    if (value)
    {
        element.style.display='block';
        element.style.visibility='visible';
    }   
    else
    {
        element.style.display='none';
        element.style.visibility='hidden';
    }
}
function setRegionVisibilityAndDisplay(tabid, id, value)
{
    if (tabid != null && tabid != "")
    {
        $(tabid).find(id).css('display', value ? 'block' : 'none');
        $(tabid).find(id).css('visibility', value ? 'visible' : 'hidden');
    }
    else
    {    
        $(id).css('display', value ? 'block' : 'none');        
        $(id).css('visibility', value ? 'visible' : 'hidden');        
    }
/*    var element = null;

    if (tabid != null && tabid != "")
    {
        element = getElement(tabid);
        
        if (element == null)
            return;
            
        element = element.getElementById(id);
    }
    else
    {
        element = getElement(id);
    }

    if (element == null)
        return;
        
    if (value)
    {
        element.style.display='block';
        element.style.visibility='visible';
    }   
    else
    {
        element.style.display='none';
        element.style.visibility='hidden';
    }*/
}

function setOuterHtml(id, value) 
{
    sSrch = generateSearchFix(id);    
    if( sSrch.length )
    {
        if (!value) 
            value = "";
        sSrch += ".attr('outerHTML',value);";
        eval( sSrch );
    }
}

function clearInnerHtml(id,value)
{
    sSrch = generateSearchFix(id);    
    if( sSrch.length )
    {
        sSrch += ".empty();";
        eval( sSrch );                        
    }
    //$(id).empty();
}
function setInnerHtml(id, value)
{
    sSrch = generateSearchFix(id);    
    if( sSrch.length )
    {
        if(!value) 
            value = "";
                    
        sSrch +=".html(value);";
        eval( sSrch );        
    }
    /*
    if (value) 
        $(id).html(value);
    else
        $(id).html("");
    */
}

function addInnerHtml(id, value)
{     
    //alert("Search " + $(id).length);
    sSrch = generateSearchFix(id);    
    if( sSrch.length )
    {
        sSrch += ".append(value);";
        eval( sSrch );        
    }
    
    //$(id).append(value);        
}

function generateSearchFix( id )
{    
    if( $.browser.msie && parseInt($.browser.version)>=8)
    {
       return "$(id)";
    }
    
    aFind = id.split(' ');
    sFindStr = "$(";
    bFirst = true;
    for( srch in aFind)
    {
        sAttr = $.trim(aFind[srch]);
        if( !sAttr.length ) continue;
        if( !bFirst )
        {
            sFindStr += ".find(";
        }

        sFindStr += "'" + sAttr + "')";
        bFirst = false;
    }
    if( !bFirst ) return sFindStr;
    return "";
}

function setInnerHtml_AddOption(id, value, text, selected)
{
    var element = getElement(id);
    
    if (element == null)
        return;
    
	var doc = element.ownerDocument;
		
	if (!doc)
	    doc = element.document;
	    
	var opt = doc.createElement('OPTION');
	opt.setAttribute('value', value);	
	opt.text = text;		
	
	element.options.add(opt);			
	
	if (selected != null && selected != undefined && selected)
	    opt.selected = true;
}

function setAlt(id, value)
{

    doWithElement(id, 
        function(element,value)
        {
            element.alt = value;
        }
        , value);
    return;

}

function setError(element, alt)
{
    var base = getPropertyParent(element);
    if (base == null)
        return;
    errorelement = base.find(".error")
    errorelement.attr("title", alt);
    errorelement.css("visibility", "visible");
    base.find(".errormessage").html(alt);
    base.find('.control').addClass("controlerror");

}

function isObject(element)
{
    return element == "[object]" || (element.toString && element.toString() == "[object]") || element == "{object}" || (element.toString && element.toString() == "{object}" || typeof(element)== "object" ) ;
}

function getPropertyParent(element)
{
    if (isObject(element))
    {
        if ($(element).attr('propcode'))
        {            
            //var base = $(element).parents('.property_' + element.propcode.replace(/\./g,"_")) ; // firefox fix
            var base = $(element).parents('.property_' + $(element).attr('propcode').replace(/\./g,"_")); 
            return base;
        }
    }
    else
    {
       if (element.indexOf('.error') > -1)
            return $(element).parent();
       else
            return $(element);
    }
}

function setErrorOff(element)
{
    var base = getPropertyParent(element);
    if (base == null)
        return;
    base.find('.error').css("visibility", "hidden");
    base.find('.errormessage').html("");
    base.find('.control').removeClass("controlerror");
}

function checkValueRequired(element)
{
    if (element == null)
        return false;
     
    var value = element.value;
    
    if (value == null || value == '')
    {
        setError(element, 'Het veld mag niet leeg blijven.');
        return false;
    }
    
    return true;
}

function setValueUpper(element)
{
    if (element == null)
        return;
     
    var value = element.value;
    
    if (value != null && value != '')
        element.value = value.toUpperCase();
}

function setValueUpperFirst(element)
{
    if (element == null)
        return;
     
    var value = element.value;
    
	if (value.length>0 && value.charAt(0) >= 'a' && value.charAt(0) <= 'z')
	{
	    sFirstChar = value.charAt(0)
	    element.value=  sFirstChar.toUpperCase(sFirstChar) + value.substring(1,value.length);
	}

}

function setValueLower(element)
{
    if (element == null)
        return;
     
    var value = element.value;
    
    if (value != null && value != '')
        element.value = value.toLowerCase();
}

var isValidIntCheck = '+-0123456789';
var isValidDecimalCheck = '.';
var isValidStringLowerCheck = 'abcdefghijklmnopqrstuvwxyz';
var isValidStringUpperCheck = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';

function isValid(value, check) 
{
    if (value == null || value == '') 
        return true;
        
    for (i = 0; i < value.length; i++) 
    {
        if (check.indexOf(value.charAt(i), 0) == -1) 
        return false;
    }
    
    return true;
}

function stripBlanks(value) 
{
    if (value == null || value == '' || value.indexOf(' ') == -1)
        return value;
        
    var result = '';

    for (i=0; i < value.length; i++)
    {
        if (value.charAt(i) != ' ')
        { 
            result += value.charAt(i); 
        }
    } 
    
    return result;
}

function checkValueDecimal(element)
{
    if (element == null)
        return false;
     
    if (element.value.indexOf(' ') != -1)
        element.value = stripBlanks(element.value);

    if (element.value == null || element.value == '')
        return true;
    
/*    if (!isValid(element.value, isValidIntCheck + isValidDecimalCheck) || element.value != parseFloat(element.value))
    {
        setError(element, 'Het veld bevat geen correct getal.');
        return false;
    }
    
    if (getAttributeCustom(element, "value_min"))
    {
        if (parseFloat(element.value) < parseFloat(getAttributeCustom(element, "value_min")))
        {
            if (getAttributeCustom(element, "value_max"))
                setError(element, 'De waarde dient tussen ' + getAttributeCustom(element, "value_min") +  ' en ' + getAttributeCustom(element, "value_max") +  ' te liggen.');
                
            else
                setError(element, 'De waarde dient niet kleiner te zijn dan ' + getAttributeCustom(element, "value_min") +  '.');
                
            return false;
        }
    }
    
    if (getAttributeCustom(element, "value_max"))
    {
        if (parseFloat(element.value) > parseFloat(getAttributeCustom(element, "value_max")))
        {
            if (getAttributeCustom(element, "value_min"))
                setError(element, 'De waarde dient tussen ' + getAttributeCustom(element, "value_min") +  ' en ' + getAttributeCustom(element, "value_max") +  ' te liggen.');
                
            else
                setError(element, 'De waarde dient niet groter te dan ' + getAttributeCustom(element, "value_max") +  '.');
                
            return false;
        }
    }*/
    
    return true;
}

function checkValueInt(element)
{
    if (element == null)
        return false;
     
    if (element.value.indexOf(' ') != -1)
        element.value = stripBlanks(element.value);

    if (element.value == null || element.value == '')
        return true;
    
/*    if (!isValid(element.value, isValidIntCheck) || element.value != parseFloat(element.value))
    {
        setError(element, 'Het veld bevat geen correct geheel getal.');
        return false;
    }
    
    if (getAttributeCustom(element, "value_min"))
    {
        if (parseFloat(element.value) < parseFloat(getAttributeCustom(element, "value_min")))
        {
            if (getAttributeCustom(element, "value_max"))
               setError(element, 'De waarde dient tussen ' + getAttributeCustom(element, "value_min") +  ' en ' + getAttributeCustom(element, "value_max") +  ' te liggen.');
                
            else
                setError(element, 'De waarde dient niet kleiner te zijn dan ' + getAttributeCustom(element, "value_min") +  '.');
                
            return false;
        }
    }
    
    if (getAttributeCustom(element, "value_max"))
    {
        if (parseFloat(element.value) > parseFloat(getAttributeCustom(element, "value_max")))
        {
            if (getAttributeCustom(element, "value_min"))
                setError(element, 'De waarde dient tussen ' + getAttributeCustom(element, "value_min") +  ' en ' + getAttributeCustom(element, "value_max") +  ' te liggen.');
                
            else
                setError(element, 'De waarde dient niet groter te zijn dan ' + getAttributeCustom(element, "value_max") +  '.');
                
            return false;
        }
    }*/
    
    return true;
}

function checkValueDate(element)
{
    if (element == null)
        return false;
     
    if (element.value == null || element.value == '')
        return true;
        
    if (!isDate(element.value, getAttributeCustom(element, "sync_date")))
    {
        setError(element, 'Het veld bevat geen correcte datum.');
        return false;
    }
    
    return true;
}

function showTab(element)
{
    if (element == null)
        return;
    if (typeof(element) == 'number')
        showTabByID('tab_' + element);
    else
        showTabByID('tab_' + element.id.substring(element.id.indexOf('_') + 1));
}

function navigateTab(canvasid, id)
{
    var canvas = document.getElementById('framework_canvas_' + canvasid);
    
    if (canvas == null)
        return;

    _doCallBack("navigatetab",true,false,null, canvasid, id);    
    //_doSubmitEventTarget('framework_manager', canvas.sync_page, 'navigatetab', id, null, true);

}
function navigateTabPrev(canvasid)
{
    canvas = document.getElementById('framework_canvas_' + canvasid);
   
    if (canvas == null)
        return;

    _doCallBack("navigatetabprev", true,false,null,canvasid);    
    //_doSubmitEventTarget('framework_manager', canvas.sync_page, 'navigatetabprev', null, null, true);

}
function navigateTabNext(canvasid)
{
    canvas = document.getElementById('framework_canvas_' + canvasid);
    
    if (canvas == null)
        return;

    _doCallBack("navigatetabnext", true,false,null,canvasid);    
    //_doSubmitEventTarget('framework_manager', canvas.sync_page, 'navigatetabnext', null, null, true);

}

function showTabByID(id)
{
    if (id == null || id == '')
        return;
        
    for (i=0; i < 999; i++)
    {
        var elementSub = getElement('tab_' + i);
        var elementTab = null;
        
        if (elementSub == null)
            return;
        
        if (elementSub.id == id)
        {
            elementSub.style.visibility='visible';
            elementSub.style.display='block';
            elementTab = getElement('tabbuttonselected_' + i);
            if (elementTab !=null)
            {
            elementTab.style.visibility='visible';
            elementTab.style.display='block';
            }
            elementTab = getElement('tabbutton_' + i);
            if (elementTab !=null)
            {
                elementTab.style.visibility='hidden';
                elementTab.style.display='none';
            }
        }
        else
        {
            elementSub.style.visibility='hidden';
            elementSub.style.display='none';
            elementTab = getElement('tabbuttonselected_' + i);
            if (elementTab !=null)
            {
                elementTab.style.visibility='hidden';
                elementTab.style.display='none';
            }
            elementTab = getElement('tabbutton_' + i);
            if (elementTab !=null)
            {
                elementTab.style.visibility='visible';
                elementTab.style.display='block';
            }
        }
    }
}

// Used for getting custom attribute values.
// For compatibility with FF.
function getAttributeCustom(element, attribute)
{
    return $(element).attr(attribute);
/*    if (eval("element." + attribute))
        return eval("element." + attribute);
    return element.getAttribute(attribute);*/
}

function focusFirstVisibleTextbox(canvasid)
{
    canvas = document.getElementById('framework_canvas_' + canvasid);
    
    if (canvas == null)
        return;

    var arr = canvas.getElementsByTagName('input')
    
    for (var i = 0; i < arr.length; i++)
    {
        var e = arr[i];
        if (e.type == 'text')
        {
            if (e.focus)
            {
                e.focus();
                break;
            }
        }
    }
}

function shimBox(boxObj)
{
    if (boxObj == null)
        return;
        
    var element = $("#framework_shim");
    var shim = null;
    if (element.length == 0)
    {
        shim = document.getElementsByTagName("body")[0].appendChild(document.createElement("div"));
	    shim.id = "framework_shim";
    }
    else
        shim = element[0];
            
    with (shim.style)
    {
        left    = boxObj.style.left;
        top     = boxObj.style.top;
        width   = boxObj.offsetWidth + "px";
        height  = boxObj.offsetHeight + "px";
        zindex  = -1;
        display = (boxObj.style.visibility == "visible") ? "block" : "none";
    }
}


///* Start Tab support functions */

$.extend($.ui.tabs.prototype, {
    __load: $.ui.tabs.prototype.load,
    load: function(index, callback)
    {
		var self = this, o = this.options, $a = this.$tabs.eq(index), a = $a[0],
				bypassCache = callback == undefined || callback === false, url = $a.data('load.tabs');
        var canvas = $a.parent().parent().parent().attr('canvas');
        if (canvas == null)
        {
            callback();
            //self.__load(index,callback);
            return;
        }

		callback = callback || function() {};

		// no remote or from cache - just finish with callback
		if (!url || !bypassCache && $.data(a, 'cache.tabs')) {
			callback();
			return;
		}

		// load remote from here on

		var inner = function(parent) {
			var $parent = $(parent), $inner = $parent.find('*:last');
			return $inner.length && $inner.is(':not(img)') && $inner || $parent;
		};
		var cleanup = function() {
			self.$tabs.filter('.' + o.loadingClass).removeClass(o.loadingClass)
					.each(function() {
						if (o.spinner)
							inner(this).parent().html(inner(this).data('label.tabs'));
					});
			self.xhr = null;
		};

		if (o.spinner) {
			var label = inner(a).html();
			inner(a).wrapInner('<em></em>')
				.find('em').data('label.tabs', label).html(o.spinner);
		}
		
        var ajaxcallback = function(r, s) {
				//$(self._sanitizeSelector(a.hash)).html(r);
				handleRunCode( r);
				
				cleanup();

				if (o.cache)
					$.data(a, 'cache.tabs', true); // if loaded once do not load them again

				// callbacks
				self._trigger('load', null, self.ui(self.$tabs[index], self.$panels[index]));
//				try {
//					o.ajaxOptions.success(r, s);
//				}
//				catch (er) {}

				// This callback is required because the switch has to take
				// place after loading has completed. Call last in order to
				// fire load before show callback...
				callback();
			}

		if (self.xhr) {
			// terminate pending requests from other tabs and restore tab label
			self.xhr.abort();
			cleanup();
		}
		$a.addClass(o.loadingClass);
		//self.xhr=_doCallBack("canvasevent", false, false,null, canvas, "tabrender" , $a.attr('page'), {target: index } );    
		self.xhr=_doCallBack("canvasevent", false, false,ajaxcallback, canvas, "tabrender" , $a.attr('page'), {target: a.hash } );    
		//self.xhr = _doCallBack(" $.ajax(ajaxOptions);
    }
    ,
    undock: function()
        {
            if (!$(".dock",this.list).hasClass("docked"))                        
                return;
            $(".dock", this.list).removeClass("docked");
            
            //event.data.tabs.select(event.data.tabs.options.selected);
            if (this.options.selected == -1)
                this.options.selected = 0;
            this.$panels[this.options.selected].fwtab = this;
            $(this.$panels[this.options.selected]).animate({width: "show"}, 500,
                 function () { 
                    var x=1;
                    $(this.fwtab.$panels).attr("style","");
                    this.fwtab.$lis.animate({height: "show"},50)
                 });
            //$(this.$panels).attr("style","");
            this.select(this.options.selected);
        },    
    dock: function()
        {
            $(".dock", this.list).addClass("docked");
            
            this.$panels.animate({width: "hide"}, 500);
            this.$lis.hide()
        },
    addpage: function(id, display, activate, html, index) {
		if (index == undefined)
			index = this.$tabs.length; // append by default
	    this.undock();

        
        var url;
        if (html == "") // remote tab
            url = id;
        else
            url = "#" + id;
		var o = this.options;
		var $li;
		if (o.allowclose)
		    var $li = $(o.tabTemplateClose.replace(/#\{href\}/g, url).replace(/#\{label\}/g, display).replace(/{tabname\}/g, id));
		else
		    var $li = $(o.tabTemplate.replace(/#\{href\}/g, url).replace(/#\{label\}/g, display).replace(/{tabname\}/g, id));
		$li.addClass(o.tabClass).data('destroy.tabs', true);

        
		//var id = url.indexOf('#') == 0 ? url.replace('#', '') : this._tabId( $('a:first-child', $li)[0] );

		// try to find an existing element before creating a new one
		var $panel = $('#' + id, this.$panels.parent());
		if ($panel.length)		
		{
		    // panel exists, activate it
		    var index = this.$lis.index($('li:has(A[page="' + id + '"])', this.$lis.parent()))
		    
		    //var index = this.$panels.index($('id=' + id, this.$panels.parent()));
		    if (index == -1)
		        return;
		        
		    // remove cache
		    $.removeData(this.$tabs[index], 'cache.tabs')
		    $li = this.$lis.eq(index)
		    $li.removeClass(o.selectedClass)
//		    $(this.$tabs[index].hash).html(html);
//		    this._tabify();
//		    if (activate==1)
//		        this.select(index)
//		    return;
				
		}
		
		if (!$panel.length) {
		
			$panel = $(o.panelTemplate).attr('id', id)
				.addClass(o.hideClass)
				.data('destroy.tabs', true);
    		$panel.addClass(o.panelClass);
	    		
		    if (index >= this.$lis.length) {
			    $li.appendTo(this.list);
			    $panel.appendTo(this.list[0].parentNode);
		    }
		    else {
			    $li.insertBefore(this.$lis[index]);
			    $panel.insertBefore(this.$panels[index]);
		    }
        }
		
		this._tabify();
		o.disabled = $.map(o.disabled,
			function(n, i) { return n >= index ? ++n : n });

        if (o.allowclose)
        {
            $(".close", $li).bind('click.fwtabs', {tabs: this} , 
                function(event) { 
                    
                    event.stopPropagation() ;
                    var index = event.data.tabs.$lis.index($(this).parents('li'))
                    if (index >= 0)
                        event.data.tabs.remove(index);
                    //$(this).parents('ul').tabs('remove', $(this).parents('li.eq(0)'));
                    }) 
            $(".close", $li).hover(function() {
                    $(this).addClass('closehover');
                }, function() {
                    $(this).removeClass('closehover');
                });
        }

        //$(this.$tabs[index].hash,this.$tabs[index].parentNode).html(html);
        $(this.$tabs[index].hash,this.$tabs.parent().parent().parent()).html(html);

		if (this.$tabs.length == 1) {
			$li.addClass(o.selectedClass);
			$panel.removeClass(o.hideClass);
//			var href = $.data(this.$tabs[0], 'load.tabs');
//			if (href) this.load(index, href);
		}
        
		// callback
		this._trigger('add', null, this.ui(this.$tabs[index], this.$panels[index]));

		this._tabify();
		
		if (activate==1)
		    this.select(index);
		this.handlebuttons();

	},
    handlebuttons: function()
    {
        if (this.$tabs.length > 0 && this.options.allowdock)
		    $(".dock", this.list).css('display', 'block');
		else 
		    $(".dock", this.list).css('display', 'none');
		if (this.$tabs.length > 0 && this.options.allowcloseall)
		    $(".closeall", this.list).css('display', 'block');
		else 
		    $(".closeall", this.list).css('display', 'none');
        $(".closeall", this.list).unbind("click.fwtabs").bind("click.fwtabs", {tabs: this},
            function (event)
            {
                event.stopPropagation() ;
/*                var $text = "<DIV class=\"dialog_text\">Wilt u alle tabbladen sluiten?</DIV>"
                var $tabs = event.data.tabs;
                $($text).dialog({title: "Alle tabbladen sluiten",  modal: true, show: 300 , hide:"fast",
                    buttons: { 
                      "Ja": function() {
                             var x=$tabs.$lis.length;
                             for (var cnt=0; cnt < x ; cnt++)
                                $tabs.remove(0); 
                             $(this).dialog("close");
                            }, 
                      "Nee": function() { 
                            $(this).dialog("close");
                            }
                        }
                   }
                );*/
                var $tabs = event.data.tabs;
                createDialog();
                
                $("#framework_dialog .content").html("Wilt u alle geopende tabbladen sluiten?");
                $("#framework_dialog .buttons").css("display", "block");
                $("#framework_dialog .buttons").html("<button id=\"framework_dialog_yesbtn\" class=\"btn\"><span>Ja</span></button>&nbsp;<button id=\"framework_dialog_nobtn\" class=\"btn\" onclick=\"hideDialog('none');\"><span>Nee</span></button>");
                $("#framework_dialog_yesbtn").click(function () {var x = $tabs.$lis.length; for (var cnt=0; cnt < x ; cnt++) $tabs.remove(0); hideDialog('none'); });
                
                showDialog("300px", "160px", "none", "Tabbladen sluiten");
            
            });
        $(".dock", this.list).unbind("click.fwtabs").bind("click.fwtabs", {tabs: this},
            function (event)
            {
                event.stopPropagation() ;
                if ($(".dock", event.data.tabs.list).hasClass("docked"))
                    event.data.tabs.undock();
                else
                    event.data.tabs.dock();
            });
        
    },
    // override remove function. has a bug with selecting the right tab    
    remove: function(index) {
		var o = this.options, $li = this.$lis.eq(index).remove(),
			$panel = this.$panels.eq(index).remove();

		// If selected tab was removed focus tab to the right or
		// in case the last tab was removed the tab to the left.
		// MB WAS: if ($li.hasClass(o.selectedClass) && this.$tabs.length > 1)
		if ((index == o.selected || o.selected <0) && this.$tabs.length > 1)
			this.select(index + (index + 1 < this.$tabs.length ? 1 : -1));
        
		o.disabled = $.map($.grep(o.disabled, function(n, i) { return n != index; }),
			function(n, i) { return n >= index ? --n : n });

		this._tabify();

        this.handlebuttons();
		// callback
		this._trigger('remove', null, this.ui($li.find('a')[0], $panel[0]));
	}
 });
    
$.extend($.ui.tabs, {
	defaults: {
	    /* MB Additions/changes */
	    allowclose: false,
	    allowdock: false,
	    allowcloseall: false,
	    tabTemplate: '<li class="tabpage"><a page="{tabname}" href="#{href}"><span>#{label}</span></a></li>',
        tabTemplateClose: '<li class="tabpage"><a page="{tabname}" href="#{href}"><span><div class="display">#{label}</div><div class="close"></div></span></a></li>',
        /* END Additions, rest is copy of original ( from jquery.ui.js) */
		ajaxOptions: null,
		cache: false,
		cookie: null, // e.g. { expires: 7, path: '/', domain: 'jquery.com', secure: true }
		deselectable: false,
		deselectableClass: 'ui-tabs-deselectable',
		disabled: [],
		disabledClass: 'ui-state-disabled',
		event: 'click',
		fx: null, // e.g. { height: 'toggle', opacity: 'toggle', duration: 200 }
		hideClass: 'ui-tabs-hide',
		idPrefix: 'ui-tabs-',
		loadingClass: 'ui-tabs-loading',
		navClass: 'ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all',
		tabClass: 'ui-state-default ui-corner-top',
		panelClass: 'ui-tabs-panel ui-widget-content ui-corner-bottom',
		panelTemplate: '<div></div>',
		selectedClass: 'ui-tabs-selected ui-state-active',
		spinner: 'Loading&#8230;'
		
	}
}); 

//$.extend($.ui.tabs.prototype, {
//    load: function(index, callback)
//    {
//	    var self = this, o = this.options, $a = this.$tabs.eq(index), a = $a[0],
//			    bypassCache = callback == undefined || callback === false, url = $a.data('load.tabs');

//	    callback = callback || function() {};

//	    // no remote or from cache - just finish with callback
//	    if (!url || !bypassCache && $.data(a, 'cache.tabs')) {
//		    callback();
//		    return;
//	    }
//	    
//        var canvas = $a.parent().parent().attr('canvas');
//        if (canvas == null)
//            self.load(index,callback);
//        
//        $a.addClass(o.loadingClass);
//        
//        _doCallBack("canvasevent", true, false,canvas, "tabrender" , $a.attr('page'), {target: index } );    
//        //_doCallBack("WF_WORKFLOWVALUEEVENT", false, false, wfId, a.parent().parent().attr('name'), "rendertab",  { page:  $a.attr("page"), target: a.hash} );
//       //canvasEvent(canvas, "tabrender", $a.attr('page'));
//       //tabRender($a.parent(), canvas, $a.attr('page') );
// 
//    },
//    
//    loadhtml: function(index, html)
//    {
//		var self = this, o = this.options, $a = this.$tabs.eq(index), a = $a[0];
//		

//    	$(this._sanitizeSelector(a.hash)).html(html);
////        this.$tabs.filter('.' + o.loadingClass).removeClass(o.loadingClass)
////					.each(function() {
////						if (o.spinner)
////							inner(this).parent().html(inner(this).data('label.tabs'));
////					});


//	    if (o.cache)
//    		$.data(a, 'cache.tabs', true); // if loaded once do not load them again

//    	// callbacks
//    	this._trigger('load', null, self.ui(self.$tabs[index], self.$panels[index]));
//    	// This callback is required because the switch has to take
//    	// place after loading has completed. Call last in order to
//    	// fire load before show callback...
//        self._trigger('show', null,
//						self.ui(self.$tabs[o.selected], self.$panels[o.selected]));    

////        if ($hide.length)
////    		switchTab(a, $li, $hide, $show);
////	    else
////	    {
//            //$("li",this).addClass(o.selectedClass).removeClass('ui-state-default');
//			//this.showTab(this, a);
////        }
//        $a.parent().addClass([o.selectedClass].join(' '))
//			        .siblings().removeClass([o.selectedClass]);
////        $a.removeClass('ui-state-default').addClass([o.selectedClass].join(' '))
////			        .siblings().removeClass([o.selectedClass].join(' ')).addClass('ui-state-default');
//        //this.switchTab(this, a, null, null);
//     }
//})



/* Start jqGrid support functions */
function stringToDoc(xmlString) {
			var xmlDoc;
			try	{
				var parser = new DOMParser();
				xmlDoc = parser.parseFromString(xmlString,"text/xml");
			}
			catch(e) {
				xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
				xmlDoc.async=false;
				xmlDoc["loadXM"+"L"](xmlString);
			}
			return (xmlDoc && xmlDoc.documentElement && xmlDoc.documentElement.tagName != 'parsererror') ? xmlDoc : null;
		}


function jqGrid_GetData(wfId, gridId,  postdata)
{   
    _doCallBack("WF_WORKFLOWVALUEEVENT", false, false, null,wfId, gridId, "gridevent",  postdata);
}
function jqGrid_Open(sender, gridId, postdata)
{   
    var wfId = null;
    if (!isGuid(sender))
        wfId = getWorkflowID(sender);
    else    
        wfId = sender;
    if (wfId==null)
        return;
           
    _doCallBack("WF_WORKFLOWVALUEEVENT",true , false, null,wfId, gridId + "|grid", "openinstance",  postdata);
}
function jqGrid_AddData(target, xmldata)
{
    var thegrid = jQuery(target)[0];
    if (thegrid.addXmlData)
        thegrid.addXmlData(stringToDoc(xmldata));
    }

function jqGrid_Event(sender, event)
{
    var wfId = getWorkflowID(sender);
    if (wfId==null)
        return;
       
    var args =[];
    for (count=2; count<jqGrid_Event.arguments.length; count++)
    {
        args[count-2] = jqGrid_Event.arguments[count];
    }
    workflowEvent(wfId, event, args);
}
//    doWithElement(target, 
//        function(element, xmldata) 
//        { 
//            element.addXmlData(element.stringToDoc(xmldata),grid.bDiv);
//            if(element.loadComplete) {element.loadComplete();}
//            //element.addXmlData(xmldata); 
//        }
//        , xmldata);
//}

/* START Autocomplete code */
/**
 *  author:		Timothy Groves - http://www.brandspankingnew.net
 *	version:	1.2 - 2006-11-17
 *              1.3 - 2006-12-04
 *              2.0 - 2007-02-07
 *
 */

var usefwns;

if (usefwns)
{
	if (typeof(fw) == "undefined")
		fw = {}
	_fw = fw;
}
else
{
	_fw = this;
}



if (typeof(_fw.Autosuggest) == "undefined")
	_fw.Autosuggest = {}

_fw.AutoSuggest = function (field, param)
{
	// no DOM - give up!
	//
	if (!document.getElementById)
		return false;
	
	
	
	
	// get field via DOM
	//
	this.fld = field;

	if (!this.fld)
		return false;
	
	// init variables
	//
	this.sInput 		= "";
	this.nInputChars 	= 0;
	this.aSuggestions 	= [];
	this.iHighlighted 	= 0;
	this.sLastGood      = "";
	
	
	
	
	// parameters object
	//
	this.oP = (param) ? param : {};
	
	// defaults	
	//
	if (!this.oP.minchars)									this.oP.minchars = 1;
	if (!this.oP.limittolist)                               this.oP.limittolist= false;
	if (!this.oP.method)									this.oP.meth = "get";
	if (!this.oP.varname)									this.oP.varname = "input";
	if (!this.oP.className)									this.oP.className = "autosuggest";
	if (!this.oP.timeout)									this.oP.timeout = 2500;
	if (!this.oP.delay)										this.oP.delay = 500;
	if (!this.oP.offsety)									this.oP.offsety = -5;
	if (!this.oP.offsetx)									this.oP.offsety = 0;
	if (!this.oP.shownoresults)								this.oP.shownoresults = true;
	if (!this.oP.noresults)									this.oP.noresults = "Geen resultaat!";
	if (!this.oP.maxheight && this.oP.maxheight !== 0)		this.oP.maxheight = 250;
	if (!this.oP.cache && this.oP.cache != false)			this.oP.cache = true;
	
	// set keyup handler for field
	// and prevent autocomplete from client
	//
	var pointer = this;
	
	// NOTE: not using addEventListener because UpArrow fired twice in Safari
	//_fw.DOM.addEvent( this.fld, 'keyup', function(ev){ return pointer.onKeyPress(ev); } );
	
	this.fld.onkeypress 	= function(ev){ return pointer.onKeyPress(ev); }
	this.fld.onkeyup 		= function(ev){ return pointer.onKeyUp(ev); }
	this.fld.onblur         = function(){ pointer.onBlur(); }
	this.fld.setAttribute("autocomplete","off");
	
}

_fw.AutoSuggest.prototype.onBlur = AutoSuggest_onBlur;
function AutoSuggest_onBlur()
{
	
    //syncValue(this.fld, "value_id");
    if (this.fld.value == "")
    {
        this.fld.value_id = "";
        syncValue(this.fld,"value_id");
        this.clearSuggestions();
    }
    else
        this.setHighlightedValue(true);
}


_fw.AutoSuggest.prototype.onKeyPress = AutoSuggest_onKeyPress;
function AutoSuggest_onKeyPress(ev)
{
	
	var key = (window.event) ? window.event.keyCode : ev.keyCode;



	// set responses to keydown events in the field
	// this allows the user to use the arrow keys to scroll through the results
	// ESCAPE clears the list
	// TAB sets the current highlighted value
	//
	var RETURN = 13;
	var TAB = 9;
	var ESC = 27;
	
	var bubble = true;

	switch(key)
	{

		case RETURN:
		    if (this.fld.value == "")
            {
                this.fld.value_id = "";
                syncValue(this.fld,"value_id");
                this.clearSuggestions();
            }
            else
    			this.setHighlightedValue();
			bubble = false;
			break;


		case ESC:
			this.clearSuggestions();
			break;
	}

	return bubble;
}



_fw.AutoSuggest.prototype.onKeyUp = AutoSuggest_onKeyUp;
function AutoSuggest_onKeyUp(ev)
{

	
	var key = (window.event) ? window.event.keyCode : ev.keyCode;
	


	// set responses to keydown events in the field
	// this allows the user to use the arrow keys to scroll through the results
	// ESCAPE clears the list
	// TAB sets the current highlighted value
	//

	var ARRUP = 38;
	var ARRDN = 40;
	
	var bubble = true;

	switch(key)
	{


		case ARRUP:
			this.changeHighlight(key);
			bubble = false;
			break;


		case ARRDN:
			this.changeHighlight(key);
			bubble = false;
			break;
		
		
		default:
			
			this.getSuggestions(this.fld.value);
	}

	return bubble;
	

}








_fw.AutoSuggest.prototype.getSuggestions = AutoSuggest_getSuggestions;
function AutoSuggest_getSuggestions(val)
{
	
	// if input stays the same, do nothing
	//
	if (val == this.sInput)
		return false;

	
	// input length is less than the min required to trigger a request
	// reset input string
	// do nothing
	//
	
	if (val.length < this.oP.minchars)
	{
		this.sInput = "";
		return false;
	}
	
	
	// if caching enabled, and user is typing (ie. length of input is increasing)
	// filter results out of aSuggestions from last request
	//
	if (val.length>this.nInputChars && this.aSuggestions.length && this.oP.cache && this.aSuggestions.length < this.oP.maxheight)
	{
		var arr = [];
		for (var i=0;i<this.aSuggestions.length;i++)
		{
			//if (this.aSuggestions[i].value.substr(0,val.length).toLowerCase() == val.toLowerCase())
			if (this.aSuggestions[i].value.toLowerCase().indexOf(val.toLowerCase()) > -1)
				arr.push( this.aSuggestions[i] );
		}
		
		if (this.oP.limittolist && arr.length == 0)
		{
			this.fld.value = this.sInput;
			return false;
		}
			
		this.sInput = val;
		this.nInputChars = val.length;
		this.aSuggestions = arr;
		
		this.createList(this.aSuggestions);
		
		
		
		return false;
	}
	else
	// do new request
	//
	{
		this.sInput = val;
		this.nInputChars = val.length;


		var pointer = this;
		

		propertyEvent(getAttributeCustom(pointer.fld, "canvas"), getAttributeCustom(pointer.fld, "property"), 'UpdateList', pointer.sInput);
		//clearTimeout(this.ajID);
		//this.ajID = setTimeout( function() { pointer.doAjaxRequest() }, this.oP.delay );
	}

	return false;
}



_fw.AutoSuggest.prototype.setSuggestions = AutoSuggest_setSuggestions;
function AutoSuggest_setSuggestions(req)
{
	this.aSuggestions = [];
	
	if ((!req || req.length == 0) && this.oP.limittolist)
	{
		this.sInput = this.sLastGood;
		this.nInputChars = this.sInput.length;
		this.fld.value = this.sInput;
		this.iHighlighted = 0;
		return;
	
	}
	var sugs = req.split("~");
	for(i=0; i< sugs.length-1; i+=2)
	{
	    this.aSuggestions.push( {'id': sugs[i], 'value': sugs[i+1], 'info': ''});
	}
//	if (this.oP.json)
//	{
//		var jsondata = eval('(' + req.responseText + ')');
//		
//		for (var i=0;i<jsondata.results.length;i++)
//		{
//			this.aSuggestions.push(  { 'id':jsondata.results[i].id, 'value':jsondata.results[i].value, 'info':jsondata.results[i].info }  );
//		}
//	}
//	else
//	{

//		var xml = req.responseXML;
//	
//		// traverse xml
//		//
//		var results = xml.getElementsByTagName('results')[0].childNodes;

//		for (var i=0;i<results.length;i++)
//		{
//			if (results[i].hasChildNodes())
//				this.aSuggestions.push(  { 'id':results[i].getAttribute('id'), 'value':results[i].childNodes[0].nodeValue, 'info':results[i].getAttribute('info') }  );
//		}
//	
//	}
	
	this.idAs = "as_"+this.fld.id;
	
	if (this.aSuggestions.length > 0)
		this.sLastGood = this.sInput;
	else if (this.oP.limittolist)
	{
		this.sInput = this.sLastGood;
		this.nInputChars = this.sInput.length;
		this.fld.value = this.sInput;
		this.iHighlighted = 0;
		return;
	}
		
	this.createList(this.aSuggestions);

}














_fw.AutoSuggest.prototype.createList = AutoSuggest_createList;
function AutoSuggest_createList(arr)
{
	var pointer = this;
	
	
	// get rid of old list
	// and clear the list removal timeout
	//
	_fw.DOM.removeElement(this.idAs);
	this.killTimeout();
	
	
	// create holding div
	//
	var div = _fw.DOM.createElement("div", {id:this.idAs, className:this.oP.className});	
	
	var hcorner = _fw.DOM.createElement("div", {className:"as_corner"});
	var hbar = _fw.DOM.createElement("div", {className:"as_bar"});
	var header = _fw.DOM.createElement("div", {className:"as_header"});
	header.appendChild(hcorner);
	header.appendChild(hbar);
	div.appendChild(header);
	
	
	
	
	// create and populate ul
	//
	var ul = _fw.DOM.createElement("ul", {id:"as_ul"});
	
	
	
	
	// loop throught arr of suggestions
	// creating an LI element for each suggestion
	//
	for (var i=0;i<arr.length;i++)
	{
		// format output with the input enclosed in a EM element
		// (as HTML, not DOM)
		//
		var val = arr[i].value;
		var st = val.toLowerCase().indexOf( this.sInput.toLowerCase() );
		var output = val.substring(0,st) + "<b>" + val.substring(st, st+this.sInput.length) + "</b>" + val.substring(st+this.sInput.length);
		
		
		var span 		= _fw.DOM.createElement("span", {}, output, true);
		if (arr[i].info != "")
		{
			var br			= _fw.DOM.createElement("br", {});
			span.appendChild(br);
			var small		= _fw.DOM.createElement("small", {}, arr[i].info);
			span.appendChild(small);
		}
		
		var a 			= _fw.DOM.createElement("a", { href:"#" });
		
		var tl 		= _fw.DOM.createElement("span", {className:"tl"}, " ");
		var tr 		= _fw.DOM.createElement("span", {className:"tr"}, " ");
		a.appendChild(tl);
		a.appendChild(tr);
		
		a.appendChild(span);
		
		a.name = i+1;
		a.onclick = function () { pointer.setHighlightedValue(); return false; }
		a.onmouseover = function () { pointer.setHighlight(this.name); }
		
		var li 			= _fw.DOM.createElement(  "li", {}, a  );
		
		ul.appendChild( li );
	}
	
	
	// no results
	//
	if (arr.length == 0)
	{
		var li 			= _fw.DOM.createElement(  "li", {className:"as_warning"}, this.oP.noresults  );
		
		ul.appendChild( li );
	}
	
	
	div.appendChild( ul );
	
	
	var fcorner = _fw.DOM.createElement("div", {className:"as_corner"});
	var fbar = _fw.DOM.createElement("div", {className:"as_bar"});
	var footer = _fw.DOM.createElement("div", {className:"as_footer"});
	footer.appendChild(fcorner);
	footer.appendChild(fbar);
	div.appendChild(footer);
	
	
	
	// get position of target textfield
	// position holding div below it
	// set width of holding div to width of field
	//
	var pos = _fw.DOM.getPos(this.fld);
	
	div.style.left 		= (pos.x + this.oP.offsetx) + "px";
	div.style.top 		= ( pos.y + this.fld.offsetHeight + this.oP.offsety ) + "px";
	div.style.width 	= this.fld.offsetWidth + "px";
	
	
	
	// set mouseover functions for div
	// when mouse pointer leaves div, set a timeout to remove the list after an interval
	// when mouse enters div, kill the timeout so the list won't be removed
	//
	div.onmouseover 	= function(){ pointer.killTimeout() }
	div.onmouseout 		= function(){ pointer.resetTimeout() }


	// add DIV to document
	//
	document.getElementsByTagName("body")[0].appendChild(div);
	
	
	
	// currently no item is highlighted
	//
	if (arr.length > 0)
	    this.setHighlight(1);
	else
	    this.iHighlighted = 0;
	
	
	
	
	
	
	// remove list after an interval
	//
	var pointer = this;
	//this.toID = setTimeout(function () { pointer.clearSuggestions() }, this.oP.timeout);
}


_fw.AutoSuggest.prototype.changeHighlight = AutoSuggest_changeHighlight;
function AutoSuggest_changeHighlight(key)
{	
	var list = _fw.DOM.getElement("as_ul");
	if (!list)
		return false;
	
	var n;

	if (key == 40)
		n = this.iHighlighted + 1;
	else if (key == 38)
		n = this.iHighlighted - 1;
	
	
	if (n > list.childNodes.length)
		n = list.childNodes.length;
	if (n < 1)
		n = 1;
	
	
	this.setHighlight(n);
}



_fw.AutoSuggest.prototype.setHighlight = AutoSuggest_setHighlight;
function AutoSuggest_setHighlight(n)
{
	var list = _fw.DOM.getElement("as_ul");
	if (!list)
		return false;
	
	if (this.iHighlighted > 0)
		this.clearHighlight();
	
	this.iHighlighted = Number(n);
	
	list.childNodes[this.iHighlighted-1].className = "as_highlight";


	this.killTimeout();
}


_fw.AutoSuggest.prototype.clearHighlight = AutoSuggest_clearHighlight;
function AutoSuggest_clearHighlight()
{
	var list = _fw.DOM.getElement("as_ul");
	if (!list)
		return false;
	
	if (this.iHighlighted > 0 && list.childNodes.length >= this.iHighlighted)
	{
        list.childNodes[this.iHighlighted-1].className = "";
		this.iHighlighted = 0;
	}
}


_fw.AutoSuggest.prototype.setHighlightedValue = AutoSuggest_setHighlightedValue
function AutoSuggest_setHighlightedValue(disablesetfocus)
{
	if (this.iHighlighted && this.iHighlighted <= this.aSuggestions.length)
	{
	  this.fld.value_id = this.aSuggestions[ this.iHighlighted-1 ].id;
		this.sInput = this.fld.value = this.aSuggestions[ this.iHighlighted-1 ].value;
		
		// move cursor to end of input (safari)
		//
		if (!disablesetfocus)
			this.fld.focus();
		if (this.fld.selectionStart)
			this.fld.setSelectionRange(this.sInput.length, this.sInput.length);
		

		this.clearSuggestions();
		
		// pass selected object to callback function, if exists
		//
		if (typeof(this.oP.callback) == "function")
			this.oP.callback( this.aSuggestions[this.iHighlighted-1], this.fld );
	}
	else
	    this.clearSuggestions();
}


_fw.AutoSuggest.prototype.killTimeout = AutoSuggest_killTimeout;
function AutoSuggest_killTimeout()
{
	clearTimeout(this.toID);
}

_fw.AutoSuggest.prototype.resetTimeout = AutoSuggest_resetTimeout;
function AutoSuggest_resetTimeout()
{
	clearTimeout(this.toID);
	var pointer = this;
	//this.toID = setTimeout(function () { pointer.clearSuggestions() }, 1000);
}







_fw.AutoSuggest.prototype.clearSuggestions = AutoSuggest_clearSuggestions;
function AutoSuggest_clearSuggestions()
{
	
	this.killTimeout();
	
	var ele = _fw.DOM.getElement(this.idAs);
	var pointer = this;
	if (ele)
	{
		//var fade = new _fw.Fader(ele,1,0,250,function () { _fw.DOM.removeElement(pointer.idAs) });
		_fw.DOM.removeElement(pointer.idAs);
	}
}




// DOM PROTOTYPE _____________________________________________


if (typeof(_fw.DOM) == "undefined")
	_fw.DOM = {}

_fw.DOM.createElement = function ( type, attr, cont, html )
{
	var ne = document.createElement( type );
	if (!ne)
		return false;
		
	for (var a in attr)
		ne[a] = attr[a];
		
	if (typeof(cont) == "string" && !html)
		ne.appendChild( document.createTextNode(cont) );
	else if (typeof(cont) == "string" && html)
		ne.innerHTML = cont;
	else if (typeof(cont) == "object")
		ne.appendChild( cont );

	return ne;
}





_fw.DOM.clearElement = function ( id )
{
	var ele = this.getElement( id );
	
	if (!ele)
		return false;
	
	while (ele.childNodes.length)
		ele.removeChild( ele.childNodes[0] );
	
	return true;
}









_fw.DOM.removeElement = function ( ele )
{
	var e = this.getElement(ele);
	
	if (!e)
		return false;
	else if (e.parentNode.removeChild(e))
		return true;
	else
		return false;
}





_fw.DOM.replaceContent = function ( id, cont, html )
{
	var ele = this.getElement( id );
	
	if (!ele)
		return false;
	
	this.clearElement( ele );
	
	if (typeof(cont) == "string" && !html)
		ele.appendChild( document.createTextNode(cont) );
	else if (typeof(cont) == "string" && html)
		ele.innerHTML = cont;
	else if (typeof(cont) == "object")
		ele.appendChild( cont );
}









_fw.DOM.getElement = function ( ele )
{
	if (typeof(ele) == "undefined")
	{
		return false;
	}
	else if (typeof(ele) == "string")
	{
		var re = document.getElementById( ele );
		if (!re)
			return false;
		else if (typeof(re.appendChild) != "undefined" ) {
			return re;
		} else {
			return false;
		}
	}
	else if (typeof(ele.appendChild) != "undefined")
		return ele;
	else
		return false;
}


_fw.DOM.appendChildren = function ( id, arr )
{
	var ele = this.getElement( id );
	
	if (!ele)
		return false;
	
	
	if (typeof(arr) != "object")
		return false;
		
	for (var i=0;i<arr.length;i++)
	{
		var cont = arr[i];
		if (typeof(cont) == "string")
			ele.appendChild( document.createTextNode(cont) );
		else if (typeof(cont) == "object")
			ele.appendChild( cont );
	}
}

_fw.DOM.getPos = function ( ele )
{
	var ele = this.getElement(ele);

	var obj = ele;

	var curleft = 0;
	if (obj.offsetParent)
	{
		while (obj.offsetParent)
		{
			curleft += obj.offsetLeft
			obj = obj.offsetParent;
		}
	}
	else if (obj.x)
		curleft += obj.x;


	var obj = ele;
	
	var curtop = 0;
	if (obj.offsetParent)
	{
		while (obj.offsetParent)
		{
			curtop += obj.offsetTop
			obj = obj.offsetParent;
		}
	}
	else if (obj.y)
		curtop += obj.y;

	return {x:curleft, y:curtop}
}
/* END AUTOCOMPLETE CODE */

/* DATE Functions */
var MONTH_NAMES=new Array('January','February','March','April','May','June','July','August','September','October','November','December','Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec');
var DAY_NAMES=new Array('Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday','Sun','Mon','Tue','Wed','Thu','Fri','Sat');
function LZ(x) {return(x<0||x>9?"":"0")+x}

function isDate(val,format) {
	var date=getDateFromFormat(val,format);
	if (date==0) { return false; }
	return true;
	}

function compareDates(date1,dateformat1,date2,dateformat2) {
	var d1=getDateFromFormat(date1,dateformat1);
	var d2=getDateFromFormat(date2,dateformat2);
	if (d1==0 || d2==0) {
		return -1;
		}
	else if (d1 > d2) {
		return 1;
		}
	return 0;
	}

function formatDate(date,format) {
	format=format+"";
	var result="";
	var i_format=0;
	var c="";
	var token="";
	var y=date.getYear()+"";
	var M=date.getMonth()+1;
	var d=date.getDate();
	var E=date.getDay();
	var H=date.getHours();
	var m=date.getMinutes();
	var s=date.getSeconds();
	var yyyy,yy,MMM,MM,dd,hh,h,mm,ss,ampm,HH,H,KK,K,kk,k;
	// Convert real date parts into formatted versions
	var value=new Object();
	if (y.length < 4) {y=""+(y-0+1900);}
	value["y"]=""+y;
	value["yyyy"]=y;
	value["yy"]=y.substring(2,4);
	value["M"]=M;
	value["MM"]=LZ(M);
	value["MMM"]=MONTH_NAMES[M-1];
	value["NNN"]=MONTH_NAMES[M+11];
	value["d"]=d;
	value["dd"]=LZ(d);
	value["E"]=DAY_NAMES[E+7];
	value["EE"]=DAY_NAMES[E];
	value["H"]=H;
	value["HH"]=LZ(H);
	if (H==0){value["h"]=12;}
	else if (H>12){value["h"]=H-12;}
	else {value["h"]=H;}
	value["hh"]=LZ(value["h"]);
	if (H>11){value["K"]=H-12;} else {value["K"]=H;}
	value["k"]=H+1;
	value["KK"]=LZ(value["K"]);
	value["kk"]=LZ(value["k"]);
	if (H > 11) { value["a"]="PM"; }
	else { value["a"]="AM"; }
	value["m"]=m;
	value["mm"]=LZ(m);
	value["s"]=s;
	value["ss"]=LZ(s);
	while (i_format < format.length) {
		c=format.charAt(i_format);
		token="";
		while ((format.charAt(i_format)==c) && (i_format < format.length)) {
			token += format.charAt(i_format++);
			}
		if (value[token] != null) { result=result + value[token]; }
		else { result=result + token; }
		}
	return result;
	}
	
function _isInteger(val) {
	var digits="1234567890";
	for (var i=0; i < val.length; i++) {
		if (digits.indexOf(val.charAt(i))==-1) { return false; }
		}
	return true;
	}
function _getInt(str,i,minlength,maxlength) {
	for (var x=maxlength; x>=minlength; x--) {
		var token=str.substring(i,i+x);
		if (token.length < minlength) { return null; }
		if (_isInteger(token)) { return token; }
		}
	return null;
	}
	
function getDateFromFormat(val,format) {
	val=val+"";
	format=format+"";
	var i_val=0;
	var i_format=0;
	var c="";
	var token="";
	var token2="";
	var x,y;
	var now=new Date();
	var year=now.getYear();
	var month=now.getMonth()+1;
	var date=1;
	var hh=now.getHours();
	var mm=now.getMinutes();
	var ss=now.getSeconds();
	var ampm="";
	
	while (i_format < format.length) {
		// Get next token from format string
		c=format.charAt(i_format);
		token="";
		while ((format.charAt(i_format)==c) && (i_format < format.length)) {
			token += format.charAt(i_format++);
			}
		// Extract contents of value based on format token
		if (token=="yyyy" || token=="yy" || token=="y") {
			if (token=="yyyy") { x=4;y=4; }
			if (token=="yy")   { x=2;y=2; }
			if (token=="y")    { x=2;y=4; }
			year=_getInt(val,i_val,x,y);
			if (year==null) { return 0; }
			i_val += year.length;
			if (year.length==2) {
				if (year > 30) { year=1900+(year-0); }
				else { year=2000+(year-0); }
				}
			}
		else if (token=="MMM"||token=="NNN"){
			month=0;
			for (var i=0; i<MONTH_NAMES.length; i++) {
				var month_name=MONTH_NAMES[i];
				if (val.substring(i_val,i_val+month_name.length).toLowerCase()==month_name.toLowerCase()) {
					if (token=="MMM"||(token=="NNN"&&i>11)) {
						month=i+1;
						if (month>12) { month -= 12; }
						i_val += month_name.length;
						break;
						}
					}
				}
			if ((month < 1)||(month>12)){return 0;}
			}
		else if (token=="EE"||token=="E"){
			for (var i=0; i<DAY_NAMES.length; i++) {
				var day_name=DAY_NAMES[i];
				if (val.substring(i_val,i_val+day_name.length).toLowerCase()==day_name.toLowerCase()) {
					i_val += day_name.length;
					break;
					}
				}
			}
		else if (token=="MM"||token=="M") {
			month=_getInt(val,i_val,token.length,2);
			if(month==null||(month<1)||(month>12)){return 0;}
			i_val+=month.length;}
		else if (token=="dd"||token=="d") {
			date=_getInt(val,i_val,token.length,2);
			if(date==null||(date<1)||(date>31)){return 0;}
			i_val+=date.length;}
		else if (token=="hh"||token=="h") {
			hh=_getInt(val,i_val,token.length,2);
			if(hh==null||(hh<1)||(hh>12)){return 0;}
			i_val+=hh.length;}
		else if (token=="HH"||token=="H") {
			hh=_getInt(val,i_val,token.length,2);
			if(hh==null||(hh<0)||(hh>23)){return 0;}
			i_val+=hh.length;}
		else if (token=="KK"||token=="K") {
			hh=_getInt(val,i_val,token.length,2);
			if(hh==null||(hh<0)||(hh>11)){return 0;}
			i_val+=hh.length;}
		else if (token=="kk"||token=="k") {
			hh=_getInt(val,i_val,token.length,2);
			if(hh==null||(hh<1)||(hh>24)){return 0;}
			i_val+=hh.length;hh--;}
		else if (token=="mm"||token=="m") {
			mm=_getInt(val,i_val,token.length,2);
			if(mm==null||(mm<0)||(mm>59)){return 0;}
			i_val+=mm.length;}
		else if (token=="ss"||token=="s") {
			ss=_getInt(val,i_val,token.length,2);
			if(ss==null||(ss<0)||(ss>59)){return 0;}
			i_val+=ss.length;}
		else if (token=="a") {
			if (val.substring(i_val,i_val+2).toLowerCase()=="am") {ampm="AM";}
			else if (val.substring(i_val,i_val+2).toLowerCase()=="pm") {ampm="PM";}
			else {return 0;}
			i_val+=2;}
		else {
			if (val.substring(i_val,i_val+token.length)!=token) {return 0;}
			else {i_val+=token.length;}
			}
		}
	// If there are any trailing characters left in the value, it doesn't match
	if (i_val != val.length) { return 0; }
	// Is date valid for month?
	if (month==2) {
		// Check for leap year
		if ( ( (year%4==0)&&(year%100 != 0) ) || (year%400==0) ) { // leap year
			if (date > 29){ return 0; }
			}
		else { if (date > 28) { return 0; } }
		}
	if ((month==4)||(month==6)||(month==9)||(month==11)) {
		if (date > 30) { return 0; }
		}
	// Correct hours value
	if (hh<12 && ampm=="PM") { hh=hh-0+12; }
	else if (hh>11 && ampm=="AM") { hh-=12; }
	var newdate=new Date(year,month-1,date,hh,mm,ss);
	return newdate.getTime();
	}


function parseDate(val) {
	var preferEuro=(arguments.length==2)?arguments[1]:false;
	generalFormats=new Array('y-M-d','MMM d, y','MMM d,y','y-MMM-d','d-MMM-y','MMM d');
	monthFirst=new Array('M/d/y','M-d-y','M.d.y','MMM-d','M/d','M-d');
	dateFirst =new Array('d/M/y','d-M-y','d.M.y','d-MMM','d/M','d-M');
	var checkList=new Array('generalFormats',preferEuro?'dateFirst':'monthFirst',preferEuro?'monthFirst':'dateFirst');
	var d=null;
	for (var i=0; i<checkList.length; i++) {
		var l=window[checkList[i]];
		for (var j=0; j<l.length; j++) {
			d=getDateFromFormat(val,l[j]);
			if (d!=0) { return new Date(d); }
			}
		}
	return null;
	}
/* End Date functions */




