/**	
	Name: 	$.ajaxListener.
	Desc: 	global ajax-requests listener based on jQuery. Function listen of this method listens ajaxStart and ajaxStop events for every ajax request.
			Ajax events firing sequence: ajaxStart -> ajaxSend -> ajaxSuccess/ajaxError -> ajaxComplete -> ajaxStop.
	Args: 	elm 	- element, in end of which listener's modal dialog will be added;
			title 	- text of title;
			cnt		- content of dialog.
	Needs: 	jQuery {jquery.js, ui.core.js, ui.dialog.js, ui.all.css}.
*/
$.ajaxListener = {
    listen: function(elm, title, txt)
    {
        elm = exists(elm) ? elm.toString() : "body";
		title = exists(title) ? title.toString() : "";
		txt = exists(txt) ? txt.toString() : "";
		
        $(elm).append("<div id='ajaxModal' title='" + title + "'>" + txt + "</div>");

        if (!exists($("#ajaxModal").length) ? true : false){ alert("Невозможно инициализировать модальный диалог."); return; }

        $("#ajaxModal").dialog(
        {
            modal: true,
            autoOpen: false,
            overlay: { opacity: 0.5, background: "black" },
            closeOnEscape: false,
            width: 500,
            height: 200
        });

        $(elm).bind("ajaxStart", function()
        {
            $("#ajaxModal").dialog('open');
        }).bind("ajaxStop", function(){
            $("#ajaxModal").dialog('close');
        });
    }
};

/*	
	Name: 	changeInputType.
	Desc:	changes the value of input's argument type.
	Args: 	oldObj 	- input to change type to;
			type 	- new type.
	Needs:	no needs.
*/
function changeInputType(oldObj, type)
{
    var newObj = document.createElement('input');
    newObj.type = type;

    if(oldObj.size) newObj.size = oldObj.size;
    if(oldObj.value) newObj.value = oldObj.value;
    if(oldObj.name) newObj.name = oldObj.name;
    if(oldObj.id) newObj.id = oldObj.id;
    if(oldObj.className) newObj.className = oldObj.className;

    oldObj.parentNode.replaceChild(newObj, oldObj);

    return newObj;
}

/*	
	Name: 	getBrowserName.
	Desc:	returns browser's name as string.
	Args: 	none.
	Needs:	no needs.
*/
function getBrowserName()
{
    var ua = window.navigator.userAgent.toLowerCase();
    var an = window.navigator.appName.toLowerCase();

    if (an == "microsoft internet explorer") return "ie";

    if (ua.indexOf("chrome") > 0) return "c";
    if (ua.indexOf("firefox") > 0) return "f";
    if (ua.indexOf("safari") > 0) return "s";

    return "o";
}

/*	
	Name: 	getBrowserVer.
	Desc:	returns browser's version as integer. 
	Args: 	none.
	Needs:	jQuery {jquery.js}.
*/
function getBrowserVer()
{
    return $.browser.version;
}


exists = function(x)
{
   return (x === undefined || x === null) ? false : true;
}

var Args = new Object();

function getArgs()
{
  var query = location.search.substring(1);
  var pairs = query.split("&");
  for (var i = 0; i < pairs.length; i++)
  {
    var pos = pairs[i].indexOf('=');
    if (pos == -1) continue;
    var argname = pairs[i].substring(0,pos);
    var value = pairs[i].substring(pos+1);
    Args[argname] = unescape(value);
  }
}

function getParamValue( arg )
{
  var ret = "";
  if( typeof arg == "string" )
  {
    var temp = Args[arg];
    ret = exists( temp ) ? temp : "";
  }
  return ret;
}

function updateParam( obj, aName, aValue )
{
  obj.p.params = updateParams( obj.p.params, [{name: aName, value: aValue }] );
}

function updateParams( src1, src2 )
{
  var i = 0;
  var check = [];
  var ret = [];
  if( src1.constructor != Array || src2.constructor != Array  )
    return ret;
  jQuery.each( src2, function(){ var o = {}; o[this.name]=1;  check.push( o );  });

  jQuery.each( src1, function(){
    var n = this.name;
    var v = this.value;
    for( i = 0; i < src2.length; i++ )
    {
      if( check[i][n] == 1 && src2[i].name == n )
      {
        v = src2[i].value;
        check[i][n] = 0;
        break;
      }
    }
    ret.push( { name: n, value: v } );
  });

  for( i = 0; i < src2.length; i++ )
  {
    var nmn = src2[i].name;
    if( check[i][ nmn ] == 1 )
      ret.push( { name: nmn, value: src2[i].value } );
  }
  return ret;
}

$.fn.extend({
	getParam: function( n ) {
		var ret = 0;
		this.each( function() {
			if( exists(this.p) && exists(this.p.params) )
			{
				var obj = this.p.params;
				for( var i = 0; i < obj.length; i++ )
					if( obj[i].name == n )
					{
						ret = obj[i].value;
						break;
					}
			}
		});
		return ret;
	},

  setParam: function( n, v ) {
	return	this.each( function() {
		var i;
		if( exists(this.p) && exists(this.p.params) )
			for( i = 0; i < this.p.params.length; i++ )
				if( this.p.params[i].name == n )
					this.p.params[i].value = v;
	});
  }
});

$.fn.extend({
	ggetFGIndex:
	function( name ) {
        var ind = -1;
        this.each( function() {
            if( exists(this.p) && exists(this.p.colModel) )
            {
                var i = 0;
                var defs = this.p.colModel;
                for( i = 0; i < defs.length; i++ )
                {
                    if( defs[i].name == name )
                    {
                        if( exists( defs[i].index ) )
                            i = defs[i].index;
                        break;
                    }
                }
                if( i < defs.length ){
                    var tobj = $(this).parent().parent();
                    var srch = $( ".hDiv th[@axis=col"+i+"]", tobj );
                    if( srch.length > 0 )
                        ind = $( ".hDiv th", tobj ).index( srch[0] );
                    else
                        ind = -1;
                }else{
                    ind = -1;
                }
            }
        });
        return ind;
	},

	getFGIndex:
	function( name ) {
		var ind = -1;
		this.each( function() {
			ind = $(this).ggetFGIndex( name );
		});
        return ind;
 	},

	getFGText:
	function( row, name ) {
		var ret = "";
		this.each( function() {
			var ind = $(this).ggetFGIndex( name );
			if( ind > 0 )
				ret = $( "td:eq("+ ind +") div", row ).text();
		});
		return ret || "";
	}
});

var thePageError = [];
var EMArr = [    "Вы не авторизованы!"
                ,"Неверно введен логин или пароль!"
                ,"Не удалось соединиться с сервером БД. Повторите запрос позднее."
                ,"Ошибка запроса. Повторите запрос позднее."
                ,"Ошибка. Проверьте правильность введенных данных."
                ,"Неверно введены цифры с картинки!"
            ];

function procErrSrv( Data, index )
{
    thePageError.push( Data.responseText );
    alert( EMArr[index] );
}

function  procErrResp( Data, NoRep )
{
    NoRep = NoRep || true;
    var msg = Data.responseText.split(":");
    if( msg.length )
    {
      var rep = ( thePageError[(thePageError.length)-1] == Data.responseText );

      if( (0 == msg[1].indexOf("Sess" ) &&  0 == msg[2].indexOf("NoSess")) ||
          (0 == msg[1].indexOf("Login") && (0 == msg[2].indexOf("NoORG") || 0 == msg[2].indexOf("NoCid"))))
      {
        if( NoRep )
        {
          if ( thePageError.length == 0 || !rep )
          {
            procErrSrv( Data, 0 );
            window.document.location = "../w_login/w_login.html";
          }
        }else{
          procErrSrv( Data, 0 );
          window.document.location = "../w_login/w_login.html";
        }
      }else

      if (0 == msg[1].indexOf("Login") && 0 == msg[2].indexOf("WrongLogin"))
      {
        if( NoRep )
        {
          if ( thePageError.length == 0 || !rep )
          {
            procErrSrv( Data, 1 );
          }
        }else{
          procErrSrv( Data, 1 );
        }
      }else

      if (0 == msg[1].indexOf("DB") && 0 == msg[2].indexOf("NoConnections"))
      {
        if( NoRep )
        {
          if ( thePageError.length == 0 || !rep )
          {
            procErrSrv( Data, 2 );
          }
        }else{
          procErrSrv( Data, 2 );
        }
      }else

      if (0 == msg[1].indexOf("Servlet") && 0 == msg[2].indexOf("SQL"))
      {
        if( NoRep )
        {
          if ( thePageError.length == 0 || !rep )
          {
            procErrSrv( Data, 3 );
          }
        }else{
          procErrSrv( Data, 3 );
        }
      }else

      if (0 == msg[1].indexOf("Servlet") && 0 == msg[2].indexOf("WrongArgs"))
      {
        if( NoRep )
        {
          if ( thePageError.length == 0 || !rep )
          {
            procErrSrv( Data, 4 );
          }
        }else{
          procErrSrv( Data, 4 );
        }
      }else

      if (0 == msg[1].indexOf("Login") && 0 == msg[2].indexOf("WrongCaptcha"))
      {
        if( NoRep )
        {
          if ( thePageError.length == 0 || !rep )
          {
            procErrSrv( Data, 5 );
          }
        }else{
          procErrSrv( Data, 5 );
        }
      }

      if (0 == msg[1].indexOf("Assort") && msg[2].length > 0)
      {
        if( NoRep )
        {
          if ( thePageError.length == 0 || !rep )
          {
            alert(msg[2]);
          }
        }else{
          alert(msg[2]);
        }
      }
    }
}

/*	
	Name: 	GetCookieByName.
	Desc:	returns the cookie's value.
	Args: 	name - cookie's name.
	Needs:	no needs.
*/
function GetCookieByName( name )
{
  cname = name + '=';
  cpos  = document.cookie.indexOf( cname );

  if( cpos != -1 )
  {
    cstart = cpos + cname.length;
    cend   = document.cookie.indexOf(";", cstart);

    if( cend == -1 )
      cend = document.cookie.length;
    return unescape( document.cookie.substring( cstart, cend ) );
  }
  return null;
}

/*	
	Name: 	setCookie.
	Desc:	sets domain's cookie.
	Args: 	name 	- cookie's name attribute;
			value 	- cookie's value attribute;
			expires - cookie's expires attribute;
			path 	- cookie's path attribute;
			domain 	- cookie's domain attribute;
			secure 	- cookie's secure attribute.
	Needs:	no needs.
*/
function setCookie(name, value, expires, path, domain, secure)
{
    document.cookie = name + "=" + escape(value) +
	((expires) ? "; expires=" + expires : "") +
	((path) ? "; path=" + path : "") +
	((domain) ? "; domain=" + domain : "") +
	((secure) ? "; secure" : "");
}

var passed = 0;
function onePassed()
{
    passed++;
    if( passed == 2 )
    {
        passed = 0;
        cntinue();
    }
}

function get_colsInfo_onSuccess( data )
{
    var obj = null;
    if( exists( predefs ) )   obj = predefs[ data['grid'] ];
    if( exists( obj ) && (obj.colModel.length == data.cols.length) )
    {
        var new_colModel = [];
        for( i = 0; i < data.cols.length; i++ )
        {
            var m = data.cols[i]['col'];   // 0 - ind, 1 - width, 2 - visible
            var col = obj.colModel[ m[0] ];
            col['index'] = m[0];
            col['width'] = m[1];
            col['hide'] = m[2] > 0 ? false : true;
            new_colModel.push( col );
        }
        obj.colModel = new_colModel;
        if( !exists( obj['resizable'] ) || obj['resizable'] != false )
        {
            obj['width'] = data['width'];
            obj['height'] = data['height'];
        }
        if( exists( obj['sortname'] ) )   obj['sortname'] = data['sortname'];
        if( exists( obj['sortorder'] ) )  obj['sortorder'] = data['sortorder'];
        obj['rp'] = data['rp'];
    }
    if( jQuery.isFunction( onePassed ) )   onePassed();
}

function get_colsInfo( name )
{
    $.ajax({
      type: PoG,
      url: '../S_FG_getColumnsInfo',
      data: [ { name : 'pathname',  value : location.pathname },
              { name : 'fgname',    value : name }
      ],
      dataType: 'json',
      success: get_colsInfo_onSuccess,
      error: onePassed
    });
}

/*	
	Name: 	getProtocolHost.
	Desc:	returns protocol and host.
	Args: 	none.
	Needs:	jQuery {jquery.js}.
*/
function getProtocolHost()
{
    var h = $(document.location).attr('host');
    var p = $(document.location).attr('protocol');

    h = exists(h) ? h.toString() : "";
    p = exists(p) ? p.toString() : "";

    return p + "//" + h;
}

/*	
	Name: 	getHost.
	Desc:	returns host.
	Args: 	none.
	Needs:	jQuery {jquery.js}.
*/
function getHost()
{
    var h = $(document.location).attr('host');

    h = exists(h) ? h.toString() : "";

    return h;
}

/*	
	Name: 	getUnSecHostName.
	Desc:	returns the 'http://<hostname>' string where <hostname>=host without port.
	Args: 	none.
	Needs:	jQuery {jquery.js}.
*/
function getUnSecHostName()
{
    var h = $(document.location).attr('hostname');

    h = exists(h) ? h.toString() : "";

    return "http://" + h ;
}

/*	
	Name: 	getProtocolHostName.
	Desc:	returns the '<protocol>//<hostname>' string where <hostname>=host without port.
	Args: 	none.
	Needs:	jQuery {jquery.js}.
*/
function getProtocolHostName()
{
    var hn = $(document.location).attr('hostname');
    var p = $(document.location).attr('protocol');

    hn = exists(hn) ? hn.toString() : "";
    p = exists(p) ? p.toString() : "";

    return p + "//" + hn;
}

/*	
	Name: 	getHostName.
	Desc:	returns the hostname without protocol and port.
	Args: 	none.
	Needs:	jQuery {jquery.js}.
*/
function getHostName()
{
    var hn = $(document.location).attr('hostname');

    hn = exists(hn) ? hn.toString() : "";

    return hn;
}

/*	
	Name: 	getHostName.
	Desc:	returns host's port or if there's no port in URL string then returns 80 as string.
	Args: 	none.
	Needs:	jQuery {jquery.js}.
*/
function getHostPort()
{
    var p = $(document.location).attr('port');

    p = exists(p) ? p.toString() : "80";

    if (p.length == 0 || p == "")
    {
        p = "80";
    }

    return p;
}

/**
*	<h2>Name: 	populateSFilter.</h2>
*	<h3>Desc:</h3>	Constructs the options for selects that are filters.
*	<h3>Args:</h3> 	cnam (selector)             - name of filter to populate;<br>
*			url (string)                - url of server-side filter's data class;<br>
*			sn (string)                 - name of column to sort;<br>
*			so (string)                 - sort order;<br>
*			flt_id (string)             - column name for filtering. Value of each row of this column will be used for filtering.<br>
*                                                   If name's format is '<some_text1>.<some_text2>' then some_text1 will be used as correlation name;<br>
*			flt_shn	(string)            - data to display in options;<br>
*			flt_zvsh (string, optional) - filter's "zero value" name to display in options. If this is passed than "zero-option" will be created;<br>
*			flt_zvv	(string, optional)  - filter's "zero value" value.
*	<h3>Needs:</h3>	jQuery {jquery.js}.
*/
function populateSFilter(cnam, url, sn, so, flt_id, flt_shn, flt_zvsh, flt_zvv)
{
    cnam = exists(cnam) ? cnam : null;
    url = exists(url) ? url : null;
    sn = exists(sn) ? sn : null;
    so = exists(so) ? so : null;
    flt_id = exists(flt_id) ? flt_id : null;
    flt_shn = exists(flt_shn) ? flt_shn : null;
    flt_zvsh = exists(flt_zvsh) ? flt_zvsh : null;
    flt_zvv = exists(flt_zvv) ? flt_zvv : '';

    if (cnam == null || url == null || sn == null || so == null ||
            flt_id == null || flt_shn == null){alert("Неверное количество аргументов для фильтра "+cnam); return;}

    var flt_id_corrnam = '';

    flt_id = flt_id.split('.');
    if (flt_id.length > 1)
    {
            flt_id_corrnam = flt_id[0]+".";
            flt_id = flt_id[1];
    }
    else
    {
            flt_id = flt_id[0];
    }

    jQuery.ajax({
        type: 'POST',
        url: url,
        data: [
                {name: 'sortname', value: sn},
                {name: 'sortorder', value: so}
        ],
        dataType: 'json',
        success: function(data)
        {
                if (exists(data))
                {
                        var id = '', shn = '';
                        var opts = '';

                        for (var i = 0; i < data.length; i++)
                        {
                                id = 'data[i].'+flt_id;
                                shn = 'data[i].'+flt_shn;

                                if (i == 0)
                                {
                                        if (flt_zvsh == null)
                                        {
                                                opts += "<option value='"+flt_id_corrnam+flt_id+'='+eval(id)+"' selected='true'>"+eval(shn)+"</option>";
                                        }
                                        else
                                        {
                                                opts += "<option value='"+flt_zvv+"' selected='true'>"+flt_zvsh+"</option>";
                                                opts += "<option value='"+flt_id_corrnam+flt_id+'='+eval(id)+"'>"+eval(shn)+"</option>";
                                        }
                                }
                                else
                                {
                                        opts += "<option value='"+flt_id_corrnam+flt_id+'='+eval(id)+"'>"+eval(shn)+"</option>";
                                }
                        }

                        exists(opts) ? jQuery(cnam).append(opts) : alert("Не удалось заполнить фильтр "+cnam);
                }
                else
                {
                        alert("Не удалось заполнить фильтр "+cnam);
                }
        },
        error: function(data)
        {
            procErrResp(data);
        }
    });
}

/**
*	<h2>Name: 	populateSFilter2.</h2>
*	<h3>Desc:</h3>	Constructs the options for selects that are filters.
*	<h3>Args:</h3> 	p (Object)                    <br>
*                       p.cnam (selector)             - name of filter to populate;<br>
*			p.url (string)                - url of server-side filter's data class;<br>
*			p.tnam (string)               - table from which we want result set;<br>
*			p.flt_id (string)             - column name for filtering. Value of each row of this column will be used for filtering.<br>
*                                                     If name's format is '<some_text1>.<some_text2>' then some_text1 will be used as correlation name;<br>
*                       p.flt_shn (string)            - data to display in options;<br>
*                       p.flt_shn_so (string)         - sort order for displayin' data;<br>
*			p.flt_zvsh (string, optional) - filter's "zero value" name to display in options. If this is passed than "zero-option" will be created;<br>
*			p.flt_zvv (string, optional)  - filter's "zero value" value;<br>
*			p.postPopl (Object)           - function to call after successfull filter populating;<br>
*			p.region (integer)            - region's id if needed.
*	<h3>Needs:</h3>	jQuery {jquery.js}.
*/
function populateSFilter2(p)
{
    var cnam = exists(p.cnam) ? p.cnam : null;
    var url = exists(p.url) ? p.url : null;
    var tnam = exists(p.tnam) ? p.tnam : null;
    var flt_id = exists(p.flt_id) ? p.flt_id : null;
    var flt_shn = exists(p.flt_shn) ? p.flt_shn : null;
    var flt_shn_so = exists(p.flt_shn_so) ? p.flt_shn_so : null;
    var flt_zvsh = exists(p.flt_zvsh) ? p.flt_zvsh : null;
    var flt_zvv = exists(p.flt_zvv) ? p.flt_zvv : '';
    var reg = exists(p.region) ? p.region : 0;

    if (cnam == null || url == null || tnam == null ||
        flt_id == null || flt_shn == null || flt_shn_so == null){alert("Неверное количество аргументов для фильтра "+cnam); return;}

    var flt_id_corrnam = '';

    flt_id = flt_id.split('.');
    if (flt_id.length > 1)
    {
            flt_id_corrnam = flt_id[0]+".";
            flt_id = flt_id[1];
    }
    else
    {
            flt_id = flt_id[0];
    }

    jQuery.ajax({
        type: 'POST',
        url: url,
        data: [
                {name: 't', value: tnam},
                {name: 'id', value: flt_id},
                {name: 'n', value: flt_shn},
                {name: 'so', value: flt_shn_so},
                {name: 'r', value: reg}
        ],
        dataType: 'json',
        success: function(data)
        {
                if (exists(data))
                {
                        var id = '', shn = '';
                        var opts = '';

                        for (var i = 0; i < data.length; i++)
                        {
                                id = 'data[i].'+flt_id;
                                shn = 'data[i].'+flt_shn;

                                if (i == 0)
                                {
                                        if (flt_zvsh == null)
                                        {
                                                opts += "<option value='"+flt_id_corrnam+flt_id+'='+eval(id)+"' selected='true'>"+eval(shn)+"</option>";
                                        }
                                        else
                                        {
                                                opts += "<option value='"+flt_zvv+"' selected='true'>"+flt_zvsh+"</option>";
                                                opts += "<option value='"+flt_id_corrnam+flt_id+'='+eval(id)+"'>"+eval(shn)+"</option>";
                                        }
                                }
                                else
                                {
                                        opts += "<option value='"+flt_id_corrnam+flt_id+'='+eval(id)+"'>"+eval(shn)+"</option>";
                                }
                        }

                        if (exists(opts))
                        {
                            jQuery(cnam).append(opts);
                            if (p.postPopl) p.postPopl(jQuery(cnam), jQuery(cnam).find("option").length);
                        }
                        else
                        {
                             alert("Не удалось заполнить фильтр "+cnam);
                        }
                }
                else
                {
                        alert("Не удалось заполнить фильтр "+cnam);
                }
        },
        error: function(data)
        {
            procErrResp(data);
        }
    });
}

/**
*	<h2>Name: 	makeSFilterString.</h2>
*	<h3>Desc:</h3>	Returns filter string for select(s) that are filters, created by populateSFilter function.
*	<h3>Args:</h3> 	sel (selector) 	- filter for which will be constructed filter string.
*	<h3>Needs:</h3>	jQuery {jquery.js}.
*/
function makeSFilterString(sel)
{
    var s = null;

    jQuery(sel).length == 0 ? s = null : s = jQuery(sel).find('option[selected]');
    if (s == null) return '';

    var flt = '';
    var substr = '';
    var cntinue = true;

    for (var i = 0; i < s.length; i++)
    {
        if (((jQuery(s[i]).attr('value')).replace(/ /g, '')).length > 0)
        {
                flt += jQuery(s[i]).attr('value')+' and ';
        }
    }

    while(cntinue)
    {
        if (flt.lastIndexOf('and') > 0)
        {
                substr = flt.substring(flt.lastIndexOf('and'));
                substr = substr.replace(/ /g, '');
                substr == 'and' ? flt = flt.substring(0, flt.length - 5) : cntinue = false;
        }
        else
        {
                cntinue = false;
        }
    }

    return flt;
}

function getPoG()
{
    var ret = "POST";
    var _pog = GetCookieByName( "PoG" );
    if( exists( _pog ) && _pog == 1 )
        ret = "GET";
    return ret;
}

function isLeapYear(yr)
{
    if (!exists(yr) || isNaN(yr)) return null;

    if (((yr % 4) == 0 && (yr % 100) != 0) || (yr % 400) == 0)
    {
        return true;
    }

    return false;
}

function lastDayOfMonth(yr, mn)
{
    if (!exists(yr) || isNaN(yr)) return null;
    if (!exists(mn) || isNaN(mn) || mn <= 0 || mn > 12) return null;
    
    var daysInMonth = new Array(31,28,31,30,31,30,31,31,30,31,30,31);
    if (mn == 2 && isLeapYear(yr))
    {
        return 29;
    }
    else
    {
        return daysInMonth[mn-1];
    }

    return null;
}