 function caCallback_Callback(control, value, validate, other_params)
{
var masterError = document.getElementById('ErrorControlFrontEnd_ValidationSummary');
if (masterError != null) {
    masterError.innerHTML='';
}
var masterError = document.getElementById('ErrorControlFrontEnd_plError');
if (masterError != null) {
    masterError.innerHTML='';
}
var masterError = document.getElementById('ErrorControlFrontEnd_plInfo');
if (masterError != null) {
    masterError.innerHTML='';
}
if (validate == true)
{
   if (typeof(Page_ClientValidate) == 'function')
   {
       Page_ClientValidate();
       if (Page_BlockSubmit == true) return false;
   }
}
var ctl_values = caCallback_Values();
caCallback.Callback(control, value, ctl_values, other_params);
}
function caCallback_Values()
{
var ctl_values = '';
if (document.getElementById('ddlProductsPerPage') != null) {
    ctl_values += '|ddlProductsPerPage='+document.getElementById('ddlProductsPerPage').options[document.getElementById('ddlProductsPerPage').selectedIndex].value;
}
if (document.getElementById('ddlSortBy') != null) {
    ctl_values += '|ddlSortBy='+document.getElementById('ddlSortBy').options[document.getElementById('ddlSortBy').selectedIndex].value;
}
if (document.getElementById('tbSortBy') != null) {
    ctl_values += '|tbSortBy='+document.getElementById('tbSortBy').value;
}
if (document.getElementById('tbPKIDs') != null) {
    ctl_values += '|tbPKIDs='+document.getElementById('tbPKIDs').value;
}
if (document.getElementById('tbCurrentPage') != null) {
    ctl_values += '|tbCurrentPage='+document.getElementById('tbCurrentPage').value;
}
if (document.getElementById('tbProductsPerPage') != null) {
    ctl_values += '|tbProductsPerPage='+document.getElementById('tbProductsPerPage').value;
}
if (document.getElementById('tbIsSearch') != null) {
    ctl_values += '|tbIsSearch='+document.getElementById('tbIsSearch').value;
}
if (document.getElementById('tbJavaScript') != null) {
    ctl_values += '|tbJavaScript='+document.getElementById('tbJavaScript').value;
}
if (document.getElementById('tbParams') != null) {
    ctl_values += '|tbParams='+document.getElementById('tbParams').value;
}
return ctl_values;
}
function caCallback_getElementsByTagNames(list,obj) {
    if (!obj) var obj = document;
    var tagNames = list.split(',');
    var resultArray = new Array();
    for (var i=0;i<tagNames.length;i++) {
        var tags = obj.getElementsByTagName(tagNames[i]);
        for (var j=0;j<tags.length;j++) {
            resultArray.push(tags[j]);
        }
    }
    var testNode = resultArray[0];
    if (!testNode) return [];
    if (testNode.sourceIndex) {
        resultArray.sort(function (a,b) {
                return a.sourceIndex - b.sourceIndex;
        });
    }
    else if (testNode.compareDocumentPosition) {
        resultArray.sort(function (a,b) {
                return 3 - (a.compareDocumentPosition(b) & 6);
        });
    }
    return resultArray;
}
function caCallback_relocateValidationSummary() {
    var masterError = document.getElementById('ErrorControlFrontEnd_ValidationSummary');
    var subError = document.getElementById('SubErrorControl_ValidationSummary');
    var ulerror = caCallback_getElementsByTagNames("ul", subError);
    if (ulerror.length > 0) {
        if (subError != null) {
            var __vs_error_cell = document.getElementById("error_vs");
            if (__vs_error_cell) {
            __vs_error_cell.innerHTML = '<ul>' + ulerror[0].innerHTML + '</ul>'; 
                __vs_error_cell.parentNode.parentNode.parentNode.nextSibling.innerHTML = ''
                __vs_error_cell.className = 'red';
            }
        }
    }
}
function caCallback_ShowSummary()
{
    var masterError = document.getElementById('ErrorControlFrontEnd_ValidationSummary');
    var subError = document.getElementById('SubErrorControl_ValidationSummary');
    if (masterError != null && subError != null && subError.style.display != 'none') {
        masterError.innerHTML=subError.innerHTML;
        masterError.style.display='block';
        subError.style.display='none';
    }
    setTimeout("caCallback_relocateValidationSummary()", 100);
}
function caCallback_ShowError()
{
    var masterError = document.getElementById('ErrorControlFrontEnd_plError');
    var subError = document.getElementById('SubErrorControl_plError');
    if (masterError != null && subError != null && subError.style.display != 'none') {
        masterError.innerHTML=document.getElementById('SubErrorControl_plError').innerHTML;
        masterError.style.display='block';
        subError.style.display='none';
        subError.innerHTML='';
    }
}
function caCallback_ShowInfo()
{
    var masterError = document.getElementById('ErrorControlFrontEnd_plInfo');
    var subError = document.getElementById('SubErrorControl_plInfo');
    if (masterError != null && subError != null && subError.style.display != 'none') {
        masterError.innerHTML=subError.innerHTML;
        masterError.style.display='block';
        subError.style.display='none';
        subError.innerHTML='';
    }
}

   function caCallback_CallbackError(sender, eventArgs)
            {
                alert("Callback error has occured");
            }
            
            function caCallback_Complete(sender, eventArgs)
            {
				//alert("Callback has completed");
            }
            
            /* Products Per Page Filter */
            function ddlProductsPerPage_onChange()
            {
                try
                {
                    // Drop down list object
				    var obj = $("ddlProductsPerPage");
				    
				    // Selected value
				    var productsPerPage = obj.options[obj.selectedIndex].value;
				    
				    // Update the hidden textbox
				    $("tbProductsPerPage").value = productsPerPage;
				    
				    // Run callback
				    caCallback_Callback("ChangePageSize", "pagesize=" + productsPerPage + ";");
                }
                catch (ex)
                {
                    alert("ddlProductsPerPage_onChange:\n" + ex);
                }
                finally
                {
                }
            }
            
            /* Sort By Filter */
            function ddlSortBy_onChange()
            {
                try
                {
                    // Drop down list object
				    var obj = $("ddlSortBy");
    				
				    // Selected value
				    var sortBy = obj.options[obj.selectedIndex].value;
				    
				    // Update the hidden textbox
				    $("tbSortBy").value = sortBy;

                    // Run callback
				    caCallback_Callback("", "sortby=" + sortBy + ";");
                }
                catch (ex)
                {
                    alert("ddlSortBy_onChange:\n" + ex.description);
                }
                finally
                {
                }
            }
            
            /* Change current page index */
            function ChangePageIndex(index)
            {
                try
                {
                    if (index && typeof(index) == "number")
                    {
                        // Update the hidden textbox
                        $("tbCurrentPage").value = index;
                        
                        // Run calback
                        caCallback.Callback("", "currentpage=" + index + ";");
                    }
                }
                catch (ex)
                {
                    alert("ChangePageIndex:\n" + ex.description);
                }
                finally
                {
                }
            }
			
			/* document.getElementById(..) */
			function $(id)
			{
			    return document.getElementById(id);
            }
            
            function btnBulkAdd_onClick() {
			try {
			var isValid=true;
			var hasQty=false;
			var tb;
			
			for(var i=0; getQtyTb(i) != null; i++) {
				tb = getQtyTb(i);
				if(trim(tb.value) != "") {
					if(!isInteger(tb.value)) {
						isValid=false;
						break;
					}
				}
				if(parseInt(tb.value,0) > 0)
					hasQty=true;
			}
			
			if(!isValid) {
				alert("You must enter a valid numeric value for the Qty.");
				tb.focus();
				tb.select();
				return false;
			}
			else {
				if(!hasQty) {
					alert('You must enter at least one non-zero quantity.');
					return false;
				}
				else {
					return true;
				}
			}
		}
		catch(ex) {
			alert(ex.description);
			return false;
		}
	}