    // **************************************
    //
    //  DataFlow DMS public js lib
    //
    // **************************************

    Array.prototype.sum = function(){
    	for(var i=0,sum=0;i<this.length;sum+=this[i++]);
    	return sum;
    }
    Array.prototype.max = function(){
    	return Math.max.apply({},this)
    }
    Array.prototype.min = function(){
    	return Math.min.apply({},this)
    }

    // ***********************************************************************************
    //    DMS Generic AJAX handling
    // ***********************************************************************************

    function dmsGenericAjaxRequest(param, url, item, dontserializeparam, async)
		{
       if( item != undefined )
        { url=url+'/'+item+'.html'; }

			 if( dontserializeparam == undefined || dontserializeparam == 'no' )
			 {
			 	param=param.toQueryString();
			 }

			 if( async == undefined || async == true)
			 {
			   async = true;
			 } else {
			   async = false;
			 }

  			var myAjax = new Ajax.Request(
  				url,
  				{
  				  asynchronous : async,
  					method: 'post',
            parameters: param,
            onComplete: dmsAjaxResponse
  				});
		}


    // XML fetcher
	  dmsAjaxResponse = function ( resp )
	  {
	    //Element.hide('ajax-loading'); // hide load box
      resp=resp.responseText;
      //alert(resp);
      // get result
      var ajaxresp = $H({
        result:   resp.match(/<result>(.|\n)*<\/result>/igm),
        message:  resp.match(/<message>(.|\n)*<\/message>/igm),
        callback: resp.match(/<callback>(.|\n)*<\/callback>/igm),
        params:   resp.match(/<params>(.|\n)*<\/params>/igm),
        data:     resp.match(/<data>(.|\n)*<\/data>/igm)
      });
      //alert(ajaxresp.inspect());
      ajaxresp.each(function (node, index){
        var k=node[0]+"";
        var v=node[1]+"";
        if( v != 'null' )
          {v=v.replace(/<\/?(result|message|callback|params|data)>/ig, '');}
        ajaxresp[k]=v;
        });

      // parse callback params
      if( ajaxresp['params'] != 'null')
      {
         var cbp=ajaxresp['params'].match(/<param>(.|\n)*?<\/param>/igm);
         var k=new String;
         var v=new String;
         var p = $H();
         ajaxresp['params'] = $H();
         for(var i=0; i< cbp.length; i++ )
         {
           k=""+cbp[i].match(/<key>(.|\n)*?<\/key>/igm)+"";
           k=k.replace(/<\/?key>/ig,'')+"";
           v=cbp[i].match(/<val>(.|\n)*?<\/val>/igm)+"";
           v=v.replace(/<\/?val>/ig,'')+"";
           p[k]=v;
           ajaxresp['params']=ajaxresp['params'].merge(p);
         }
      }

      /////////// make some great things \\\\\\\\\\\\\\\
      // messages
      if( ajaxresp['message'] != 'null' )
      {
        dmsMessage(ajaxresp['message'], ajaxresp['result'])
      }

      // =fixme Dummy status handler
      //if( ajaxresp['result'] != 'null' && ajaxresp['result'] != "ok" )
      //{
      //  alert('Something bad happens!');
      //}

      // callback function
      if( ajaxresp['callback'] != 'null' )
      {
        // callback params handler
        if( ajaxresp['data'] != 'null' )
        {
          // merge response with params
          ajaxresp['params']['data']=ajaxresp['data'];
          delete ajaxresp['data'];
        }
        eval(ajaxresp['callback'])(ajaxresp['params']);
      }
	  }

    // ***********************************************************************************
    //    DMS Shopping Cart
    // ***********************************************************************************

    function dmsAddToCartFromChild(id)
    {
      var o=$(id);
      var obj=$(id+"_container");

      dmsAddToCart(obj);
    }

    function dmsAddToCart(obj)
    {
      //alert($H(obj).inspect());
      var o=obj.parentNode.parentNode;
      var id=o.id;

      o.className='cart-incart';

      // change msg
      obj.innerHTML='<small>удалить из корзины</small>';
      obj.onclick=function(){dmsDeleteFromCart(this);return false;};

      // send ajax request
			var param=$H({
			  'object'  : id
			});

      dmsGenericAjaxRequest(param, '/cart/add', 'ajax');
      return false;
    }

    function dmsDeleteFromCart(obj)
    {
      var o=obj.parentNode.parentNode;
      var id=o.id;

      o.className='cart-outcart';

      // change msg
      obj.innerHTML='<small>добавить в корзину</small>';
      obj.onclick=function(){dmsAddToCart(this);return false;};

      // send ajax request
			var param=$H({
			  'object'  : id
			});

      dmsGenericAjaxRequest(param,"/cart/remove",'ajax');
    }

    function dmsShowSpisok(obj)
    {
    	var txt = obj.innerHTML;
    	//alert("123");
    	id = obj.id+'s';
    	if (txt.substr(1,1)=='+')
    	{
	   		txt = '(-'+txt.substr(2);
	   		document.getElementById(id).style.display = 'block';
	   		//document.getElementById(obj.id).style.display = 'block';
	   	}
        else
        {
    		txt = '(+'+txt.substr(2);
    		document.getElementById(id).style.display = 'none';
    		//document.getElementById(obj.id).style.display = 'block';
    	}
    	obj.innerHTML=txt;
    	//obj.onclick=function(){dmsShowSpisok(this);return false;};
    	return false;
    }

    function dmsCartDelete(obj)
    {
      var o=obj.parentNode.parentNode;
      var id=o.id;
      Element.remove(o);

      // remove element from cart summa table
      objprops=id.split('_');
      delete cart[objprops[0]][objprops[1]];

      if($H(cart[objprops[0]]).keys().length==0)
        delete cart[objprops[0]];

      // send ajax request
			var param=$H({
			  'object'  : id
			});

      dmsGenericAjaxRequest(param, '/cart/remove', 'ajax', 'no', false);

      if( $H(cart).keys().length == 0 )
      {
        //Element.update($('container-cart'), );
        var refresh = new Ajax.Updater (
          {success: 'container-cart'},
          '/cart/ajax.html',
          {
            method: 'post'
          }
        );
      }
      dmsCartUpdateSum();
      return false;
    }

    function dmsUpdateCartRef(r)
    {
      Element.update($('shoppingcartref'), r.ref);
    }

    // ---------------------------------------------------- shopping cart finale
    var cart = {};

    function dmsCartAddToStruct(section, id, price )
    {
      if( cart[section] == undefined )
        cart[section]={};

      cart[section][id]=price;
      //console.debug($H(cart).toQueryString());
      //console.debug($H(cart[section]).values());
    }

    function dmsCartUpdateSum()
    {
      // TEST //
      // cart['testval']={};
      // cart['testval']['1']='1231';
      // TEST END //

      var s = 0;
      var val = $H(cart).values();

      val.each(
        function(obj){
          $H(obj).each(
            function(v){ s += parseInt(v[1]); }
          );
        }
      );

      Element.update($('cart-sum'), s+'');
    }

    // ***********************************************************************************
    //    DMS Various Site Controls
    // ***********************************************************************************

    function dmsShow(obj)
    {
      var href=obj.href;
      //console.debug(href);
      window.open(href, 'openreport', 'width=750,height=600,resizable=yes,status=yes,scrollbars=yes');
    }

    function test1(obj)
    {
      alert(obj.innerHTML);
    }

    function confirmSelfDel()
    {
    	var x=window.confirm("Вы действительно хотите удалить свою учетную запись?")
		if (x){
			//location.href="/customer/delself";
			var param=$H({
			  'dummy'  : 'yes'
			});

			dmsGenericAjaxRequest(param,"/customer/delself");
			location.href="http://www.businesstat.ru";
		}
	}

	function validateOrg(frm)
	{

		/*if(document.forms[0].elements[4].value == "")
		{
			alert('No orgname!!!');
		} else if (document.forms[0].elements[5].value == "")
		{
			alert('No orgaddrr!!!');
		} else if (document.forms[0].elements[6].value == "")
		{
			alert('No ink!!!');
		} else
		{
			document.forms[0].submit();
		}*/
		if(!frm)
			return false;
		
		for(var i=0; i<frm.elements.length; i++) {
			
			var elm = frm.elements[i];
			
			switch(elm.name) {
				
				case 'order[orgname]':
					if(elm.value == '') {
						alert('Необходимо указать название организации');
						elm.focus();
						return false;
					}
				break;
				
				case 'order[orgaddr]':
					if(elm.value == '') {
						alert('Необходимо указать юридический адрес организации');
						elm.focus();
						return false;
					}
				break;
				
				case 'order[innkpp]':
					if(elm.value == '') {
						alert('Необходимо указать ИНН/КПП организации');
						elm.focus();
						return false;
					}
				break;
				
				default:
				break;
			}
		}
		
		/*if(frm.order[orgname] && frm.order[orgname].value == "")
		{
			alert('Необходимо указать название организации');
			document.forms[0].elements[4].focus();
			return false;
		}

		if(document.forms[0].elements[5].value == "")
		{
			alert('Необходимо указать юридический адрес организации');
			document.forms[0].elements[5].focus();
			return false;
		}

		if(document.forms[0].elements[6].value == "")
		{
			alert('Необходимо указать ИНН/КПП организации');
			document.forms[0].elements[6].focus();
			return false;
		}*/

		frm.submit();
		return true;
	}
