var prevFilterPanel= null;
var DEFAULT_STRING_OPERATION = "like";
var DEFAULT_NUMBER_OPERATION = "=";
var DATE_FORMAT = "dd MMM yyyy - 13 May 2008)";


var ERR_1 = "Invalid string value";
var ERR_2 = "Invalid number value";
var ERR_3 = "Invalid date value";
var ERR_4 = "Invalid string value.\n '%'is allowed at the start and end of a filter";


var EXPATRIATESDB_PANEL_WIDTH = 960;


String.prototype.trim = function()
{
    return this.replace(/(^\s*)|(\s*$)/g, "");
}


function FilterImgClicked(sender,gridId,name)
{
    var filterRow  = document.getElementById(gridId + "_FilterRow");
    var filterPanel  = document.getElementById(gridId + "_" + name + "_FilterPanel");
    
    if (prevFilterPanel != null && prevFilterPanel.getAttribute("id")== filterPanel.getAttribute("id"))
    {
        filterPanel.style.display = (filterPanel.style.display == "none")?"":"none";
    }
    else
    {
        if (prevFilterPanel!=null)
        {
            prevFilterPanel.style.setAttribute("display","none");       
        }    
        
        
        filterPanel.style.setAttribute("display","");    
        prevFilterPanel = filterPanel;
    }
    
    filterRow.style.display = filterPanel.style.display;
    
    return false;
}


function ApplyFilter(sender,gridId,name,dataType,colType)
{  
    return ValidateFilter(sender,gridId,name,dataType,colType);
}

function ClearFilter(sender,gridId,name,dataType,colType)
{
    var obj  = document.getElementById(gridId + "_" + name + "_FilterBox");
     if (isNull(obj) || isUndefined(obj)) return false;
    obj.value = "";
       
}

function ValidateFilter(sender,gridId,name,dataType,colType)
{
  
   var obj  = document.getElementById(gridId + "_" + name + "_FilterBox");
   if (isNull(obj) || isUndefined(obj)) return false;   
   obj.value = obj.value.trim();
   
   //if it is a combo
   if (colType==2) return true;
   
   var err = ValidateDataType(sender,dataType);
    if (err>0)
    {   
        if (!dataType=="DateTime")
        {
            alert(eval("ERR_"+ err));
            obj.value = "";
            obj.focus();
        }
        return false;
    }
    
    return true;
}

function ValidateDataType(sender,dataType)
{
   var value = sender.value;
   
    if (isString(value) && value.length==0) return 0;
    
    switch (dataType)
    {
        case "Int32":
        case "Int16":
        case "Double":
        case "Single":
        case "Byte":        
            return  (isNumeric(value))?0:2;
        case "DateTime":  
                 
            return (CheckCalendarDate(sender))?0:3;
        
        case "Boolean":
        case "String":
        default:
             var index = value.indexOf("%");
             if (index!=-1)
             {
                if (index ==0 || index== value.length-1) return 0;
                return 4;
             }
             
             return 0;
    }
}

function CheckCalendarDate(sender)
{
    
    var error = validateDate(sender.value,sender.dateFormat,sender.dateFormatSeparator,sender.calendarFutureYears,sender.calendarTotalYears);
    
    if (sender.value!="" && error >0)
    { 
        
        var message  = "";
        
        switch(error)
        {
            case 1:
                message = "Invalid date format use [" + sender.dateFormat +  "] date format";
                break;
            case 2:
                var cFY = parseInt(sender.calendarFutureYears);
	            var cTY = parseInt(sender.calendarTotalYears);
            
                message = "Invalid year! Must be in (" + ((new Date()).getFullYear() + (cFY - cTY)) +
                            " - " + (new Date()).getFullYear() +  cFY + ")";
                break;
        }
        
    
       alert(message);    
       sender.focus();
       return false;
    }
    
    return true;
}


function CheckCalendarDateWithPostBack(sender)
{
    
    if(event.toElement!=null)
    {
        if (event.toElement.id.indexOf("_"+sender.id)!=-1) return true;
    }
    
    var error = validateDate(sender.value,sender.dateFormat,sender.dateFormatSeparator,sender.calendarFutureYears,sender.calendarTotalYears);
    
    if (sender.value!="" && error >0)
    { 
        
        var message  = "";
        
        switch(error)
        {
            case 1:
                message = "Invalid date format use [" + sender.dateFormat +  "] date format";
                break;
            case 2:
                var cFY = parseInt(sender.calendarFutureYears);
	            var cTY = parseInt(sender.calendarTotalYears);
            
                message = "Invalid year! Must be in (" + ((new Date()).getFullYear() + (cFY - cTY)) +
                            " - " + ((new Date()).getFullYear() +  cFY) + ") range";
                break;
        }
        
    
       alert(message);
       sender.focus();
       return false;
    }
 
    
    __doPostBack(sender.name,'')
    
    return true;
}



function CalendarClick(sender)
{
   /*
   if (sender.value=="")
   {
        sender.value =DATE_FORMAT;
        sender.style.color="#8493B4";
   }
   */

}

function AdjustToolbar(gridId,adCellId)
{


    var imgObj  = document.getElementById(adCellId);
    if(imgObj==null) return;

    var divObj  = document.getElementById(gridId + "_pnlToolbar");

    if (!isNullOrUndefined(divObj) && divObj.offsetWidth > EXPATRIATESDB_PANEL_WIDTH)
    {
        imgObj.style.width=divObj.offsetWidth - EXPATRIATESDB_PANEL_WIDTH + 1;
        imgObj.style.height="1px";
        //show cell 
        document.getElementById(adCellId + "_cell").style.display = "block";
    }
}

function OnGridButtonClick(obj)
{
    disableAllElements(obj);
    return true;
}


function disableAllElements(obj) 
{
    var el = document.getElementsByTagName("input"); 
    for (var i = 0; i < el.length; i++) 
    {

        if (el[i].name != obj.name && el[i].type != "hidden") 
        {
            el[i].setAttribute('disabled', true);
        }

        el[i].onclick = function() { return false; };
    }
}

function CalendarKeyDown(sender)
{

}

/*
    raised on click on plus img (for grouping functionality)
*/

function Plus_OnClick(e)
{
    //get src element
    var obj = (document.all) ? event.srcElement : e.target;
    //grouping name 
    var groupingName = obj.getAttribute("groupingName");
    //get grouping element used for keeping list of expanded groups 
    var groupingFld = document.getElementByTagAndId("input", "gridGrouping", "hidden");
    //add this group to the list
    if ((groupingFld.value).indexOf("," + obj.getAttribute("id")) == -1)
    groupingFld.value = groupingFld.value + "," + obj.getAttribute("id"); 
    //change image and attach event    
    obj.src = "images/_minus.gif";
    obj.onclick = Minus_OnClick;

    //get table object 
    var table = obj.parentNode;    
    while (table.tagName.toUpperCase() != 'TABLE') table = table.parentNode;
    //get row that contains obj
    var row = obj.parentNode;
    while (row.tagName.toUpperCase() != 'TR') row = row.parentNode;

    //scan all table rows and find all rows with specific groupingName
    var counter = 1;       
    for (var i = 0; i < table.rows.length; i++)
    {
        if (table.rows[i].getAttribute("groupingName") != null && table.rows[i].getAttribute("groupingName") == groupingName)
        {
            //show row 
            table.rows[i].style.display = "";
            table.moveRow(i, row.rowIndex + counter);
            counter++;            
        }
    }
}

/*
raised on click on minus img (for grouping functionality)
*/
function Minus_OnClick(e) 
{
    //get src element
    var obj = (document.all) ? event.srcElement : e.target;
    //grouping name
    var groupingName = obj.getAttribute("groupingName");
    //get grouping element used for keeping grouping state
    var groupingFld = document.getElementByTagAndId("input", "gridGrouping", "hidden");
    //remove this group from the list 
    if (groupingFld != null)
        groupingFld.value = groupingFld.value.replace("," + obj.getAttribute("id"), "");

    //change image and attach event    
    obj.src = "images/_plus.gif";
    obj.onclick = Plus_OnClick;
    
    //get table object 
    var table = obj.parentNode;
    while (table.tagName.toUpperCase() != 'TABLE') table = table.parentNode;
    
    var counter = 0;
    var len = table.rows.length;

    while(counter < len)
    {
        if ( table.rows[counter].getAttribute("groupingName") == groupingName)
        {
            //hide row and move it to the end 
            table.rows[counter].style.display = "none";
            table.moveRow(counter, table.rows.length - 1);
            len--;
        }
        else
        {
            counter++;
        }
    }
}

/* initialize grid grouping on start up */
function InitGrid() 
{
   /* if table doesn't support moveRow(ex.Mozzila) create it */  
   if (document.getElementsByTagName("TABLE").length >0 && typeof(document.getElementsByTagName("TABLE")[0].moveRow) == "undefined")
    {
        Node.prototype.moveRow = function()
        {
            if (this && this.nodeName.match(/^(table|t(body|head|foot))$/i))
            {
                sourcePosition = (!arguments[0] && arguments[0] != 0 ? -1 : arguments[0]);
                destPosition = (!arguments[1] && arguments[1] != 0 ? -1 : arguments[1]);

                if (!this.rows[sourcePosition] || destPosition >= this.rows.length)
                {
                    throw "Invalid parameters";
                }

                var srcRow = this.rows[sourcePosition];       
                var destRow = null;
                if (destPosition < this.rows.length-1)
                {
                    destRow = (destPosition > sourcePosition) ? this.rows[destPosition + 1] : this.rows[destPosition];
                }
                
                var parentNode = srcRow.parentNode;
                var clonedRow = srcRow.cloneNode(true);

                if (destPosition == this.rows.length - 1)
                    parentNode.appendChild(clonedRow);
                else
                    parentNode.insertBefore(clonedRow,destRow);
                
                parentNode.removeChild(srcRow);
            }
        }
    }

        
    var tables = document.getElementsByTagName("table");
    var table = null;
    var counter = 0;
    var len = 0;

    //scan all "grouping" tables and move hidden row to the end of table (prevent double lines around hidden row)
    for (var i = 0; i < tables.length; i++) 
    {
        table = tables[i];
        
        if(!isNullOrUndefined(table.getAttribute("grouping")) && table.getAttribute("grouping") == "1" )
        {
            len = table.rows.length;
            while (counter < len)
            {
                if (table.rows[counter].getAttribute("groupingName") != null)
                {   
                    table.moveRow(counter, table.rows.length - 1);
                    len--;
                }
                else
                {   
                    counter++;
                }
            }
        }
    }

    if (typeof (document.getElementByTagAndId) == "undefined")
    {
        document.getElementByTagAndId = getElementByTagAndId;
    }

    var groupingFld = document.getElementByTagAndId("input","gridGrouping","hidden");

    //try to expand all groups listed in groupind field
    if (groupingFld != null && groupingFld.value != "")
    {
        var s = groupingFld.value.split(",");
        var obj = null;

        for (var t = 0; t < s.length; t++)
        {
            obj = document.getElementById(s[t]);
            if (s[t] != "" && obj != null && obj.tagName.toUpperCase() == "IMG")
            {
                if (typeof (obj.click) == "undefined" && typeof (HTMLElement.prototype.click) == "undefined")
                    HTMLElement.prototype.click = function()
                    {
                        var evt = this.ownerDocument.createEvent('MouseEvents');
                        evt.initMouseEvent('click', true, true, this.ownerDocument.defaultView, 1, 0, 0, 0, 0, false, false, false, false, 0, null);
                        this.dispatchEvent(evt);
                    }
                obj.click();
            }
        }
    }
}


function getElementByTagAndId(tagName,id,type)
{
    var elements = document.getElementsByTagName(tagName);

    for (var i = 0; i < elements.length; i++)
    {
        if (elements[i].getAttribute("id") && (elements[i].getAttribute("id")).indexOf(id) != -1 
                    && (typeof (type) == "undefined" || elements[i].getAttribute("type").toLowerCase() == type.toLowerCase()))
            return elements[i];
    }
    return null;
}


