﻿//FilterMultiForm
//=========================================================================
FilterMultiForm = function(name, urlchoiser, subName, schemaSearch, schemaRender, schemaData, renderParameter/*,callBackResult,callBackLoading,callBackError*/, direct, autoRefresh,isHistory,statfilter,countSearchResult) {
    this.CurrentURL = '';
    this.SubmitMode = SubmitModes.RealTime;
    this.m_name = name;
    this.m_urlChoiser = urlchoiser;
    this.m_statfilter = statfilter;
    this.m_countSearchResult = countSearchResult;
    this.m_pagingsort = null;

    this.m_schemaSearch = schemaSearch;
    this.m_schemaRender = schemaRender;
    this.m_schemaData = schemaData;
    this.m_subName = subName;

    this.m_renderParameter = renderParameter;
    this.m_inputs = new Array();
    this.m_isChange = false;

    //IT'S AJAX
    var thisObject = this;
    this.ObjectsCallbacks = new Array();
    this.ajax = new Array();
   
        for(var i = 0; i < this.m_countSearchResult;i++)
        {
            if(i > 0)
            {
            this.ObjectsCallbacks.push({
                Index:i,
                loading: function() { Mian.Lib.EventManager.Instance.RaiseEvent("loading_" + this.Index, thisObject); },
                success: function(result) { thisObject.m_isLoading = false; Mian.Lib.EventManager.Instance.RaiseEvent("onload_" + this.Index, thisObject, result); },
                error: function() { Mian.Lib.EventManager.Instance.RaiseEvent("onloadError_" + this.Index, thisObject); },
                update: function(result) { thisObject.SetFilterFromUrl(result); }
                }
                )
               
            } else
            {
            this.ObjectsCallbacks.push({
                Index:i,
                loading: function() { Mian.Lib.EventManager.Instance.RaiseEvent("loading", thisObject); },
                success: function(result) { thisObject.m_isLoading = false; Mian.Lib.EventManager.Instance.RaiseEvent("onload", thisObject, result); },
                error: function() { Mian.Lib.EventManager.Instance.RaiseEvent("onloadError", thisObject); },
                update: function(result) { thisObject.SetFilterFromUrl(result); }
                }
                )
            }
             this.ajax.push(new Mian.Lib.HttpRequest());
        } 
    
    this.Loading = null; //callBackLoading;
    if (autoRefresh == true) {
        Mian.Lib.EventManager.Instance.AddEventHandler("DOM_PostLoad", document, function() {
            if (isHistory) Mian.History.Instance.Init();
            Mian.Lib.EventManager.Instance.RaiseEvent("Pre_AutoRefresh", thisObject);
            thisObject.SetFilterFromLocation();
            thisObject.Refresh();
            Mian.Lib.EventManager.Instance.RaiseEvent("Post_AutoRefresh", thisObject);
        })
    }
    Mian.Lib.EventManager.Instance.AddEventHandler("HashChanged", Mian.History.Instance,function(eventArgs) { thisObject.OnHashChanged(eventArgs); });
}
FilterMultiForm.prototype.SetButtonSubmitMode = function(){
    //this.SubmitMode = SubmitModes.SubmitButton;
}

FilterMultiForm.prototype.SetFilterFromString = function(filters) {
    var z = 1;
    if (filters != '') {
        var parameters = filters.split(";")
        for (var index=0;index < this.m_inputs.length;index++) {
            input = this.m_inputs[index];
            var isClear = true;
            for (var index1 in parameters) {
                value = parameters[index1];
                if (value.indexOf(input.name) == 0) {
                    input.input.SetValue(value.split(":")[1]);
                    isClear = false;
                }
            }
            if (isClear) input.input.Clear();
        }
    }
}

FilterMultiForm.prototype.AddInput = function(name, input, title) {
    var z = new Object();
    var thisObject = this;
    input.Refresh = function() { thisObject.Refresh(); }
    input.Change = function() { thisObject.OnChange(); }
    input.IsChange = function() { thisObject.OnIsChange(); }
    input.Event = function(e) { thisObject.IssueEvent(e); }
    z.name = name;
    z.title = title;
    z.input = input;
    var isNew = true;
    for (var index=0;index < this.m_inputs.length;index++)
        if (this.m_inputs[index].name == name) {
        isNew = false;
        this.m_inputs[index] = z;
    }
    if (isNew == true) this.m_inputs.push(z);
}
FilterMultiForm.prototype.GetInput = function(name){   
    var result = null;
    for(var index=0;index < this.m_inputs.length;index++)
      if(this.m_inputs[index].name == name)
        result = this.m_inputs[index];

    return result.input;
}

FilterMultiForm.prototype.SetFilterValue = function(name,value){   
    var result = null;
    for(var index=0;index < this.m_inputs.length;index++)
    {
      if(this.m_inputs[index].name == name)
        this.m_inputs[index].input.SetValue(value);
    }
    this.AddHistoryPoint('', this.GetQueryParameter(this.ToQueryParameters()));
}
FilterMultiForm.prototype.GetFilterValue = function(name,value){   
    for(var index=0;index < this.m_inputs.length;index++)
    {
      if(this.m_inputs[index].name == name)
        return this.m_inputs[index].input.ToQueryParameters();
    }
    return ''
}

FilterMultiForm.prototype.ToQueryParameters = function(){
   var result = "";
   for(var index =0;index < this.m_inputs.length;index++)
   {
        var item = this.m_inputs[index];
        var value = item.input.ToQueryParameters();
        if(value!='') result += item.name + ":" + value + ";"; 
   } 
    
   return result;
}
FilterMultiForm.prototype.GetUrl = function(index){
    var url = this.m_urlChoiser.GetUrlWithIndex(index);
    var ret = '';
    if(url.indexOf('?')==-1) 
        ret = url + '?';
        else
        ret = url + '&';
    return ret;
}
FilterMultiForm.prototype.GetQueryParameter  = function(param){
    var nameForm = (this.m_name!="") ? this.m_name + "=" : "=";
    var pading = "";
    if(this.m_pagingsort!=null) pading = "page:" + this.m_pagingsort.ToQueryParameters();
    var result = "";
    if(param!="")
        return nameForm + param + pading;
        else
        return nameForm +  pading;
}

FilterMultiForm.prototype.GetStatFilter = function(index)
{
    if(this.m_statfilter == null) return '';
    if(this.m_statfilter.length >  index) 
    {
        var filters = this.m_statfilter[index];
        var today = new Date();
        filters = filters.replace("random",today.getMilliseconds());
        return filters;
    }
    return '';
}

FilterMultiForm.prototype.GetShemaParameter  = function(index){
    var result = "";
    result = AddQueryParameterWithIndex(result, "search", this.m_schemaSearch,index);
    result = AddQueryParameterWithIndex(result, "render", this.m_schemaRender,index);
    result = AddQueryParameter(result, "result", this.m_renderParameter);
    result = AddQueryParameter(result, "data", this.m_schemaData);
    result = AddQueryParameter(result, "name", this.m_subName);  
    return result;
}
FilterMultiForm.prototype.GetSubmitUrl = function(index){
    var qparam = this.GetQueryParameter(this.ToQueryParameters());  
    if(qparam != "") qparam = '&' + qparam;
    result = this.GetUrl(index);
    result = result + this.GetShemaParameter(index) + qparam + this.GetStatFilter(index);
    return result;
}
FilterMultiForm.prototype.ClearFilters = function() {
for (var index = 0;index < this.m_inputs.length;index++) {
    var input = this.m_inputs[index].input;
    if (input.Clear != null)
        input.Clear();
    }
}
FilterMultiForm.prototype.OnIsChange = function(){
    this.m_isChange = true;
}
FilterMultiForm.prototype.Change = function(){
    if(this.ajax.IsLoading() == false){
        this.m_isChange = false;
        this.OnChange();
    }
}
FilterMultiForm.prototype.OnChange = function() {
    if (this.SubmitMode == SubmitModes.RealTime) {
        this.Refresh();
    }
}
FilterMultiForm.prototype.IssueEvent = function(e){
   for(var index in this.m_inputs)
   {
        var item = this.m_inputs[index];
        item.input.ProcessEvent(e);
   } 
}

FilterMultiForm.prototype.OnRefresh = function() {
    var t = 1;
    var max = this.ObjectsCallbacks.length;
    for(var i=0;i<max;i++)
    {
    if (this.ajax[i].IsLoading() == false) {
        if (this.Loading) this.Loading();
        this.ajax[i].Get(this.GetSubmitUrl(i), this.ObjectsCallbacks[i]);
        }
    }
}

FilterMultiForm.prototype.Refresh = function() {
    this.OnRefresh();
    this.AddHistoryPoint('', this.GetQueryParameter(this.ToQueryParameters()));
}

FilterMultiForm.prototype.AddHistoryPoint = function(title, url) {
    if (Mian.History.Instance && Mian.History.Instance.IsHistory) {
        Mian.History.Instance.SetHash(url);
    }
}

FilterMultiForm.prototype.GetBackUrl = function(anchor){
    var cutStr = document.location.href;
    var cutIndex = cutStr.indexOf('?filter=');
    if(cutIndex == -1) cutIndex = cutStr.length;
    var resSrt = cutStr.substr(0, cutIndex);
    var page = this.GetInput('page');
    if(page!=null) page.m_Flag = true;
    return anchor.href + '&filter=' + this.ToQueryParameters();
}

FilterMultiForm.prototype.SetFilterFromLocation = function()
{
    var tmp = document.location.hash.split('filter=');
    if (tmp.length > 1) {
        var filter = tmp[1];
        this.SetFilterFromString(filter);
    }
}

FilterMultiForm.prototype.OnHashChanged = function() {
    this.SetFilterFromLocation();
    this.OnRefresh();
}

FilterMultiForm.prototype.ToFilterValues = function() {
    var result = "";
    for (var index =0 ;index < this.m_inputs.length;index++) {
        var item = this.m_inputs[index];
        var value = item.input.ToString();
        if (value != '' && item.title) result += "<br />" + item.title + ":" + value + ";";
    }
    return result;
}