﻿// JScript File
//возвращает локализованное сообщение об ошибке
//
//
function getLocalizedErrorMessage(errMsgKey)
{
    //фильтруем явно не меседж=кей
    if (errMsgKey.indexOf('Error:')>-1) return errMsgKey;
    if (errMsgKey.indexOf('<')>-1) return errMsgKey;
    if (errMsgKey.indexOf('>')>-1) return errMsgKey;
    if (errMsgKey.indexOf('&')>-1) return errMsgKey;
    if (errMsgKey.indexOf('=')>-1) return errMsgKey;
    
    _assembly='ResourceManager';
    _typeName='ResourceCache';
    _methodName='getResourceValue';
    _paramValues=errMsgKey;
    
    return CallbackRequest(_assembly,_typeName,_methodName,_paramValues,null);

}

//то же что и пред.
function getLocalizedMessage(msgKey)
{
  
    _assembly='ResourceManager';
    _typeName='ResourceCache';
    _methodName='getResourceValue';
    _paramValues=msgKey;
    
    return CallbackRequest(_assembly,_typeName,_methodName,_paramValues,null);

}


function getFriendlyColumnName(columnName)
{

    _assembly='ResourceManager';
    _typeName='ResourceCache';
    _methodName='getCallbackColumnName';
    _paramValues=columnName;
    
    return CallbackRequest(_assembly,_typeName,_methodName,_paramValues,null);

}

//returns true if error
function CallbackError(response)
{
     var hasError=false;
     
     //это сообщение для юзера
     if(response.indexOf('<DisplayUserErrorMessage>')>-1) {
        var userErrorMessage = response.substring(response.lastIndexOf('<DisplayUserErrorMessage>')+ 25);
        userErrorMessage= userErrorMessage.substring(0,userErrorMessage.lastIndexOf('</DisplayUserErrorMessage>'));
        alert(getLocalizedErrorMessage(userErrorMessage));        
     
     } else if (response.indexOf('Error')>-1) {
         hasError=true;
         //if html = display popup,otherwise - alert
         if (response.indexOf('<html') + response.indexOf('<div') + response.indexOf('<br')>-3) {
            
            var oPopup = window.createPopup();
            var oPopupBody = oPopup.document.body;
            //  oPopupBody.style.backgroundColor = "lightyellow";
            oPopupBody.style.border = "solid black 1px";  
            oPopupBody.innerHTML = response;
            oPopupBody.style.fontSize='11px';
            alert(getLocalizedErrorMessage(oPopupBody.innerText));        
     

           // oPopup.show(150, 200, screen.availWidth-300, screen.availHeight-400);
         }
         else
            alert (response);
                 
     }        
      waitPopup('hide');
      return hasError;        
}



//"UpdateField(this,'{0}','{1}','{2}','{3}','{4}',{5})"

var updateFieldSrc;    
var updateFieldXmlRequest;      
var updateFieldDataField;            
//фцию которую нужно вызвать после колбэка
var updateFieldEventCallback;
function UpdateField(src,assemblyName,typeName,updateMethod,dataKeyValue,fieldName,dataType,eventCallback) {

    if(typeof(src)=='string') src=document.getElementById(src);
    
    updateFieldDataField=fieldName;

   if (src.Validators) 
   {
       for(i=0;i<src.Validators.length;i++) {
                validationResult=ValidatorValidate(src.Validators[i],src.Validators[i].validationGroup,event);
                if (!src.Validators[i].isvalid) return;
       }
   }
   
   value=src.value; 
   if(src.tagName=='INPUT' && src.type=='checkbox') value=src.checked;
    
    
    
   updateFieldSrc=src;
   updateFieldEventCallback=eventCallback;
   params=dataKeyValue + ';' + fieldName + ';' + dataType +';' + escape(value);
 //  waitPopup('show');
   window.status='working...'; 
   updateFieldXmlRequest= CallbackRequest(assemblyName,typeName,updateMethod,params,UpdateFieldCallbackResult,true);

//титлы
   if (src.tagName=='SELECT')
        status=src.options[src.selectedIndex].text;
}




//response must be '1' = one row updated
function UpdateFieldCallbackResult()
{

    if (updateFieldXmlRequest.readyState != 4) return;
    
    response= updateFieldXmlRequest.responseText;
    if (CallbackError(response)) return;
    
    window.status='updated:' + updateFieldDataField;
    
    if (response.indexOf('Error')>-1) {
        var oPopup = window.createPopup();
         var oPopupBody = oPopup.document.body;
      //  oPopupBody.style.backgroundColor = "lightyellow";
        oPopupBody.style.border = "solid black 1px";  
        oPopupBody.innerHTML = response;
        oPopupBody.style.fontSize='11px';
           
           
        oPopup.show(0, 0, screen.availWidth, screen.availHeight);
    }
    else if (response=='0')
        alert ('not updated');
                
    //вызываем фцию после исполнения скрипта, если она определена
    if(updateFieldEventCallback!=null) updateFieldEventCallback();
}




//вариант для независимого от схемы ListControl
//кол-бэк обновление связанного ListControl
//по старой традиции Access называем это Requery
//данные для обнолвения можно брать из tableSchema поэтому здесь их можно не указывать
//считаем что значение изменяющегося ddl служит параметром для связанного ддл
//parameters: параметры. Строка, аналогичная myParameter (далее преобразуется в соотв. массив объектов)
var RequerySourceIds;    
var RequeryListControlXmlRequest;     
var RequeryTargetIds;                  
function RequeryListControl2(assemblyName,typeName,methodName,dataTextField,dataValueField,parameters,controlsToRequery) {

   if (assemblyName=='') return;
   if (typeName=='') return;
   if (parameters=='') return;
   if (controlsToRequery=='') return;
   //может быть несколько контролей для реквери
   RequeryTargetIds=controlsToRequery;
   
   
   
   params = "assemblyName=" + assemblyName;
   params += '&typeName=' + typeName;
   params += '&methodName=' + methodName;
   params += '&dataTextField=' + dataTextField;
   params += '&dataValueField=' + dataValueField;
   
   //пакуем отправляемые параметры в нейм-валуе коллекцию
   
   //преобразуем переданную строку в массив объектов типа myParameter
   var myParameters=parseQueryStringArray(parameters)
   
   var values='';
    
   for (i=0;i<myParameters.length;i++)
   {
         
        if (i>0) values +='&';
        switch(myParameters[i].parameterType)
        {
            case 'ControlOrElseQueryString':
            case 'Control':
              values += myParameters[i].name + '=' + GetValue(myParameters[i].controlID);
              break;      
            case 'Parameter':
              values += myParameters[i].name + '=' + myParameters[i].defaultValue;
              break;      
            
            default:
            
        }
    
       
   }
   
   params += '&parameters=' + escape(values);
   
   assemblyName='myControls';
   typeName='BoundDropDownList';
   methodName='CallbackFillListControl2';
   
   
   
   
   waitPopup('show');
   RequeryListControlXmlRequest= CallbackRequest(assemblyName,typeName,methodName,params,RequeryListControl2CallbackResult,true);

}



function RequeryListControl2CallbackResult()
{

    if (RequeryListControlXmlRequest.readyState != 4) return;
    response= RequeryListControlXmlRequest.responseText;
        
    if (CallbackError(response)) return;
     waitPopup('hide');
    
    
    var ids =RequeryTargetIds.split('&');
    
    for (j=0;j<ids.length;j++)
    {
    
    //должны получить список в виде value=text&value=text
        ddl =document.getElementById(ids[j]);
        
        if (ddl)
        
	{
	        //убираем старые айтемс
	        for (i=0;i<ddl.options.length;i++)
	        {
	            ddl.options.remove(i);
	            i-=1;
	        }
	       
	    
	        values=response.split('&');
	    
	        for (i=0;i<values.length;i++)
	        {
	            kvp=values[i].split('=');
	            value=kvp[0];
	            text=decodeURIComponent(kvp[1]);
	            
	           var oOption = document.createElement("OPTION");
	           if (parseInt(value)==-1) oOption.style.backgroundColor="lightgrey";
	             
	            ddl.options.add(oOption);
	            oOption.innerText = text;
	            oOption.value = value;
	
	        }
        
	}
    }
      
}    




//кол-бэк обновление связанного ListControl
//по старой традиции Access называем это Requery
//данные для обнолвения можно брать из tableSchema поэтому здесь их можно не указывать
//считаем что значение изменяющегося ddl служит параметром для связанного ддл
//table,field - таблица (схема) и поле из которой берутся управляющие значения
//controlToRequery - клиент=ид контроля, который нужно рекверить
//srcDdl - контроль, значение которого служит параметром
var RequeryListControlSrc;    
var RequeryListControlXmlRequest;     
var RequeryListControlClientId;                  
function RequeryListControl(table,field,controlToRequery,namingContainer,parameters) {

    
  // RequeryListControlSrc=srcDdl;
   RequeryListControlClientId=controlToRequery;
   
   
   var myParameters=parseQueryStringArray(parameters)
   
   var values='';
    
   for (i=0;i<myParameters.length;i++)
   {
         
        if (i>0) values +='&';
        switch(myParameters[i].parameterType)
        {
            case 'ControlOrElseQueryString':
            case 'Control':
              values += myParameters[i].name + '=' + GetValue(myParameters[i].controlID);
              break;      
            case 'Parameter':
              values += myParameters[i].name + '=' + myParameters[i].defaultValue;
              break;    
            case 'DataItem':
              values += myParameters[i].name + '=' + GetValue(namingContainer + '_' + myParameters[i].dataKeyName);
              break;
            case 'Request':
            case 'QueryString':
                values += myParameters[i].name + '=' + QueryString()[myParameters[i].queryStringField];
                break;
            default:
            
        }
    
       
   }
   
   
   params='table=' + table+ '&field=' + field + '&parameters=' + escape(values);
   
   assemblyName='myControls';
   typeName='BoundDropDownList';
   methodName='CallbackFillListControl';
   
   
   
   
   waitPopup('show');
   RequeryListControlXmlRequest= CallbackRequest(assemblyName,typeName,methodName,params,RequeryListControlCallbackResult,true);

}



function RequeryListControlCallbackResult()
{

    if (RequeryListControlXmlRequest.readyState != 4) return;
    response= RequeryListControlXmlRequest.responseText;
        
    if (CallbackError(response)) return;
     waitPopup('hide');
    
    
    //должны получить список в виде value=text&value=text
    if (typeof(RequeryListControlClientId)=='object')
        ddl=RequeryListControlClientId;
    else  if (typeof(RequeryListControlClientId)=='string')
        ddl =document.getElementById(RequeryListControlClientId);
    
    //убираем старые айтемс
    for (i=0;i<ddl.options.length;i++)
    {
        ddl.options.remove(i);
        i-=1;
    }
       
    
    values=response.split('&');
    
    for (i=0;i<values.length;i++)
    {
        kvp=values[i].split('=');
        value=kvp[0];
        text=decodeURIComponent(kvp[1]);
        
        var oOption = document.createElement("OPTION");
       if (parseInt(value)==-1) oOption.style.backgroundColor="lightgrey";
         
        ddl.options.add(oOption);
        oOption.innerText = text;
        oOption.value = value;

    }
    
      
}    


//arguments:
//assembly,typeName,methodName,paramValues
//paramValues delimited by ';'
var callbackRequest;

function CallbackRequest(assembly,typeName,methodName,paramValues,eventCallback) {

     if (window.navigator.userAgent.indexOf("MSIE")!=-1)
         xmlRequest = new ActiveXObject("Microsoft.XMLHTTP");
     else
         xmlRequest = new XMLHttpRequest();

     assembly=encodeURIComponent (assembly);
     typeName=encodeURIComponent (typeName);
     methodName=encodeURIComponent (methodName);
     
     if (paramValues)
     {
         paramValuesArray=paramValues.split(";");
         paramValues="";
         for (i=0;i<paramValuesArray.length;i++) {
         
            if (i>0 ) paramValues +=';';
            if (paramValuesArray[i]=='this.value') {
               var src=window.event.srcElement;
               if (src.tagName=='INPUT' && src.type=='checkbox')
                   paramValues +=window.event.srcElement.checked; 
               else if (src.tagName=='input' && src.type=='text')
                   paramValues +=window.event.srcElement.value;
            }
            else {
                paramValues +=paramValuesArray[i];
            }
         }
         paramValues=encodeURIComponent (paramValues);
    }   
    var useAsync=false;
    if (eventCallback!=null && eventCallback!=undefined) useAsync=true;
    
  //  if (useAsync) waitPopup('show');
    
   //  xmlRequest.onreadystatechange = getCallBackResponse;
     xmlRequest.open ("GET", cfg['applicationRoot'] + 'callback.aspx?assembly=' + assembly + '&type=' + typeName + '&method=' + methodName + '&params=' + paramValues ,useAsync) 
     xmlRequest.send("<body></body>");

    callbackRequest=xmlRequest;
    if (useAsync) xmlRequest.onreadystatechange = eventCallback;
    
    if (!useAsync) {
      response=xmlRequest.responseText; 
      if (response.indexOf('Error')>-1) {
           CallbackError(response);
      } else
            return response;
    } else 
        return xmlRequest;
        
}

//check and alert if error result
function checkCallbackResult()
{

    if (callbackRequest.readyState == 4) {
        waitPopup('hide');
        response= callbackRequest.responseText;
        if (response.charAt(0)=='e' || response.indexOf('Error')>-1) alert(response);
    }    
    
}

function waitPopup(mode)
{
    popup=document.getElementById('popupWaitWorking');
   // popupTable=document.getElementById('popupWaitWorkingTable');
    if (popup==null) return;
    
    if (mode=='hide') {
        popup.style.display='none';
 //       popupTable.style.display='none';
        return;
    } else if (mode=='show') {

        if (popup.style.display=='') return ;
        if (window.event==null)
        {
            frame=window.frameElement;
            if (frame==null) {
                popup.style.left=screen.availWidth/2-180;
                popup.style.top=screen.availHeight/3-30 + document.body.scrollTop;
            } else {
                popup.style.left=screen.availWidth/2-180;
                popup.style.top=screen.availHeight/2-50-(screen.availHeight-frame.offsetHeight);
            }
            
        } else {
        
//               popup.style.left=window.event.clientX;
//               popup.style.top=window.event.clientY;
                popup.style.left=screen.availWidth/2-180;
                popup.style.top=screen.availHeight/2-50  + document.body.scrollTop;
                
         
        }
    
        popup.style.display='';
        //popupTable.style.display='';
    }
}


 var theForm=document.forms[0];
 var callbackObject= new Object();
//simplified microsoft style sync callback
//validate = if needs to validate before callback
function DoCallback(eventTarget, eventArgument,eventCallback,context,useAsync,validate,validationGroup) {

    InitCallback();

    var validationResult = true;
    
    if (validate) {
        if (typeof(Page_ClientValidate) == 'function') {
        //needs validation group argument:Page_ClientValidate(validationGroup);
            validationResult = Page_ClientValidate(validationGroup);
        }
    }
    if (!validationResult) return "validation_failed";
                

    var xmlRequest,e;
    try {
        xmlRequest = new XMLHttpRequest();
    }
    catch(e) {
        try {
            xmlRequest = new ActiveXObject("Microsoft.XMLHTTP");
        }
        catch(e) {
        }
    }
    
    callbackObject.xmlRequest=xmlRequest;
    callbackObject.eventCallback = eventCallback;
    callbackObject.context = context;
    
    var postData=__theFormPostData;
    
    postData += '&__CALLBACKID=' + EncodeCallback(eventTarget);
    postData += '&__CALLBACKPARAM=' + EncodeCallback(eventArgument);
    //empty viewstate
  //  postData += '&__VIEWSTATE=' ;
    
    if (theForm["__EVENTVALIDATION"]) postData += "&__EVENTVALIDATION=" + EncodeCallback(theForm["__EVENTVALIDATION"].value);
    if (theForm["__VIEWSTATE"]) postData += "&__VIEWSTATE=" + EncodeCallback(theForm["__VIEWSTATE"].value);
 
    
        xmlRequest.open("POST", theForm.action, useAsync);
        if (useAsync) xmlRequest.onreadystatechange = CallbackComplete;
        xmlRequest.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
        xmlRequest.send(postData);
        
    

    if (useAsync) {
        waitPopup('show');
    } else {
    //needs some filtering
       var response=xmlRequest.responseText; 
       var separatorIndex = response.indexOf("|");
       if (separatorIndex != -1) {
            var validationFieldLength = parseInt(response.substring(0, separatorIndex));
            response=response.substring(separatorIndex + validationFieldLength + 1);
        }
        return response;
    }
     
           
  
}


//ms callback helper functions

function EncodeCallback(parameter) {
    if (encodeURIComponent) {
        return encodeURIComponent(parameter);
    }
    else {
        return escape(parameter);
    }
}

//removed _viewstate from form post = raises error
var __nonMSDOMBrowser = (window.navigator.appName.toLowerCase().indexOf('explorer') == -1);
var __theFormPostData = "";
var __theFormPostCollection;


//the best is - not to add what not relate to grid
function InitCallback(eventTarget) {

    //clear before start= this is callback!!!
    if (theForm==undefined) theForm=document.forms[0];
    __theFormPostData="";
    __theFormPostCollection = new Array();
    var count = theForm.elements.length;
    var element;
    for (var i = 0; i < count; i++) {
        element = theForm.elements[i];
        //skip elements what is not from this grid:
   //     if (element.id.substring(0,eventTarget.length)!=eventTarget.length) continue;
        
        var tagName = element.tagName.toLowerCase();
        if (tagName == "input") {
            
            var type = element.type;
            if ((type == "text" || type == "hidden" || type == "password" ||
                ((type == "checkbox" || type == "radio") && element.checked)) &&
                (element.id != "__EVENTVALIDATION") && (element.id != "__VIEWSTATE")  ) {
                InitCallbackAddField(element.name, element.value);
            }
        }
        else if (tagName == "select") {
            var selectCount = element.options.length;
            for (var j = 0; j < selectCount; j++) {
                var selectChild = element.options[j];
                if (selectChild.selected == true) {
                    InitCallbackAddField(element.name, element.value);
                }
            }
        }
        else if (tagName == "textarea") {
            InitCallbackAddField(element.name, element.value);
        }
    }
}

function InitCallbackAddField(name, value) {
    var nameValue = new Object();
    nameValue.name = name;
    nameValue.value = value;
    __theFormPostCollection[__theFormPostCollection.length] = nameValue;
    __theFormPostData += name + "=" + EncodeCallback(value) + "&";
}



//ms preprocess callback response

function CallbackComplete() {
   
        if (callbackObject && callbackObject.xmlRequest && (callbackObject.xmlRequest.readyState == 4)) {
            ExecuteCallback(callbackObject);
           // waitPopup('hide');
        }
}

//блин, вот где фильтруется базар( aca eventvalidator в респонсе!
function ExecuteCallback(callbackObject) {

    var response = callbackObject.xmlRequest.responseText;
    if (response.indexOf("Error:")>-1) {
        var separatorIndex = response.indexOf("|");
        if (separatorIndex>-1 && separatorIndex<10) response=response.substring(separatorIndex+1);
        CallbackError(response);
        return;
    }    
        
    
    if (response.charAt(0) == "s") {
        if ((typeof(callbackObject.eventCallback) != "undefined") && (callbackObject.eventCallback != null)) {
            callbackObject.eventCallback(response.substring(1), callbackObject.context);
        }
    }
    else if (response.charAt(0) == "e") {
        if ((typeof(callbackObject.errorCallback) != "undefined") && (callbackObject.errorCallback != null)) {
            callbackObject.errorCallback(response.substring(1), callbackObject.context);
        }
        else {
            alert(response.substring(1));
        }
    }
    else {
        var separatorIndex = response.indexOf("|");
        if (separatorIndex != -1) {
            var validationFieldLength = parseInt(response.substring(0, separatorIndex));
            if (!isNaN(validationFieldLength)) {
                var validationField = response.substring(separatorIndex + 1, separatorIndex + validationFieldLength + 1);
                if (validationField != "") {
                    var validationFieldElement = theForm["__EVENTVALIDATION"];
                    if (!validationFieldElement) {
                        validationFieldElement = document.createElement("INPUT");
                        validationFieldElement.type = "hidden";
                        validationFieldElement.name = "__EVENTVALIDATION";
                        theForm.appendChild(validationFieldElement);
                    }
                    validationFieldElement.value = validationField;
                }
                if ((typeof(callbackObject.eventCallback) != "undefined") && (callbackObject.eventCallback != null)) {
                    callbackObject.eventCallback(response.substring(separatorIndex + validationFieldLength + 1), callbackObject.context);
                }
            }
        }
    }
}



function WebForm_PostBackOptions(eventTarget, eventArgument, validation, validationGroup, actionUrl, trackFocus, clientSubmit) {
    this.eventTarget = eventTarget;
    this.eventArgument = eventArgument;
    this.validation = validation;
    this.validationGroup = validationGroup;
    this.actionUrl = actionUrl;
    this.trackFocus = trackFocus;
    this.clientSubmit = clientSubmit;
}
function WebForm_DoPostBackWithOptions(options) {
    var validationResult = true;
    if (options.validation) {
        if (typeof(Page_ClientValidate) == 'function') {
            validationResult = Page_ClientValidate(options.validationGroup);
        }
    }
    if (validationResult) {
        if ((typeof(options.actionUrl) != "undefined") && (options.actionUrl != null) && (options.actionUrl.length > 0)) {
            theForm.action = options.actionUrl;
        }
        if (options.trackFocus) {
            var lastFocus = theForm.elements["__LASTFOCUS"];
            if ((typeof(lastFocus) != "undefined") && (lastFocus != null)) {
                if (typeof(document.activeElement) == "undefined") {
                    lastFocus.value = options.eventTarget;
                }
                else {
                    var active = document.activeElement;
                    if ((typeof(active) != "undefined") && (active != null)) {
                        if ((typeof(active.id) != "undefined") && (active.id != null) && (active.id.length > 0)) {
                            lastFocus.value = active.id;
                        }
                        else if (typeof(active.name) != "undefined") {
                            lastFocus.value = active.name;
                        }
                    }
                }
            }
        }
    }
    if (options.clientSubmit) {
        __doPostBack(options.eventTarget, options.eventArgument);
    }
}



