var standardGridWidth = (screen.width -50);
var standardGridHeight = (screen.height - 290);
var currentSelectedRow = 0;
var popupState='close';
var gridInstance = null;
var hasFocus = true;
var popupWidth = document.body.clientWidth/4;
var popupHeight = document.body.clientHeight/4;

    /* ==========================   HANDLER AND FUNCTIONS <START>    ============================ */

    function prepareStringForSQL(str){
        if(str)
            return str.replace(/'/g,"''");
        return "";
    }


    function saveComments() {
        var comments = trimString(jQuery("#comment").val());

        if(comments.length > 0) {
            comments = prepareStringForSQL(comments);
            var commentObj = jQuery("#comment");
            var params = "actionType=saveComments&id="+commentObj.attr("toDoId")+"&comments="+encodeURIComponent(comments)
                    +"&assignBy="+commentObj.attr("taskOwnderId");

            DWRRedirector.getForwardTo ("/billing/manageToDoList.do",params,function(data) {
                var json = eval("("+data+")");
                if(json.commentsHistory && json.commentsHistory.length > 0){
                    //jQuery("#commentsHistory").val('');
                    jQuery("#commentsHistory").val(json.commentsHistory);
                    jQuery("#commentsHistory").empty();
                    jQuery("#commentsHistory").prepend(json.commentsHistory);

                    jQuery("#comment").val('');
                }
            });

        } else {
            jQuery("#comment").val("");
            alert("Please enter comments");;
        }

    }

    function commentEnterKeyHandler() {
        var event = window.event;
        
        // 'ENTER KEY'
        if(event.keyCode == 13){
            saveComments();
        }
    }

    function customValidation(postData, formId){
        var isContinue = (postData.assignTo > 0);
        var msg;
        if(!isContinue)
            msg = "Assign To: Field is required";
        
        return[isContinue,msg];
    }
    
    function validateDates(postData, formId){
    	
    	var startDate = postData.startDate;
    	var endDate = postData.endDate;
    	/*var dt1  = parseInt(startDate.substring(0,2),11);
	    var mon1 = parseInt(startDate.substring(3,5),10);
	    var yr1  = parseInt(startDate.substring(6,10),10);
	    var dt2  = parseInt(endDate.substring(0,2),10);
	    var mon2 = parseInt(endDate.substring(3,5),10);
	    var yr2  = parseInt(endDate.substring(6,10),10);*/
	    var date1 = jQuery.datepicker.parseDate('mm-dd-yy',startDate); //new Date(yr1, mon1, dt1);
	    var date2 = jQuery.datepicker.parseDate('mm-dd-yy',endDate);//new Date(yr2, mon2, dt2);
	    var isContinue;
	    
	    if(date2 < date1)
	    {
	    	isContinue = false;
	    }
	    else
    	{
	    	isContinue = true;
    	}
        var msg;
        if(!isContinue)
            msg = "Start Date cannot be greater than Due Date";
        
        return[isContinue,msg];
    }

    function validateStatus(){
        var childs = jQuery("#status").children();
        var statusValue = jQuery("#status").val();
        for (var i=0; i<childs.length; i++) {

            if(childs[i].value == statusValue) {
                break;
            }
            jQuery(childs[i]).remove();
        }
    }

    function showHideEditIcon(show, gridId){
        if(!show)
            jQuery("#edit_"+gridId).css({display:"none"});
        else
            jQuery("#edit_"+gridId).css({display:"inline"});
    }

    function enableSearch(gridInstance) {

        var gridId = gridInstance.attr("id");
        
        // Grid makes search dialog;
        var filterGrid = jQuery("#mySearchDialog").filterGrid(gridId, {
            gridModel:true,
            gridNames:true,
            formtype:"vertical",
            enableSearch:true,
            enableClear:false,	
            autosearch: false,
            beforeSearch:function() {
        	
                var assign = jQuery("input:radio:checked").val();
                var documentTodo= jQuery("#documentTodo").val();
                var assignToId = jQuery("#mySearchDialog").find("[id=assignTo]").val();
                var params = {
                    userType:jQuery("#assignToUserType").val(),
                    userId:assignToId,
                    assignToMe:assign,
                    toDoTypeId:jQuery("#sg_toDoTypeId").val(),
                    createdOnFrom:jQuery("#sg_createdon_from").val(),
                    createdOnTo:jQuery("#sg_createdon_to").val(),
                    toDoIdentifier:jQuery("#documentTodo").val()
                };

                var gridInstance = jQuery("#"+gridId);
                gridInstance.appendPostData(params);
                showHideGridHeaders(assign);
                jQuery("#assign").val(assign);
                jQuery("#documentTodo").val(documentTodo);
                //alert(jQuery("#assignToUserType").val() +" , "+jQuery("#sg_toDoTypeId").val() +" , "+jQuery("#sg_createdon_from").val()+" , "+jQuery("#sg_createdon_to").val()+", "+assign);
            },
            afterSearch : function() {
                jQuery("#mySearchDialog").dialog('close');
            }
        });

        
        gridInstance.jqGrid('navSeparatorAdd',gridInstance.getGridParam("pager"),{
            caption:"Separator",
            title:"Separator"

            // Adding Custom Search functionality;
        }).navButtonAdd(gridInstance.getGridParam("pager"),{
            caption:"Search",
            title:"Search",
            id:"search_toDoListGrid",
            buttonImage:"",
            onClickButton:function() {
                openSearchDialog();
            }

        }).navSeparatorAdd(gridInstance.getGridParam("pager"),{
            caption:"Separator",
            title:"Separator"

            // Adding Clear Search functionality;
        }).navButtonAdd(gridInstance.getGridParam("pager"),{
            caption:"Clear Search",
            title:"Clear Search",
            onClickButton:function() {
                var gridInstance = getToDoGridInstance();
                customClearSearch();
                jQuery(".filterform")[0].reset();
                filterGrid[0].clearSearch();
            }

        }).navSeparatorAdd(gridInstance.getGridParam("pager"),{
            caption:"Separator",
            title:"Separator"
        });
         
        // Modifying grid's cerated dialog to meet our needs;
        modifySearchDialog();
    }

    function customClearSearch() {

        // reset 'assign' value;
        jQuery("#assign").val("1");

        showHideGridHeaders(jQuery("#assign").val());
    }

    function enableRefresh(gridInstance) {

        var gridId = gridInstance.attr("id");

        gridInstance.jqGrid('navButtonAdd',gridInstance.getGridParam("pager"),{caption:"Refresh",title:"Refresh",
            onClickButton:function() {
                gridInstance.trigger('reloadGrid');
            }
        });
    }

    function showHideGridHeaders(assign) {
        if (assign == 0) {
            gridInstance.hideCol("assignBy");
            gridInstance.showCol("assignTo");

        } else {
            gridInstance.hideCol("assignTo");
            gridInstance.showCol("assignBy");
        }
    }

    function enableDelete(gridInstance){
        // Adding Delete search button on navigation bar;
        gridInstance.jqGrid('navButtonAdd',gridInstance.getGridParam("pager"),{caption:"Delete",title:"Delete",
            onClickButton:function() {
                var rowData = gridInstance.getRowData(gridInstance.getGridParam("selrow"));
                var selectedIds = getToDoGridInstance().getGridParam("selarrrow");
                
                if(selectedIds.length <= 0)
            	{
                	alert("Please select a record to delete.");
                	return;
            	}
                
                if(selectedIds.length > 1)
            	{
                	alert("Multiple To Do can not be deleted.");
                	return;
            	}

                // Only Task Owner can delete task; 
                 if(rowData.assignByUserId == loggedInUserId){
                     gridInstance.delGridRow(gridInstance.getGridParam("selrow"),{
                         drag:false,
                         modal:true,
                         reloadAfterSubmit:true,
                         msg:"Delete selected record ?",
                         resize:false,
                         afterShowForm:function() {
                             fixJqGridOverlay();
                             setDivtoCenterOfScreen("#delmod"+getToDoGridInstance().attr("id"));
                         }
                     });

                 } else {
                     jQuery("#alertDialog").dialog({
                         resizable:false,
                         draggable:false,
                         modal:true,
                         close: function(){
                             jQuery(this).empty();
                         },
                         open:function(){
                             jQuery(this).append("Task can only be deleted by initiator");
                         },
                         Caption:"",
                         title:"Alert"

                     });
                 }
            }
        });
    }

    function openSearchDialog() {
       jQuery("#mySearchDialog").dialog({
           open:function() {
               setDivtoCenterOfScreen(jQuery(this).attr("id"));
               // Setting 'assignto' value;
               jQuery("input[value='"+jQuery("#assign").val()+"']").attr("checked",true).click();
           },
           
           close:function() {
               jQuery(this).dialog('destroy');
           },
           title:"Search To-Do Tasks",
           width:screen.width - 700,
           modal:true,
           draggable:false,
           resizable:false	
       });
    }

    function writeAssignmentLabel(){

        var checkedRadioObj = jQuery("input:radio:checked");
        var assignLabelObj = jQuery("label[for^='assign']");

        if(checkedRadioObj.val() == 1) {
            assignLabelObj.text("Assigned By");
            enableDisableAssignTo(false);

        } else if(checkedRadioObj.val() == 0){
            assignLabelObj.text("Assigned To");
            enableDisableAssignTo(false);

        } else if(checkedRadioObj.val() <= -1){
             enableDisableAssignTo(true);
        }
    }

    function modifySearchDialog() {

        // Customizing dropdowns; adding 'All' option;
        jQuery("<option value='-1' >All</option>").prependTo("#sg_status");
        jQuery("<option value='-1' >All</option>").prependTo("#sg_toDoTypeId");
        jQuery("<option value='-1' >All</option>").prependTo("#sg_priority");

        // Adding 'createdon' fields for search;
        jQuery("#mySearchDialog tbody").prepend("<tr><td>Created On</td><td><input type='text' id='sg_createdon_from' size='10' maxlength='10'/> &nbsp;<label style='font-size:22'>-</label> &nbsp;<input type='text' id='sg_createdon_to' size='10' maxlength='10'/> </td></tr>");
        jQuery("#mySearchDialog tbody").prepend("<tr><td>Assigned</td><td><input class='option' onclick='writeAssignmentLabel()' type='radio' name='assign' value='1'/>To Me <input type='radio' name='assign' onclick='writeAssignmentLabel()' class='option' value='0'/>By Me <input type='radio' name='assign' onclick='writeAssignmentLabel()' class='option' value='-1'/>Un Assigned</td></tr>");
        jQuery("#mySearchDialog tbody").prepend("<tr><td>Todo ID </td><td><input type='text' id='documentTodo'/> </td></tr>");
        

        // Customizing AssignBy;
        jQuery("#sg_assignBy").css({display:"none"});
        jQuery("#sg_assignBy").parent().append(assignTo);

        // Applying 'NoWrap' attribute to 'TD' which contains dropdown of users open
        jQuery(jQuery("#sg_assignBy").parent().parent().children().get(1)).attr("noWrap","noWrap");

        // Adding style to cancel button;
        jQuery("#sButton").attr("class","fm-button ui-state-default ui-corner-all");
        // Adding 'Cancel' button;
        jQuery(".filtertable tr td").last().append("<input type='button' class='fm-button ui-state-default ui-corner-all' name='cancel' value='Cancel'/>")
                .bind("click",function(){
            jQuery("#mySearchDialog").dialog("close");
        });
         //class='fm-button ui-state-default ui-corner-all'
        attacheFormFieldsEvents("#sg_startDate,#sg_endDate,#sg_createdon_from,#sg_createdon_to");

        //Reset search form;
        jQuery(".filterform")[0].reset();
    }

    function enableDisableAssignTo(checked){

        jQuery("#assignToUserType").attr("disabled",checked).val(-1);
        
        if(!jQuery("#assignTo").attr("disabled"))
            jQuery("#assignTo").attr("disabled",checked).val(-1);
    }
    function applyStaffOptions(options) {
        var colModel = options.gridOptions.colModel;
        var navigationOpt = options.navigationOptions;
        navigationOpt.edit = false;
        navigationOpt.search = false;
        navigationOpt.add = false;
        navigationOpt.del = false;
    }

    function applyPhyscianOptions(options) {
        var colModel = options.gridOptions.colModel;
    }

    function getColModelObjIndex(colModel, nameToFind) {
        var index;
        for(var i=0; i<colModel.length;i++) {
            if(nameToFind == colModel[i].name){
                index = i;
                break;
            }
        }
        return index;
    }

    function getToDoGridInstance(){
        if(gridInstance == undefined || gridInstance == null)
            return pendingToDoGrid;
        else
            return gridInstance;
    }

    function appendPostData(postData){
        postData.assignTo=jQuery("#assignTo").val();
        postData.assignToUserType =jQuery("#assignToUserType").val();
        postData.comments = jQuery("#statusComment").val();
        var selectedIds = getToDoGridInstance().getGridParam("selarrrow");
        var multipleIds="";
        if(selectedIds.length > 0)
        {
        	for(var index = 0; index < selectedIds.length; index++ )
    		{
        		multipleIds =multipleIds + selectedIds[index]+",";   
    		}
        }
        postData.todoIds =multipleIds;
    }

    function appendAssignTo(){
        jQuery("#assignTo.FormElement").remove();
        jQuery("#tr_assignTo td.DataTD").append(assignTo);
    }

    function resetAssignTo(){
        jQuery("#assignTo").val('-1');
        jQuery("#assignToUserType").val('-1');
    }

    function populateAssignTo() {
        var rowData = getToDoGridInstance().getRowData(getToDoGridInstance().getGridParam("selrow"));
        var obj = jQuery("#assignToUserType");
        obj.val(rowData.assignToType);
        obj.change();
        
        setTimeout(function(){
            jQuery("#assignTo").val(rowData.assignToUserId);
        },300);

    }

    function initializeDropDown(dropDownObj){

        dropDownObj.empty();
        dropDownObj.append("<option value='-1'>--Select--</option>");
        dropDownObj.attr("disabled",true);
    }

    function getUsers(obj) {
        var assignToDropDown  = jQuery(obj).parent().find("[id=assignTo]");
        if(obj.value != -1) {
            var params = "actionType=getUsers&assignToUserType="+obj.value;

            DWRRedirector.getForwardTo("/billing/manageToDoList.do",params,function(data) {
                var optionsHtml = data;

                assignToDropDown.attr("disabled",false);
                assignToDropDown.empty();
                assignToDropDown.append("<option value='-1'>--Select--</option>");
                assignToDropDown.append(optionsHtml);
                assignToDropDown = null;
            });
        } else{
            initializeDropDown(assignToDropDown);
        }
    }

    function setValidRequestedPage(gridInstance){
        var lastPage = gridInstance.getGridParam("lastpage");
        var requestedPage = gridInstance.getGridParam("page");
        if(requestedPage > lastPage) {
            gridInstance.setGridParam({page:lastPage});
        }

    }

    function setRowInfoImg(gridInstance,rowData, rowId) {
        var data = rowData;
        data.info="<img style='cursor:hand;' src='"+infoImgUrl+"infoImg.gif' onclick='displayAttendeeInformation("+rowId+","+rowData.assignByUserId+","+(data.info == 'Y'? true:false)+")'/>";
    }

    function setRowSelection(gridInstance) {

        var json = gridInstance.getGridParam("userData")[0];
        
        // Set selection to first row;
        var id = json.selectedRowId;
        if(id > 0) {
            gridInstance.setSelection(json.selectedRowId,true);
            showHideEditIcon(true,gridInstance.attr("id"));
        } else {
           showHideEditIcon(false,gridInstance.attr("id"));
        }
    }

    function autorefreshWidget(func, milli){

        setTimeout(milli,function(){
            alert(func)

           autorefreshWidget(mili,func);
        });
    }

    function fixJqGridOverlay(){
        jQuery(".jqmOverlay").css({position:'absolute',height:(screen.height)});
    }

    function setjqGridDoalogtoCenterOfScreen(gridId){
        setDivtoCenterOfScreen("#editmod"+gridId);
    }

    function setDivtoCenterOfScreen(divId){
        var div = jQuery(divId);
        var top = (screen.height / 2) - div.height()/2;
        var left = (screen.width / 2) - div.width()/2;
        div.css({top:top,left:left,zIndex:2000});

    }

    function displayAttendeeInformation(rowId,taskOwnderId, displayPatientInfo) {
        
        var params = "actionType=getAttendeeInfo&id=" + rowId+"&assignBy="+taskOwnderId;
        var pos = jQuery("#" + rowId).position();
        pos.left = '20px';
        DWRRedirector.getForwardTo("/billing/manageToDoList.do", params, function(data) {

            var json = eval("(" + data + ")");
            jQuery("#dialog").dialog({
                draggable:false,
                resizable:false,
                title:'To Do Details ',
                width:(screen.width - 600),
                modal:true,
                buttons:{
                  "Close":function(){
                      jQuery(this).dialog('close');
                  }
                },
                close: function() {
                    jQuery("#name").empty();
                    jQuery("#address").empty();
                    jQuery("#phone").empty();
                    jQuery("#hptitle").empty();
                    jQuery("#policy").empty();
                    jQuery("#comment").attr("toDoId",'0');
                    jQuery("#comment").val('');
                    jQuery("#commentsHistory").val('');
                    jQuery("#commentsHistory").empty();

                },
                open: function() {
                    if(displayPatientInfo){
                        jQuery("#patientInfo").css({display:'inline'});
                        jQuery("#name").empty();
                        jQuery("#address").empty();
                        jQuery("#phone").empty();
                        jQuery("#hptitle").empty();
                        jQuery("#policy").empty();
                        //jQuery("#instype").empty();

                        jQuery("#name").append(json.name);
                        jQuery("#address").append(json.address);
                        jQuery("#phone").append(json.phone);

                        if(json.hasOwnProperty("hptitle")) {
                            jQuery("#hptitle").append(json.hptitle);
                            jQuery("#policy").append(json.policyno);
                            //jQuery("#instype").append(json.instype);
                        }
                    } else {
                        jQuery("#patientInfo").css({display:'none'});
                    }
                    jQuery("#comment").attr("toDoId",rowId);
                    jQuery("#comment").attr("taskOwnderId",taskOwnderId);
                    jQuery("#commentsHistory").prepend(json.commentsHistory);
                    documentDetailGrid
                    //added by junaid for patient document module
                    if(json.documentDetailGrid.rows!=''){            
                    var todoDocumentGrid = jQuery("#documentDetailGrid").jqGrid( {
                        datatype: "json",
                        colNames:['Created On','Document', 'Category','Description','Review Status'],
                        colModel:[
                            {name:'Created On',index:'CreationDateTime',width:130, sortable:false,editable:false,align:"center"},
                            {name:'Document',index:'documentName',width:140,sortable:false,editable:false,align:"center"},
                            {name:'Category',index:'category',sortable:false,editable:false,align:"center"},
                            {name:'Description',index:'description',sortable:false,editable:false,align:"center"},
                            {name:'Review Status',index:'reviewStatus',sortable:false,editable:false,align:"center"}
                        ],
                        autowidth: true,
                        viewrecords: true,
                        height:100
                    }
                );
        
        	todoDocumentGrid[0].addJSONData(json.documentDetailGrid);
                    }
                    
                    
                    var taskGrid = jQuery("#taskHistoryGrid").jqGrid( {
                                    datatype: "json",
                                    colNames:['Assigned Date','Assigned By', 'Assigned To'],
                                    colModel:[
                                        {name:'Assigned On',index:'assignedOn',width:130, sortable:false,editable:false,align:"center"},
                                        {name:'assignBy',index:'assignBy',width:140,sortable:false,editable:false,align:"center"},
                                        {name:'assignTo',index:'assignTo',sortable:false,editable:false,align:"center"}
                                    ],
                                    autowidth: true,
                                    viewrecords: true,
                                    height:100
                                }
                            );
                    
                    taskGrid[0].addJSONData(json.taskHistoryJson);
                }
            });
            setDivtoCenterOfScreen("dialog");

        });
    }

    function attacheFormFieldsEvents(ids) {
        //'#startDate, #endDate'
        jQuery(ids).bind({
            keypress: function() {
                keyPressOnDate(jQuery(this).get(0));
            },
            blur:function() {
                blurOnDate(jQuery(this).get(0));
            },
            click: function() {
                jQuery(this).datepicker({
                    showOn: 'button',
                    buttonImage: calendarImagePath ,
                    buttonImageOnly: true,
                    dateFormat:'mm-dd-yy',
                    buttonText:"Calendar",
                    showAnim:false
                });
            }
        });
        jQuery(ids).click();
        jQuery(ids).unbind('click');

    }

    function getReminderTasks() {

        var params = "actionType=getPendingTasks";
        DWRRedirector.getForwardTo("/billing/manageToDoList.do", params, function(data) {

        });
    }

    function showReminderPopup(json) {

        if(popupState == "close") {
            jQuery("#realTime").css({display:'none'});
            jQuery("#delay").css({display:'none'});

            if(json.hasOwnProperty("realtimeMsg")){
                jQuery("#realTime").css({display:'inline'});
            }

            if(json.hasOwnProperty("delayMsg")) {
                jQuery("#delay").css({display:'inline'});
            }

            var popup = jQuery("#toDoNotifier");
            popup.css({position:'absolute', width:popupWidth, height:popupHeight, top:document.body.clientHeight - (popupHeight),left:document.body.clientWidth - (popupWidth)});
            popup.slideDown("normal");
            popupState="open";

            // Hide Reminder popup after 10 seconds;
            setTimeout("hideReminderPopup()",5000);
        }
    }

    function hideReminderPopup() {

        if(popupState == "open") {
            jQuery("#toDoNotifier").fadeOut("normal", function(){
                jQuery("#realTime").css({display:'none'});
                jQuery("#delay").css({display:'none'});

                popupState="close";
            });
        }
    }

    function hideFieldsForEditRow() {

        if(staffUser){
            jQuery("#tr_date").hide();
            jQuery("#tr_assignedBy").hide();
            jQuery("#tr_mappingname").hide();
            jQuery("#tr_description").hide();
            jQuery("#tr_type").hide();
            attacheFormFieldsEvents();
        }
    }

    function afterSubmitHandlerForEditRow(gridId, resp) {
        var gridInstance = jQuery("#" + gridId);
        var json = eval("(" + resp.responseText + ")");
        var rowData = gridInstance.getRowData(json.id);
        
        rowData.status = json.status;
        rowData.startDate = json.startDate;
        rowData.endDate = json.endDate;
        rowData.description = json.description;
        rowData.toDoType = json.type;

        if(json.hasOwnProperty("assignedTo"))
            rowData.assignTo = json.assignedTo;

        if(json.hasOwnProperty("assignedBy"))
            rowData.assignedBy = json.assignedBy;
        
        gridInstance.setRowData(json.id, rowData);
    }

    function isSelected(elemId){
        var elem = jQuery("#"+elemId);
        return elem.attr("checked");
    }

    function openToDoDialog(dialogId,values) {

        var options = {
            open: function (event,ui){
                var obj = jQuery("#"+dialogId+" table");

                    var params="actionType="+values.dialogType+"&assignBy="+values.assignBy+"&assignByUserType="+values.assignByUserType
                    /*+"&assignToUserType="+values.assignToUserType*/+"&userId="+values.userId+"&featureTypeMappingId="+values.featureTypeMappingId
                    +"&featuresMappingId="+values.featureMappingId+"&permanentEntry="+values.isPermanentEntry+"&toDoTypeId="+values.toDoTypeId
                    DWRRedirector.getForwardTo("/billing/manageToDoList.do",params,function(data){
                        jQuery("#"+dialogId).append(data);
                    });
            },
            
            
            close: function(event,ui){
                jQuery("#"+dialogId+" table").empty();
                
                //When clicked on 'Cancel' or 'Cross' button;
                if(jQuery("#todoFeatureMappingId").val() <= 0 && !values.isPermanentEntry){
                    jQuery("#"+values.checkBoxId).attr("checked",false);                    
                }
                
                
                	
                //if(values.isPermanentEntry)
                	//jQuery("#todoFeatureMappingId").val('0');
                

            },
            draggable:false,
            modal:true,
            title:"Enable To-Do",
            resizable:false,            
            width:(screen.width - 680),
            beforeClose:  function(event,ui){
            	if(event.keyCode == 27){
            		jQuery("#"+values.checkBoxId).attr("checked",false);	
            	}
            },
            buttons:{
                "Cancel" : function(event,ui){
                        jQuery(this).dialog("close");
                        jQuery("#"+values.checkBoxId).attr("checked",false); 
                },
                "Save" : function(event,ui) {
                    // Validation <Start>
                    var desc = jQuery("#description").val();
                    desc = prepareStringForSQL(desc);
                    
                    var assignToUserType = jQuery("#assignToUserType").val();
                    var assignTo = jQuery("#assignTo").val();

                    var errorMsg="";
                    if(desc.length <= 0) {
                        errorMsg+=" - Description is requried.\n";
                    }

/*
                    if(assignToUserType == -1 || assignTo <=0) {
                        errorMsg+=" - Assign to is required";
                    }
*/

                    if(errorMsg.length > 0){
                        alert(errorMsg);
                        return;
                    }
                    // Validation <END>

                    var dialogBox = jQuery(this);

                    var params = "actionType=saveToDoConfiguration&description="+encodeURIComponent(desc)+"&assignTo="+assignTo
                        +"&assignBy="+jQuery("#assignBy").val()+"&assignByUserType="+jQuery("#assignByUserType").val()
                        +"&assignToUserType="+(jQuery("#assignToUserType").val() == -1 ?"" :jQuery("#assignToUserType").val())+"&userId="+jQuery("#userId").val()
                        +"&featureTypeMappingId="+jQuery("#featureTypeMappingId").val()+"&referenceId="+jQuery("#referenceId").val()
                        +"&featuresMappingId="+values.featureMappingId+"&toDoTypeId="+jQuery("#toDoTypeId").val()+"&permanentEntry="+values.isPermanentEntry
                        +"&priority="+jQuery("#priority").val();

                     //alert(params)                       //
                    if(isSelected("isRemindable")){

                        var reminderDays = jQuery("#daysAfterRemind").val();

                        if(/([^0-9])+/g.test(reminderDays)){
                            alert("Reminder days field contains invalid characters.");
                            return;

                        }else if( parseInt(reminderDays) <=0){
                            alert("Reminder days must be greater than 0");
                            return;
                        }
                        params+="&remindable=true&daysAfterRemind="+jQuery("#daysAfterRemind").val();
                    }


                    DWRRedirector.getForwardTo("/billing/manageToDoList.do",params,function(data){
                        var json = eval('('+ data +')');

                        if(json[0].mappingId > 0){
                        	jQuery("#todoFeatureMappingId").val(json[0].mappingId); 
                         
                        }
                        
                        dialogBox.dialog("close");
                    });
                }
            }
        };

        jQuery("#"+dialogId).dialog(options);
    }

    function openDialog(checkBoxelem, dialogId, actionType, assignBy, assignByUserType,userId,featureTypeMappingId, featureMappingId, toDoTypeId, permanentEntry){

        var options = {
            dialogType:actionType,
            assignBy:assignBy,
            assignByUserType :assignByUserType,
            //assignToUserType :assignToUserType,
            userId:userId,
            featureTypeMappingId:featureTypeMappingId,
            featureMappingId:featureMappingId,
            isPermanentEntry : permanentEntry,
            toDoTypeId : toDoTypeId,
            checkBoxId :checkBoxelem.id
        };


        if(checkBoxelem.checked){
            openToDoDialog(dialogId,options);

        } else if(!checkBoxelem.checked) {

            // Set to '0' for; do not save mapping;
            jQuery("#todoFeatureMappingId").val('0');
            

            if( featureMappingId > 0 ) {
                var isConfirmed = confirm("Are you sure to remove TODO ?");
                if(isConfirmed) {
                    var params = "actionType=removeToDoMapping&id="+featureMappingId;
                    DWRRedirector.getForwardTo("/billing/manageToDoList.do",params,function(data){
                        //Reload current page to update 'page state' for to-do;
                        document.location.reload();
                    });

                } else {
                    checkBoxelem.checked = true;
                }
            }
        }
    }

    
    function registerToDoPopupEventHandlers() {
        // When focus;
        jQuery(window).bind('focus',function() {

                try{
                    window.opener.hasFocus=false;
                }catch(e){
                    e;
                }
            hasFocus = true;
            
        });

        // When focusout;
        jQuery(window).bind('blur',function() {
            hasFocus = false;
        });
    }

    // This function indicates that 'To-Do' has been found or not;
    function checkNewToDo(json) {
	    if(json.hasOwnProperty("showReminder") && json.hasOwnProperty("reloadGrid") ) {
	
	        // Shows when current page is other than To-Do List page 
	        if(json.showReminder && (jQuery("#mySearchDialog").attr("id") == undefined) ) {
	            showReminderPopup(json);
	        }
	
	        if(json.reloadGrid && gridInstance){
	            gridInstance.trigger("reloadGrid");
	        }
        }
    }

    function insertStatusCommentTextField(){
    	//jQuery("#tr_statusComments").hide();
    	//alert(jQuery("#tr_statusComments td").last("td").html())
    	var textFieldHtml = jQuery("#tr_statusComment td").last("td").html();
    	jQuery("#tr_statusComment").last("td").remove();
    	
    	jQuery("#tr_status td select").after(textFieldHtml);
    	
    }

    /* ==========================   HANDLER AND FUNCTIONS <END>    ============================ */


    /* ==========================   TO-DO LIST GRID CODE <START>    ============================ */

    function isSelectedRowOwner(){
        var rowData = getToDoGridInstance().getRowData(getToDoGridInstance().getGridParam("selrow"));
        return (rowData.assignByUserId == loggedInUserId);
    }

    function getGridOptions() {
    var options  = {
        navigationOptions : {
           edit:true,
            add:true,
            del:false,
            search:false,
            refresh:false
        },
        gridEditOptions : {

            afterShowForm:function(form) {
                attacheFormFieldsEvents("#startDate,#endDate");
                fixJqGridOverlay();
                setjqGridDoalogtoCenterOfScreen("toDoListGrid");
                validateStatus();
                
                //
                var selectedIds = getToDoGridInstance().getGridParam("selarrrow");
                if(selectedIds.length > 1) {
                	jQuery("#tr_description").hide();
                	jQuery("#tr_startDate").hide();
                	jQuery("#tr_endDate").hide();
                	jQuery("#pData").hide();
                	jQuery("#nData").hide();
                	
                }else{
                	// becasue we dont want to add comments field in multiple todo edit;
                	insertStatusCommentTextField();
                }

                //

                // Only task-initiator can reassign task;
                /* Commented because "Any user can assign task to any user";
                  if(isSelectedRowOwner()){*/
                    appendAssignTo();
                    populateAssignTo();
                    
                /*} else {
                    jQuery("#tr_assignTo").remove();
                }*/

            }/*, Commented because assignto is not required while edit to do;
            beforeSubmit : function(postData, formId) {
                
                *//* Commented because "Any user can assign task to any user";
                  if(isSelectedRowOwner())*//*
                    return customValidation(postData,formId);
                *//*else
                    return [true,''];*//*
            }*/,
            onclickSubmit:function(params,postData){
                appendPostData(postData);//alert("SUBMIT");
                resetAssignTo();
            },
            beforeSubmit : function(postData, formId) {
                return validateDates(postData,formId);
            },
            

            bSubmit: "Update",  // this update
            bCancel: "Cancel",
            editCaption:"Edit To-Do Task",
            modal:true,
            drag:false,
            resize:false,
            recreateForm:true,
            closeAfterEdit:true,
            width:355,
            height:270
            
        },

        gridAddOptions : {
            afterShowForm: function (form) {
                attacheFormFieldsEvents("#startDate,#endDate");
                fixJqGridOverlay();
                setjqGridDoalogtoCenterOfScreen("toDoListGrid");
                appendAssignTo();
                insertStatusCommentTextField();

            },
            onclickSubmit:function(params,postData) {
                appendPostData(postData);
                resetAssignTo();
            }, 
            beforeSubmit : function(postData, formId) {
                return validateDates(postData,formId);
            } ,
            bSubmit: "Save",
            bCancel: "Cancel",
            closeAfterAdd:true,
            addCaption:"Add To-Do Task",
            modal:true,
            drag:false,
            resize:false,
            recreateForm:true,
            width:355,
            height:270

        },
        gridOptions : {
            url:toDoGridUrl,
            datatype: "json",
            colNames:['Date','Type', 'Description', 'Assigned By', 'Assigned To','Start Date','Due Date', 'Status','Priority','info','','','','Patient Name','Patient DOB','','','Info'],
            colModel:[
                {name:'date',index:'createdon',width:130, hidden:true,formoptions:{elmsuffix:"(mm-dd-yyyy)"},searchoptions:{searchhidden:true}},
                {name:'toDoTypeId',index:'todoTypeName',width:140,edittype:'select',editoptions:{value:toDoTypes},editable:true,editrules:{required:true},align:"center"},
                {name:'description',index:'description',width:180,editable:true,align:"left",editrules:{required:true},editoptions:{maxlength:"100"}},
                {name:'assignBy',index:'assignby',width:130,align:"left",align:"center"},
                {name:'assignTo',index:'assignto',width:130,align:"left", editrules:{edithidden:true},editable:true,required:true,hidden:true,align:"center"},
                {name:'startDate',index:'startDate',editable:true,width:120,align:"left",editoptions:{maxlength:"10"},editrules:{required:true},formoptions:{elmsuffix:"(mm-dd-yyyy)"},align:"center"},
                {name:'endDate',index:'endDate',width:120,editable:true,sortable:true,editoptions:{maxlength:"10"},editrules:{required:true},formoptions:{elmsuffix:"(mm-dd-yyyy)"},align:"center"},
                {name:'status',index:'status',width:80,editable:true,edittype:'select',editoptions:{value:statusOptions},sortable:true,editrules:{required:true},align:"center"},
                {name:'priority',index:'priority',width:70,edittype:'select',editoptions:{value:priorities},editable:true,editrules:{required:true},align:"center"},
                {name:'info',index:'info',width:50, sortable:false,editable:false,search:false,align:"center",hidden:true},
                {name:'assignToType',index:'assignToType',hidden:true, sortable:false,editable:false,search:false,align:"center"},
                {name:'assignToUserId',index:'assignToUserId',hidden:true, sortable:false,editable:false,search:false,align:"center"},
                {name:'assignByUserId',index:'assignByUserId',hidden:true, sortable:false,editable:false,search:false,align:"center"},
                {name:'PATIENTNAME',index:'PATIENTNAME',width:140,edittype:'select',search:false,editoptions:{value:toDoTypes},sortable:true,editable:false,editrules:{required:true},align:"center"},
                {name:'dbo',index:'dbo',editable:true,width:120,align:"left",search:false,editoptions:{maxlength:"10"},editrules:{required:true},editable:false,formoptions:{elmsuffix:"(mm-dd-yyyy)"},align:"center"},
                {name:'todoIds',index:'todoIds',hidden:true,editable:false,width:120,align:"left",search:false,editoptions:{maxlength:"10"},editable:false},
                {name:'statusComment',index:'statusComment',hidden:true,editable:true,width:120,align:"left",search:false,editoptions:{maxlength:"15"}},
                {name:'info',index:'info',width:50, sortable:false,editable:false,search:false,align:"center"},
                
            ],
            rowNum:50,
            autowidth: true,
            multiselect: true,
            rowList:[25,50,75,100],
            pager: jQuery('#paging'),
            sortname: 'createdon',
            viewrecords: true,
            sortorder: "desc",
            caption:"To-Do List",
            width: standardGridWidth,
            height: standardGridHeight,
            editurl: editToDoUrl,
            beforeRequest: function(){
        		
        		
        	var param = {
        				toDoIdentifier:jQuery("#toDoIdentifier").val()
        				
        		}; 
        		
        		jQuery(this).appendPostData(param);
        	},
            loadError: function(xhr, st, err) {
                alert(err);
            },
            onSortCol:function(index, colindex, sortorder) {
                // Preserving page Number;
                var pg = jQuery(".ui-pg-input").val();
                jQuery(this).setGridParam({page:pg});
            },
//            gridComplete:function() {
//                setRowSelection(jQuery(this));
//           },
            onSelectRow:function(rowId) {
                currentSelectedRow = rowId;
            },
            afterInsertRow: function(rowId, rowData, elem) {
                setRowInfoImg(jQuery(this),rowData,rowId);
                jQuery(this).setRowData(rowId,rowData);
            },
            onPaging:function(pgbtn){
                if(pgbtn == "user") {
                    setValidRequestedPage(jQuery(this));
                }
                
            }
        }
    };
    return options;
}

    function grid() {
        var options = getGridOptions();
        
        var gridInstance = jQuery("#toDoListGrid").jqGrid(options.gridOptions);
        var navigationObj = gridInstance.navGrid('#paging',options.navigationOptions,options.gridEditOptions,options.gridAddOptions);

         enableRefresh(gridInstance);
        
        //Custom search functionality;
        enableSearch(gridInstance);

        //Custom Delete functionality;
        enableDelete(gridInstance);

        return gridInstance;
    }

    /* ==========================   TO-DO LIST GRID CODE <END>    ============================ */


    /* ==========================   PENDING TASK GRID CODE <START>    ============================ */

    var pendingGridEditOptions = {
        afterShowForm:function(form) {
            fixJqGridOverlay();
            setjqGridDoalogtoCenterOfScreen("pendingToDoListGrid");
            attacheFormFieldsEvents("#startDate, #endDate");
            validateStatus();
            
            // Only task-initiator can reassign task;
            /* Commented because "Any user can assign task to any user";
              if(isSelectedRowOwner())*/

                appendAssignTo();
                populateAssignTo();

            /*} else {
                jQuery("#tr_assignTo").remove();
            }*/

        },
        onclickSubmit:function(params,postData) {
            appendPostData(postData);
        },
        beforeSubmit : function(postData, formId) {
            // Handling Special Characters
            postData.description = prepareStringForSQL(postData.description);
            /* Commented because "Any user can assign task to any user";
              if(isSelectedRowOwner())*/
                return customValidation(postData,formId);
            /*else
                return [true,''];*/

        },
        bSubmit: "Update",
        bCancel: "Cancel",
        reloadAfterSubmit:true,
        closeAfterEdit:true,
        drag:false,
        recreateForm:true

    };

    function displayPendingToDoGrid() {
        
        DWRRedirector.getForwardTo("/billing/manageToDoList.do","actionType=getPendingGridParameters",function(data) {
            var json = eval('('+data+')');
            var toDoUrl = json.toDoUrl;
            var toDoEditUrl = json.editToDoUrl;
            var types = json.toDoTypes;
            var statuses =json.toDoStatus;
            assignTo = json.userTypes;
            calendarImagePath = json.calendarImage;
            loggedInUserId = json.loggedInUserId;
            infoImgUrl = json.infoImgUrl;

            var dialogOptions = {
                draggable:false,
                resizable:false,
                open: function() {
                    pendingTaskGrid(toDoUrl,toDoEditUrl,types,statuses);
                },
                width: (screen.width - 50),
                modal:true,
                zIndex:200,
                close:function(){

                    pendingToDoGrid.GridUnload(pendingToDoGrid.attr("id"));
                    pendingToDoGrid = null;
                    jQuery(this).dialog('destroy');
                }
            };

            jQuery("#pendingToDoDialog").dialog(dialogOptions);
            var top = (screen.height / 2) - jQuery("#pendingToDoDialog").height()/2;
            var left = (screen.width / 2) - jQuery("#pendingToDoDialog").width()/2;
            jQuery("#pendingToDoDialog").css({top:top,left:left,zIndex:2000});
        });
    }

    var pendingToDoGrid;

    function pendingTaskGrid(toDoUrl,toDoEditUrl,types,statuses) {
        if(!pendingToDoGrid){
            pendingToDoGrid = jQuery("#pendingToDoListGrid").jqGrid({
                url:toDoUrl,
                datatype: "json",
                colNames:['Date','Type', 'Description', 'Assigned By','Assigned To','Start Date','End Date', 'Status','','','',''],
                colModel:[
                    {name:'date',index:'startDate',width:130},
                    {name:'toDoTypeId',index:'todoTypeName',width:140,edittype:'select',editoptions:{value:types},editable:true,editrules:{required:true}},
                    {name:'description',index:'description',width:180,sortable:true,editable:true},
                    {name:'assignedBy',index:'assignby',width:130,align:"left", sortable:true},
                    {name:'assignTo',index:'assignto',width:130,align:"left", hidden:true,editable:true,editrules:{edithidden:true}},
                    {name:'startDate',index:'startDate',editable:true,width:120,align:"left",editoptions:{maxlength:"10"},editrules:{required:true},formoptions:{elmsuffix:"(mm-dd-yyyy)"}},
                    {name:'endDate',index:'endDate',width:120,editable:true,sortable:true,editoptions:{maxlength:"10"},editrules:{required:true},formoptions:{elmsuffix:"(mm-dd-yyyy)"}},
                    {name:'status',index:'status',width:80,editable:true,edittype:'select',editoptions:{value:statuses},sortable:true,editrules:{required:true}},
                    {name:'info',index:'info',width:50, sortable:false,editable:false,search:false,align:"center"},
                    {name:'assignToType',index:'assignToType',hidden:true, sortable:false,editable:false,search:false},
                    {name:'assignToUserId',index:'assignToUserId',hidden:true, sortable:false,editable:false,search:false},
                    {name:'assignByUserId',index:'assignByUserId',hidden:true, sortable:false,editable:false,search:false}

                ],
                rowNum:50,
                autowidth: true,
                rowList:[25,50,75,100],
                pager: jQuery('#pendingPaging'),
                sortname: 'endDate',
                viewrecords: true,
                sortorder: "desc",
                caption:"Pending TO DO List",
                editurl: toDoEditUrl,
                loadComplete: function() {
                },
                loadError: function(xhr, st, err) {
                    alert(err);
                },
                onSortCol:function(index, colindex, sortorder) {

                    // Preserving page Number;
                    var pg = jQuery(".ui-pg-input").val();
                    jQuery(this).setGridParam({page:pg});
                },
                afterInsertRow: function(rowId, rowData, elem) {
                    setRowInfoImg(jQuery(this),rowData,rowId);
                    jQuery(this).setRowData(rowId,rowData);
                },
                gridComplete: function() {
                    setRowSelection(jQuery(this));
                },
                onPaging:function(pgbtn){
                    if(pgbtn == "user"){
                        setValidRequestedPage(jQuery(this));
                    }
                }
            }).navGrid('#pendingPaging', {edit:true,add:false,del:false,search:false,refresh:false}, pendingGridEditOptions)
              .navButtonAdd('#pendingPaging',{caption:"Refresh",title:"Refresh",
                onClickButton:function() {
                    pendingToDoGrid.trigger('reloadGrid');
                }
            });
        }
    }

    /* ==========================   PENDING TASK GRID CODE <END>    ============================ */
