/*












*/




function Build_Base_onlineMeetings(){

		this._views     = {};
		this._organizer = null;

		var callBack = null;

		this.setCallBack = function(func)
		{
			if(typeof(func) == 'function')
			{
				callBack = func;
			}
		}


		this.setOrganizer = function(str)
		{
			if(str && typeof str == 'string' )
			{
				this._organizer = str;
			}
			else
			{
				throw new Error("Build_Base_onlineMeetings :: setOrganizer\nOrganizer onlineMeetings is null")
			}
		}

		this.setLink = function(hash)
		{
			if(hash.parent)
			{
				this._views.parent = new View();
				this._views.parent.setView(hash.parent);
			}
			else
			{
				throw new Error("Build_Base_onlineMeetings :: setLink\nParent onlineMeetings is null")
			}


			if(hash.link)
			{
				this._views.link = new View();
				this._views.link.setView(hash.link);
			}
			else
			{
				throw new Error("Build_Base_onlineMeetings :: setLink\nLink onlineMeetings is null")
			}


			if(hash.hiddenParentStyle && ( hash.hiddenParentStyle == 'visibility' || hash.hiddenParentStyle == 'display' ))
			{
				this._views.hiddenParentStyle = hash.hiddenParentStyle;
			}
			else
			{
				throw new Error("Build_Base_onlineMeetings :: setLink\nHiddenParentStyle onlineMeetings not visibility and not display");
			}

			if(hash.url && typeof hash.url == 'string' && hash.url.match(/^(http|https)/))
			{
				this._views.url = hash.url;
			}

			else if(hash.url && typeof hash.url == 'string'){				this._views.url = location.protocol+"//"+location.host+hash.url;
				//alert(this._views.url);			}

			else
			{
				throw new Error("Build_Base_onlineMeetings :: setLink\nUrl onlineMeetings is not string");
			}


		}


		this.getAllMeetings = function()
		{
			var oGetAllMeetings = new GetAllMeetings();
			var arr =     {
								'url' : '/Ajax_webex/proxy.php',
								data  :
								{
									cmd       : 'getAllMeetings',
									organizer : this._organizer,
									placeholder : LocationManager.is_hash('QA')? true : false
								},
								repeatOnFailure : 1
							}


			oGetAllMeetings.setData(arr);
			oGetAllMeetings.sendPost();
			oGetAllMeetings.setObserver( 'oncomplete', oncompleteGetAllMeetings.bind(this, oGetAllMeetings) );
			oGetAllMeetings.setObserver( 'onempty',    onemptyGetAllMeetings.bind   (this)                  );
			oGetAllMeetings.setObserver( 'onerror',    onerrorGetAllMeetings.bind   (this)                  );

		}


		function oncompleteGetAllMeetings(oGetAllMeetings)
		{               //alert(2);
            var allMeetings = oGetAllMeetings.getMeetings();

			if(!allMeetings.length)
			{
				allMeetings = [allMeetings];
			}
			for(var k = 0 ; k < allMeetings.length; k++){
				var meetings = allMeetings[k];
                if(meetings.meetingFields && meetings.meetingFields.length)
				{					for(var i = 0; i < meetings.meetingFields.length; i++)
					{
						var field = meetings.meetingFields[i];
                        /*For webex*/
						/*if(field.name == 'status' && field.value == 'NOT_INPROGRESS' && meetings.meetingId)*/
						if(field.name == 'status' && field.value == 'INPROGRESS' && meetings.meetingId)
						{
							if(this._views && this._views.parent)
							{
								if(this._views.parent[this._views.hiddenParentStyle])
								{
									this._views.parent[this._views.hiddenParentStyle](true);

								}

								var url =  this._views.url + meetings.meetingId;

								if(this._views.link.getView().nodeName == 'A')
								{
									/* Open in the same window
									this._views.link.getView().href = url;
									*/
									/*Open in new window - use window.open*/
									/*this._views.link.target = "_top";*/
									this._views.link.getView().href = "javascript:window.open('"+url+"','Webex','toolbar=no,location=yes,directories=no,status=no,menubar=no,scrollbars=no,resizable=no,width=380,height=240'); void(0);";

								}
								else
								{
									window.addEvent(this._views.link.getView(), 'onclick', beforeClickonlineMeetingsLink.rcBind(this, { 'url' : url }))
								}
							}
							callBackCall({status : true, meeting : meetings})
							return;
						}
					}
				}

			}
			callBackCall({status : false});
		}

		function beforeClickonlineMeetingsLink(hash)
		{
			if(hash.url)
			{
				window.location = hash.url;
			}
		}

		function onemptyGetAllMeetings()
		{
			callBackCall({status : false});
		}

		function onerrorGetAllMeetings()
		{
			callBackCall({status : false});
		}

		function callBackCall(hash)
		{
			if(callBack)
			{
				callBack(hash);
			}
		}

	}



/*







*/



function View(){
	Subscriber.call(this);
	Resize.call(this);
	Base.call(this);
	Move.call(this);
	States.call(this);

	this._view = undefined;

	this.getView = function(obj){
		return this._view;
	}
	this.setViewAsClone = function(obj){
		if(is_dom(obj)){
			this.setView(obj.cloneNode(true));
		}
	}
	this.remove = function(){
		this._view.parentNode.removeChild(this._view);
	}
	this.setView = function(obj){
		if(is_dom(obj)){
			this._view = obj;
		}else{
			this._view = document.createElement(obj);
		}
	}
	this.insertIn = function(parent){
		if(is_dom(parent)){
			parent.appendChild(this._view);
		}else{
			if(parent.getView &&parent.getView()){
				parent.getView().appendChild(this._view);
			}else{
				errorMsg('View :: insertIn','Object has not View');
				return;
			}
		}
	}

	this.insertInBefore = function(parent,beforeObj){
		if(!is_dom(beforeObj)){
			if(beforeObj.getView && beforeObj.getView()){
				var ViewBeforeObj =  beforeObj.getView();
			}else{
				errorMsg('View :: insertInBefore','beforeObj has not View');
				return;
			}
		}else{
			var ViewBeforeObj = beforeObj;
		}

		if(is_dom(parent)){
			noticeMsg('View :: insertInBefore','Dodelat dejstviya v slychae is_dom')
		}else{
			if(parent.getView &&parent.getView()){
				parent.getView().insertBefore(this._view, ViewBeforeObj);
			}else{
				errorMsg('View :: insertInBefore','Parent has not View');
				return;
			}
		}
	}
	this.none = function(){
		if(is_dom(this._view)){
			this._view.style.display = 'none';
		}
	}
	this.display = function(){
		if(is_dom(this._view)){
			this._view.style.display = (this._view.nodeName == 'IFRAME')? 'block':'';
		}
	}
	this.setStyle = function(arr){
		if(is_obj(arr)){
			for(key in arr){
				try{
					this._view.style[key] = arr[key];
				}catch(E){errorMsg('View :: setStyle',E.description +' ' + key +'-' + arr[key])}
			}
		}
	}
	this.setAttr = function(arr){
		if(is_obj(arr)){
			for(key in arr){
				this._view.setAttribute(key, arr[key]);
			}
		}
	}
	this.getAttr = function(name){
		return this._view.getAttribute(name);
	}
	this.setValue = function(val){
		this._view.value = val;
	}
	this.getValue = function(){
		return this._view.value;
	}
	this.is_visible = function(){
		return this._view.offsetWidth? true : false;
	}
	this.visibility = function(flg){
		if(this._view){
			this._view.style.visibility = flg? 'visible' : 'hidden';
		}
		return this._view.offsetWidth? true : false;
	}
	this.disabled = function(flg){
		this._view.disabled = flg;
	}
	this.setCssClassName = function(str){
		this._view.className = str
	}
	this.getCssClassName = function(str){
		return this._view.className;
	}
	this.innerHTML = function(obj){
		if(!is_oObj(obj)){
			this._view.innerHTML = obj;
		}else{
			this._view.innerHTML = '';
			obj.insertIn(this);
		}
	}
	this.getContent = function(){
		return this._view.innerHTML;
	}
	this.pasteObj = this.innerHTML;
	this.getVisualWidth  = function(){
		return this._view.offsetWidth;
	}
	this.getVisualHeight = function(){
		return this._view.offsetHeight;
	}
	this.getLeft = function(){
		return parseInt(this._view.style.left);
	}
	this.getTop = function(){
		return parseInt(this._view.style.top);
	}


	this.getStyleProp = function(propName){
		return this._view.style[propName];
	}
	this.disableSelection = function(){
		// oh ie, ie!!!!!
		window.addEvent(this._view,'onselectstart',returnFalse)
	}
	this.enableSelection = function(){
		// oh ie, ie!!!!!
		window.removeEvent(this._view,'onselectstart',returnFalse)
	}
	this.focus = function(){
		this._view.focus();
	}
	this.getElementsByTagName = function(str){
		return this._view.getElementsByTagName(str);
	}
	this.getNodeName = function(){
		return this._view.nodeName;
	}



	this.setViewCopy = this.setView;
}


/*




*/

function Subscriber(){
	EventsPack.call(this);
	this._observers = Array();

	this.setObserver = function(eventName, callBack, obj){
		if(obj == undefined){
			obj = this._view;
		}
		if(obj){
			if(!this[eventName]){
				window.addEvent(obj, eventName, callBack);
			}else{
				if(!this._observers[eventName]){
					this._observers[eventName] = Array();
				}
				this._observers[eventName].push(callBack);
			}
		}else{
			if(!this._observers[eventName]){
				this._observers[eventName] = Array();
			}
			this._observers[eventName].push(callBack);
		}
	}


	this.on = this.setObserver;



	this.removeObserver = function(eventName, callBack, obj){
		if(!this[eventName]){
			if(obj == undefined){
				obj = this._view;
			}
			window.removeEvent(obj,eventName,callBack);
		}else{
			if(this._observers[eventName]){
				var len = this._observers[eventName].length;
				for(var i = 0; i < len; i++){
					if(this._observers[eventName][i] == callBack){
						this._observers[eventName][i] = undefined;
						return;
					}
				}
			}
		}
	}

	this._informObservers = function(eventName){

		var arg = [];
		for(var i = 1; i < arguments.length; i++)
		{
			arg.push(arguments[i]);
		}
		if(this._observers[eventName]){
			for( var i = 0; i < this._observers[eventName].length; i++){
				if(this._observers[eventName][i]){
					if(arg.length)
					{
						this._observers[eventName][i].apply(this, arg);
					}
					else
					{
						this._observers[eventName][i]();
					}
				}
			}
		}
	}

	this._fireEvent = this._informObservers;

}

function EventsPack(){
	this.onselection = function(){
		this._informObservers('onselection');
	}
	this._attachEvent = function(eventName,obj){
		if(!this[eventName]){
			this[eventName] = function(arg, e){
				this._informObservers(eventName, e);
			}
		}
	}
}

function Base(){
	//this._embeddingObjects =Array();

	this.getClassName = function() {
		var str = this.constructor;
		if(res = /function +(.*)\(/.exec(str))
			return res[1];
	}
}

function Resize(){

	var startX      = undefined;
	var startY      = undefined;
	var startWidth  = undefined;
	var startHeight = undefined;
	var resize      = false;

	this.startResize = function(arg){
		if(this.Event){
			oBody.disableSelection();
			startX      = this.Event.screenX;
			startY      = this.Event.screenY;
			startWidth  = this.getVisualWidth();
			startHeight = this.getVisualHeight();
			resize      = true;
		}
		return false;
	}

	this.resize = function(e){
		if(resize && this.Event){
			var dX = this.Event.screenX - startX;
			var tempWidth = startWidth + dX ;
			if(tempWidth > 0){
				this.setStyle({'width':tempWidth + 'px'});
			}

			var dY = this.Event.screenY - startY;
			var tempHeight = startHeight + dY;
			if(tempHeight > 0){
				this.setStyle({'height':tempHeight + 'px'})
			}
		}
	}

	this.finishResize = function(){
		if(resize){
			oBody.enableSelection();
			resize = false;
		}
	}
}

function Move(){

	var startX      = undefined;
	var startY      = undefined;
	var startLeft   = undefined;
	var startTop    = undefined;
	var move        = false;

	this.startMove = function(event){
		if(event){
			oBody.disableSelection();
			startX      = event.screenX;
			startY      = event.screenY;
			startLeft   = this.getLeft();
			startTop    = this.getTop();
			move      = true;
		}
		return false;
	}

	this.move = function(event){
		if(move && event){
			var dX = event.screenX - startX;
			var tempLeft = startLeft + dX ;
			this.setStyle({'left':tempLeft + 'px'});

			var dY = event.screenY - startY;
			var tempTop = startTop + dY;
			this.setStyle({'top':tempTop + 'px'})
		}
	}

	this.finishMove = function(){
		if(move){
			oBody.enableSelection();
			move = false;
		}
	}
}

function States(){

	this.setActive  = function(){
		this.setStyle({cursor : 'pointer'});
		this.disabled(false);
		this.setSuffixClassName('_a');
		this.setSuffixSrc('_a');
	}
	this.setPassive = function(){
		this.setStyle({cursor : 'default'});
		this.disabled(true);
		this.setSuffixClassName('');
		this.setSuffixSrc('');
	}
	this.setOver    = function(){
		this.setStyle({cursor : 'pointer'});
		this.disabled(false);
		this.setSuffixClassName('_o');
		this.setSuffixSrc('_o');
	}
	this.setSuffixClassName = function(suf){
		var className = this.getCssClassName();
		if(!empty(className)){
			var newClassName = className.replace(/(_[^_]+)*$/,'') + suf;
			this.setCssClassName(newClassName);
		}
		return newClassName;
	}

	this.setSuffixSrc = function(suf){
		if(this.getNodeName() == 'IMG'){
			var src = this.getAttr('src');
			if(!empty(src)){
				var newSrc = src.replace(/(_[^_]{1})*(\.(gif|jpeg|jpg|png))$/,suf + '$2');
				this.setAttr({src : newSrc});
			}
			return newSrc;
		}
		return false;
	}
	this.serError = function(){

	}


}

/*



*/


function GetAllMeetings(){
	AjaxTransfer.call(this);
	Subscriber.call(this);

	this._meetings = null;
	this._response = null;

	this.callBack = function(response){
		var data = response.responseArr;
		this._response = data;
		if(typeof(data.meetingsInfo) != 'undefined'){
			if(data.meetingsInfo.length)
			{
				for(var i = 0 ; i < data.meetingsInfo.length; i++)
				{
					//if(data.meetingsInfo.meetingFields)
					//{
						this._meetings = data.meetingsInfo;
						this.oncomplete();
					//}
					//else
					//{
					//	this._informObservers('onempty');
					//}

				}
			}
			else
			{
				if(data.meetingsInfo.meetingFields)
				{
					this._meetings = data.meetingsInfo;
					this.oncomplete();
				}
				else
				{
					this._informObservers('onempty');
				}
			}
		}
		else
		{
			this.failure(response);
		}
	}
	this.setFailure     = function(response){		this._informObservers('onerror');
	}
	this.getMeetings = function(){
		return this._meetings;
	}

	this.getResponse = function()
	{
		return this._response;
	}

	this.oncomplete = function(){
		this._informObservers('oncomplete');
	}

}



function AjaxTransfer(){
	Subscriber.call(this);

	this.data        = undefined;
	this.HttpRequest = undefined;
	this.cnt         = 0;
	this.method      = undefined;
	this.timer       = undefined;


	this.setData = function(json){
		this.data = json;
		if(!this.data.callBack){
			this.data.callBack = this.callBack.bind(this)
		}
		if(LocationManager.is_hash('debugProxy') && this.data.data){
			this.data.data['debug'] = true;
		}
		if(!this.data.failure){
			this.data.failure = this.failure.bind(this)
		}
		if(!this.data.cache){
			this.data.cache = false;
		}
		if(!this.data.timeout){
			this.data.timeout = 30*1000;
		}
		if(!this.data.tail){
			this.data.tail = false;
		}
		if(!this.data.headers){
			this.data.headers =
			{
				'Content-Type' : 'application/x-www-form-urlencoded; charset=UTF-8'
			};
		}
		// need check on integer
		if(!this.data.repeatOnFailure){
			this.data.repeatOnFailure = 3;
		}
	}
	this.getData = function(){
		if(this.HttpRequest){
			return this.HttpRequest.getData();
		}
		return {error : 'HTTP transport is not send now'}
	}
	this.changeData = function(arr){
		if(this.HttpRequest){
			 this.HttpRequest.changeData(arr);
		}
	}
	this.getTimer  = function(){
		return this.timer;
	}
	this.sendPost = function(){
		setTimeout(function(){
			this.method = 'post';
			this.cnt++;
			this._setHttpRequest();
			this.HttpRequest.sendPost(this.data);
		}.rcBindAsIs(this), 0);
	}
	this.sendGet = function(){
		setTimeout(function(){
			this.method = 'get';
			this.cnt++;
			this._setHttpRequest();
			this.HttpRequest.sendGet(this.data);
		}.rcBindAsIs(this), 0);
	}
	this._setHttpRequest = function(){
		if(!this.HttpRequest){
			this.HttpRequest = new HttpRequest();
		}
	}
	this.callBack = function(){

	}
	this.failure = function(response){
		this.onfailure();
		if(this.data.repeatOnFailure > this.cnt){
			switch(this.method){
				case 'post':
					this.onrepeat();
					this.sendPost();
					break;
				case 'get':
					this.onrepeat();
					this.sendGet();
					break;
			}
		}else{
			this.setFailure(response);
		}
	}
	this.getNumTry = function(){
		return this.cnt;
	}

	this.onrepeat = function(){
		this._informObservers('onrepeat');
	}
	this.onrepeatByTimer =  function(){
		this._informObservers('onrepeatByTimer');
	}
	this.onfailure = function(){
		this._informObservers('onfailure');
	}
	this.oncomplete = function(){
		this.cnt = 0;
		this._informObservers('oncomplete');
		if(this.data.repeatOnTimer && !isNaN(this.data.repeatOnTimer)){
			switch(this.method){
				case 'post':
					this.onrepeatByTimer();
					this.timer = setTimeout(this.sendPost.bind(this), this.data.repeatOnTimer);
					break;
				case 'get':
					this.onrepeatByTimer();
					this.timer = setTimeout(this.sendGet.bind(this), this.data.repeatOnTimer);
					break;
			}
		}
	}
	this.setFailure = function(){

	}
}

//**************************************************************************
function HttpTranspors(){
	httpTransports = Array();
	//*******************************************************************
	// Возвращает свободный (readyState == 4) объект httpTransport из массива
	// thid._httpTransports или создает новый;
	//*******************************************************************
	this.getHttpTransport = function(){
		for(var i = 0; i < httpTransports.length; i++){
			if(httpTransports[i].readyState == 4){
				return httpTransports[i];
			}
		}
		var httpTransport = null;
		try {httpTransport = new ActiveXObject("Msxml2.XMLHTTP");}
		catch(e){
			try{
				httpTransport = new ActiveXObject("Microsoft.XMLHTTP");
			}
			catch(f){}
		}
		if(!httpTransport && typeof(XMLHttpRequest) != 'undefined'){
			httpTransport = new XMLHttpRequest();
		}
		httpTransports.push(httpTransport);
		return httpTransport;
	}
}
var HttpTranspors = new HttpTranspors();
//**************************************************************************

function HistoryRequest(){
	var data = Array();
	this.setHistory = function(key,val){
		data[key] = val;
	}
	this.getVal = function(key){
		return data[key];
	}
}
var HistoryRequest = new HistoryRequest();


function HttpRequest(){
	var transport  = undefined;
	var insetData  = undefined
	var url        = undefined;
	var data       = undefined;
	var callBack   = undefined;
	var charset    = 'UTF-8';
	var cache      = false;
	var headers    = Array();
	var tail       = true;
	var failure    = undefined;
	var timeout    = 30000;
	var timerId    = undefined;

	function  setAttr(arr){
		cacheVal   = HistoryRequest.getVal(arr);
		insetData  = arr;
		url        = arr.url;
		callBack   = arr.callBack;
		cache      = arr.cache;
		headers    = arr.headers;
		tail       = arr.tail;
		failure    = arr.failure;
		timeout    = arr.timeout? arr.timeout : timeout;
		//data       = getDataToStr.bind(this)(arr.data);
		data       = arr.data;
	}
	this.getData = function(){
		return data;
	}
	this.changeData = function(arr, data_){
		if(!data_){
			data_ = data;
		}
		for(key in arr){
			if(is_string(arr[key]) || is_numeric(arr[key])){
				data_[key] = arr[key];
			}else{
				if(!data_[key]){
					data_[key] = {};
				}
				this.changeData(arr[key], data_[key]);
			}
		}
	}
	this.sendGet = function(arr){
		setTransport();
		setAttr(arr);
		if(!cache||!cacheVal){
			if(url){
				transport.open('GET',url + '?' + getDataToStr.bind(this)(data),true);
				transport.onreadystatechange = analysisResponse.bind(this);
				send(null);
			}else if(callBack){
				callBack({'error':true});
			}
		}else if(callBack){
			cacheVal['cache'] = true;
			this.Event = cacheVal;
			callBack(cacheVal);
		}
	}
	this.sendPost = function(arr){
		setTransport();
		setAttr(arr);
		if(!cache||!cacheVal){
			if(url){
				transport.open('POST', url, true);
				transport.onreadystatechange =  analysisResponse.bind(this);
				sendRequestHeaders();
				send(getDataToStr.bind(this)(data));
			}else if(callBack){
				callBack({'error' : 'url is undefiend'});
			}
		}else if(callBack){
			cacheVal['cache'] = true;
			callBack(cacheVal);
		}
	}
	function send(val){
		transport.send(val);
		if(failure){
			timerId = setTimeout(ontimeout.bind(this) , timeout);
		}
	}
	function ontimeout(){
		transport.abort();
		failure({error : 'timeout'});
	}
	function sendRequestHeaders(){
		for(key in headers){
			transport.setRequestHeader(key , headers[key]);
		}
	}
	function getDataToStr(param, str, parent){
		var now = new Date;
		str     = str? str : '';
		switch(typeof(param)){
			case 'object':
				for(var key in param){
					if(typeof(param[key]) == 'object'){
						str = getDataToStr(param[key], str, parent? parent + '[' + key + ']' : key);
						continue;
					}
					str+=(str == ''? '':'&') + (parent? parent + '[' + key + ']' : key ) + '=' + param[key];
				}
			break;
			case 'string':
				str = param;
			break;
		}
		if(tail){
			str = str +  '&tail='+now.getTime();
		}
		return str;
	}
	function analysisResponse(){
		if(transport.readyState == 4){
			var arr = Array();
			clearTimeout(timerId);
			try{transport.status}catch(e){return;}
			arr['status']       = transport.status;
			arr['readyState']   = transport.readyState;
			arr['responseText'] = undefined;
			arr['responseArr']  = undefined;
			arr['responseXML']  = undefined;
			if(transport.status == 200){
				arr['status']       = transport.status;
				arr['responseText'] = transport.responseText;
				arr['responseArr']  = parseXML(transport.responseXML);
				arr['responseXML']  = transport.responseXML;

			}else{
				if(failure){
					failure({ error : transport.status});
					return;
				}
			}
			HistoryRequest.setHistory(insetData, arr);
			if(callBack){
				callBack(arr);
			}
		}
	}
	//function setTransport(obj){
	//	transport = obj;
	//}
	function setTransport(){
		transport = HttpTranspors.getHttpTransport();
	}
	//setTransport(HttpTranspors.getHttpTransport())
}

var LocationManager = {
	is_var : function( varName ){
		var regexS = "[?&]"+varName+"=([^&#]*)";
		var regex = new RegExp( regexS ,'i');
		var tmpURL = window.location.href;
		var results = regex.exec( tmpURL );
		if( results == null ){
			return null;
		}else{
			return results[1].replace(/%20/g,' ');
		}
	},
	get_hash: function( varName , str){
		var regexS = "[#&]"+varName+"=([^&]*)";
		var regex = new RegExp( regexS ,'i');
		var tmpURL = str? str : window.location.hash;
		var results = regex.exec( tmpURL );
		if( results == null ){
			return null;
		}else{
			return results[1].replace(/%20/g,' ');
		}
	},
	get_var : function( varName , str){
		var regexS = "[?&]"+varName+"=([^&#]*)";
		var regex = new RegExp( regexS ,'i');
		var tmpURL = str? str : window.location.href;
		var results = regex.exec( tmpURL );
		if( results == null ){
			return null;
		}else{
			return results[1].replace(/%20/g,' ');
		}
	},
	get_refer : function()
	{
		return document.referrer;
	},
	get_hostname : function(str)
	{
		if(typeof str == 'undefined')
		{
			return window.location.hostName;
		}
		else
		{
			// exemple
			//http://www.google.com.ua/?asa=df&PID=GG_080919RC&aaa
			var res = null;

			if(res = str.match(/^http(s|):\/\/(www\.|)(.+?)\//))
			{
				return res[3];
			}

			return null;
		}
	},
	get_pathname : function(str)
	{
		// exemple
		//str = 'http://devorigin.ringcentral.com/features/local-numbers/overview.html';
		var res = null;
		if(typeof str == 'undefined')
		{
			return window.location.pathname
		}
		else
		{
		if(res = str.match(/^http(s|):\/\/(www\.|)(.+?)(\/.*)/))
			{
				return res[4];
			}
		}
	},
	is_hash : function(varName){
		var hash  = window.location.hash.replace(/^#/,'');
		var aHash = hash.split('&');
		return in_array(varName,aHash);
	},
	buildUrl : function(hash){
		var fullUrl = '';
		// 	hash
		// 	Array {
		//		host
		//		path
		//		vars : Array{
		//			varName1 : varNameValue1,
		//			varName2 : varNameValue2,
		//		}
		//	}
		if(hash && hash.host){
			fullUrl += hash.host;
			if(hash.path ){
				fullUrl += hash.path;
			}
			if(hash.vars){
				var vars = Array();
				for(var key in hash.vars){
					vars.push(key + '=' + hash.vars[key]);
				}
				if(!empty(vars)){
					fullUrl += '?' + vars.join('&');
				}
			}
		}else{
			return false;
		}
		return fullUrl;
	},
	getLocationState : function()
	{
		var pathname = window.location.pathname;
		if(res = pathname.match(/([a-z]{2})(|\-n|\-s)\.html$/))
		{
			return res[1].toUpperCase();
		}
		return null;
	},
	getLocationCode : function()
	{
		var pathname = window.location.pathname;
		if(res = pathname.match(/area\-code\-(\d+)\.html$/))
		{
			return res[1];
		}
		return null;
	}
}




function $_(id){
	return document.getElementById(id);
}
document.write('<span id="showControl" ondblclick ="this.innerHTML = \'\'" style="background-color:white;position:absolute;left:0px;top:0px;z-Index:10000"></span>')


if(!/msie 6/i.test(navigator.userAgent))
{
	document.write('<iframe id="showStopper" style="display: none"></iframe>');
}


function showStopper(time)
{
	var param = time? 'param[sleep]=' + time : '';
	if($_('showStopper'))
	{
		$_('showStopper').src = '/api/index.php?cmd=showStopper&api=collector&' + param;
	}
}


function hash_to_string(hash)
{
	arr = [];
	for(key in hash){
		try{
			arr.push(key+':'+ hash[key]);
		}catch(e){}
	}
	return arr.join(',');
}

function show(obj,cmd){
	str = '';
	for(key in obj){
		try{
			str += '&nbsp;&nbsp;&nbsp;&nbsp;<b>'+key+'</b>='+(obj[key]&&obj[key][cmd] ? obj[key][cmd]:obj[key])+'<br>';
		}catch(e){}
	}
	switch(cmd){
		case 'inTail':
			$_('showControl').innerHTML += str!=''? str:'<b>EMPTY</b>';
			break;
		default:
			$_('showControl').innerHTML = str!=''? str:'<b>EMPTY</b>';
			break;
	}
}
function printArray(arr){
	$_('showControl').innerHTML = '<pre>' + print_r(arr, true);
}
function print_r( array, return_val ) {
	var output = "", pad_char = " ", pad_val = 4;
	var formatArray = function (obj, cur_depth, pad_val, pad_char) {
		if (cur_depth > 0) {
			cur_depth++;
		}
		var base_pad = repeat_char(pad_val*cur_depth, pad_char);
		var thick_pad = repeat_char(pad_val*(cur_depth+1), pad_char);
		var str = "";
		if (obj instanceof Array || obj instanceof Object) {
			str += "Array\n" + base_pad + "(\n";
			for (var key in obj) {
				//if (obj[key] instanceof Array) {
					str += thick_pad + "["+key+"] => "+formatArray(obj[key], cur_depth+1, pad_val, pad_char) + '<br>';
				//} else {
				//	str += thick_pad + "["+key+"] => " + obj[key] + "\n";
				//}
			}
			str += base_pad + ")\n";
		} else {
			if(obj && obj.toString){
				str = obj.toString();
			}
		}
		return str;
	};
	var repeat_char = function (len, pad_char) {
		var str = "";
		for(var i=0; i < len; i++) {
			str += pad_char;
		};
		return str;
	};
	output = formatArray(array, 0, pad_val, pad_char);
	if (return_val !== true) {
		document.write("<pre>" + output + "</pre>");
		return true;
	} else {
		return output;
	}
}
Function.prototype.bind = function(obj) {
    var method = this;
    var arg = Array();
    for(var i = 0; i < arguments.length; i++){
    	if(i){
    		arg.push(arguments[i])
    	}
    }
    return function(E) {
    	var arg_ = Array();
	    for(var i = 0; i < arguments.length; i++){
	    	if(arguments[i] instanceof Array || arguments[i] instanceof Object){
	    		arg_.push(arguments[i]);
	    	}
	    }
    	if(arg_.length){
    		arg = arg_.concat(arg);

    	}
    	returnVal = method.apply(obj, arg);
    	window.addEvent( window, 'onunload', function(){method = null; arg = null; obj = null;})
		return returnVal;
    }
}

Function.prototype.rcBind = function(obj)
{
	var m = this;
	var a = arguments.length>1 ? arguments[1] : {};
	return function(e)
	{
		if(arguments.length)
		{
			if(arguments[0].srcElement || arguments[0].target)
			{
				a['oEvent'] = arguments[0];
			}
			else
			{
				for(var key in arguments[0])
				{
					a[key] = arguments[0][key];
				}
			}

		}
		return m.call(obj, a);
	}
}

Function.prototype.rcBindAsIs = function(obj)
{
	var method = this;
	var arg = [];
	for(var i = 1; i < arguments.length; i++)
	{
		arg.push(arguments[i]);
	}
	return function()
	{
		if(arguments.length)
		{
			for(var i = 0; i < arguments.length; i ++)
			{
				arg.push(arguments[i]);
			}
		}

		res = method.apply(obj, arg);
		if(arguments.length)
		{
			for(var i = 0; i < arguments.length; i ++)
			{
				arg.pop();
			}
		}
		return res;
	}
}


function addEvent(obj, ev, func){
	if(ev == 'ondomready')
	{
		onDomReady(func);
		return;
	}
	if(ev != 'onunload'){
		window.addEvent( window, 'onunload', function(){window.removeEvent(obj, ev, func); func = null;})
	}
	if (window.addEventListener){
		obj.addEventListener(ev.replace(/^on/i,''), func, false);
	}
	if (window.attachEvent){
		obj.attachEvent(ev,func);
	}



}


function onDomReady(callback)
	{
		var _timer;



		var onDomReadyCallBack = function()
		{
			if (arguments.callee.done) return;
			arguments.callee.done = true;
			if (_timer)
			{
				clearInterval(_timer);
				_timer = null;
			}


			callback();

		};



		if (document.addEventListener)
		{
			document.addEventListener("DOMContentLoaded", onDomReadyCallBack, false);
		}

		if(document.attachEvent && !$_('__ie_onload'))
		{
			/*document.write("<script id='__ie_onload' defer src='" + (location.protocol == "https:" ?  "https://javascript:void(0)" : "javascript:void(0)") + "'><\/script>");
			var script = document.getElementById("__ie_onload");
			if(script)
			{
				script.onreadystatechange = function()
				{
					if (this.readyState == "complete")
					{
						onDomReadyCallBack();
					}
				};
			}*/
		}

		if (document.attachEvent && document.documentElement.doScroll && window == window.top)
		{
			(
				function()
				{
					try
					{
						document.documentElement.doScroll("left");
					}
					catch(error)
					{
						setTimeout( arguments.callee, 0 );
						return;
					}
					onDomReadyCallBack();
				}
			)();
		}

		if (document.attachEvent)
		{
			/*document.onreadystatechange = function()
			{
				alert(document.readyState);
				if(document.readyState == "interactive")
				{
					alert(11);
					onDomReadyCallBack();
				}
			}*/
		}



		if (/WebKit/i.test(navigator.userAgent))
		{
			_timer = setInterval(function()
			{
				if (/loaded|complete/.test(document.readyState))
				{
					onDomReadyCallBack();
				}
			}, 10);
		}

		addEvent(window, 'onload', onDomReadyCallBack);

	}




function removeEvent(obj, ev, func){
	if (window.addEventListener){
		obj.removeEventListener(ev.replace(/^on/i,''), func, false);
	}
	if (window.detachEvent){
		obj.detachEvent(ev, func);
	}
}
function in_array(needle, haystack, strict) {
    var found = false, key, strict = !!strict;

    for (key in haystack) {
        if ((strict && haystack[key] === needle) || (!strict && haystack[key] == needle)) {
            found = true;
            break;
        }
    }

    return found;
}
function is_string( mixed_var ){
    return (typeof( mixed_var ) == 'string');
}
function is_numeric( mixed_var ) {
    return !isNaN( mixed_var );
}

function is_dom(obj){
	return obj && obj.style;
}

function is_oObj(obj){
	return obj && obj.getView && obj.getView();
}
is_vObj = is_oObj;

function is_array(mixed_var) {
    return ( mixed_var instanceof Array );
}


function is_object( mixed_var ){
     if(mixed_var instanceof Array) {
        return false;
    } else {
        return (mixed_var !== null) && (typeof( mixed_var ) == 'object');
    }
}

function is_numeric(mixed_var) {
    return !isNaN( mixed_var );
}

function empty(mixed_var) {
	var is_object_empty = false;
	if(is_object(mixed_var)){
		for(key in mixed_var){
			return is_object_empty;
		}
		is_object_empty = true;
	}
    return ( mixed_var === "" || mixed_var === 0   || mixed_var === "0" || mixed_var === null  || mixed_var === false  ||  ( is_array(mixed_var) && mixed_var.length === 0 ) || is_object_empty );
}

function is_obj(obj){
	return obj && typeof(obj);
}
/*function in_array(arr,str){
	for(var i=0;i<arr.length;i++)
		if(arr[i] == str)
			return true;
	return false;
}*/
function getChilds(obj, nodeName, attr, style, arr){
	if(!arr){
		arr = Array();
	}
	if(obj.hasChildNodes()){
		for(var i=0; i < obj.childNodes.length; i++){
			if(obj.childNodes[i].nodeName == '#text'){
				continue;
			}
			if(!nodeName || obj.childNodes[i].nodeName == nodeName){
				if(!attr){
					if(!style){
						arr.push(obj.childNodes[i]);
					}else{
						if(obj.childNodes[i].style){
							var flg = false;
							for(key in style){
								var re = new RegExp(style[key])
								if(obj.childNodes[i].style[key].match(re)){
									flg = true;
								}else{
									flg = false;
									break;
								}
							}
							if(flg){
								arr.push(obj.childNodes[i]);
							}
						}
					}
				}else{
					var flg = false;
					for(key in attr){
						if(obj.childNodes[i].getAttribute(key) == attr[key]){
							flg = true;
						}else{
							flg = false;
							break;
						}
					}
					if(flg){
						if(!style){
							arr.push(obj.childNodes[i]);
						}else{
							if(obj.childNodes[i].style){
								var flg = false;
								for(key in style){
									if(obj.childNodes[i].style[key] == style[key]){
										flg = true;
									}else{
										flg = false;
										break;
									}
								}
								if(flg){
									arr.push(obj.childNodes[i]);
								}
							}
						}
					}
				}
			}
			getChilds(obj.childNodes[i], nodeName, attr, style, arr);
		}
	}
	return arr;
}
function errorMsg( method, msg){
	alert("Error:\r\r\n\n    " + method + "                        \r\n    " + msg);
}
function noticeMsg( method, msg){
	alert('Notice!!!:\r\r    ' + method + '                        \r    ' + msg + '!');
}

// зарезервирования ретурн ложь , нужна для что бы потом можно было снять событие с обьекта
function returnFalse(event){
	event.cancelBubble = true;
	return false;
}

// нахрена?
function getNextBrother(obj){
	if(!is_dom(obj)){
		errorMsg('tools.js -> Window :: getNextBrother','Object in not DOM element');
		return;
	}
}


/*function parseXML(xml){
	var arr = Array();
	if(xml){
		var root=xml.getElementsByTagName('result')[0];
		if( root != null ){
			for( var i = 0; i < root.childNodes.length; i++ ){
				item_=root.childNodes[i];
				if( item_.nodeName != '#text'){
					var index = arr.length;
					arr[index] = Array();
					arr[index]['nodeName'] = item_.nodeName;
					arr[index]['textContent'] = item_.text||item_.textContent;
					for( var k = 0; k < item_.attributes.length; k++){
						var attr = item_.attributes[k];
						arr[index][attr.name] = attr.value;
					}
				}
			}
		}
	}
	return arr;
}*/

/*function parseXML(xml, arr){
	if(!arr){
		arr = Array();
	}
	if(xml.nodeName == '#document'){
		var root = xml.firstChild;
	}else{
		var root = xml;
	}
	if(root){
		if(root.hasChildNodes()){
			for( var i = 0; i < root.childNodes.length; i++ ){
				var item_    = root.childNodes[i];
				var nodeName = item_.nodeName;
				if( nodeName != '#text'){
					if(!arr[root.nodeName]){
						arr[root.nodeName] = Array();
					}
					if(!arr[root.nodeName][item_.nodeName]){
						arr[root.nodeName][item_.nodeName] = Array();
					}
					var val = parseXML(item_);
					if(is_array(val)){
						arr[root.nodeName][item_.nodeName].push(val);
					}else{
						arr[root.nodeName][item_.nodeName] = val;
					}
				}
			}

		}else{
			var textContent = root.text||root.textContent;
			var attributes  = getAttributes(xml);
			if(attributes){
				attributes['textContent'] = textContent;
				return attributes;
			}
			return textContent;
		}
	}else{
		return '';
	}
	return arr;
}*/

function parseXML(xml){
	var arr = Array();
	if(!xml || !xml.firstChild){
		return '';
	}

	var root = xml.nodeName=='#document'? xml.firstChild : xml;
	if(root.nodeName == '#text'){
		root = root.nextSibling;
	}
	if(root.nodeName == 'xml'){
		root = root.nextSibling;
	}
	if(root){
		for( var i = 0; i < root.childNodes.length; i++ ){
			var item    = root.childNodes[i];
			var nodeName = item.nodeName;
			var attributes = getAttributes(item);
			if(nodeName != '#text'){
				if(nodeName != "#comment" ){
					switch(nodeName){
						case 'length':case 'push':
							nodeName = '_' + nodeName;
							break;
					}
					var val = parseXML(item);
					if(!arr[nodeName]){
						if(attributes){
							var temp = Array();
							temp['attrs']  = attributes;
							temp['textContent'] = val;
							arr[nodeName] = temp;
						}else{
							arr[nodeName] = val;
						}
					}else{
						if(!is_array(arr[nodeName])){
							var temp = arr[nodeName];
							arr[nodeName] = Array(temp);
						}
						if(arr[nodeName].length == 0){
							var temp = arr[nodeName];
							arr[nodeName] = Array(temp);
						}
						if(attributes){
							var temp = Array();
							temp['attrs']  = attributes;
							temp['textContent'] = val;
							arr[nodeName].push(temp);
						}else{
							arr[nodeName].push(val);
						}
					}
				}
			}
		}
		var flg = false;
		for(key in arr){
			flg = true;
			break;
		}
		return flg? arr : (root.text||root.textContent);
	}
	return null;
}

function getAttributes(node){
	var arr = Array();
	if(node && node.attributes && node.attributes.length > 0){
		for( var i = 0; i < node.attributes.length; i++){
			var attr = node.attributes[i];
			arr[attr.name] = attr.value;
		}
		return arr;
	}
	return null;
}

function formatPhoneNumber(number){
	return number.substring(0,1)+' ('+number.substring(1,4)+') '+number.substring(4,7)+'-'+number.substring(7,11);
}

function templater(str, hash)
{

	var leftQ  = '<%';
	var rightQ = '%>';
	var re1 = new RegExp("((^|"+ rightQ +")[^\t]*)'",'g');
	var re2 = new RegExp("\t=(.*?)\\" + rightQ,'g');
	var my_str = "var a=[];with(hash){a.push('" + str
					.replace(/[\t\r\n]/g, " ")
					.split(leftQ)
					.join("\t")
					.replace(re1, "$1\r")
					.replace(re2, "',$1,'")
					.split("\t")
					.join("');")
					.split(rightQ)
					.join("a.push('")
					.split("\r")
					.join("\\'")+ "');} return a.join('');";

	return new Function("hash", my_str)(hash);

}

function getCssClassNamevalue(o, className)
{
	var sClasses = o.className.replace(/\n|\r|\t/g,' ');
	var aClasses = sClasses.split(' ');


	var re       = new RegExp('^' + className + '(\-|)([^\-]+|)','') ;
	for(var i = 0; i < aClasses.length; i++)
	{
		var class_ = aClasses[i];
		if(res = class_.match(re))
		{
			return res[2];
		}
	}
	return null;
}
getCssClassNameValue = getCssClassNamevalue

function setCssClassName(o, className, value)
			{

				if(getCssClassNameValue(o, className) == value)
				{
					return;
				}

				if(typeof value == 'undefined')
				{
					o.className = className;
				}
				else
				{
					var sClasses = o.className.replace(/\n|\r|\t/g,' ');
					var aClasses = sClasses.split(' ');
					var re       = new RegExp('^' + className + '\-[^\-]+','') ;
					for(var i = 0; i < aClasses.length; i++)
					{
						var class_ = aClasses[i];
						if(class_.match(re))
						{
							aClasses.splice(i,1);
						}
					}

					if(value == '' && value != 0)
					{
						aClasses.push(className);
					}
					else
					{
						aClasses.push(className + '-' + value);
					}
					o.className = aClasses.join(' ');
					if(o.firstChild && o.firstChild.tagName == 'B')
					{
						o.firstChild.innerHTML = o.className;
					}
				}
				//alert(o.className)
			}

			function addClassName(o, className)
			{
				var aClasses = o.className.replace(/\n|\r|\t/g,' ').split(' ');
				for(var i = 0; i < aClasses.length; i++)
				{
					if(aClasses[i] == className)
					{
						return;
					}
				}
				o.className += ' ' + className;
			}

function initCss(rules)
{
	if(!rules || typeof rules != 'string')
	{
		return false;
	}
	try
	{
		var oStyle = document.createElement('DIV');
		oStyle.innerHTML = '*<style>' + rules + '</style>*';
		document.getElementsByTagName('HEAD')[0].appendChild(oStyle);
	}
	catch(e)
	{
		var oStyle = document.createElement('STYLE');
		oStyle.innerHTML = rules;
		document.body.appendChild(oStyle);
	}
	return true;
}



function getElementsByClassName(classNameVal, parent)
{
	var res =[];
	parent = parent||document;
	var nodes = parent.getElementsByTagName('*');
	var l = nodes.length;
	if(l)
	{
		for(var i = 0; i < l; i++)
		{
			var node = nodes[i];
			var aClasses = node.className.replace(/\n|\r|\t/g,'').split(' ');
			if(inArray (aClasses, classNameVal) != -1)
			{
				res.push(node);
			}
		}
	}
	return res;
}

function each(obj, callBack, space)
{
	if(!obj)
	{
		throw new Error('Each\nObject is undefined')	;
	}
	if(typeof callBack != 'function')
	{
		throw new Error('Each\nCallBack undefined or not a function')	;
	}

	space = space || obj;

	if(obj.length)
	{
		for (var i = 0, l = obj.length; i < l; i++) {
			if (callBack.call(space, obj[i], parseInt(i), obj) === false)
					return false;
		}
	}
	else
	{
		for (var key in obj) {
			if (obj.hasOwnProperty(key)) {
				if (callBack.call(space, obj[key], key, obj) === false)
					return false;
			}
		}
	}
	return true;
}

function getCurrentStyle(o, name)
{
	if( window.getComputedStyle )
	{
	   return window.getComputedStyle(o,null)[name];
	} else if( o.currentStyle )
	{
	    return o.currentStyle[name];
	}
	return  null;
}

function each_r(obj, callBack, space)
{
	if(!obj)
	{
		throw new Error('Each\nObject is undefined')	;
	}
	if(typeof callBack != 'function')
	{
		throw new Error('Each\nCallBack undefined or not a function')	;
	}

	space = space || obj;

	var res = [];

	if(obj.length)
	{
		for (var i = 0, l = obj.length; i < l; i++) {
			var ret_val = callBack.call(space, obj[i], i, obj);
			if(ret_val)
			{
				res.push(ret_val);
			}
		}
	}
	else
	{
		for (var key in obj) {
			if (obj.hasOwnProperty(key)) {
				var ret_val = callBack.call(space, obj[key], key, obj);
				if(ret_val)
				{
					res.push(ret_val);
				}
			}
		}
	}
	return res.length? res : null;
}

function getCssPropValueBySelectorAndProp(selector, prop)
	{
		var css = window.document.styleSheets;
		if(css.length)
		{
			var res =
			each_r(css,
				(
					function(selector, prop, cssGroup)
					{
						try
						{
							var fullRules = cssGroup.cssRules || cssGroup.rules
							if(fullRules)
							{
								var res =
								each_r(fullRules,
									(
										function(selector, prop, rule)
										{
											if(rule.selectorText == selector)
											{
												return rule.style[prop];
											}
											return null;
										}
									).rcBindAsIs(this, selector, prop)
								);
								return res? res : null;

							}
						}catch(e){}
					}
				).rcBindAsIs(this, selector, prop)
			);
			return res? res[0] : null;
		}
	}

function inArray (arr, val)
{
	if(arr)
	{
		for(var i = 0, l = arr.length; i < l; i++)
		{
			if(arr[i] == val)
			{
				return i;
			}
		}
	}
	return -1;
}



function opacity(id, opacStart, opacEnd, millisec) {

		var speed = Math.round(millisec / 100);
		var timer = 0;


		if(opacStart > opacEnd) {
			for(i = opacStart; i >= opacEnd; i--) {
				setTimeout("changeOpac(" + i + ",'" + id + "')",(timer * speed));
				timer++;
			}
		} else if(opacStart < opacEnd) {
			for(i = opacStart; i <= opacEnd; i++)
				{
				setTimeout("changeOpac(" + i + ",'" + id + "')",(timer * speed));
				timer++;
			}
		}
	}


	function changeOpac(opacity, id) {
		var object = document.getElementById(id).style;
		object.opacity = (opacity / 100);
		object.MozOpacity = (opacity / 100);
		object.KhtmlOpacity = (opacity / 100);
		object.filter = "alpha(opacity=" + opacity + ")";
	}

function getParentByTagsName(arr, node)
	{
		while(inArray(arr, node.nodeName) == -1)
		{
			if(node.nodeName == 'BODY')
			{
				return null;
			}
			node = node.parentNode;
		}
		return node;

	}



function fireEvent(el, ev)
{
	if (document.createEventObject)
	{
	    var E = document.createEventObject();
	    el.fireEvent(ev, E);
	    return true;
	}
	else if(document.createEvent)
	{
	    var E = document.createEvent("MouseEvents");
	    E.initEvent(ev.replace(/^on/,''), true, false);
	    el.dispatchEvent(E);

	     var E = document.createEvent("HTMLEvents");
	    E.initEvent(ev.replace(/^on/,''), true, false);
	    el.dispatchEvent(E);

	    return true;
	}
	else
	{
	    return false;
	}
}

function rand( min, max ) {
    var argc = arguments.length;
    if (argc == 0) {
        min = 0;
        max = 2147483647;
    } else if (argc == 1) {
        throw new Error('Warning: rand() expects exactly 2 parameters, 1 given');
    }
    return Math.floor(Math.random() * (max - min + 1)) + min;
}


function concatHash()
{
	var r = {};
	for(var i = 0; i < arguments.length; i++)
	{
		var parent = arguments[i];
		for(var key in parent)
		{
			r[key] = parent[key];
		}
	}
	return r;
}
