﻿﻿﻿// JScript File




﻿﻿// JScript File
//на табл. джобс на первой стр.
function highLightRow2()
{
    src=window.event.srcElement;
    if (src.tagName=='TD')
        row=src.parentElement;
    else if (src.tagName=='A') {
         if (src.className=='link')
            AppendToClassName(src,'linkHover');
         else if (src.className=='altLink') 
            AppendToClassName(src,'altLinkHover');
         return;    
    } else
        return;
        
    
    AppendToClassName (row,'gridRowHover');
    //гиперлинки нуждаются в особой обработке
    for (j=0;j<row.cells.length;j++)
    {
        cell=row.cells[j];
        for (i=0;i<cell.childNodes.length;i++)
        {
            if (cell.childNodes[i].tagName=='A')
            {   
                if (cell.childNodes[i].className=='link')
                    AppendToClassName(cell.childNodes[i],'linkHover');
                else if (cell.childNodes[i].className=='altLink') 
                    AppendToClassName(cell.childNodes[i],'altLinkHover');
                
            }    
        }
    }    
    
}


function resetHighLightRow2()
{
    src=window.event.srcElement;
    if (src.tagName=='TD')
        row=src.parentElement;
    else if (src.tagName=='A') {
        RemoveClassName(src,'linkHover');
        RemoveClassName(src,'altLinkHover');
        return;
    } else
        return;
    
  
        //src.parentElement.style.backgroundColor='e2eef5'; 
    
    RemoveClassName(row,'gridRowHover');
    //гиперлинки нуждаются в особой обработке
    for (j=0;j<row.cells.length;j++)
    {
        cell=row.cells[j];
        for (i=0;i<cell.childNodes.length;i++)
        {
            if (cell.childNodes[i].tagName=='A')
            {   
                RemoveClassName(cell.childNodes[i],'linkHover');
                RemoveClassName(cell.childNodes[i],'altLinkHover');
            }    
        }
    }    
     
    
    
}



function hightLightRow()
{
    src=window.event.srcElement;
    if (src.tagName=='TD')
    {
       //  firstSibling=src.parentElement.firstChild;
        if(src.outerHTML.indexOf('href=')>-1) return;
        if(src.outerHTML.indexOf('INPUT')>-1) return;
          
        // if (firstSibling.className=='HideIDCSS')
       //  {
            if(src.parentElement.className=='GridSelectedRowCss') return;
            src.parentElement.style.backgroundColor='e2eef5'; 
            src.parentElement.style.cursor='hand';
       //  }
    } else if (src.tagName=='TH') {
    
         src.style.cursor='hand';
      //   src.style.backgroundColor='#ced7e1';
    }

}


function resetHightLightRow()
{
    src=window.event.srcElement;
    if (src.tagName=='TD')
    {
      
        if(src.outerHTML.indexOf('href=')>-1) return;
       if(src.outerHTML.indexOf('INPUT')>-1) return;
        
      // firstSibling=src.parentElement.firstChild;
        
        //if (firstSibling.className=='HideIDCSS')
       // {
            src.parentElement.style.backgroundColor='';
            src.parentElement.style.cursor='';
       // }
    } else if (src.tagName=='TH') {
    
         src.style.cursor='';
         //src.style.backgroundColor='#e7ecf1';
    }
    
}






//ключи передаются полностью
function processUI(dataKeyNames,mode,afterSelectCommand)

{


    src=window.event.srcElement;
    if (src.tagName=='TD')
    {
      //  firstSibling=src.parentElement.firstChild;
       if(src.outerHTML.indexOf('href=')>-1) return;
       if(src.outerHTML.indexOf('INPUT')>-1) return;
         
       var rowObj=src.parentElement;
       var tableObj=rowObj.parentElement.parentElement;
       //датакейвалуе имеет вид key1value_key2_value
       //datakeynames передаются в виде datakeyname1,datakeyname2
       var dataKeyValues=rowObj.id.substring(tableObj.id.length+4);
       
       //попробуем создать датакей в микрософтовском стиле
       dataKeyNamesArray=dataKeyNames.split(',');
       dataKeyValuesArray=dataKeyValues.split('_');
       var dataKeys =new Array();
       for (i=0;i<dataKeyNamesArray.length;i++)
       {
            dataKey = new Object();
            dataKey.key=dataKeyNamesArray[i];
            dataKey.value=dataKeyValuesArray[i];
            dataKeys.push(dataKey);
       }
       
        
        
        
      
//        eventTarget='dv$users';
//        eventArgument='Select$' + dataKeyValue;
//        eventCallback=null;
//        context=null;
//        useAsync=false;
//        validate=false;
//        validationGroup="";
//        
//        html=   DoCallback(eventTarget, eventArgument,eventCallback,context,useAsync,validate,validationGroup) 
////маркер начала рендеринга
//        //dv_users.outerHTML=html.substring(html.indexOf('render:')+7);
//         container.outerHTML='<div><table>' + html + '</table></div>';
       //если это лук=ап виндоу - вернуть значение. Иначе - открыть "детальвью"
       
       table='';
       qstr=parseQueryString(window.location.search);
       if (qstr!=undefined && qstr['table']!=undefined) table=qstr['table'];
       
       url='Details.aspx?table=' + table ;
       for(i=0;i<dataKeys.length;i++)
       { 
            url += '&' + dataKeys[i].key + '=' + dataKeys[i].value;
       }
       
       
    //   if (vtable!='' && vtable!=undefined) url += '&vtable=' + vtable;
       
       switch (mode)
       {
            //на будущее
            case 'CallbackEdit':
                break;
            case 'CallbackReadOnly':
                break;
            case 'ModalEditDialog':
                vReturnValue = window.showModalDialog(url + '&mode=edit' );
                break;
            case 'ModelessEditDialog':
                window.showModelessDialog(url + '&mode=edit');
                break;
            
            case 'ModalReadOnlyDialog':
                 vReturnValue = window.showModalDialog(url + '&mode=ReadOnly');

                break;
            case 'ModelessReadOnlyDialog':
                absUrl=window.location.pathname.substring(0,window.location.pathname.lastIndexOf('/')) + '/' + url;
            
                window.showModelessDialog(absUrl + '&mode=ReadOnly',null,"resizable:1;dialogWidth:800px");
                // navigate(url);
                break;
            
            case "Select":
            case "select":
                afterSelectCommand=afterSelectCommand.replace('{dataKeyValues}',dataKeyValues);
              //  eval(afterSelectCommand);
                GridViewRowCommand(tableObj.id + ":" + dataKeyValues,"Select",afterSelectCommand);
                break;
            default:
            
                if(window.dialogArguments==undefined)  
                    navigate(url);
                else {
                //это лук-ап грид - поднятый уже - и сейчас возвращающий значение
                // после юзер-клика на какой то строке
                //лучше вернуть значения всего ряда
                    var header=tableObj.rows[0];
                    var result =new Object();
                    
                    
                    for (i=0;i<rowObj.cells.length;i++)
                    {
                        var columnName=header.cells[i].id.substring(tableObj.id.length+7);
                        var value=rowObj.cells[i].innerText;
                        
                        result[columnName]=value;
                        
                    }
                    window.returnValue=result;
                    window.close();
            
                }    
       
       }
        
            
    }    

         
    

}


//for optimizing - make sence to create special grid function for edit/delete/insert etc
//beforeCommand = script to execute before
//afterCommand = script to execute after
var gvrAfterCommand;
function GridViewRowCommand(target,command,afterCommandScript,beforeCommandScript) {


if (beforeCommandScript!='')  eval(beforeCommandScript);
    

//если в afterCommandScript пишутся аргументы - то это выполняется как ф-ция не дожидаясь
//завершения данной ф-ции
    gvrAfterCommand=afterCommandScript;

    var args=target.split(':');

    var eventTarget=args[0];
    var eventArgument=command +'$'+ args[1];
    var eventCallback=GridViewRowCallBackResult;
    var context=args[0].replace(/\$/g,"_") + ':' + command + ':' + args[1];

    if (command=='Delete' && !confirm(getLocalizedMessage('AreYouSureToDelete')+ '?')) return;
        

    if (command=='Update' || command=='Insert')
    {
        var validate=true;
        var validationGroup=args[0].replace(/\$/g,"_");
        
//группа валидации - это id данной строки        
        if (command=='Insert') validationGroup +='_rowNew'; else validationGroup +='_row' + args[1];
        

    }
    //DoCallback(eventTarget, eventArgument,eventCallback,context,useAsync,validate,validationGroup) {

    DoCallback(eventTarget,eventArgument,eventCallback,context,true,validate,validationGroup);

//   btnEdit.NavigateUrl = String.Format("javascript:DoCallback('{0}','{1}',{2},'{3}')", Me.UniqueID, "Edit$" & dataKeyValues, "GridViewRowCallBackResult", Me.UniqueID.Replace("$", "_") & ":Edit:" & dataKeyValues)
//href="javascript:DoCallback('ctl00$Content$ctl00$countries','Edit$97',GridViewRowCallBackResult,'ctl00_Content_ctl00_countries:Edit:97')"
//DoCallback(eventTarget, eventArgument,eventCallback,context,validate)


}





//process edit command callback
//context: grid::rowIndex
//result: innerHTML of row
//context contains:controlID:Command:rowIndex
//first value of each row in "result" - is datakeyvalues
//specially for new rows





//формат строки, посылаемой кол-бэком
//rowId=grid_countries_row335
//columns=id%3d335%0d%0acountryE%3ddsfsdf%0d%0acountryH%3d%25d7%2593%25d7%2592%25d7%259b%25d7%2593%25d7%2592%25d7%259b%0d%0acountryR%3d%25d1%258b%25d0%25b2%25d0%25b0%25d0%25b2%25d1%258b%25d0%25b0%0d%0acommand%3d%253ca%2bhref%253d%2522javascript%253aGridViewRowCommand('grid%2524countries%253a335'%252c'Edit')%2522%253e%25d0%25a0%25d0%25b5%25d0%25b4%25d0%25b0%25d0%25ba%25d1%2582%25d0%25b8%25d1%2580%25d0%25be%25d0%25b2%25d0%25b0%25d1%2582%25d1%258c%253c%252fa%253e%2526nbsp%253b%253ca%2bhref%253d%2522javascript%253aGridViewRowCommand('grid%2524countries%253a335'%252c'Delete'%252c%2526quot%253bnull%2526quot%253b)%2522%253e%25d0%25a3%25d0%25b4%25d0%25b0%25d0%25bb%25d0%25b8%25d1%2582%25d1%258c%253c%252fa%253e
//validators=
//значения в columns и validators = urlEncoded namevalue pairs
//поск. может быть несколько строк - каждая строка тоже урл-енкодится
//т.о, в результате - на каждую строку по одной строке, плюс строка кол-бэк если есть
//пример:
//row=UrlEncodedRow1
//row=UrlEncodedRow2
//trace=trace

//расшифровка urlEncodedRow:
//rowId=rowId
//columns=UrlEncodedColumns
//validators=urlEncodedValidators

//расшифровка urlEncodedColumn:
//columnName=urlEncodedValue

//блин. соф маасэ - можно работать с нормальным xml не изощряясь с массивами и проч. 
// структура документа
//<xml decl>
//<XGridView>
//<Row>
//<Cell>
//<Validators> -><Validator>
//<innerHTML>

function GridViewRowCallBackResult(result,context) {


    args=context.split(':');
    controlId=args[0];
    command=args[1];
    dataKeyValues=args[2];
    grid=document.getElementById(controlId);
    
    var trace='';
       
    if (command!='Delete') {
    
    
        var xmlDoc = new ActiveXObject("Msxml2.DOMDocument.3.0");

        
        xmlDoc.loadXML(result);
        if (xmlDoc.parseError.errorCode != 0) {
           var myErr = xmlDoc.parseError;
           alert("You have error " + myErr.reason);
        } else {
          // alert(xmlDoc.xml);
        }

        //первый нод документа - это xml
        //второй - grid
        
        var gridNode=xmlDoc.childNodes(1);
        if  (gridNode.nodeName!='XGridView') {alert('wrong xml'); return;}
        
        var rows = new Array();
        for (i=0;i<gridNode.childNodes.length;i++)
        {
         
            var rowNode=gridNode.childNodes[i];
         
            switch (rowNode.nodeName)
            {
                case 'Row':
                
                    var row= new Object();
                    row.clientId=getXmlAttributeByName(rowNode,'rowID');
                    row.className=getXmlAttributeByName(rowNode,'cssClass');
                    row.rowType=getXmlAttributeByName(rowNode,'rowType');
                    
                    row.cells = new Array();
                    row.validators= new Array();
                 
                    for (j=0;j<rowNode.childNodes.length;j++)
                    {
                        var cell = new Object();
                        var cellNode=rowNode.childNodes[j];
                        
                        cell.columnName=getXmlAttributeByName(cellNode,'columnName');
                        cell.width=getXmlAttributeByName(cellNode,'width');
                        cell.height=getXmlAttributeByName(cellNode,'height');
                     //   cell.style=getXmlAttributeByName(cellNode,'style');
                        
                        for (k=0;k<cellNode.childNodes.length;k++)
                        {
                            var node=cellNode.childNodes[k];
                            switch (node.nodeName)
                            {
                                case 'innerHTML':
                                    cell.innerHTML=node.text;
                                    break;
                                case 'Validators':
                                    
                                    for(l=0;l<node.childNodes.length;l++)
                                    {
                                        row.validators.push(node.childNodes[l].text);
                                    }   
                                    break;
                                case 'style':
                                    cell.style=new Array();
                                    for(l=0;l<node.attributes.length;l++)
                                    {
                                        var style= new Object();
                                        style.name=node.attributes[l].name
                                        style.value=node.attributes[l].value;
                                        cell.style.push(style);
                                    }
                                    break;     
                            } //end switch   
                    
                        } //end k
                        row.cells.push(cell);
                    } //end j
                    rows.push(row);
                break;
              
                case 'trace':
                    trace=unescape(rowNode.text);
            
            }
         } //end i         
         
        
   // return;       
   } 

    

  
   
   //сортировка возвращает грид полностьб
    if (command.indexOf('Sort')==0) command='Sort';
    if (command.indexOf('Page')==0) command='Page';
    if (command.indexOf('Push$')==0) command='Push';
   
    
    
    switch(command) {
        case "Edit":
            
            callbackRow=rows[0];
           
            rowToEdit=document.getElementById(controlId + '_row' + dataKeyValues);
           
            //hide new row and replace current row
            if (grid.rows[grid.rows.length-1].id==controlId + '_rowNew') grid.rows[grid.rows.length-1].style.display='none';

            for (i=0;i<callbackRow.cells.length;i++) 
            { 
                rowToEdit.cells[i].innerHTML=callbackRow.cells[i].innerHTML; 
            }
          
            InitCallBackValidators(callbackRow.validators,callbackRow.clientId);
            break;
        case "Update":
            
            callbackRow=rows[0];
            rowToUpdate=document.getElementById(controlId + '_row' + dataKeyValues);
        
            //show new row and update current row
            
           if (grid.rows[grid.rows.length-1].id==controlId + '_rowNew')  grid.rows[grid.rows.length-1].style.display='';
            for (i=0;i<callbackRow.cells.length;i++) 
            { 
                rowToUpdate.cells[i].innerHTML=callbackRow.cells[i].innerHTML; 
            }
            
           removeCallbackValidators();
            
           InitCallBackValidators(callbackRow.validators,callbackRow.clientId);
             
            break;
        case "Delete":
            rowToDelete=document.getElementById(controlId + '_row' + dataKeyValues);
            grid.deleteRow(rowToDelete.rowIndex);
            removeCallbackValidators();
            break;
        case "Cancel":
        
            //show new row
           if (grid.rows[grid.rows.length-1].id==controlId + '_rowNew')  grid.rows[grid.rows.length-1].style.display='';
           
            callbackRow=rows[0];
            rowToRestore=document.getElementById(controlId + '_row' + dataKeyValues);
        
            for (i=0;i<callbackRow.cells.length;i++) 
            { 
                rowToRestore.cells[i].innerHTML=callbackRow.cells[i].innerHTML; 
            }
            
            removeCallbackValidators(); 
            break;
        case "Insert":
        
            callbackInsertedRow=rows[0];
            callbackNewRow=rows[1];
            //заменяем последний (новый) ряд на вновь полученный
            var rowToReplace=document.getElementById(controlId + '_rowNew');
            //ориентируемся на хедер-роу в отображении и сокрытии ячеек
            var headerRow=grid.rows[0];
            rowToReplace.id=callbackInsertedRow.clientId;
            for (i=0;i<callbackInsertedRow.cells.length;i++) 
            { 
               rowToReplace.cells[i].innerHTML=callbackInsertedRow.cells[i].innerHTML; 
               if (headerRow.cells[i].style.display=='none' && i<headerRow.cells.length-1) rowToReplace.cells[i].style.display='none';
               
            }
            
            if (rows.length>1)
            {
            //insert new
                newRow=grid.insertRow(rowToReplace.rowIndex+1);
                newRow.id=callbackNewRow.clientId;
                newRow.className=callbackNewRow.className;
                for (i=0;i<callbackNewRow.cells.length;i++) 
                {
                    newCell=newRow.insertCell(); 
                    newCell.innerHTML=callbackNewRow.cells[i].innerHTML; 
                    if (headerRow.cells[i].style.display=='none' && i<headerRow.cells.length-1) newCell.style.display='none';
            
                }
            
            //remove old insertValidators
       //     insertValidators=new Array();
            //init new insertValidators
                removeCallbackValidators();
                
                InitCallBackValidators(callbackNewRow.validators,callbackNewRow.rowId);
            }
            break;
       
       
    
     
       case 'Sort':
       case 'Page':
       case 'Filter':
       case 'Select':
       
       
            //для корректрой работы нужно еще разобраться с пейджером, 
            //и с количеством возвращаемых строк
            //уточняем команду, и корректируем соотв. ячейку
            
//            if (command=='Sort') {
//                sortArgs=args[1].split('$');
//                if (sortArgs[0]=='Sort' || sortArgs[0]=='SortAsc')
//                    nextSortCommand="SortDesc";
//                else
//                    nextSortCommand="SortAsc";
//                    
//                
//                sortedColumnHeader=document.getElementById(grid.id + '_column' + sortArgs[1]);
//                if (nextSortCommand=='SortAsc')
//                {
//                    if (sortedColumnHeader.innerHTML.indexOf('SortDesc')>-1)
//                        sortedColumnHeader.innerHTML=sortedColumnHeader.innerHTML.replace('SortDesc','SortAsc');
//                    else
//                        sortedColumnHeader.innerHTML=sortedColumnHeader.innerHTML.replace('Sort','SortAsc');
//                    sortedColumnHeader.innerHTML=sortedColumnHeader.innerHTML.replace('or_down','or_up');
//                }    
//                else
//                {
//                                    
//                    if (sortedColumnHeader.innerHTML.indexOf('SortAsc')>-1)
//                        sortedColumnHeader.innerHTML=sortedColumnHeader.innerHTML.replace('SortAsc','SortDesc');
//                    else
//                        sortedColumnHeader.innerHTML=sortedColumnHeader.innerHTML.replace('Sort','SortDesc');
//                        
//                    sortedColumnHeader.innerHTML=sortedColumnHeader.innerHTML.replace('or_up','or_down');
//                }
//                
//            }
            
          //самое разумное - удалить все строки, кроме первой и последней
          //сейчас мы рендерим пейджер тоже - и можно начинать с пейджера!
            //и потом добавлять новые
            //нужна только поправка на новый ряд и на пейджер
            //если количество рядов (при пейджинге) меньше чем в гриде - нужно удалить лишние
            //сначала удаляем все кроме хедера, нового и пейджера
            for (i=0;i<grid.rows.length;i++)
            {
                grid.rows[i].removeNode(true);
                i=i-1;
            }
            
            for (i=0;i<rows.length;i++)
            {
                callbackRow=rows[i];
             
                switch(callbackRow.rowType)
                {
                    case 'Header':
                    
                        //oTHead = grid.createTHead();

                        newRow=grid.insertRow(i);
                        newRow.id=callbackRow.clientId;
                        newRow.className=callbackRow.className;    
                        
                        for (j=0;j<callbackRow.cells.length;j++) 
                        {
                            
                            //newCell=newRow.insertCell(); 
                            newCell=document.createElement('TH');
                            newCell.id=grid.id + '_column' + callbackRow.cells[j].columnName;
                            newCell.innerHTML=callbackRow.cells[j].innerHTML; 
                            newRow.appendChild(newCell);
                            
                            if (callbackRow.cells[j].style && callbackRow.cells[j].style.length>0)
                            {   //есть оказывается проперть cssText!
                                for (k=0;k<callbackRow.cells[j].style.length;k++)
                                {   
                                    var style=callbackRow.cells[j].style[k]; 
                                    newCell.style.setAttribute(style.name,style.value);
                                }        
                            }
                            
                        }
                        
                        break;
                        
                    case 'Pager':
                        //пейджер - это только один cell <table>
                        newRow=grid.insertRow(i);
                        newRow.id=callbackRow.clientId;
                        newRow.className=callbackRow.className;    
                        
                        newCell=newRow.insertCell(); 
                        newCell.colSpan=grid.rows[0].cells.length;
                        newCell.innerHTML=callbackRow.cells[0].innerHTML; 
                        
                        break;
                    default:    
                
                         //вставляем новый ряд
                        newRow=grid.insertRow(i);
                        newRow.id=callbackRow.clientId;
                        newRow.className=callbackRow.className;    
                        
                        for (j=0;j<callbackRow.cells.length;j++) 
                        {
                            newCell=newRow.insertCell(); 
                            newCell.innerHTML=callbackRow.cells[j].innerHTML; 
                            if(callbackRow.cells[j].width!='') newCell.width=callbackRow.cells[j].width;
                            if (callbackRow.cells[j].style && callbackRow.cells[j].style.length>0)
                            {   //есть оказывается проперть cssText!
                                for (k=0;k<callbackRow.cells[j].style.length;k++)
                                {   
                                    var style=callbackRow.cells[j].style[k]; 
                                    newCell.style.setAttribute(style.name,style.value);
                                }        
                            }
                                
                        }
                
                }
                
                
               
               
            }    //end for
            
            for (i=0;i<rows.length;i++)
            {
                if (rows.rowType=='DataRow' && rows.validators.length>0)
                    InitCallBackValidators(row.validators,eow.rowId);
            }
            break;
            
            
        case "Push":
        
            callbackRow=rows[0];
            if (grid.rows.length==0) newRow=grid.insertRow(0); else newRow=grid.insertRow(1);
            newRow.id=callbackRow.clientId;
            newRow.className=callbackRow.className;
            
            //ориентируемся на хедер-роу в отображении и сокрытии ячеек
            var headerRow=grid.rows[0];
            for (i=0;i<callbackRow.cells.length;i++) 
            { 
                newCell=newRow.insertCell(); 
                newCell.innerHTML=callbackRow.cells[i].innerHTML; 
                if (headerRow.cells[i].style.display=='none' && i<headerRow.cells.length-1) newCell.style.display='none';
            }
            
            removeCallbackValidators();
            
            InitCallBackValidators(callbackRow.validators,callbackRow.rowId);
            
            break;
    
    
    }
    
    
    if (trace!='' && document.getElementById('traceDiv')!='')  traceDiv.innerHTML="callback Trace: <br>" +  trace;
        
    waitPopup('hide');
    if (gvrAfterCommand!=null) 
    {
        if (typeof(gvrAfterCommand)!='function') 
            eval(gvrAfterCommand);
        else
            gvrAfterCommand();
                
    
    }
    
    
}

