/**
 * Главный конфигурационный скрипт
 */
var Ech={



	Report:function(e)
	{
	    var rep=(this.isset(e,'description'))? e.description : '';
	    var message=(this.isset(e,'message'))? e.message : '';
	    var number=(this.isset(e,'number'))? e.number : '';
	    alert('des:'+rep+"\nmessage:"+message+"\nnumber:"+number+"\n\n\n"+e);
	},


	newClass:function(parent, prop) {
	  // Dynamically create class constructor.
	  var clazz = function() {
	    // Stupid JS need exactly one "operator new" calling for parent
	    // constructor just after class definition.
	   if (clazz.preparing) return delete(clazz.preparing);
	    // Call custom constructor.
	    if (clazz.constr) {
	      this.constructor = clazz; // we need it!
	      clazz.constr.apply(this, arguments);
	    }
	  }
	  clazz.prototype = {}; // no prototype by default
	  if (parent) {
	    parent.preparing = true;
	    clazz.prototype = new parent;
	    clazz.prototype.constructor = parent;
	    clazz.constr = parent; // BY DEFAULT - parent constructor
	  }
	  if (prop) {
	    var cname = "constructor";
	    for (var k in prop) {
	      if (k != cname) clazz.prototype[k] = prop[k];
	    }
	    if (prop[cname] && prop[cname] != Object)
	      clazz.constr = prop[cname];
	  }
	  return clazz;
	},




    /*
     * Глобальные---------------------------------------------------------------------
     */
	isset: function(obj, proto)
	{
		try{
			if(!obj)return false;
			function cheak(obj,proto)
			{
				try
				{
    				if(typeof obj[proto] != typeof undef)
    				{
    					return obj[proto];
    				}else return 'pizdec';
				}catch(e){}
				return 'pizdec';
			}

			if(typeof proto==typeof 'string')
			{
				if(cheak(obj,proto)=='pizdec')return false;
				return true;
			}else if(typeof proto == typeof ['array1','array2'])
			{
				var pro;
				var ob=obj;
				for(var i in proto)
				{
					pro=proto[i];
					ob=cheak(ob,pro);
					if(ob=='pizdec')return false;
				}
				return true;
			}
			return false;

		}catch(e){this.Report(e);}
	},
	count:function(obj)
	{
		try
		{
			var count=0;
			for(var i in obj)
			{
				++count;
			}
			return count;
		}catch(e){this.Report(e);}
	},

	clone:function(object)
	{
		try
		{
		    if (typeof(object) != typeof window) return object;
		    var newObject = object.constructor();
		    for (objectItem in object) {
		        newObject[objectItem] = this.clone(object[objectItem]);
		    }
		    return newObject;
	   	}catch(e){this.Report(e);}
	},



	False: function(){return false;},

	    /**
	     * Оперделение браузера
	     */

		IsIE: function()
		{
			return (!this.IsMoz() && !this.IsOpera());
		},

		IsOpera: function()
		{
			return (navigator.userAgent.toLowerCase().indexOf('opera') != -1);
		},

		IsMoz: function()
		{
			return (navigator.userAgent.toLowerCase().indexOf('gecko') != -1);
		},

		//Оперделение браузера-----------------------------------------------------------------

	//Глобальные-----------------------------------------------------------------

	window_open: function(REQUEST)
	{
		REQUEST=(typeof REQUEST != typeof undef)? REQUEST : null;
		var url=(this.isset(REQUEST,'url'))? REQUEST.url : '';
		var width=(this.isset(REQUEST,'width'))? REQUEST.width : 100;
		var height=(this.isset(REQUEST,'height'))? REQUEST.height : 100;
		var cont=(this.isset(REQUEST,'cont'))? REQUEST.cont : null;

		var w = screen.width, h = screen.height;
		if(this.IsOpera())
		{

			w = document.documentElement.offsetWidth;
			h = document.documentElement.offsetHeight;
		}
		var Win = window.open(url,"",'status=no,scrollbars=yes,resizable=yes,width='+width+',height='+height+',top='+Math.floor((h - height)/2-14)+',left='+Math.floor((w - width)/2-5));
		if(null!==cont){
			Win.document.open();
			Win.document.write(cont);
			Win.document.close();
		}

	},

	/**
	 * COOKIE
	 */
	cookie_read:function(name)
	{
		try{
		  var cookieValue = "";
		  var search = name + "=";
		  if(document.cookie.length > 0)
		  {
		    offset = document.cookie.indexOf(search);
		    if (offset != -1)
		    {
		      offset += search.length;
		      end = document.cookie.indexOf(";", offset);
		      if (end == -1) end = document.cookie.length;
		      cookieValue = unescape(document.cookie.substring(offset, end))
		    }
		  }
		  return cookieValue;
	  }catch(e){this.Report(e);}
	},
	/**
	  * writeCookie("myCookie", "my name", 24);
	  * Stores the string "my name" in the cookie "myCookie" which expires after 24 hours.
	  * The hours parameter is optional; if hours is left out, the cookie value expires at the end of the visitor's browser session.
	 */
	cookie_write:function(name, value, REQUEST)
	{
		try
		{
		  REQUEST=(typeof REQUEST == typeof undef)? null : REQUEST;
		  var expire="";
		  var path = "; path=" + '/';
		  var hours=(this.isset(REQUEST,'hours'))? REQUEST.hours : 10000;
		  //hours, path
		  if(hours!==false){
			  expire = new Date((new Date()).getTime() + this.math_parseInt(hours) * 3600000);
			  expire = "; expires=" + expire.toGMTString();
		  }


		  if(this.isset(REQUEST,'path')){
			  if(REQUEST.path===true) path="";
			  else{
				  path = "; path=" + this.str_trim(REQUEST.path);
			  }
		  }

		  document.cookie = name + "=" + escape(value) + expire + path;
	  }catch(e){this.Report(e);}
	},

	cookie_isset:function(){
	  try{
			var value='cookie_isset_'+Math.ceil(Math.random()*Math.ceil(1000000));
			this.cookie_write(value,value,{hours:false});
			var res=this.cookie_read(value);
			return (res===value)? true : false ;
		}catch(e){this.Report(e);}
	},





    /*
     * События---------------------------------------------------------------------
     */
	event_add: function(el, evname, func)
	{
		try{
    		if(el.attachEvent) // IE
    			el.attachEvent("on" + evname, func);
    		else if(el.addEventListener) // Gecko / W3C
    			el.addEventListener(evname, func, false);
//    		else
//    			el["on" + evname] = func;
		}catch(e){this.Report(e);}

	},

	event_remove: function(el, evname, func)
	{
		try{
     		if(el.detachEvent) // IE
    			el.detachEvent("on" + evname, func);
    		else if(el.removeEventListener) // Gecko / W3C
    			el.removeEventListener(evname, func, false);
//    		else
//    			el["on" + evname] = null;
		}catch(e){this.Report(e);}

	},



	event_XYmouse:function (evt)
	{
		try{
			if(!evt) throw 'XYmouse:no Event';
			var coord={left:0, top:0};
			if (evt.pageX)
			{
				coord.left=evt.pageX;
				coord.top=evt.pageY;

			}else if(evt.clientX)
			{
				coord.left=evt.clientX + document.body.scrollLeft - document.body.clientLeft;
				coord.top=evt.clientY + document.body.scrollTop - document.body.clientTop;

				if(document.body.parentElement && document.body.parentElement.clientLeft)
				{
					var parElem=document.body.parentNode;
					coord.left+= parElem.scrollLeft - parElem.clientLeft;
					coord.top+= parElem.scrollTop - parElem.clientTop;
				}
			}
			return coord;
		}catch(e){this.Report(e);}


	},
	event_cancelBubble:function(evt)
	{
		evt=(evt)? evt : ((window.event)? event : null);
		if(!evt)return;
		if(this.isset(evt, 'cancelBubble'))
		     evt.cancelBubble=true;
		if(this.isset(evt, 'stopPropagation'))
		     evt.stopPropagation();
	},

    event_createMouseEvt:function(type, clientX, clientY, cancelBubble){
    	try{

            var evt;

            if(this.isset(document, 'createEventObject'))
            {
	            evt = document.createEventObject();
	            evt.clientX=clientX;
	            evt.clientY=clientY;
	            evt.cancelBubble=cancelBubble;
	            evt.type=type;

            }else if(Ech.isset(document, 'createEvent'))
            {
                evt = document.createEvent("MouseEvents");
                evt.initMouseEvent(type, cancelBubble, false, window, 1, 0, 0,
                    					clientX, clientY,
										0, 0, 0, 0, 1, document);
            }
            return evt;

        }catch(e){Ech.Report(e);}
    },

    event_fireEvent:function(evt, obj)
    {
    	try{

            if(Ech.isset(document, 'fireEvent'))obj.fireEvent('on'+evt.type, evt);
			else if(Ech.isset(document, 'dispatchEvent'))obj.dispatchEvent(evt);

        }catch(e){Ech.Report(e);}

    },



    event_DragDrop:function(start)
    {

		function NodeSearch(Elem, what, isset)
		{
			while(Elem)
			{
				if((Elem.nodeType==1) && isset(Elem,['style','MozUserSelect']))
				{
		            Elem.style.MozUserSelect=what;
				}
		        if(Elem.firstChild) NodeSearch(Elem.firstChild, what, isset);
		        Elem=Elem.nextSibling;

			}
		}

		try{
            switch(start)
            {
            	case 'off':
            		this.event_add(document, 'drag', this.False);
            		this.event_add(document, 'dragstart', this.False);
            		this.event_add(document, 'contextmenu', this.False);
            		this.event_add(document, 'select', this.False);
            		this.event_add(document, 'selectstart', this.False);
            		if(this.isset(document,['body','style','MozUserSelect']))
            		{
          				NodeSearch(document.body, 'none', this.isset);
            		}
            		break;
            	case 'on' :
            		this.event_remove(document, 'drag', this.False);
            		this.event_remove(document, 'dragstart', this.False);
            		this.event_remove(document, 'contextmenu', this.False);
            		this.event_remove(document, 'select', this.False);
            		this.event_remove(document, 'selectstart', this.False);
            		if(this.isset(document,['body','style','MozUserSelect']))
            		{
          				NodeSearch(document.body, '', this.isset);
            		}
            		break;
            }
		}catch(e){this.Report(e);}
    },

    //События-----------------------------------------------------------------








	/**
	 * Элементы-----------------------------------------------------
	 */
	el_create:function(elemName, proObj, stObj){
		try{
			var elem=((typeof elemName)==(typeof 'string'))? document.createElement(elemName) :
				(((typeof elemName)==(typeof window))? elemName : null);

			if(!elem) throw('Ech::el_create: не могу создать элемент');

			if((typeof proObj)==(typeof window))
			{
				for(var i in proObj){elem[i]=proObj[i]}
			}
			if((typeof stObj)==(typeof window))
			{
				for(var j in stObj){elem.style[j]=stObj[j]}
			}
			return elem;

		}catch(e){this.Report(e);}

	},

	el_GetRealPos: function(el)
	{
		try{

	      // has to be part of document to have pageXY
	      if (el.parentNode === null || el.style.display == 'none') {
	         return false;
	      }

	      /**
	       * Position of the html element (x, y)
	       * @private
	       * @type Array
	       */
	      var parent = null;
	      var pos={};
	      var box;

	      if (el.getBoundingClientRect) { // IE
	         box = el.getBoundingClientRect();
	         var scrollTop = document.documentElement.scrollTop || document.body.scrollTop;
	         var scrollLeft = document.documentElement.scrollLeft || document.body.scrollLeft;
			 var l1=(box.left + scrollLeft);
			 var t1=(box.top + scrollTop);
	         return {'left':l1, 'top':t1, 'right':(l1+el.offsetWidth), 'bottom':(t1 + el.offsetHeight)}
	      }
	      else if (document.getBoxObjectFor) { // gecko
	         box = document.getBoxObjectFor(el);
	         pos = {'left':box.x, 'top':box.y};
	      }
	      else { // safari/opera
	         pos = {'left':el.offsetLeft, 'top':el.offsetTop};
	         parent = el.offsetParent;
	         if (parent != el) {
	            while (parent) {
	               pos['left'] += parent.offsetLeft;
	               pos['top'] += parent.offsetTop;
	               parent = parent.offsetParent;
	            }
	         }

	         // opera & (safari absolute) incorrectly account for body offsetTop
	         var ua = navigator.userAgent.toLowerCase();
	         if (
	            ua.indexOf('opera') != -1
	            || ( ua.indexOf('safari') != -1 && el.style.position.toLowerCase() == 'absolute' )
	         ) {
	            pos['top'] -= document.body.offsetTop;
	         }
	      }

	      if (el.parentNode) { parent = el.parentNode; }
	      else { parent = null; }

	      while (parent && parent.tagName.toLowerCase() != 'body' && parent.tagName.toLowerCase() != 'html') {
	         pos['left'] -= parent.scrollLeft;
	         pos['top'] -= parent.scrollTop;

	         if (parent.parentNode) { parent = parent.parentNode; }
	         else { parent = null; }
	      }
		  pos['right']=pos['left']+el.offsetWidth;
		  pos['bottom']=pos['top']+el.offsetHeight;
	      return pos;

		}catch(e){this.Report(e);}
	},

	el_GetReal_oWHLT:function(el)
	{
		try{
			if(!el)throw('Ech::el_GetReal_oWHLT: Нет елемента');
			var HW={};
			HW.oHeight=el.offsetHeight;
			HW.oWidth=el.offsetWidth;
			HW.oLeft=el.offsetLeft;
			HW.oTop=el.offsetTop;
			return HW;
		}catch(e){this.Report(e);}
	},
	el_GetReal_cWHLT:function(el)
	{
		try{
			if(!el)throw('Ech::el_GetReal_cWHLT: Нет елемента');
			var HW={};
			HW.cHeight=el.clientHeight;
			HW.cWidth=el.clientWidth;
			HW.cLeft=el.clientLeft;
			HW.cTop=el.clientTop;
			return HW;
		}catch(e){this.Report(e);}
	},

	el_AlignToPos:function(pos, w, h)
	{
		var x = pos["left"], y = pos["bottom"];

		var html = document.documentElement;
		if((html.clientWidth + html.scrollLeft) - (pos["left"] + w) < 0)
		{
			if(pos["right"] - w >= 0 )
				x = pos["right"] - w;
			else
				x = html.scrollLeft;
		}

		if((html.clientHeight + html.scrollTop) - (pos["bottom"] + h) < 0)
		{
			if(pos["top"] - h >= 0)
				y = pos["top"] - h;
			else
				y = html.scrollTop;
		}

		return {'left':x, 'top':y};
	},

	el_FindChildObject: function(obj, tag_name, class_name)
	{
		try{
			if(!obj)
				return null;
			var tag = tag_name.toUpperCase();
			var cl = (class_name? class_name.toLowerCase() : null);
			var n = obj.childNodes.length;
			for(var j=0; j<n; j++)
			{
				var child = obj.childNodes[j];
				if(child.tagName && child.tagName.toUpperCase() == tag)
					if(!class_name || child.className.toLowerCase() == cl)
						return child;
			}
			return null;
		}catch(e){this.Report(e);}
	},

	el_FindNextSibling: function(obj, tag_name)
	{
		try{
			var o = obj;
			var tag = tag_name.toUpperCase();
			while(o.nextSibling)
			{
				var sibling = o.nextSibling;
				if(sibling.tagName && sibling.tagName.toUpperCase() == tag)
					return sibling;
				o = sibling;
			}
			return null;
		}catch(e){this.Report(e);}
	},

	el_FindPreviousSibling: function(obj, tag_name)
	{
		try{
			var o = obj;
			var tag = tag_name.toUpperCase();
			while(o.previousSibling)
			{
				var sibling = o.previousSibling;
				if(sibling.tagName && sibling.tagName.toUpperCase() == tag)
					return sibling;
				o = sibling;
			}
			return null;
		}catch(e){this.Report(e);}
	},

	el_FindParentObject: function(obj, tag_name)
	{
		try{
			var o = obj;
			var tag = tag_name.toUpperCase();
			while(o.parentNode)
			{
				var parent = o.parentNode;
				if(parent.tagName && parent.tagName.toUpperCase() == tag)
					return parent;
				o = parent;
			}
			return null;
		}catch(e){this.Report(e);}
	},
	el_AdDelClass:function(elem, evtVal, value)
	{
		try{
			switch(evtVal)
			{
				case 'add' :
					this.el_AdDelClass(elem, 'del', value);
					elem.className = elem.className+' '+value;
					break;
				case 'del' :
					elem.className = elem.className.replace(new RegExp('\s*'+value,'ig'), '');
					break;
			}
		}catch(e){this.Report(e);}
	},
	el_HasClass:function(elem, value)
	{
		try{
			var RE =new RegExp(value,'ig');
			return (RE.exec(elem.className))? true: false;
		}catch(e){this.Report(e);}
	},
	el_delChilds:function(elem)
	{
		try{
			while(elem.firstChild)
			{
				elem.removeChild(elem.firstChild);
			}
		}catch(e){this.Report(e);}
	},
	//Элементы-----------------------------------------------------------------









    /*
     *Обработка строк-------------------------------------------------
     */

	str_trim: function(s)
	{
		try{
     		var r, re;
     		s=String(s);
    		re = /^[ \r\n]+/g;
    		r = s.replace(re, "");
    		re = /[ \r\n]+$/g;
    		r = r.replace(re, "");
    		return r;
		}catch(e){this.Report(e);}

	},
	str_empty:function(s)
	{
		try{
		   if(this.str_trim(s)=='')return true; else return false;
		}catch(e){this.Report(e);}

	},

	str_shield:function(s){//Экранирует ' и \
		try{
			s=String(s);
			var re1=/\\/g
			var re2=/\'/g;
			var re3=/[\r\n]/mg;
			var re4=/  /g;
			s=s.replace(re3, " ");

			while(re4.test(s)){
				s=s.replace(re4, " ");
			}
			s=s.replace(re1, "\\\\");
			return s.replace(re2, "\\\'");
		}catch(e){this.Report(e);}

	},
	str_urlencode: function(s)
	{
		try{
			return escape(s).replace(new RegExp('\\+','g'), '%2B');
		}catch(e){this.Report(e);}
	},
    //Обработка строк-------------------------------------------------










	/**
	 * Обработка чисел---------------------------------------------------------
	 */
	math_parseInt:function(n)
	{
		try{
			return (isNaN(parseInt(n,10)))? 0 : parseInt(n,10);
		}catch(e){this.Report(e);}
	},

	math_isNULL:function(n)
	{
		try{
			return (this.math_parseInt(n)==0)? true : false;
		}catch(e){this.Report(e);}
	},
	//Обработка чисел---------------------------------------------------------










    /*
     *FCKeditor
     */
	fck_start:function(textarea, elem)
	{
		try
		{
			var FCK=null;
			FCK = new FCKeditor(textarea.id);
			FCK.BasePath = '/lib/FCKeditor/';
			FCK.Width=textarea.style.width;
			FCK.Height=textarea.style.height;
			FCK.Value=textarea.value;
			FCK.Config['SkinPath']='/lib/FCKeditor/editor/skins/office2003/';
			elem.innerHTML = FCK.CreateHtml();
			return 	FCK;
		}catch(e){this.Report(e);}

	},
	fck_getData:function(instanceName)
	{

		try
		{
			var value=null;
			if(typeof FCKeditorAPI!=typeof undef){
				var oEditor = FCKeditorAPI.GetInstance(instanceName) ;
				if(oEditor)
				{
					value=oEditor.EditorDocument.body.innerHTML;
				}

			}else
			{
				value=document.getElementById(instanceName).value;
			}
			return value;
		}catch(e){this.Report(e);}

	},
	/**
	 * form----------------------------------------------------------
	 */
	form_getDatas:function(form, FCK_instance)
	{

		try
		{
			FCK_instance=(typeof FCK_instance!= typeof undef)? FCK_instance : Array();
			var request=new Array();
			for(var i=0; i<form.length; i++)
			{
				if(this.isset(form[i], 'name') && !this.str_empty(form[i].name))
				{
					var value=form[i].value;
					if(form[i].className=='FCK_edit')
					{
						value=this.form_getData_fromFCK(form[i].id);
					}
					request[form[i].name]=value;
				}
			}
			for(var z in FCK_instance)
			{
				if(this.isset(request, FCK_instance[z]['instance']))
				{
					delete request[FCK_instance[z]['instance']];
					request[FCK_instance[z]['name']]=this.fck_getData(FCK_instance[z]['instance']);
				}
			}
			return request;
		}catch(e){this.Report(e);}

	},

	select_Change:function(select, massFields, num, needEmpty , massAttr, massStyle)
	{
		try
		{
			this.el_create(select, massAttr, massStyle);
			needEmpty=(typeof needEmpty!= typeof undef)? needEmpty : false;
			select.innerHTML='';

			var option;
			if(needEmpty)
			{
				option=this.el_create('option', {value:0});
				option.appendChild(document.createTextNode(''));
				option.value=0;
				select.appendChild(option);
			}

			for(var id in massFields)
			{
				option=this.el_create('option', {value:massFields[id][num[0]]});
				option.appendChild(document.createTextNode(massFields[id][num[1]]));
				select.appendChild(option);
			}
		}catch(e){this.Report(e);}
	},

	select_Selected:function(select, id)
	{
		try
		{
			for(var i=0;i<select.length; i++)
			{
				try{select.options[i].selected=false;}catch(e){}
			}
			for(var i=0;i<select.length; i++)
			{
				if(select.options[i].value==id)
				{
					try{select.options[i].selected=true;}catch(e){}
					break;
				}
			}
		}catch(e){this.Report(e);}
	},


	select_GetValue:function(select)
	{
		try
		{
			var value=null;
			var text='';
			for(var i=0;i<select.length; i++)
			{
				if(select.options[i].selected)
				{
					text=(select.options[i].text)? select.options[i].text : '';
					value=(select.options[i].value)? select.options[i].value: null;
					break;
				}
			}
			return [text, value];
		}catch(e){this.Report(e);}
	}

}

