//###########################################################
// Version:  2009-08-01, mrc ltd., Lombard, IL, USA  
// Functions for web 2.0 report .
// Only jQuery library is used. ALways use jQuery in place of $.
//###########################################################
  jQuery.noConflict();

  var optionDisabledClass='asmOptionDisabled';// Class for items that are already selected / disabled
  var CLOSE_CLS = 'menu_body_close';
  var OPEN_CLS = 'menu_body_open';
  var GREEN_COLOR = '#6f9'; //rgb(102, 255, 153) in FF
  var GREY_COLOR  = '#777';
  var WHITE_COLOR  = '#fff';
  var datapaneIdj = "#data_pane";
  var dataHolderId = '#report-data';
  var graphHolderId = '#report-graph';
  var trigger_run_query = false; 
  var _imageDrill = true;
  var _hasEditError = false;
  var _enterKeyPressed;
  var _lastTextInput;
 
  var formId2 = "";
  var appUrl2 = "";
  var datapaneId2 = ""; 
  var options2;

  var columes; //number of columns of the report table
  var otherParms; //parms from the selection panel
  var availOptions; //available option from server used to grey out selections
  var hasEmptyOption; //indecates if the returned data has at least 1 empty
  var numOfRefreshes = 0; //track how many refreshes 
  var firingId = "";
  var firingVal = "";
  var isRuntimeRemoval = false;
  var isPivot = false;
  var row_collapsed_img = "/mrcjava/image/closed.gif";
  var row_expanded_img = "/mrcjava/image/open.gif";
/****************************************************************/
//   Init at document ready. 
/****************************************************************/	
jQuery(document).ready(function() {
	  // ------- setup ajax helper inputs  -------
	initializeAjaxHelpers();
	
    // ------- setup select pane for expand/cllapse  -------
    initSelectMenu();
	
    // Create checkbox/radio/ul inputs from select list  if any           
    convertList();
	 
	// ------- Hide/show menu pane    -----------------------
	//SetupMenuHideShow();

	// ------- remove option of blank value -------
	jQuery("#select_menu select[multiple] option[value='']").remove();
	
	// ------- asmselect plugin  for dropdown inputs -------
	jQuery("#select_menu select[multiple]").asmSelect({
		addItemTarget: 'bottom', animate: true, highlight: true, sortable: false
	});

	// ------- Setup slider for input field  ----------------
	initSliders();
	
}); 

/*****************************************************************/
//   Enable one page logic - called from one page report.
/****************************************************************/
function onePage(customOptions) {
    var options = {
        formId: '',                // Id of the form
        appUrl: '',                // URI of the APP - MRCJAVALIB.R00100s
        extraParms: '&p1=qqq',             // '&p1=v1&p2=v2...'
        datapaneId: 'data_pane',   // Id of the data pane - datapane 
        greyoutOn: true,           // Use selection pane greyout - true/false 
        appkeys: {}
    };
    jQuery.extend(options, customOptions); 
    formId2 = options.formId;
    appUrl2 = options.appUrl;
    datapaneId2 = options.datapaneId;
    options2 = options;
    
    // Setup the list div (if any) for click action
    jQuery('.list_div').click(function() {
        //with greyout logic and no submit button, do green color
       if ( options2.greyoutOn && jQuery('form #btn_search').length == 0) {
           if (jQuery(this).isGreen()) {
              jQuery(this).textListUnclick();
              jQuery(this).bg('');
           } else {
              jQuery(this).textListclick();
              jQuery(this).bg(GREEN_COLOR);
           }
       } else { //no greyout logic, do bold on text buttons
           if (jQuery(this).isBold()) {
              jQuery(this).textListUnclick();
              jQuery(this).css('font-weight',400);
           } else {
              jQuery(this).textListclick();
              jQuery(this).css('font-weight',700);
           }
       }
    });
    
    //save the input clicked for use grey when Enter pressed
    jQuery('.menu_body input[type=text]').click(function() {
        var lastInput = jQuery(this);
        _lastTextInput = lastInput;
    });
    
   //setup run report based on change of input field if no greyout. 
   // If there is greyout then the 'run report' will happen after greyout
    if ( !options.greyoutOn ) {
        setupSubmitOnInput();
    } else { //there is greyout but only 1 select
        if (jQuery('.menu_body select').size() == 1) {
          //setupSubmitOnInput();   
        }
    }
    
    //setup run refresh selections if grey on and no submit buton
    if (options.greyoutOn && jQuery('form #btn_search').length == 0) {
        setupRefreshSelect();
    } else {
        //save Id/val of element selected/clicked to be used to grey
        setupRegisterFiringId(); 
    }

    // Set width at load time when the menu is expanded.
    jQuery('#select_menu').width( jQuery('#select_menu').width() + 5);
    //jQuery('#select_menu').width('auto');
    enableOnePage(formId2, appUrl2, datapaneId2);    
}
/*****************************************************************/
//   Enable one page logic - display data on prompt page. (old interface)
/****************************************************************/
function enableOnePage(formId, appUrl, dataPaneId) {
   datapaneIdj = "#" + dataPaneId;
   formId2 = formId;
   appUrl2 = appUrl;
   datapaneId2 = dataPaneId;
  
   jQuery("#" + formId).submit(function(evt) {
	
	  blockUIandRun(formId, appUrl, dataPaneId);	
      return false;
   });  
 
   setupDrill() ; //used when 1-page report is imported to other apps
   jQuery('#isinit').val('1'); //tell report this is init (for *RUNVALID)
   
   var imgDrill = jQuery.valByNameFromQS('imgdrill', window.location.href);  
   if (imgDrill && imgDrill == 'y') {
     //var wkInput = jQuery(" <input />" ).attr( {"type": "hidden", "value":"y", "name":"imgdrill", "id":"imgdrill"});  
     var wkInput = jQuery("<input type=hidden value=y name=imgdrill id=imgdrill />");  //chg for jquery 1.4.2
     var inp0 = jQuery('#sel_R001 input.ls');
     if (inp0.length) { //if multiple inputs for LS/NS, set the value for img drill
         inp0.eq(0).val( jQuery('#R001').val());       
     }
     jQuery("#" + formId).append(wkInput);
   }
   
   var data = jQuery('#report-data').html();
   if (data.indexOf('freemarker.core.') > 0) {
       return; //has error, show it.
   }
   
   /* check if need to do smart logic for hard coded select input */
   checkRefreshSelections2();

		jQuery("#" + formId).submit();
   
}
/****************************************************************/
//   Initiallize Select menu exapnd/collapse
/****************************************************************/
function initSelectMenu() {
 
	jQuery('.menu_head').addClass(OPEN_CLS);
	
	jQuery("#select_menu p.menu_head").click(function()  {
	    var menuHead = jQuery(this);
		menuHead.toggleClass(CLOSE_CLS);
		menuHead.toggleClass(OPEN_CLS);
		var itemOpen = menuHead.hasClass(OPEN_CLS);
		if (itemOpen) {
		    menuHead.attr("title", "Collapse");
		} else {
		    menuHead.attr("title", "Expand");
		}
		menuHead.next("div.menu_body").slideToggle(300);
	});
 
    /* Hide, show all record selections */
    jQuery("#open_all").toggle(function()  { 
		jQuery("div.menu_body").not('.no_collapse').slideUp(300);
		jQuery('.menu_head').addClass(CLOSE_CLS).removeClass(OPEN_CLS).attr("title", "Expand");    
		jQuery(this).html('<img src="/mrcjava/image/closed.gif"> Record Selections').attr("title","Expand all");			
	  }, 	function()  { 
		jQuery("div.menu_body").slideDown(300);
		jQuery('.menu_head').addClass(OPEN_CLS).removeClass(CLOSE_CLS).attr("title", "Collapse");  
        jQuery(this).html('<img src="/mrcjava/image/open.gif"> Record Selections').attr("title","Collapse all");		
	  }
	);	
	
	/* Hide, show subtotal selections */
	  jQuery("#open_all_sub").toggle(function()  { 
		jQuery("#sub_totals").slideUp(300);
        jQuery(this).html('<img src="/mrcjava/image/closed.gif"> Include Levels').attr("title","Show level selections");		
	  }, 	function()  { 
		jQuery("#sub_totals").slideDown(300);
		jQuery(this).html('<img src="/mrcjava/image/open.gif"> Include Levels').attr("title","Hide level selections");			
	  }
	);	
}
/****************************************************************/
/*   setup run report based on change of input field.           */
/****************************************************************/
function setupSubmitOnInput() {

    /*  Check if there is submit button. If no then setup Ajax submit. */
    if (jQuery('form #btn_search').length > 0) {
       return; //Has submit button.  skip setup 
    }
   
    /* No submit button  */
    /* Setup select fields to run Ajax query */
    var selects = jQuery('.menu_body select');
    jQuery(selects).change(function() {
	
	    blockUIandRun(formId2, appUrl2, datapaneId2);	
    });
    
     /* Setup checkbox to run Ajax query */
    jQuery('.menu_body input:radio, .menu_body input:checkbox').click(function() {
		
        blockUIandRun(formId2, appUrl2, datapaneId2);   
    });
    
    /* Setup text buttons to run Ajax query */
    jQuery('.list_div').click(function() {
	
       blockUIandRun(formId2, appUrl2, datapaneId2);   
    } );
    
    trigger_run_query = true;
}
/****************************************************************/
/*   setup selection menu hide/show.                            */
/****************************************************************/
function SetupMenuHideShow() {

    jQuery("#hide_menu").unbind('click');
    jQuery("#hide_menu").toggle(function() { 
       var width = jQuery("#select_pane").width();
       var widthc = "-" + (width + 12) + "px";
       jQuery("#select_pane").animate({ marginLeft: widthc}, 1000, function() {
          jQuery("#hide_menu img").attr({"src":"/mrcjava/image/show_menu.png",  "title": "Show Record Selections"});  
       } );
    }, function() { 
       jQuery("#select_pane").animate({ marginLeft: "10px" }, 1000, function() {
          jQuery("#hide_menu img").attr({"src":"/mrcjava/image/hide_menu.png",  "title": "Hide selection menu"});
       } ); 
    });   
}
/****************************************************************************/
//   Refresh selections based on selected values.
/****************************************************************************/
function setupRefreshSelect() {

    //before setup refresh on controls, check if need to a refresh (need to 
    // when clicked on image map and the 1st key is selected)
    if (jQuery("select#R001 option:selected").length) {
        //refreshSelections(jQuery("select#R001"));    
    }
        
   /* Enter Key pressed */
    jQuery("#" + formId2).bind("keypress", function(e) {
		
       if (e.keyCode == 13) {
           if (_lastTextInput) {
		  
              refreshSelections({ inpField : _lastTextInput});
           }
           _enterKeyPressed = true;
       }
    });
 
    /* refresh if select changes */
   // var selects = jQuery('.menu_body select');
    var selects = jQuery('.menu_body select.mrcselect');
    if (selects.size() >= 1) {
       jQuery(selects).change(function(evt) {
          /* check if range select */
          var sel_id = jQuery(this).parents('.menu_body').attr('id');
          var sels = jQuery('#' + sel_id + " select.mrcselect");
          if (sels.length == 2) {
              var val1 = jQuery(sels).eq(0).val();
              var val2 = jQuery(sels).eq(1).val();
              var val3 = val1 + val2;
              if ( (val1 == '' || val2 == '') && !(val1 == '' && val2 == '') ) {
                  return; //only 1 selected, do not fire
              }
          }
          firingId = jQuery(this).parents('.menu_body').attr('id').substring(4);
          var firingValTmp = jQuery(this).val();
          if (jQuery.isArray(firingValTmp)) {
            firingVal = firingValTmp[0];
          }
          //alert(firingId + "---" + firingVal);
  	      refreshSelections({ inpField : this}) ;
       });
    }
   
      /* refresh if input blur */
    jQuery('.menu_body input[type=text]').blur(function() {
	   var inpName = jQuery(this).attr('name');
	   var cssSel = 'input[name=' + inpName + ']';
	   var inparr =  jQuery.makeArray( jQuery(cssSel) );
	   
	   //input (range), need check if both have values	  
	   if (inparr.length == 2) { // 
          var val1 = jQuery.trim(jQuery(inparr[0]).val());	   
          var val2 = jQuery.trim(jQuery(inparr[1]).val());
          if (val1 == '' || val2 == '') {
       	     return; //at least 1 is empty, do not fire.
          } 
	   }	   
	   //comment out 2010/01/07
	   //refreshSelections({ inpField : this}) ; 
    });
    
    /* refresh if input check (radio/checkbox) */
    jQuery('.menu_body input:radio, .menu_body input:checkbox').click(function() {
        firingId = null ;
        firingVal = null;
        if (jQuery(this).attr('checked')) {
           firingId = jQuery(this).parents('.menu_body').attr('id').substring(4) ;
           firingVal = jQuery(this).val();
        }
        jQuery(this).checkListCheckEq();
	    refreshSelections({ inpField : this}) ;
    });
    
     /* refresh converted simple div list  */
    jQuery('.list_div').click(function() {
        firingId = null ;
        firingVal = null;
        if (jQuery(this).isGreen()) {//select to turn green          
            firingId = jQuery(this).parent().attr('id') ;
            firingVal = jQuery(this).attr('oval');//text();
        }      
		
        refreshSelections({ inpField : this} ) ;
    } );
    
}
/****************************************************************************/
/*   Save Id/Val of element selected.                                       */
/****************************************************************************/
function setupRegisterFiringId() {
 
    var selects = jQuery('.menu_body select.mrcselect');
    jQuery(selects).change(function(evt) {
         firingId = jQuery(this).parents('.menu_body').attr('id').substring(4);
         var firingValTmp = jQuery(this).val();
         if (jQuery.isArray(firingValTmp)) {
            firingVal = firingValTmp[0];
         }
    });
    
    jQuery('.menu_body input:radio, .menu_body input:checkbox').click(function() {
        if (jQuery(this).attr('checked')) {
           firingId = jQuery(this).parents('.menu_body').attr('id').substring(4) ;
           firingVal = jQuery(this).val();
           jQuery(this).checkListCheckEqWithButton();
        }
    });
    
    jQuery('.list_div').click(function() {
        var listdiv = jQuery(this);
        if (listdiv.isGreen() || listdiv.isBold()) {//select to turn green          
            firingId = jQuery(this).parent().attr('id') ;
            firingVal = jQuery(this).attr('oval');//text();
        }  
    } );
}
/****************************************************************************/
// Refresh selection values.
// optparms.menu_bodyId = 'sel_R00n' (no #)
/****************************************************************************/
function refreshSelections(optparms) {	
	var validated = checkRequiredFields(jQuery("#" + formId2));
	if(validated == false){
		return false;
	}
	if(isPivot == true){
		saveDimensions();
		valid = getSubTotals();
	}
    if (_hasEditError) { //has input edit error. No greyout
       _hasEditError = false;
       //return;
    }
    
    if (jQuery('.menu_body select').size() == 0 && 
            jQuery('.dsp_list').size() == 0 && 
            jQuery('.dsp_radio').size() == 0 && 
            jQuery('.dsp_check').size() == 0 &&
            !optparms.firstKeyPair) {
         insertOrUnblock();
         return; //no list, skip smart logic
    }
   
    var menu_bodyId = optparms.menu_bodyId;
    if (!menu_bodyId) {
        menu_bodyId = jQuery(optparms.inpField).parents('.menu_body').eq(0).attr('id');
    }  
    
    //query DB and use result to refresh/greyout selecions pane 
    var parms = parmValuesDrill();  //get parms from R001...
    
    var keyVal = "";
    if (optparms.firstKeyPair) {
        keyVal = "&" + optparms.firstKeyPair;
        var pos = optparms.firstKeyPair.indexOf('=');
        var rxxx = optparms.firstKeyPair.substring(0,pos);
        parms = parmValuesDrill(rxxx);  //get parms from R001...except key
    }
    
    //block browser during the grey logic
    blockBrowser(formId2, appUrl2, datapaneId2);
    
    var url = appUrl2 + "?reqtype=21" + keyVal + parms;// + "&x=" + Math.random();
    url = url.replace(/_%_/g, '_%25_');//mrc encode for space 
   // alert('refreshSelections-' + url);
    jQuery.ajax({ url: url,  dataType: "html",
       success: function(data, textStatus) {  //Ajax success!
          eval(data); //set var availOptions
          clearGreyoutSelections(menu_bodyId, {'url_togo':optparms.url_togo, 
                firstKeyPair: optparms.firstKeyPair} );
       },
       error: function(XMLHttpRequest, textStatus, errorThrown) { //Ajax failed
         var errmsg = "Error happened during Ajax request: ";
         errmsg += XMLHttpRequest.responseText;
       } 
    });
}
/****************************************************************/
//  Clear and grey out selections.
/****************************************************************/
function clearGreyoutSelections(menu_bodyId, optparms) {   
  
    var selectedIsInReturnData = true;
    if (firingVal) {   //only use this condition if is select click (not unclick) 
        //selectedIsInReturnData = isinArray(firingVal, firingId);
    }
    
    //has empty selection, or the return data does not have the selected value clear and resubmit
    if (hasEmptyOption || !selectedIsInReturnData) {  
        //clear selected in all other menu_body
        var actingId = '#' + menu_bodyId;
        jQuery('.menu_body').not(actingId).each(function() {
            var theid = '#' + jQuery(this).attr('id');  
            clearSelected2(theid);   
        });
        
        /* No option in the second try, query data anyway */
        numOfRefreshes++; 
        if (numOfRefreshes > 1) {
            //alert("attempted " + numOfRefreshes + " times. Cannot refresh selections. url=" + optparms.url);
             insertOrUnblock();
            numOfRefreshes = 0;
            return;
        }
        
        //Ajax again to get new data
        refreshSelections({ menu_bodyId : menu_bodyId, firstKeyPair: optparms.firstKeyPair});
        return;
    }  
    
    //No conflict, go do grey out
    numOfRefreshes = 0;
    greyoutSelections({ menu_bodyId : menu_bodyId }) ;   
    
    // Image drill down.  
    if (optparms.firstKeyPair) {
        var pos = optparms.firstKeyPair.indexOf('=');
        var rxxx = optparms.firstKeyPair.substring(0,pos);
        var otparms = parmValuesDrill(rxxx);
        otparms = otparms.replace(/_%_/g, '_%25_');//mrc encode for space 
        var url = appUrl2 + "?imgdrill=y&" + optparms.firstKeyPair + otparms;
        window.location = url; 
        return;
    }
 
    insertOrUnblock();
}

function insertOrUnblock() {
    /*  If no submit button Ajax data. */ 
    if (jQuery('form #btn_search').length == 0) {
        //blockUIandRun(formId2, appUrl2, datapaneId2);  
        insertReportData(formId2, appUrl2, datapaneId2);  
    } else {
       /* Has submit button, Unblock page after grey complete */
       setTimeout(function(){jQuery.unblockUI();}, 200);
    }     
}
/****************************************************************************/
//  When there are hard coded selection values, try refresh based on them 
/****************************************************************************/
function checkRefreshSelections2() {  
    var selects = jQuery('.menu_body select.mrcselect');
    if (selects.length == 0) {
        return; 
    }
    
    /* find the first select that has value and do smart logic */
    jQuery(selects).each(function() {
        var theid = jQuery(this).parents('.menu_body').attr('id').substring(4);
        var val = jQuery(this).val();
        if (theid && theid.indexOf('R00') >= 0 && val && val.length > 0) {
           refreshSelections2({ menu_bodyId : theid});
           return false; //break in each
        }
    }); 
}
/****************************************************************************/
// Refresh selection values without fire Ajax
// optparms.menu_bodyId = 'sel_R00n' (no #)
/****************************************************************************/
function refreshSelections2(optparms) {  
    
    if (_hasEditError) { //has input edit error. No greyout
        return;
    }
    
    //query DB and use result to refresh/greyout selecions pane 
    var parms = parmValuesDrill();  //get parms from R001...
    
    var keyVal = "";
    if (optparms.firstKeyPair) {
        keyVal = "&" + optparms.firstKeyPair;
    }
    var qoramp = "?";
	if(appUrl2.indexOf("?") >=0){
		qoramp = "&";
	}
    var url = appUrl2 + qoramp + "reqtype=21" + keyVal + parms;// + "&x=" + Math.random();
    url = url.replace(/_%_/g, '_%25_');//mrc encode for space 
    //alert('2' + url);
    jQuery.ajax({ url: url,  dataType: "html",
       success: function(data, textStatus) {  //Ajax success!
          if (data) {
              eval(data); //set var availOptions
              clearGreyoutSelections2({menu_bodyId: optparms.menu_bodyId, 'url':url, 
                firstKeyPair: optparms.firstKeyPair} );
          } else {
              setTimeout(function(){jQuery.unblockUI();}, 200);
          }
       },
       error: function(XMLHttpRequest, textStatus, errorThrown) { //Ajax failed
         var errmsg = "Error happened during Ajax request: ";
         errmsg += XMLHttpRequest.responseText;
         //alert(errmsg); 
       } 
    });
}
/****************************************************************/
//  Clear and grey out selections.
/****************************************************************/
function clearGreyoutSelections2(optparms) {   
  
     //has empty selection, clear and resubmit
    if (hasEmptyOption) {  
        //clear selected in all other menu_body
        var actingId = '#' + optparms.menu_bodyId;
        jQuery('.menu_body').not(actingId).each(function() {
            var theid = '#' + jQuery(this).attr('id');  
            clearSelected2(theid);   
        });
        
        /* No option in the second try, query data anyway */
        numOfRefreshes++; 
        if (numOfRefreshes > 1) {
           // alert("Tried " + numOfRefreshes + " times. Cannot refresh selections. url=" + optparms.url);
            //insertOrUnblock();
            numOfRefreshes = 0;
            return;
        }
        
        //Ajax again to get new data
        refreshSelections2(optparms);
        return;
    }  
    
    //No conflict, go do grey out
    numOfRefreshes = 0;
    greyoutSelections({ menu_bodyId : optparms.menu_bodyId});   
}
/****************************************************************/
//  grey out selection values based on new Ajax result.
/****************************************************************/
function greyoutSelections(optparms) {  
  
    //1. do select list
    jQuery('.menu_body').each(function() {
        var selects = jQuery(this).find('select');
        if (selects.size() == 1) { //normal select 
            greySelectOptions1(selects.eq(0).attr('id'));          
        }
        if (selects.size() == 2) { //asm select + normal list
            var asmId = selects.eq(0).attr('id'); //asmSelect...
            var mrcId = selects.eq(1).attr('id'); //R00...
            greySelectOptions2(asmId, mrcId);          
        }
        
        // Radio inputs ( <div class="menu_body" id="sel_R002">)
        //<div><input type="radio" name="R002" value="R0040" />R0040<input type="radio" name="R002" value="R0030" />R0030
        var radios = jQuery(this).find(':radio');
        if(radios.length > 0) {
            var fldId = ( jQuery(this).attr('id')).substring(4); //R001 
            radios.each(function() {            
                 var thisInp = jQuery(this);
                 if (!isinArray( thisInp.val(), fldId ) ){ //not in returned list - grey out  
                    thisInp.next().bg(GREY_COLOR);
                 } else { //is in returned list - remove grey
                    thisInp.next().bg("");
                 }
                 if (thisInp.attr('checked')) {
                    thisInp.next().bg(GREEN_COLOR);
                 }
            });
        }
    });
    
    //2. do check box list ( <div class="menu_body dsp_check" id="sel_R002">)
    //<div><input id="R0021" name="R002" value="1" type="checkbox"><label for="R0021">1 &nbsp; </label>...
    jQuery('.dsp_check').each(function() {
        var fldId = ( jQuery(this).attr('id')).substring(4); //R001 
        var checks = jQuery(this).find('input');
        jQuery(checks).each(function() {
           var thisInp = jQuery(this);
           if (!isinArray( thisInp.val(), fldId ) ){ //not in returned list - grey out  
              thisInp.next().bg(GREY_COLOR);
           } else { //is in returned list - remove grey
               thisInp.next().bg("");
           }
           if (thisInp.attr('checked')) {
               thisInp.next().bg(GREEN_COLOR);
           }
       
        });
    });
    
    //3. do simple text list ( <div class="menu_body dsp_list" id="sel_R002">)
    //<div id="R001"> <div class="list_div">2005</div> <div class="list_div">2006</div>
    jQuery('.dsp_list').each(function() {
        var fldId = ( jQuery(this).attr('id')).substring(4); //R001 
        var fldVal = jQuery('#' + fldId + "Id").val(); //input fld val  
        fldVal = fldVal.replace(/_%_/g,' '); //space in text was converted to ' '      
        var rxxx = optparms.menu_bodyId ? optparms.menu_bodyId.substring(4): "";
        var texts = jQuery(this).find('.list_div');
        
        jQuery(texts).each(function() {
           var thisInp = jQuery(this);
           var val = thisInp.attr('oval');//text();
           //val = val.replace(/ /g,'_%_'); //space in text was converted to ' '
           if (!isinArray( val, fldId ) ){ //not in returned list - grey out  
               thisInp.bg(GREY_COLOR);
           } else if (!thisInp.isGreen()) { //in returned list & not green - remove grey
              var expr = '\\b' + val + '\\b';
              if (fldVal.search(expr) < 0) { //val not in selected  
                 thisInp.bg("");
              } else { //val in selected, restore green  
                 thisInp.bg(GREEN_COLOR);
              }
           } 
        });
    });
    
    if ( options2.greyoutOn && jQuery('form #btn_search').length == 1) {
       setTimeout(function(){jQuery.unblockUI();}, 200);
    }
}
/************************************************/
//  grey out select list options for regular select
/************************************************/
function greySelectOptions1(selectId) {  
    if (!jQuery.isR0nn(selectId) ) {//if (selectId.indexOf('R00') < 0 ) { 
       return;
    }
  
    //alert(availOptions[selectId]);
    var selOptions = jQuery('#' + selectId + ' option');
    jQuery(selOptions).each(function() {
        var thisOpt = jQuery(this);
        var thisVal = thisOpt.val();
        thisVal = thisVal.replace(/_%_/g,' '); // 
        if (!isinArray( thisVal, selectId ) ){ //not in returned list - grey out  
            thisOpt.bg(GREY_COLOR);
        } else { //is in returned list - remove grey
            thisOpt.bg(WHITE_COLOR);             
        }
    });
}
/************************************************/
//  grey out select list options for asm select.
/************************************************/
function greySelectOptions2(asmId, mrcId) {  
 
    //alert(availOptions[mrcId]);
    var selOptions = jQuery('#' + asmId + ' option');
    jQuery(selOptions).each(function() {
        var thisOpt = jQuery(this);
        var thisVal = thisOpt.val();
        thisVal = thisVal.replace(/_%_/g,' '); // 
        if (!isinArray( thisVal, mrcId ) ){ //not in returned list - grey out  
            thisOpt.bg(GREY_COLOR);
        } else { //is in returned list - remove grey
 
            if ( thisOpt.attr('disabled') ) {
                thisOpt.bg(GREEN_COLOR);  //selected in asm
            } else {
                thisOpt.bg(WHITE_COLOR);             
            }
        }
    });
}
/************************************************/
//  Check if an value is in the available array.
/************************************************/
function isinArray(val, selectId) { 
    if (val == null || val == '') {
        return true; //empty option etc
    }
    var avlOptions = availOptions[selectId]; //values from server
    if (!avlOptions) {
        return true; //ext obj list is not in the return data
    }
    
    var isInArray = false;
    for (var i=0; i < avlOptions.length; i++) {
        var avl = avlOptions[i].replace(/_%_/g,' '); // 
        avl = avl.replace(/&quot;/g,'"'); // double quote in availOptions is encoded
        val = val.replace(/_%_/g,' '); // 
        if (val == avl) {
            isInArray = true;
            break;
        }    
    }
    return isInArray;
}

/****************************************************************************/
/**   setup drill down for next level sub-total rows.                       */
/****************************************************************************/
function setupDrill() {
    //get columes to be used in setting up drill link row
    if (!columes) {
       var subtr = jQuery('.sub_total').eq(0);
       //alert(subtr + ",,  " + subtr.length);
       columes = subtr.children('td').size();
    }
    
    //setup click on sub-total rows, td containing drill icon clicked
	
	jQuery('.drill_icon').unbind('click');//2011-09-14:add for jquery 1.6.4
    jQuery('.drill_icon').bind('click', callSetupDrill2);
	jQuery('.s1m,.s2m,.s3m').unbind('click');
	 jQuery('.s1m,.s2m,.s3m').bind('click', callSetupDrill4);
}
/****************************************************************/
/** Setup paging records (in the same level) from Show More link */
/****************************************************************/
function setupPaging() {
    
    jQuery('.paging_alink').bind('click', callPaging);
      
}
/****************************************************************/
/** setup show/hide for Ajax loaded drill down step 2           */
/****************************************************************/
function callSetupDrill2() {
    //'this' is the td containing drill icon 
    var thistr = jQuery(this).parents('tr').eq(0);
      
    //If this is a 'show more' paging row, skip drill down
    if (jQuery(thistr).hasClass('paging_tr')) {
        return;
    }
    
    jQuery(thistr).find('.spin-img').show();

    if (thistr.attr('loaded') != 'y') { //rows have not been loaded
       drillDown(thistr);
       thistr.attr('loaded','y');
       thistr.attr('shown','y');
       thistr.find('img.drill_icon').attr('src', row_expanded_img);
       thistr.find('img.drill_icon').attr('title', 'Collapse');
       return;
    }
    //already loaded, do show/hide
    var thisClass = jQuery(thistr).attr('class');
    var thisLevel = getLevelInt(thisClass);
    
    var nextRow = jQuery(thistr).next('tr');
    var nextClass = nextRow.attr('class');
    var cnt = 1;
	
    while (nextClass) {
        if (cnt++ > 10000) {
            alert('contact mrc.')
            break;
        }
   
        var nextLevel = getLevelInt(nextClass);
        if (nextLevel <= thisLevel) {
            break; //done with this level
        }

        if (thistr.attr('shown') == 'y') {
           nextRow.hide();  
        } else {
            nextRow.show(); 
            nextRow.attr('shown','y'); 
        }
        
        nextRow = jQuery(nextRow).next('tr');
        nextClass = nextRow.attr('class');
        
    } //while

    if (thistr.attr('shown') == 'y') {
        thistr.attr('shown','n'); 
        thistr.find('img.drill_icon').attr('src', row_collapsed_img);
        thistr.find('img.drill_icon').attr('title', 'Expand');
    } else {
        thistr.attr('shown','y'); 
        thistr.find('img.drill_icon').attr('src', row_expanded_img);
        thistr.find('img.drill_icon').attr('title', 'Collapse');
    }
    jQuery(thistr).find('.spin-img').hide();
}
 function callSetupDrill4() {
    //'this' is the td containing drill icon 
    var thistr = jQuery(this).parents('tr').eq(0);
      
    //If this is a 'show more' paging row, skip drill down
    if (jQuery(thistr).hasClass('paging_tr')) {
        return;
    }
    
    jQuery(thistr).find('.spin-img').show();
    if (thistr.attr('loaded') != 'y') { //rows have not been loaded
       drillDown(thistr);
       thistr.attr('loaded','y');
       thistr.attr('shown','y');
        thistr.find('.indicator').toggleClass("indicator2");
       thistr.find('img.drill_icon').attr('title', 'Collapse');
       return;
    }
    //already loaded, do show/hide
	
    var thisClass = jQuery(thistr).attr('class');
    var thisLevel = getLevelInt(thisClass);
    
    var nextRow = jQuery(thistr).next('tr');
    var nextClass = nextRow.attr('class');
    var cnt = 1;
    while (nextClass) {
        if (cnt++ > 10000) {
            alert('contact mrc.')
            break;
        }
   
        var nextLevel = getLevelInt(nextClass);
        if (nextLevel <= thisLevel) {
            break; //done with this level
        }

        if (thistr.attr('shown') == 'y') {
           nextRow.hide();  
        } else {
            nextRow.show(); 
            nextRow.attr('shown','y'); 
        }
        
        nextRow = jQuery(nextRow).next('tr');
        nextClass = nextRow.attr('class');
        
    } //while

    if (thistr.attr('shown') == 'y') {
	
        thistr.attr('shown','n'); 
        thistr.find('.indicator').toggleClass("indicator2");
        thistr.find('img.drill_icon').attr('title', 'Expand');
    } else {
	
        thistr.attr('shown','y'); 
        thistr.find('.indicator').toggleClass("indicator2");
   
    }
    jQuery(thistr).find('.spin-img').hide();
}
/****************************************************************/
/**  get the level number 1,2,3 ... 
/ *  return 99 if detail, return 0 if no level
/****************************************************************/
function getLevelInt(str) {
    if (str.indexOf('level_detail') >= 0) {
        return 9; //detail level
    }
	var level = 0;
    var pos = str.indexOf('level_R00');
    if (pos > 0) {
    	var intp = str.substring(pos+9);
        level = parseInt(intp);
    }
    return level;
}
/****************************************************************/
/**   drill down for sub-total rows using Ajax.
/****************************************************************/
function drillDown(theRow) {
    var thisClass = jQuery(theRow).attr('class');
    var thisLevel = getLevelInt(thisClass);
    
    var parms = "";
    jQuery(theRow).find('.sub_value').each(function() {
    	var key = jQuery(this).attr('key');
    	var val = jQuery(this).attr('val');
    	val = encodeURIComponent(val);
	    parms += "&" + key + "=" + val;
    } );
    
    //Add other selections 
    if (otherParms) {
	
        otherParms = otherParms.replace(/_%_/g, '_%25_');//mrc encode for space 
        parms += otherParms;
    }
  
    var appurl = appUrl2;
    var urldiv = jQuery(theRow).parent('tbody');
    //alert(urldiv.attr('id') + ",  " + urldiv.attr('appurl'));
    if (jQuery(urldiv).length > 0) {
         appurl = jQuery(urldiv).attr('appurl');
        //alert('appurl=' + appurl);
    }
    
    //make url to Ajax request drill down rows
	var qoramp = "?";
	 if(appurl.indexOf("?") >=0){
		qoramp = "&";
	}
    var url = appurl + qoramp + "run=1&outfmt=21&level=" + thisLevel + parms + "&colspan=" + columes;
    url += options2.extraParms;
    var debug = jQuery("input[name='debug']").val();
    url += '&debug=' + debug;
    url += "&x=" + Math.random();
	//alert('3' + url);
    jQuery.ajax({  url: url, dataType: "html",
       success: function(data, textStatus) {	//Ajax success!
          //alert(data);
         var pos = data.indexOf('<i>Debug'); 
         if (pos > 0) { //extract debug info if exists
             var bugInfo = data.substring(pos);
             data = data.substring(0, pos);
             jQuery('#debug-info').html(bugInfo);
         }
         jQuery(theRow).after(data);
         setupDrill(); //setup drill down for next level
         setupPaging();//setup paging in the same level
         setupLinkWithParms();
		 try{
			setupPopupDialog();
		}catch(err){
		
		}
		 
	   },
	   error: function(XMLHttpRequest, textStatus, errorThrown) { //Ajax failed
	     var errmsg = "Error happened during Ajax drilldown: ";
	     errmsg += XMLHttpRequest.responseText;
	     errmsg = "<tr>" + errmsg + "</tr>";
         jQuery(theRow).html(errmsg);	   
	   },
	   complete: function(XMLHttpRequest, textStatus) { //Ajax completed	
	      jQuery(theRow).find('.spin-img').hide();
	   }
    });

    return ;
}
/****************************************************************/
/** Setup paging records (in the same level) from Show More link */
/****************************************************************/
function callPaging(event) {
    event.preventDefault(); //supress click on a tag
         
    var url = jQuery(this).attr('href');
    var theRow = jQuery(this).parents('tr').eq(0); //get tr of 'show more'
    jQuery(theRow).find('.spin-img').show();
	//alert('4' + url);
    jQuery.ajax({  url: url, dataType: "html",
         success: function(data, textStatus) {  //Ajax success!
             jQuery(theRow).after(data).remove();
             setupDrill(); //setup drill down for next level
             setupPaging();//setup paging in the same level
         },
         error: function(XMLHttpRequest, textStatus, errorThrown) { //Ajax failed
             var errmsg = "Error happened during Ajax page down: ";
             errmsg += XMLHttpRequest.responseText;
             errmsg = "<tr>" + errmsg + "</tr>";
             jQuery(theRow).html(errmsg);      
         },
         complete: function(XMLHttpRequest, textStatus) { //Ajax completed    
             jQuery(theRow).find('.spin-img').hide();
         }
    });
	return false; //TW 2010-03-04 added for mobile jquery1.5 does not support the event.preventDefault() must return false
}
/****************************************************************/
/** Setup refresh page when image map clicked                   */
/****************************************************************/
function setupImageMapCall() {   
    jQuery('map area').click(function(event) {
        var url = jQuery(this).attr('href');
        if (url.indexOf('other=1') > 0) { //&other=1, go there 
            return;  
        }     
        event.preventDefault(); //supress click on map area
        
        var firstkeyName = jQuery.valByNameFromQS('firstkey', url );
        if (firstkeyName) {
            firstkeyName = jQuery.trim(firstkeyName);
        }
        var firstkey = firstkeyName;
        var needDsp = "&q=1"; //need to dsp selection info when page load
        var rxxx = options2.appkeys[firstkeyName]; //R001, R002
        
        if (!rxxx) {
            return; //if 1st key not in selection, no graph drill down
        }
  
        //1st key is in selection, clear/grey selections before going to url 
        firstkey = rxxx;
        needDsp = ""; //1st key is in selection, no need to dsp another one

        //alert(rxxx + "----" + url);
        var r001Val  = jQuery.valByNameFromQS('firstVal', url );
        r001Val = jQuery.trim(r001Val);
        r001Val = r001Val.replace(/,/g,'');
        r001Val = r001Val.replace(/ /g,'_%25_');
        var firstKeyPair = firstkey + "=" + r001Val ;
        var url = appUrl2 + "?" + firstKeyPair + parmValuesDrill(firstkey) + needDsp;
        var theid = "#sel_" + rxxx;
        
        if (options2.greyoutOn) {//smart logic
            refreshSelections({ menu_bodyId : theid, url_togo: url, firstKeyPair: firstKeyPair});
        } else { //no smart logic, just drill down
            var otparms = parmValuesDrill(rxxx);
            otparms = otparms.replace(/_%_/g, '_%25_');//mrc encode for space 
            var url = appUrl2 + "?imgdrill=y&" +  firstKeyPair + otparms;
            window.location = url; 
        }
      
    });  
}
/********************************************************************/
/** Setup link with page parms. When users paint a link in the 
 * page the can add class=link_with_parms to include selected parms */
/********************************************************************/
function setupLinkWithParms() {   
    jQuery('.link_with_parms').click(function(event) {
        var url = jQuery(this).attr('href');   
        event.preventDefault(); //supress click on map area
        var qora = "?";
        if (url.indexOf("?") > 0) {
            qora = "&";
        }
        var url = url + qora + parmValuesDrill( );
        window.location = url;       
    });  
}
/****************************************************************/
/** display selection when page is from image map click         */
/****************************************************************/
function dspSelectionForImageMap(url) {   
    var needDsp = jQuery.valByNameFromQS('q', window.location.href);  
    if (needDsp == '' ) {
        return;
    }
    
    var fkdiv = jQuery('#firstKeyDiv');
    var kname = fkdiv.attr('kname'); 

    if (url.indexOf('&' + kname) < 0) {
        return; //if url does not contain this key, skip
    }
    
    var kval = jQuery.valByNameFromQS(kname, window.location.href)
    jQuery('#firstKeyVal').text(kval);
    fkdiv.show();
    jQuery('#dlt_img_sel').click(function() { //click to go to main page with no selection
        var url = appUrl2 + '?z=1' + parmValuesDrill();
        //alert(url);
        window.location = url;
    }); 
}
/****************************************************************/
//   Initiallize input sliders if any
/****************************************************************/
function initSliders() {
	jQuery('.hideme').remove(); //remove by user
	
    var sliderDivs = jQuery(".slider-bar");
	if (!sliderDivs) {
	   return;
	}

	sliderDivs.each(function() {
	    var slider = jQuery(this);
	    var thisid = slider.attr("id").substring(6); //id = sliderR001...
		var min = parseInt(slider.attr("min"));
		var max = parseInt(slider.attr("max"));
		var step = parseInt(slider.attr("step"));
		var trigger_run = slider.hasClass("trigger_run")
		if (slider.hasClass("range") ) {
		   rangeSlider(thisid, min, max, step, trigger_run);
		} else {
		   singleSlider(thisid, min, max, step, trigger_run);
		}
	});
}

/****************************************************************/
// Block UI and run report.
/****************************************************************/
function blockUIandRun(formId, appUrl, dataPaneId) {
if(isPivot == true){
		getSubTotals();
		if(valid == true){
			blockBrowser(formId, appUrl, dataPaneId);
			insertReportData(formId, appUrl, dataPaneId);
		}else{
			alert('At least one value field for totaling must be selected and set to display.');
		}
	}else{
		blockBrowser(formId, appUrl, dataPaneId);
		insertReportData(formId, appUrl, dataPaneId);	 
	 }
}
/****************************************************************/
//  Block UI 
/****************************************************************/
function blockBrowser(formId, appUrl, dataPaneId) {
	  //block page at form submit
	 jQuery.blockUI.defaults.css = {};
	 jQuery.blockUI({  centerY: 0, 
         css: { top: '250px', left: '380px', right: ''} ,
	     message: '<div id="blockui_splash" ><img src="/mrcjava/image/maploader.gif" /> &nbsp; Loading data, please wait ...</div>'
	 }); 
}
/****************************************************************/
// Set graph position for PDF.
/****************************************************************/
function graphPosition() {
   var top0 = jQuery(graphHolderId).css('top');
   var left0 = jQuery(graphHolderId).css('left');
   if (top0 == 'auto' || left0 == 'auto') {
   	   return;  //graph location not changed
   }
   jQuery('#graphtop').val('0');
   jQuery('#graphleft').val(left0);
}
/****************************************************************/
//  Get report data and insert data to passed element Id
/****************************************************************/
function insertReportData(formId, appUrl, dataPaneId) {

  var parms = parmValues(formId);
  
  if(isPivot == true){
		parms += '&pivot=y';
  }
  var qoramp = "?";
  if(appUrl.indexOf("?") >=0){
	qoramp = "&";
  }
  
  var url = appUrl + qoramp + "onepage_data=1&" +  parms + "&x=" + Math.random();
  var urlparm = window.location.search.substring(1);
  var previewMaxRows = jQuery(".max_rows_list > li.selected", window.parent.document).attr('max_rows');
  if(previewMaxRows && previewMaxRows != ''){
	url += '&max_preview_rows=' + previewMaxRows;
  }
  //has key name rather than R001 and is image drill
  if (urlparm && urlparm.indexOf('q=1') > 0 && _imageDrill) { 
     var pos = urlparm.indexOf('&');
     url += '&' + urlparm.substring(0, pos); //add name=val only
  }
  
  url = url.replace(/_%_/g, '_%25_');//mrc encode for space in select list
  //alert(url  );
  if(isPivot == true){
	url = url.replace("&run=0","");
	}
	//alert('5'+url);
  jQuery.ajax({ url: url, dataType: "html",
     success: function(data, textStatus) {	//Ajax success!
        displayData(data);
		if(isPivot == true){
			setInitialParms();
			jQuery("#report-graph").show();
			jQuery("#pivotContainer").show();
			resetDimensions();
		}
		try{
			irtCallback();
		}catch(err){
		
		}
	    otherParms = parmValuesDrill();  //get parms for drill down 
	 },
	 error: function(XMLHttpRequest, textStatus, errorThrown) { //Ajax failed
	   var errmsg = "Error happened during Ajax request: ";
	   errmsg += XMLHttpRequest.responseText;
       jQuery(datapaneIdj).html(errmsg);
	 },
	 complete: function(XMLHttpRequest, textStatus) { //Ajax completed	
	           
       /* setup customer links that need include page parms */
       setupLinkWithParms();
       
       /* Hide/show menu pane   */
       SetupMenuHideShow();
       
	   /* Unblock page when Ajax complete */
	   if (jQuery('form #btn_search').length == 0 ||
	           jQuery('#isinit').val() == '1' || 
	           !options2.greyoutOn) {
 	       setTimeout(function(){jQuery.unblockUI();}, 200);
       }
       
       /* no selections, unblock */
       if (jQuery.jsonIsEmpty(options2.appkeys)) {
           setTimeout(function(){jQuery.unblockUI();}, 200);
       }
	   
	  jQuery('#reorder').val('N');
       jQuery('#sort_typ').val('');
       jQuery('#cur_sort_col').val('');
       jQuery('#isinit').val('0');
       jQuery('#imgdrill').val('n');
       
	   //make graph graggable	
	   //jQuery(graphHolderId).draggable({cursor: 'move'}); 
	   
	   /*show runtime selections ,  setup Runtime Remove */
	   jQuery('#runtime_select').show();
	   if (jQuery('#runtime_select').length) {
	       jQuery('#sel_criteria_text').show();
	   }

	   setupRuntimeRemove();
	 }
  });

  return ;
}

/****************************************************************/
//   Display data sent by server.  
/****************************************************************/
function displayData(data) {
	
	var dataPane = jQuery(datapaneIdj).html();
   jQuery(datapaneIdj).html(data); 
	
	var error = data.indexOf("displayError");
	if(isPivot == true && error > 0){
		jQuery(datapaneIdj).html(dataPane);
	}

   //Setup drill down from subtotal rows
   setupDrill();   
   
   //Setup refresh page when image map clicked 
   setupImageMapCall();
   
    if (jQuery.jsonIsEmpty(options2.appkeys)) {
		if(isPivot == false){
			jQuery('map').remove(); //no img drill if 1st key not in R000
			return; //no selection, skip refresh selection
		  }
    }
    
   //Refresh selections if 1st key is in selection
    var kname = jQuery('#firstKeyDiv').attr('kname'); 
    var rxxx = options2.appkeys[kname]; //R001, R002
    if (options2.keyrls) {
    var rls = options2.keyrls[kname];
      if (rls && (rls != 'EQ' && rls != 'LS')) {
			if(isPivot == false){
				jQuery('map').remove();
			}
      }
    }
    
    var imgdrlval = jQuery('#imgdrill').val();
    var isinit = jQuery('#isinit').val();
    if (!rxxx) {
        var rxxx0 = firingId;
    /*    if (!rxxx0) {//no firing id, just grab the first one
            var menus = jQuery('.menu_body') ;
            if (menus.length > 0) {
                rxxx0 = menus.eq(0).attr('id').substring(4) 
            }
        }*/
        rxxx = rxxx0; //if first key not in selection, still do smart logic
        //if 1st key not in Selections (not R00n), remove img map
        if(isPivot == false){
				jQuery('map').remove();
			}
    }
    
    if (rxxx) {       
        if ( options2.greyoutOn && isinit) {   
           //  if (isinit == '1' && imgdrlval == 'y') {     
           if (isinit == '1'  ) {
              refreshSelections2({ menu_bodyId : rxxx});
           } else  if (isinit != '1') {
                if (jQuery('form #btn_search').length == 1) { //has run button                          
                     refreshSelections2({ menu_bodyId : rxxx});
                } else if (jQuery('form #btn_search').length == 0  ) {//no run button
                    //run from enter key   
                    if (_enterKeyPressed) {
                       _enterKeyPressed = false;            
                       refreshSelections2({ menu_bodyId : rxxx});
                    }
                } else {
                     setTimeout(function(){jQuery.unblockUI();}, 200);
                }
           }
        }
        return;
    }
    
    setTimeout(function(){jQuery.unblockUI();}, 200);    
}
/****************************************************************/
//   Display errors sent by server. Called from Ajax response.
/****************************************************************/
function displayError(errors) {
   _hasEditError = false;
  
  if (!errors) { 
      return;
  }
  
  _hasEditError = true; //tell not do greyout
  
  for (var i=0; i < errors.length; i++) {
     var msg = errors[i];
     if (!msg || msg == '') {
	    continue;
	 }
	 var errid = "#msg_R00" + (1+i);
	 if (i >= 9) {
	    errid = "#msg_R0" + (1+i);
	 }
	 jQuery(errid).text(msg);
     jQuery(datapaneIdj).html("");
  }
}
/****************************************************************/
//   Setup for runtime selection removal when user delete selection from data pane
/****************************************************************/
function setupRuntimeRemove() {
  jQuery('.dlt_sel').each(function() {
    var imgspan = jQuery(this);
	var theid0 = imgspan.attr('id');
	var theid = "#sel_" + theid0.substring(4); 
	imgspan.click(function() {	    	    
	    isRuntimeRemoval = true; 
	    
	    // clear selected 
	    clearSelected(theid);  
	     
	    // hide this selection 
	    imgspan.fadeOut(1000);
	    
	    // clear/grey for selections, and run query 
	    if ( options2.greyoutOn ) {
	        refreshSelections({ menu_bodyId : theid});
	    // no refresh, just run query 
	    } else if (trigger_run_query) {
		
	       blockUIandRun(formId2, appUrl2, datapaneId2);	
	    }	   
	});
  });
}

/*****************************************************************/
//  Clear selected items inside a menu_body (called from data pane)
//  <div class="menu_body"  id="sel_R004"> 
/****************************************************************/
function clearSelected(theid) {
    
    //reset select list
    clearSelectedSelectList(theid);
        
    //reset input or input with slider 
    var rid = theid.substring(5); //R001..
    var sid = '#slider' + rid;
    if (jQuery(sid).length == 0) { //not slider       
       jQuery(theid + ' .text_input').val('');
       jQuery('input.' + rid).val(''); //clear LS/NS inputs
       jQuery('input#' + rid).val(''); //clear LS/NS inputs
    } else { //slider, reset min/max values
       var min = jQuery(sid).slider('option', 'min');
       var max = jQuery(sid).slider('option', 'max');
       var inputSel = "input[name='" + rid + "']";
       var inputs = jQuery(inputSel);
       if (inputs && inputs.length == 1) { //single slider
           jQuery(inputs.val(min));
           jQuery(sid).slider('option', 'value', min);
       } else  if (inputs && inputs.length == 2) { //range slider
          jQuery(inputs[0]).val(min);
          jQuery(inputs[1]).val(max);
          jQuery(sid).slider('option', 'min', min);
          jQuery(sid).slider('option', 'max', max);
          jQuery(sid).slider( 'values', 0, min);
          jQuery(sid).slider( 'values', 1, max);
       }    
    }
    
    //reset converted list divs and their inputs
    var listDivs = jQuery( theid + ' .list_div');
    if (listDivs.length > 0) {
      listDivs.each(function() {
          //jQuery(this).textListUnclick();
          jQuery(this).bg("").css('font-weight',400);
      }); 
      var rid = theid.substring(5); //R001
      var inp = '#' + rid + 'Id';  
      jQuery(inp).val('');
    }
    
    //reset converted checkboxes / radios
    jQuery(theid + ' :checked').attr('checked', '');  
    
 
}
/*****************************************************************/
//  Clear selected items inside a menu_body (called from Ajax referesh)
//  <div class="menu_body"  id="sel_R004"> 
/****************************************************************/
function clearSelected2(theid) {
    
    //reset select list
    clearSelectedSelectList(theid);
    
    //reset input fields
    //jQuery(theid + ' input[type=text]').val('');
    jQuery(theid + ' .text_input').val('');
   
    //reset converted list divs and their inputs
    jQuery(theid + ' .list_div').each(function() {
        jQuery(this).bg("");
        jQuery(this).css('font-weight',400);
        var theId = jQuery(this).parent().attr('id');
        var inp = '#' + theId + 'Id'; //the created hidden input - R001Id
        jQuery(inp).val("");
    
    });  
    //reset converted checkboxes / radios
    jQuery(theid + ' :checked').attr('checked', ''); 
}
/*********************************************/
//  Clear selected select list inside a menu_body  
//  <div class="menu_body"  id="sel_R004"> 
/**********************************************/
function clearSelectedSelectList(theid) {

   //reset mrc regular select
   var mrcSelect =   theid + ' select';
   jQuery(mrcSelect).val(''); 
   var mrcOpt = mrcSelect + ' option';
   jQuery(mrcOpt).each(function() {
       if (jQuery(this).attr('disabled')) {
          jQuery(this).removeClass(optionDisabledClass).attr("disabled", false);
       }
   }); 
   
   //reset asm select
   var asmSelect =   theid + ' select.asmSelect';
   jQuery(asmSelect).val('');
   
   //remove asm list item from ol list 
   var ol =   theid + ' ol.asmList';
   var olliItems = ol + ' li';
   jQuery(olliItems).slideUp('fast', function() {
      jQuery(this).remove();
   });
}
/*****************************************************************/
//  Reset background after removing selected from data pane.
//  <div class="menu_body"  id="sel_R004"> 
/****************************************************************/
function clearSelectedBg(theid) {
    jQuery(theid + ' .list_div').each(function() { 
        jQuery(this).bg('');
    });
   
    //reset converted checkboxes / radios
    jQuery(theid + ' :checked').next().bg(''); 
}
/*****************************************************************/
//  Get report parm values from form inputs
/****************************************************************/
function parmValues(formId) {
	if(isPivot == true){
		var get = getSubTotals();
	}
   var valueUrl = "";
   var ids = "#" + formId + " input," + "#" + formId + " select";
   var saved = [];
   
   jQuery(ids).each(function(index) {  
	  var fieldName = jQuery(this).attr('name'); 	  
	  var sels = jQuery('#sel_' + fieldName + " select.mrcselect");//chk select
	  if (sels.length == 0) {
         sels = jQuery('input[name=' + fieldName + "]"); //chk inputs
	  }
      
	  var pair = parmPair(fieldName, this);
	  var pairInSaved = false;
	  for (var i in saved) {
	      //do not add dup parm (pair: R001=A%20B, saved[i]: R001=A
	      if ( pair == saved[i] || (pair.indexOf(saved[i]) == 0 && pair.indexOf('%20') > 0) ) { 
	         if (sels.length != 2  ) { //for range allow dup
	           pairInSaved = true;
	         }
          }
	  }
	  if (!pairInSaved && pair.length > 0) {
          valueUrl += pair;
          saved.push(pair);
	  }
 
      var thisId = jQuery(this).attr('id'); 
      var errid = "#msg_" + thisId; 	 //remove err msg if any
      jQuery(errid).text("");
	
   });
   
   return valueUrl;
}
/****************************************************************/
//  Get report parm values from form inputs for Ajax drill down
/****************************************************************/
function parmValuesDrill(firstkey) {
  var valueUrl = "";
  var ids = "#" + formId2 + " input," + "#" + formId2 + " select";
  jQuery(ids).each(function(index) {  
	 var fieldName = jQuery(this).attr('name'); //R001, R002
	 if (fieldName) {
	   if (jQuery.isR0nn(fieldName) || fieldName.indexOf('CALCULA') == 0) {
	     var pair = parmPair(fieldName, this); 
	     if (firstkey  && fieldName == firstkey) {
	         pair = ""; //image map link, do not incl R0001
	     }
	     valueUrl += pair;	
	   }
	 }
  });
  return valueUrl;
}
/****************************************************************/
//  Get a pair of field name/value 
/****************************************************************/
function parmPair(fieldName, InputField) {
   var inp = jQuery(InputField);
   if (!fieldName) {
       return ""; //2011-09-14, for jQuery 1.6.4
   }
   if ( inp.attr('type') == 'radio' && !inp.attr('checked')) {
      return ""; // uncheck radios 
   } else if ( inp.attr('type') == 'checkbox' && !inp.attr('checked')) {
      return ""; // uncheck checkbox 
   } else if ( fieldName.indexOf('asm') >= 0) {
      return ""; // asm select field 
   } 
   var fldVal = inputFieldValue(InputField);
   if (!fldVal || fldVal == '') {
       return "";
   }
   //fldVal = fldVal.replace(/&/g, '%26')
   var pair = "&" + fieldName + "=" + fldVal;
   return pair;
}
 
/****************************************************************/
//  Get input field value of one field. 
/****************************************************************/
function inputFieldValue(InputField){ 
  var value = ""; 
  var inp = jQuery(InputField);
  var inpval = inp.val();
  if (!inp || !inpval) {
     return "";
  }
  
  var fieldName = inp.attr('name'); 
  var type = inp.attr('type'); 
  //Detail, subtotal checkbox fields:
  if (type && type == 'checkbox' && fieldName && fieldName.indexOf('_') > 0) {
     var cked = inp.attr('checked'); //return true or false
	 var chkVal = cked ? '1' : '0';
	 return chkVal;
  }
   
  if (!jQuery.isArray(inpval) ){
     inpval = encodeURIComponent(inpval);
     return inpval;
  }
 
  var spc = "";
  jQuery(inpval).each(function(index, val) {
     val = encodeURIComponent(val);
     value += spc + val  ;
     spc = "%20";
  });
  return value;
}
 
/****************************************************************/
//  Create a jquery single slider.
/****************************************************************/
function singleSlider(id, min, max, step, trigger_run) {
    var inputSel = "input[name='" + id + "']";
	jQuery(inputSel).val(min); 
    var inpId = "#" + id;
	var sldId = "#slider" + id;
	jQuery(sldId).slider({ min: min, max: max, step: step,
	   slide: function(event, ui) { jQuery(inpId).val(ui.value); },
	   stop: function(event, ui) { 
		   if (jQuery('form #btn_search').length == 0) { //no run button
              blockUIandRun(formId2, appUrl2, datapaneId2);	
		   }
	   }
	});
}
/****************************************************************/
//  Create a jquery range slider.
/****************************************************************/
function rangeSlider(id, min, max, step, trigger_run) {
    var inputSel = "input[name='" + id + "']";
    var inputs = jQuery(inputSel);
	if (inputs && inputs.length == 2) {
	   jQuery(inputs[0]).val(min);
	   jQuery(inputs[1]).val(max);
	}
	//alert(inputs + ",  " + inputs[1]);
    var inpId = "#" + id;
	var sldId = "#slider" + id;
    jQuery(sldId).slider({range:true,  min: min, max: max,  step: step,
	    values: [min, max],
        slide: function(event, ui) { 
		   jQuery(inputs[0]).val(ui.values[0]); 
		   jQuery(inputs[1]).val(ui.values[1]); 
		},
		stop: function(event, ui) { 
		    if (jQuery('form #btn_search').length == 0) { //no run button
              blockUIandRun(formId2, appUrl2, datapaneId2);	
		   }
		}
    });
}

/*****************************************************************************/
/* Create checkbox/radio/ul inputs from select list  if any                                                                */
/******************************************************************************/
function convertList() {
	/* Create radio inputs from select list */
	jQuery('.dsp_radio > select').each(function() {
		var radioDiv = makeInputs(this, 'radio');
		radioDiv.appendTo( jQuery(this).parent()); //append to <div class=dsp_radio>
		jQuery(this).remove(); //remove select list
	});
	
	/* Create checkbox inputs from select list */
	jQuery('.dsp_check  select').each(function() {
	    
		var checkDiv = makeInputs(this, 'checkbox');
		/* append to <div class=dsp_check> or <div class=dsp_check><span> */
		checkDiv.appendTo( jQuery(this).parent()); 
		var itemWidth =  jQuery(this).parents('div.dsp_check').attr('itemwidth');
		if (itemWidth ) {
		    jQuery(this).parent().find('label').css('width',itemWidth);
		    //jQuery(this).parents('div.dsp_check').find('label').css('width',itemWidth);
		}
		var thisId = jQuery(this).attr('id');
	   // alert("dsp-check:" + jQuery(this).html());
		jQuery(this).addClass('removed').remove(); //remove select list
		 
	});

 
    /* Create simple div list from select list */
    jQuery('.dsp_list  select').each(function() {
       var itemWidth =  jQuery(this).parents('div.dsp_list').attr('itemwidth');
       var itemPerRow = jQuery(this).parents('div.dsp_list').attr('itemsperrow');

       if (!itemPerRow) {
           itemPerRow = '5'; //default
       }
       var itemPerRowInt = parseInt(itemPerRow);
   
       var fldName =  jQuery(this).attr('name');
       var aDiv = jQuery('<div />').attr('id',fldName);
       var selectedVal = "";
       var aSpace = "";
       var item = 0;
       var qs = window.location.search ;
       
       jQuery(this).children().each(function(i, val) {
          var option = jQuery(this);
          var optionVal = option.val();
		  if (optionVal && optionVal != " ") {
		      optionVal = optionVal.replace(/_%_/g, ' ');//mrc encode for space 
		      if (option.attr('selected')) {
		          selectedVal += aSpace + optionVal;
		          aSpace = " ";
		      }
		      var listDiv = jQuery(" <div />" ).attr('oval', optionVal ).text( option.text() ).addClass('list_div');	
		    
		      if (option.attr('selected') ) {//has qs
		          listDiv.bg(GREEN_COLOR); //only do it if not origial request
		      }
		      item++;
              var br = jQuery("<span />");
              if (item >= itemPerRow) {
                 br = jQuery("<br />");
                 item = 0;
              }
	          listDiv.appendTo( aDiv ).after(br);
	        
	      }      
       });	
	   aDiv.appendTo( jQuery(this).parent() );  
	  if(jQuery.browser.msie){
			if (jQuery.browser.version < "8.0"){
				jQuery(this).parent().find('.list_div').css('display', 'inline');
			}
			if( jQuery.browser.version == "8.0" && document.documentMode != null && document.documentMode == "7") {
				jQuery(this).parent().find('.list_div').css('display', 'inline');
			}
		 }
	   if (itemWidth) {
	      jQuery(this).parent().find('.list_div').css('width', itemWidth);
	   }
	   jQuery(this).remove(); //remove select list
	   //create a hidden input for this list
	   //var inputhd = = jQuery("<input  />");  //chg 1.4.2
	   var inputhd = jQuery(" <input type=hidden />" ).attr( 
	        { "value":selectedVal, "name":fldName, "id":fldName + "Id"});
	   jQuery("#hiddenfields" ).after(inputhd);	
	  
    });
} 

/****************************************************************/
/* Create checkbox/radio inputs from select list */
/****************************************************************/
function makeInputs(select, inpType) {

   var dspType = "div.dsp_check";
   if (inpType == "radio") {
       dspType = "div.dsp_radio";
   }
   var itemPerRow =  jQuery(select).parents(dspType).attr('itemsperrow');
   if (!itemPerRow) {
       itemPerRow = '5'; //default
   }
   var itemPerRowInt = parseInt(itemPerRow);
   var fldName =  jQuery(select).attr('name');
   var inpDiv = jQuery('<div />');
   var item = 0;
   jQuery(select).children().each(function(i, val) {
       var option = jQuery(this);
       var tempId = fldName + i;
       var inpstr = " <input type=" + inpType + " />";
	   var inputRadio = jQuery(inpstr )
	         .attr( { "value":option.val(), "name":fldName, "id":tempId});	
	  
	   var aLabel = jQuery('<label />').attr("for",tempId).html(option.text() + " &nbsp; ");
     
	   if (option.val() && option.val() != " ") {
	       item++;
	       var br = jQuery("<span />");
           if (item >= itemPerRow) {
               br = jQuery("<br />");
               item = 0;
           }
	   	   inputRadio.appendTo( inpDiv ).after(br).after(aLabel);
	   	   if (option.attr('selected')) {
              inputRadio.attr('checked', true);
              inputRadio.next().bg(GREEN_COLOR);
           }
	   }
   });
   return inpDiv;	   
} 

/*****************************************************************************/
//  Sort column when advanced sort is on  
/*****************************************************************************/
function sortCol(col,typ){  // for advanced sort

    var oForm = jQuery('#' + formId2);
	jQuery('#reorder').val('Y');
	jQuery('#sort_typ').val(typ);
	jQuery('#cur_sort_col').val(col);
    oForm.submit();
} 
function sendTable(format){
	var el = jQuery("<div>");
    jQuery(el).append(jQuery(".outputTable").clone());
    jQuery(el).find(".drill_icon").remove();
    jQuery(el).find(".spin-img").remove();
    jQuery(el).find("img").remove();
    var myHTML = jQuery(el).html();
    var myForm = document.getElementById(formId2);
    myForm.runtimeHTML.value = encodeURIComponent(myHTML);
    myForm.runtimeFormat.value = format;
    myForm.submit(); 
    myForm.runtimeHTML.value = "";
    myForm.runtimeFormat.value = "";

}
/****************************************************************/
//  Set desc or asc sort image 
/****************************************************************/
var s1 = new Image(); s1.src = "/mrcjava/image/ascg.gif";
var s0 = new Image(); s0.src = "/mrcjava/image/descg.gif";
function setSortImage(names) { // for set grey sort images 
  for (var i=0; i<names.length; i++) {
    var im = names[i];  
    if (document.images[im]) {
      if (im.indexOf("s0") == 0) {
        document.images[im].src =  s0.src ;
      } else {
        document.images[im].src =  s1.src ;
      }
    }
  }
}
/*****************************************************************************/
//  jQuery plugins  
/*****************************************************************************/
/*************************************************/
/* Set background-color                          */
/*************************************************/
(function($){ 
    
$.fn.bg = function(color) {
    $(this).css('background-color', color);   
    return $(this);
}
/*************************************************/
/* check if element is green                     */
/*************************************************/
$.fn.isGreen = function() {
    var yesIs = false;
    var bg = $(this).css('background-color');
    if (bg.indexOf('6f9') > 0 ||  bg.indexOf('102') > 0 ) {
        yesIs = true;
    }
    return yesIs;
}
/*************************************************/
/* check if element is bold                      */
/*************************************************/
$.fn.isBold = function() {
    var yesIs = false;
    var bg = $(this).css('font-weight');
    if (bg == '700' || bg == 'bold' ) {
        yesIs = true;
    }
    return yesIs;
}
/*************************************************/
/* Disable a form element                        */
/*************************************************/
$.fn.disable = function() {
   $(this).attr("disabled", "disabled");
   return this; 
};
/*************************************************/
/* List_div click handler                        */
/*************************************************/
$.fn.textListclick = function() {
    //first check if need to remove other selected for EQ
    $(this).textListCheckEq();
    
    //$(this).bg(GREEN_COLOR);
    var theId = $(this).parent().attr('id');
    var inp = '#' + theId + 'Id'; //the created hidden input - R001Id
    var thisTxt =  $(this).attr('oval');//text();
    thisTxt = thisTxt.replace(/ /g, '_%_');   
    
    var expr = '\\b' + thisTxt + '\\b';
    if ($(inp).val().search(expr) >= 0) { //value already in there  
        return $(this);
    }
    
    var newVal = thisTxt + " " + $(inp).val();
    $(inp).val(newVal);
    return $(this);
}
/*************************************************/
/* List_div unclick handler                      */
/*************************************************/
$.fn.textListUnclick = function() {
    $(this).bg("");
    $(this).css('font-weight',400);
    var theId = $(this).parent().attr('id');
    var inp = '#' + theId + 'Id'; //the created hidden input - R001Id
    var newVal = $(inp).val();
    var inpVal = $(this).attr('oval');//text();
    inpVal = inpVal.replace(/ /g,'_%_');
    var expr = new RegExp('\\b' + inpVal + '\\b');
    newVal = newVal.replace(expr, " ");
    $(inp).val(newVal);
    return $(this);
}
/*************************************************/
/* Check if list has selected (is green)         */
/*************************************************/
$.fn.textListHasSelected = function() {
    var texts = $(this).find('.list_div');
    var hasSelected = false;
    $(texts).each(function() {
       if ($(this).isGreen()) {  
           hasSelected = true;
           return false;
       } 
    });
    return hasSelected;
}

/*************************************************/
/*  check List_div if select relation is 'EQ',    */
/* if yes we need to unckeck other selected.     */
/*************************************************/
$.fn.textListCheckEq = function() {
    var theId =  $(this).parent().attr('id');
    var kname = jQuery.fldNameFromRxxx(theId, options2.appkeys);
    var rls = options2.keyrls[kname];
    if (rls != 'EQ') {
        return $(this);  //no need to check if not EQ
    }
    //Reset input value
    var inp = '#' + theId + 'Id'; //the created hidden input - R001Id
    var inpVal = $(this).attr('oval');//text();
    $(inp).val(''); // set value to the selected
    //remove color if any
    $('#' + theId + ' .list_div').each(function() { 
        jQuery(this).bg('');
    });
   
    return $(this);
}
/*************************************************/
/* check checkbox list if select relation is 'EQ'*/
/* if yes we need to unckeck other selected.     */
/*************************************************/
$.fn.checkListCheckEq = function() {
    var theId = $(this).attr('name'); //R001...
    var kname = jQuery.fldNameFromRxxx(theId, options2.appkeys);
    var rls = options2.keyrls[kname];
    if (rls == 'LS' || rls == 'NS') {
        return $(this);  //no need to check if not EQ
    }
    //Reset all checkboxes 
    $('#sel_' + theId + ' input:checkbox').each(function() { 
        $(this).next().bg('');
        $(this).attr('checked', false);
    });
    
    //set the clicked one
    $(this).next().bg(GREEN_COLOR);
    $(this).attr('checked', true);
   
    return $(this);
}
/*************************************************/
/* check checkbox list if select relation is 'EQ'*/
/* For with run button situation                 */
/*************************************************/
$.fn.checkListCheckEqWithButton = function() {
    var theId = $(this).attr('name'); //R001...
    var kname = jQuery.fldNameFromRxxx(theId, options2.appkeys);
    var rls = options2.keyrls[kname];
    if (rls == 'LS' || rls == 'NS') {
        return $(this);  //no need to check if not EQ
    }
    //Reset all checkboxes 
    $('#sel_' + theId + ' input:checkbox').each(function() { 
        $(this).attr('checked', false);
    });
    
    //set the clicked one
    $(this).attr('checked', true);  
    return $(this);
}
/************************************************************/
//  Get parm value from querystring  
/************************************************************/
$.valByNameFromQS = function( name, qs ){  
   name = name.replace(/[\[]/,"\\\[").replace(/[\]]/,"\\\]");  
   var regexS = "[\\?&]"+name+"=([^&#]*)"; 
   var regex = new RegExp( regexS );  
   var results = regex.exec( qs );  
   if( results == null )    
     return "";  
   else    
     return results[1];
}
/************************************************************/
//  Check if a JSON object is empty
/************************************************************/
$.jsonIsEmpty = function(obj) { 
    for(var i in obj) { 
        return false; 
    } 
    return true; 
}
/************************************************************/
//  Return field name given R001...
/************************************************************/
$.fldNameFromRxxx = function(rxxx, obj) { 
    var namei = null;
    for(var name in obj) { 
        var rxxxi = obj[name];
        if (rxxxi == rxxx) {
            namei = name;
            break;
        }
    } 
    //alert(namei + '===' + rxxx); 
    return namei; 
}
/************************************************************/
//  Check if String is of form R0nn (nn is 2-digits)
/************************************************************/
$.isR0nn = function(rxxxStr) { 
    var pattern = /^R0\d{2}$/; // match 'R0dd' - d is a difit
    var yesOrNo = pattern.test(rxxxStr);      
    return yesOrNo; 
}
})(jQuery);
