//var seoUserEmail = ["havoyan@sourcio.com", "khachatryan.lusine@gmail.com", "mvardany@sourcio.com", "ngaspary@sourcio.com","sdallaky@sourcio.com", "amanukya@sourcio.com", "hlputyan@sourcio.com", "aberbery@sourcio.com", "aghazary@sourcio.com", "demo@demo.com", "demo1@demo.com", "demo2@demo.com"];

var controlPanel;
var seoTree = new Framework.Modules.SEOTree();

var SEO_TYPE_POSITION = 0;
var SEO_TYPE_BACKLINKS = 1;
var SEO_TYPE_INDEXED_PAGES = 2;
var SEO_TYPE_PAGE_RANK = 3;
var SEO_TYPE_RANKING = 4;
var SEO_TYPE_SOCIAL_BOOKMARKS = 5;
var SEO_TYPE_MY_BUZZ = 6;




var windowHref = window.location.href;
var URLDomain = windowHref.substring(0,windowHref.lastIndexOf("/"));
if (!URLDomain) {URLDomain = windowHref;}
Framework.serverPath = URLDomain;
Framework.userURL = Framework.serverPath + "/user/";
Framework.contactURL =  Framework.serverPath + "/notification/";
Framework.agentURL = Framework.serverPath + "/agent/";
Framework.testURL = Framework.serverPath + "/test/";
Framework.statisticURL = Framework.serverPath + "/statistic/";
Framework.languageURL = Framework.serverPath + "/lang/";
Framework.todoURL = Framework.serverPath + "/todo/";
Framework.layoutURL = Framework.serverPath + "/layout/";
Framework.reportURL = Framework.serverPath + "/report/";
Framework.notesURL = Framework.serverPath + "/notes/";
Framework.feedbackURL = Framework.serverPath + "/feedback/";
Framework.visitorURL=Framework.serverPath+"/visitor/";
Framework.redirectPUT = Framework.serverPath+"/put/";
Framework.redirectDelete = Framework.serverPath+"/delete/";
Framework.tellfriendURL = Framework.serverPath + "/friend/";
Framework.tracerouteURL = Framework.serverPath+"/trace/";
Framework.testimonialURL = Framework.serverPath+"/testimonial/";
Framework.optionsURL = Framework.serverPath+"/options/";
Framework.sharedTabsURL = Framework.serverPath + "/dev_tmp/shared_tabs.xml";
Framework.sharedTabConfigURL = Framework.serverPath + "/dev_tmp/add_shared_tab.xml";
Framework.downloadAgentURL = Framework.serverPath + "/AgentDownloader";
Framework.seoURL = Framework.serverPath + "/seo/";
Framework.seoLinksURL = Framework.serverPath + "/seoLinks/";
Framework.seoIndexedPagesURL = Framework.serverPath + "/seoIndexedPages/";
Framework.seoPageRankURL = Framework.serverPath + "/seoPageRank/";
Framework.seoRankingURL = Framework.serverPath + "/seoServiceTest/";
Framework.seoMyBuzzURL = Framework.serverPath + "/seoMyBuzz/";

//Framework.username = "Pogos";

var agt = navigator.userAgent.toLowerCase();
var isIE = ( /msie/i.test(navigator.userAgent) &&  !/opera/i.test(navigator.userAgent) );
var is_moz  = ((agt.indexOf('mozilla')!=-1) && (agt.indexOf('spoofer')==-1)
            && (agt.indexOf('compatible') == -1) && (agt.indexOf('opera')==-1)
            && (agt.indexOf('webtv')==-1) && (agt.indexOf('hotjava')==-1));

var THEME_IMG_ROOT = "themes/default/";
var COUNTRY_CODES = null;
TABLE_VIEW="0";
LINE_VIEW="1";
BAR_VIEW="2";
CALENDAR_VIEW="3";
MAP_VIEW="4";
PIE_VIEW="5";
ANGLE_VIEW="6";
TRACE_VIEW="7";
CODE_VIEW="8";
TOP_COUNTRY_VIEW="9";
TOP_CITY_VIEW="10";
TOP_IP_VIEW="11";
TOP_OS_VIEW="12";
TOP_BROWSER_VIEW="13";
TOP_REFERER_VIEW="14";
TOP_KEYWORD_VIEW="15";
HORIZONTAL_BAR_VIEW="16";

var menuWidth = (CURRENT_LANGUAGE == "ru") ? 185 : 165;
var OPTIONS = {};

var GENERAL_SETTINGS = {
	LAYOUT_MAX_COLUMNS_COUNT : 4,
	DEFAULT_COLUMNS_COUNT : 3,
	LOAD_ONLY_CURRENT_TAB : true,
	DEFAULT_AUTOLAYOUT : [3,3],
	DEFAULT_MODULE_HEIGHT: 200,
	POOLING_ENABLED: true,
	POOL_MAX_SIZE: 50,
	POLLING_ENABLED: false,
	POLLING_INTERVAL: 100,

	AUTO_LAYOUTS: [
		[2,2],
		[3,2],
		[3,3],
		[4,3],
		[1,1],
		[1,2]
	],

	LANGUAGES: [
	 "en",
	 "ru",
	 "fr",
	 "de"
	],

	SKINS: [
		"blackberry",
		"default",
		"gray",
		"pink"
	],
	SKIN_NAMES: [
		"Blackberry",
		"Default",
		"Grey",
		"Pink"
	],

	PANELS_CONFIG: {
       west: {
			split:true,
	        initialSize: menuWidth,
	        titlebar: true,
	        collapsible: true,
	        minSize: 200,
	        maxSize: 200,
	        animate: true
	  },
	  center: {
	        autoScroll:true,
	        tabPosition: 'top',
	        closeOnTab: true,
	        alwaysShowTabs: true
	  },
	  north: {
	        split:true,
	        initialSize: 70,
	        minSize: 70,
	        maxSize: 150,
	        titlebar: true,
	        collapsible: true,
	        animate: true
	  }
	}
}



Controller = {
	DONTLOAD: false,
	LOADED: false,
	init: function()
	{
		if( this.LOADED )return;
		else this.LOADED = true;
		curWidth = document.documentElement.clientWidth;
		curHeight = document.documentElement.clientHeight;

		RequestDispatcher.init();
		PortletLoader.init();
		Controller.setLanguageVariables();

	},

	init2: function()
	{
		Layouter.init();
		PortletLoader.request_getPortlets();
		MenuManager.init();
		DialogWindow.init();
//		ShardTabsManager.init();
//		TagManager.init();
		MysManager.init();
		MessageWindow.init();

	},

	updateMaxValue:function(){
		var maxValue=-1;
		if($("staticRadio").checked==true){
			try{
				var maxValue=parseInt($("staticInput").value.trim(),10);
				if(maxValue!=null && typeof maxValue!='undefined' && !isNaN(maxValue)){
					if(maxValue>TEST_FAIL_POINT){
						maxValue=TEST_FAIL_POINT;
					}
					RequestDispatcher.sendPUT(Framework.testURL+User.userId+"/maxvalue/"+maxValue, Controller.maxValueCallback);
				}
				else{
					staticInput.value="";
					scalingErrorTd.innerHTML="Invalid input";

				}
			}
			catch(ex){}
		}
		else{
			RequestDispatcher.sendPUT(Framework.testURL+User.userId+"/maxvalue/"+maxValue, Controller.maxValueCallback);
		}
	},
	maxValueCallback:function(response){
		var resp=eval("("+response.responseText+")");
		if(resp.status==STATUS_OK){
			;
		}


	},
	changeLanguage_step1: function( lang_abrv )
	{
		MessageWindow.show( { header: Framework.Lang.message,
								  body: Framework.Lang.change_language_message,
								  okHandler: Controller.changeLanguage_step2_OK,
								  cancelHandler: Controller.changeLanguage_step2_CANCEL,
								  handlerParams: lang_abrv
		})

	},

	changeLanguage_step2_OK:function(lang_abrv)
	{
		var url = Framework.languageURL + User.userId + "/" + lang_abrv;
		RequestDispatcher.send( url, "PUT", null, Controller.changeLanguage_step3);
	},

	changeLanguage_step2_CANCEL: function( lang_abrv )
	{
		$("language_" + CURRENT_LANGUAGE).changeValue(true);
	},

	changeLanguage_step3:function( req, handlerParams )
	{
		var responseStatus = req.responseXML.firstChild.firstChild.nodeValue;
		responseStatus = parseInt( responseStatus );
		if( responseStatus )
			window.location.reload(true);
	},

	openMenuGroups: function()
	{
		var menu = $("my-dl").childNodes;
		for( var i=0; i<menu.length; i++ )
		{
			if( menu[i].tagName != "DT" )continue;
			AccordionMenu.openDtById( menu[i].id );
			if( menu[i].firstChild.className == "accordion_collapse" )
				MenuManager.expandCollapse( menu[i] );
		}
	},

	generateDialogPanel: function(){
		this.dialogPanel = new YAHOO.widget.Dialog("dlg", { visible:false, effect:[{effect:YAHOO.widget.ContainerEffect.FADE,duration:0.80},{effect:YAHOO.widget.ContainerEffect.FADE,duration:0.80}], fixedcenter:true, constraintoviewport:true, modal:false, draggable:true });
		this.dialogPanel.render();
	},
	showDialogPanel: function( event, mode, title, width, height, initParams )
	{
		var menuItem = event.target || event.srcElement;

		if( menuItem == null  )menuItem = event;

		var config = { event: event, mode: mode, title: title, menuItem: menuItem, width: width, height: height, initParams: initParams };
		switch( mode )
		{
			case "Agent":
				var url = Framework.downloadAgentURL + "?userKey=" + User.userId;
				RequestDispatcher.sendGET( url, Controller.showDialogPanel_Step2, config );
				break;
			default:
				Controller.showDialogPanel_Step2( null, config );
		}
	},

	showDialogPanel_Step2: function( req, handlerParams )
	{
		var responseParams;
		if( req )
			responseParams = eval ( "(" + req.responseText + ")" );
		var event = handlerParams.event;
		var mode  = handlerParams.mode;
		var title = handlerParams.title;
		var width = handlerParams.width;
		var height = handlerParams.height;
		var menuItem = handlerParams.menuItem;
		var initParams = handlerParams.initParams;
		


		switch( mode )
		{
			case "Agent":
				if( GENERAL_SETTINGS.REDIRECT_TO_DOWNLOAD_PAGE )
				{
					GENERAL_SETTINGS.REDIRECT_TO_DOWNLOAD_PAGE = false;
					User.hasUserAgent = true;
				}
				else
					User.hasUserAgent = responseParams.content;
				break;
		}


		MenuManager.hideAllTooltips();



		var obj = generateDialogContent( mode, initParams );
		var dialogWindowBody = $( "dialogWindowBody" );
		dialogWindowBody.innerHTML = " <img src='images/loader.gif' />  " + Framework.Lang.loading + "...";
		if(  title == null && Framework.Modules[ mode + "Widget" ] != null ) title = Framework.Modules[ mode + "Widget" ].add_title;
		else
		{
			switch( mode )
			{
				case "SubmitTestimonial": title = Framework.Lang.submitTestimonial;break;
				case "SharedTabs": title = Framework.Lang.add_shared_tab;break;
				case "Contact": title = Framework.Lang.defaultContactAdd_title;break;
				default:
					title = "&nbsp;";
			}

		}
		$("dialogWindowHead").innerHTML = (title == null)?"&nbsp;":title;

		if( obj != null )
		{
			dialogWindowBody.innerHTML = "";
			DialogWindow.showDialogFromMenu(menuItem , mode,  DialogCaller[ "Save"+mode ], obj.firstChild, width, height );
		}
	},

	hideDialogPanel: function(){
		this.dialogPanel.hide();
	},

	closeModules: function( moduleName, dataIds )
	{
		for( var i=0; i<PORTLETS.length; i++)
		{
			portlet = PORTLETS[i];
			if( portlet.moduleName != moduleName )continue;

			for( var j=0; j<dataIds.length; j++ )
			{
				if( parseInt(portlet.params[ "dataId" ]) == parseInt(dataIds[j]) )
				{
					portlet.close();
					try{
						portlet.object.destroy();
					}catch(ex){}
				}
			}
		}
	},

	tabChanged: function(evt){
		try{
			return Controller.callModulesListener("onPageDisplay");
		}catch(ex){}
	},

	callModulesListener_timer: null,

	callModulesListener: function( handler, returnValue, tabId )
	{
		var cur_time = Math.round((new Date).getTime());

		if( cur_time-this.callModulesListener_timer < 200 )return;

		var table = $("table_" + Layouter.getActiveTabId() );
		var tbody = table.getElementsByTagName("TBODY")[0];
		var tds = tbody.firstChild.childNodes;

		var count = tds.length;
		for( var i=0; i<tds.length; i++ )
		{
			if( tds[i].tagName != "TD"  )continue;
			for( var j=0; j<tds[i].childNodes.length; j++ )
				if( tds[i].childNodes[j].className == "portlet" )
				{
					var portlet = PortletLoader.getPortlet( tds[i].childNodes[j].id );
					try{
					portlet.object[handler]();
					}catch(ex){}
				}
		}
		this.callModulesListener_timer = Math.round((new Date).getTime());
		return (returnValue == null)?true:returnValue;
	},


	splitterMoved: function()
	{
		Controller.fixModuleSizes();
		Controller.callModulesListener( "onPageResize", true );
		setCookie("expandcollapse", (Layouter.dialog.getRegion('west').collapsed) ? "collapse" : "expand");
		setCookie("menuWidth", Layouter.dialog.getRegion('west').el.dom.clientWidth);

	},





	setLanguageVariables : function()
	{
		try{
			var id = [ "deletePage", "collapseAll", "expandAll", "footerLink_signIn"];
			var maxlength=0;
			for (var i = 0; i < id.length; i++)
			{
				text = Framework.Lang[id[i]];
				if (text.length > maxlength) maxlength = text.length;
			}
			var width = maxlength * 5;
			for (var i = 0; i < id.length; i++)
			{
				$(id[i]).parentNode.style.width = width + "px";
				$(id[i]).innerHTML = Framework.Lang[id[i]];
			}
		}
		catch(ex){}
	},


	pre_changeTabLayout: function(colCount, tabId, dontCallListeners )
	{
		Controller.enableLoadingScreen( true );
		setTimeout( "Controller.changeTabLayout("+colCount+", "+ tabId+ "," + dontCallListeners+")", 500 );
	},

	changeTabLayout : function( colCount, tabId, dontCallListeners )
	{

		if(  parseInt(colCount) <= 0  )
		{
			Controller.enableLoadingScreen( false );
			return;
		}

		if( tabId == null ) tabId =  Layouter.getActiveTabId();

		var table = $("table_" + tabId );

		if( table == null )
		{
			Controller.enableLoadingScreen( false );
			return;
		}

		Controller.enableLoadingScreen( true );

		var visible_tds_count = TABS_CONFIG[ tabId ]["colCount"];


		TABS_CONFIG[ tabId ]["colCount"] = colCount;
		var colCount_COPY2 = colCount;

		var wd = Math.ceil( 100 / colCount );

		var tbody = table.getElementsByTagName("TBODY")[0];

		var tds = tbody.firstChild.childNodes;
		var portlet_count = 0;
		var tdPortletCount ={};
		var tds_count = 0;


		var count = tds.length;
		for( var i=0; i<tds.length; i++ )
		{
			if( tds[i].tagName != "TD"  )continue;
			tds_count++;


			tdPortletCount[tds[i].id] = 0;
			for( var j=0; j<tds[i].childNodes.length; j++ )
				if( tds[i].childNodes[j].className == "portlet" )
				{
					portlet_count++;
					tdPortletCount[tds[i].id]++;
				}
		}



		var eachColCount = Math.floor(portlet_count/colCount);

		if(  colCount >= visible_tds_count )
		{
			var colCountCopy = colCount;

			var tds =  tbody.firstChild.childNodes;
			var count = tds.length;
			for(  var i=0; i<count; i++)
			{
				if( tds[i].tagName != "TD"  )continue;

				tds[i].className = "";

				if( colCountCopy-- >= 0 )
				{
					tds[i].width = wd + "%";
					tds[i].style.display = "";

					if( Browser.isOpera )
					{
						tds[i].style.display = "block";
					}
				}
				else
				{
					tds[i].width = "0px";
				}
			}
		}




		if( eachColCount == 0 )eachColCount = 1;


		var currentTD = $(tabId+"_body"+1);

		var c = 1;
		var new_counter = 0;

		for( var i=0; i<count; i++ )
		{
			if( tds[i].tagName != "TD")continue;
			var count2 = tds[i].childNodes.length;

			for( var j=0; j<count2; j++ )
			{
				if( currentTD == null || currentTD.width == "0%" )break;


				var portlet = tds[i].childNodes[j];
				if( portlet == null || portlet.className != "portlet" )continue;

				if( tdPortletCount[ tds[i].id ] == 0 )break;

				currentTD.appendChild(portlet);

				$(portlet.id + "_frame").style.width = "100%";

				--j;
				tdPortletCount[ tds[i].id ]--;
				new_counter++;

				if( new_counter == eachColCount &&  currentTD.id != tabId+"_body"+colCount )
				{
					currentTD = $(tabId+"_body"+(++c));
					new_counter = 0;
				}
			}

		}
		var tds =  tbody.firstChild.childNodes;
		var count = tds.length;

		for(  var i=0; i<count; i++)
		{
			if( tds[i].tagName != "TD"  )continue;

			tds[i].className = "";

			if( colCount > 0 ){
				tds[i].width = wd + "%";
				tds[i].style.display = "";
				colCount--;
			}
			else
			{
				try{
				tds[i].style.display = "none";
				tds[i].width = "0%";
				}catch(ex){   };
			}
		}



		var flag1 = false, flag2 = false;

		for(  var i=0; i<tds.length; i++)
		{
			if( tds[i].tagName != "TD"  )continue;

			if( !flag1 )
			{
				tds[i].className += " topLeftCell";
				break;
			}
		}


		for(  var i=tds.length-1; i>=0; i--)
		{
			if( tds[i].tagName != "TD" || tds[i].style.display == "none" || tds[i].width == "0%")continue;

			if( !flag2 )
			{
				tds[i].className += " topRightCell";
				break;
			}
		}

		Controller.fixModuleSizes();

		if( dontCallListeners )return;

		Controller.callModulesListener( 'onPageResize', true );
		PortletLoader.saveUserData( "column_layout", null, null, { tabId: tabId, colCount: colCount_COPY2} );

		Controller.enableLoadingScreen( false );
	},
	fixModuleSizes: function()
	{
		var tab = Layouter.getActiveTab();

		if( tab == null  )return;

		var tabId = tab.tabId;
		for( var i=0; i<PORTLETS.length; i++ )
		{
			if( PORTLETS[i].params["tabNumber"] == tabId )
			{
				if( isNaN(PORTLETS[i].params["height"]) )PORTLETS[i].params["height"] = Controller.getTabConfig(tabId).moduleHeight;
				PORTLETS[i].resizer.resizeTo( PORTLETS[i].portlet_DOMOBJ.offsetWidth, parseInt(PORTLETS[i].params["height"]) );
				PORTLETS[i].portlet_FRAME.style.width = "100%";
			}
		}

		Controller.callModulesListener( 'onPageResize', true );
	},

	enableLoadingScreen: function( displayMode )
	{
		$("main-page-loading").style.display = (displayMode)?"block":"none";
		$("loading_mask").style.display      = (displayMode)?"block":"none";
	},

	calculateLayoutHeight: function( rowCount, tabId )
	{
		if( tabId == null  )
			tabId = Layouter.getActiveTabId();
		var height = Math.max($("tab_"+ tabId).offsetHeight);
		height = Math.ceil( height / rowCount )-12;
		return height;
	},

	pre_changeTabLayout2: function(colCount, rowCount, tabId, onlyVerticaly )
	{
		Controller.enableLoadingScreen( true );
		setTimeout( "Controller.changeTabLayout2("+colCount+", "+ rowCount+ "," + tabId + ","+ onlyVerticaly +")", 500 );
	},

	changeTabLayout2: function( colCount, rowCount, tabId, onlyVerticaly )
	{
		if(  parseInt(colCount) <= 0  ){
			Controller.enableLoadingScreen( false );
			return;
		}
		if( tabId == null ) tabId =  Layouter.getActiveTabId();
		var table = $("table_" + tabId );

		if( table == null ){
			Controller.enableLoadingScreen( false );
			return;
		}

		Controller.enableLoadingScreen( true );

		if(!onlyVerticaly)Controller.changeTabLayout(colCount, tabId, true );

		TABS_CONFIG[ tabId ]["colCount"] = colCount;


		var height = Controller.calculateLayoutHeight(rowCount, tabId );

		TABS_CONFIG[ tabId ][ "moduleHeight" ] = height;


		var tbody = table.getElementsByTagName("TBODY")[0];

		var tds = tbody.firstChild.childNodes;

		var count = tds.length;
		for( var i=0; i<count; i++ )
		{
			if( tds[i].tagName != "TD") continue;
			var count2 = tds[i].childNodes.length;

			for( var j=0; j<count2; j++ )
			{
				var portlet = tds[i].childNodes[j];
				if( portlet == null || portlet.className != "portlet" )continue;

				portlet = PortletLoader.getPortlet( portlet.id );
				portlet.resizer.resizeTo( portlet.portlet_DOMOBJ.offsetWidth,TABS_CONFIG[ tabId ][ "moduleHeight" ]);
				portlet.portlet_FRAME.style.width = "100%";
				portlet.portlet_FRAME.style.position = "";
			}
		}

		TABS_CONFIG[ tabId ][ "layout" ] = [ rowCount, colCount ];

		Controller.callModulesListener( "onPageResize", true );
		PortletLoader.saveUserData( "auto_layout", null, null, { tabId: tabId, rowCount: rowCount, colCount: colCount} );

		Controller.enableLoadingScreen( false );
	},


	numberOfColsForAllTabs : null,

	pre_changeAllTabLayouts: function( colCount )
	{
		Controller.enableLoadingScreen( true );
		setTimeout( "Controller.changeAllTabLayouts("+colCount+")", 500 );
	},

	changeAllTabLayouts: function( colCount )
	{
		if ( !Controller.getTabConfig() ) {return;}
		for( var id in TABS_CONFIG )
		{
			if( typeof(TABS_CONFIG[id]) == "function" )continue;
			Controller.changeTabLayout( colCount, id );
		}
		this.numberOfColsForAllTabs = colCount;
	},
	getTabConfig: function( tabId )
	{
		if( tabId == null )tabId = Layouter.getActiveTabId();
		return TABS_CONFIG[tabId];
	}
}


var MysManager = {
	init: function(){
		MysWindow.init();
		$("mytagSelector").innerHTML = '<select id="mysTagSelector" onchange="MysManager.openTagInfo(this.value,false)" style="width:130px">'+
						'<option value="Reports">'+Framework.Lang.Menu.AddReport+'</option>'+
						'<option value="VTReports">'+Framework.Lang.Menu.AddVTReport+'</option>'+
						'</select>';

		changeFormStyle($("mytagSelector"), false, true, false, false,false,false);
	},
	openTagInfo: function(mode,destroyPopup, param)
	{
		if(destroyPopup && Browser.isFirefox) MysWindow.init();
		$( "mytagInfoLoading" ).innerHTML = "<img src='images/loader.gif' />" + Framework.Lang.loading;
		$("mytagInfo").innerHTML = "";
		MysManager.mode = mode;
		MysManager.checkAllCheckBox = 0;
		MysWindow.showDialog($(mode));
		$("mytagInfoTitle").innerHTML = Framework.Lang["mys"+mode];
		var myTagSelector = $("mytagSelector");
		myTagSelector.style.display = "none";
		var url = "";

		var mysTagSelector = $("mysTagSelector", true);

		switch(mode){
			case "SEO":
						url = Framework.seoURL + User.userId + "/allTests?type=" + SEO_TYPE_POSITION;
						break;
			case "SEOBacklinks":
						url = Framework.seoRankingURL + User.userId + "/allTests?type=" + SEO_TYPE_BACKLINKS;
						break;
			case "SEOIndexedPages":
						url = Framework.seoRankingURL + User.userId + "/allTests?type=" + SEO_TYPE_INDEXED_PAGES;
						break;
			case "SEOPageRank":
						url = Framework.seoPageRankURL + User.userId + "/allTests?type=" + SEO_TYPE_PAGE_RANK;
						break;
			case "SEORanking":
						url = Framework.seoRankingURL + User.userId + "/allTests?type=" + SEO_TYPE_RANKING;
						break;
			case "SEOSocialBookmarks":
						url = Framework.seoRankingURL + User.userId + "/allTests?type=" + SEO_TYPE_SOCIAL_BOOKMARKS;
						break;
			case "SEOMyBuzz":
						url = Framework.seoMyBuzzURL + User.userId + "/allTests";
						break;

			}
		MysManager.mysURL = url;
		//MysManager.prepareCall = true;
		MysManager.request_getTagInfo( MysManager.mysURL );
	},

	mysURL: null,
	//prepareCall: false,

	request_getTagInfo: function( url )
	{
		RequestDispatcher.connectGET( url, null , MysManager.process_getTagInfo );
	},

	CURRENT_TAG_TITLE: null,
	process_getTagInfo: function( req, handlerParams){
	   var items;
	   try{
	   	items = eval( "(" + req.responseText + ")" ).data;
		if( items == null  )return;
		}catch(ex){return;}
		
		MysManager.items = MysManager.getJsonData(items);
	
		MysManager.drawTable();

	},
	getJsonData:function(dataArray){
		
		
		
		var arr = new Array();
		for(var i=0;i<dataArray.length; i++){
			var cont = new Object();
			cont.id = dataArray[i][0];
			cont.active = 0;
			switch(MysManager.mode){
				case "SEO":{
					cont.name = dataArray[i][1];
					cont.testUrl = dataArray[i][2].join(', ');
					cont.searchEngine = dataArray[i][3].join(', ');
					cont.keyword = dataArray[i][4].join(', ');
					break;
				}
				case "SEOBacklinks":
				case "SEOIndexedPages":
				case "SEOPageRank":
				case "SEORanking":
				case "SEOSocialBookmarks":
				{
					cont.name = dataArray[i][1];
					cont.testUrl = dataArray[i][2].join(', ');
					cont.searchEngine = dataArray[i][3].join(', ');
					break;
				}		
				case "SEOMyBuzz":
				{
					cont.name = dataArray[i][1];
					cont.keyword = dataArray[i][2].join(', ');
					break;
				}
				default:{
					cont.name = dataArray[i][1];
					cont.interval = dataArray[i][2];
					cont.testname = dataArray[i][3];
					break;
				}
			}
			
			arr[arr.length] = cont;
		}
		return arr;
	},
	checkAllCheckBox:0,
	drawTable:function(){
		if(MysManager.items != undefined || MysManager.items != null){
			
			var el = $( "mytagInfo" );
			el.style.width = "98%";
			$( "mytagInfoLoading" ).innerHTML = "<img src='images/loader.gif' />" + Framework.Lang.loading;
			
			var wd,headers,config,data_;
			
		
			switch(MysManager.mode){
				case "SEO":{
					wd = (el.offsetWidth-30)/4;
					headers = [{ dataField: "active", headerRenderer: "checkbox",  width: "20", type:"input" , onClick : "MysManager.checkAllRows",sortable: false, active: MysManager.checkAllCheckBox},//
						 { dataField: "name",   headerText: "Name" ,width: wd ,sortable: true,align:'left' },
						 { dataField: "testUrl",    headerText: "URL", width: wd,sortable: true, align:'left'},
						 { dataField: "searchEngine",    headerText: "Search Engine", width: wd,sortable: true, align:'left' },
						 { dataField: "keyword",    headerText: "Keyword", width: wd,sortable: true, align:'left' }
					 ];
				 
					config = toFlexJSONArrayString(headers);	
					data_ = "[";
					var dataItem;
							
					for( var i=0; i<MysManager.items.length; i++ ) {		
						dataItem = "";
						dataItem += '{';
						dataItem += '"cellOnclick": "'  + "MysManager.checkUncheckRow:"  + i + '",';
						dataItem += '"checkboxOnclick": "'  + "MysManager.checkUncheckRow:"  + i + '",';
						dataItem += '"active": "'    + MysManager.items[i].active + '",';
						dataItem += '"searchEngine": "'  + MysManager.items[i].searchEngine + '",';
						dataItem += '"testUrl": "'  + MysManager.items[i].testUrl + '",';
						dataItem += '"keyword": "'  + MysManager.items[i].keyword + '",';
						dataItem += '"name": "'    + MysManager.items[i].name + '"';
						dataItem += '},';
						data_ += dataItem;
					}
					data_ = data_.substr(0, data_.length-1);
					data_ += "]";
					break;
				}
				case "SEOBacklinks":
				case "SEOIndexedPages":
				case "SEOPageRank":
				case "SEORanking":
				case "SEOSocialBookmarks":
				{
					
					wd = (el.offsetWidth-30)/4;
					headers = [{ dataField: "active", headerRenderer: "checkbox",  width: "20", type:"input" , onClick : "MysManager.checkAllRows",sortable: false, active: MysManager.checkAllCheckBox},//
						 { dataField: "name",   headerText: "Name" ,width: wd ,sortable: true,align:'left' },
						 { dataField: "testUrl",    headerText: "URL", width: wd,sortable: true, align:'left'},
						 { dataField: "searchEngine",    headerText: "Search Engine", width: wd,sortable: true, align:'left' }
					 ];
				 
					config = toFlexJSONArrayString(headers);	
					data_ = "[";
					var dataItem;
							
					for( var i=0; i<MysManager.items.length; i++ ) {		
						dataItem = "";
						dataItem += '{';
						dataItem += '"cellOnclick": "'  + "MysManager.checkUncheckRow:"  + i + '",';
						dataItem += '"checkboxOnclick": "'  + "MysManager.checkUncheckRow:"  + i + '",';
						dataItem += '"active": "'    + MysManager.items[i].active + '",';
						dataItem += '"searchEngine": "'  + MysManager.items[i].searchEngine + '",';
						dataItem += '"testUrl": "'  + MysManager.items[i].testUrl + '",';
						dataItem += '"name": "'    + MysManager.items[i].name + '"';
						dataItem += '},';
						data_ += dataItem;
					}
					data_ = data_.substr(0, data_.length-1);
					data_ += "]";
					
					break;
				}	
				case "SEOMyBuzz":
				{
					wd = (el.offsetWidth-30)/4;
					headers = [{ dataField: "active", headerRenderer: "checkbox",  width: "20", type:"input" , onClick : "MysManager.checkAllRows",sortable: false, active: MysManager.checkAllCheckBox},//
						 { dataField: "name",   headerText: "Name" ,width: wd ,sortable: true,align:'left' },
						 { dataField: "keyword",    headerText: "Keyword", width: wd,sortable: true, align:'left' }
					 ];
				 
					config = toFlexJSONArrayString(headers);	
					data_ = "[";
					var dataItem;
							
					for( var i=0; i<MysManager.items.length; i++ ) {		
						dataItem = "";
						dataItem += '{';
						dataItem += '"cellOnclick": "'  + "MysManager.checkUncheckRow:"  + i + '",';
						dataItem += '"checkboxOnclick": "'  + "MysManager.checkUncheckRow:"  + i + '",';
						dataItem += '"active": "'    + MysManager.items[i].active + '",';
						dataItem += '"keyword": "'  + MysManager.items[i].keyword + '",';
						dataItem += '"name": "'    + MysManager.items[i].name + '"';
						dataItem += '},';
						data_ += dataItem;
					}
					data_ = data_.substr(0, data_.length-1);
					data_ += "]";
					
					break;
				}
					/*
					myDataModel = new Ext.data.Store({
				        proxy: new Ext.data.MemoryProxy(items),
				        reader: new Ext.data.ArrayReader({id: 0}, [
								{name: 'checkbox'},
								{name: 'name'},
								{name: 'keyword'}
							])
			        });
			        myDataModel.load();
					mysColModel = new Ext.grid.ColumnModel([
						{header: "<input id='my_main_check' type='checkbox' onchange='MysManager.selectAll( event )' />", width:10, dataIndex:'checkbox', sortable: false},
						{header: "Name", dataIndex:'name', sortable: true},					
						{header: "Keyword(s)", dataIndex:'keyword', sortable: true}
					]);
	
					break;
				}*/							
				default:{//Report, TransactionReport
						wd = (el.offsetWidth-30)/3;
						headers = [{ dataField: "active", headerRenderer: "checkbox",  width: "20", type:"input" , onClick : "MysManager.checkAllRows",sortable: false, active: MysManager.checkAllCheckBox},//
							 { dataField: "name",   headerText: Framework.Lang.Name ,width: wd ,sortable: true,align:'left' },
							 { dataField: "interval",    headerText: Framework.Lang.AddReport_interval, width: wd,sortable: true, align:'left'},
							 { dataField: "testname",    headerText: Framework.Lang.AddReport_tagTestName , width: wd,sortable: true, align:'left' }
						 ];
					 
						config = toFlexJSONArrayString(headers);	
						data_ = "[";
						var dataItem;
								
						for( var i=0; i<MysManager.items.length; i++ ) {
								
							dataItem = "";
							dataItem += '{';
							dataItem += '"cellOnclick": "'  + "MysManager.checkUncheckRow:"  + i + '",';
							dataItem += '"checkboxOnclick": "'  + "MysManager.checkUncheckRow:"  + i + '",';
							dataItem += '"active": "'    + MysManager.items[i].active + '",';
							dataItem += '"name": "'  + MysManager.items[i].name + '",';
							dataItem += '"interval": "'  + MysManager.items[i].interval + '",';
							dataItem += '"testname": "'    + MysManager.items[i].testname + '"';
							dataItem += '},';
							data_ += dataItem;
						}
						data_ = data_.substr(0, data_.length-1);
						data_ += "]";
					
						break;
					
				}
				
	
			}
		
			el.style.height =  parseInt($("mysWindowBody").style.height)-$("mytagSelector").offsetHeight - 30+"px";
			el.innerHTML = getGridFlashNode( "datagrid_MysWindow", data_ , config );
			MysManager.timeInterval = setInterval("MysManager.removeLoading()", 400);
			if(Browser.isMacFirefox) $("mysWindowBody").style.overflow = "visible";
		}
		
	},
	timeInterval:null,
	items:null,
/*
	process_getTagInfo: function( req, handlerParams){
	   var items;
	   try{
	   	items = eval( "(" + req.responseText + ")" ).data;
		if( items == null  )return;
		}catch(ex){return;}



		var wd = el.offsetWidth /3;

		switch(MysManager.mode){
			case "SEO":{
				myDataModel = new Ext.data.Store({
			        proxy: new Ext.data.MemoryProxy(items),
			        reader: new Ext.data.ArrayReader({id: 0}, [
			               {name: 'checkbox'},
	                       {name: 'name'},
						   {name: 'testUrl'},
						   {name: 'searchEngine'},
						   {name: 'keyword'}
			    	    ])
		        });
		        myDataModel.load();
				mysColModel = new Ext.grid.ColumnModel([
					{header: "<input id='my_main_check' type='checkbox' onchange='MysManager.selectAll( event )' />", width:10, dataIndex:'checkbox', sortable: false},
					{header: "Name", dataIndex:'name',   sortable: true},
					{header: "URL", dataIndex:'testUrl',   sortable: true},
					{header: "Search Engine", dataIndex:'searchEngine',    sortable: true},
					{header: "Keyword", dataIndex:'keyword',    sortable: true}
				]);

				break;
			}
			
			case "SEOBacklinks":
			case "SEOIndexedPages":
			case "SEOPageRank":
			case "SEORanking":
			case "SEOSocialBookmarks":
			{
				myDataModel = new Ext.data.Store({
			        proxy: new Ext.data.MemoryProxy(items),
			        reader: new Ext.data.ArrayReader({id: 0}, [
			               {name: 'checkbox'},
	                       {name: 'name'},
						   {name: 'testUrl'},
						   {name: 'searchEngine'},						   
			    	    ])
		        });
		        myDataModel.load();
				mysColModel = new Ext.grid.ColumnModel([
					{header: "<input id='my_main_check' type='checkbox' onchange='MysManager.selectAll( event )' />", width:10, dataIndex:'checkbox', sortable: false},
					{header: "Name", dataIndex:'name', sortable: true},
					{header: "URL", dataIndex:'testUrl', sortable: true},
					{header: "Search Engine", dataIndex:'searchEngine', sortable: true}
				]);

				break;
			}
			case "SEOMyBuzz":
			{
				myDataModel = new Ext.data.Store({
			        proxy: new Ext.data.MemoryProxy(items),
			        reader: new Ext.data.ArrayReader({id: 0}, [
							{name: 'checkbox'},
							{name: 'name'},
							{name: 'keyword'}
						])
		        });
		        myDataModel.load();
				mysColModel = new Ext.grid.ColumnModel([
					{header: "<input id='my_main_check' type='checkbox' onchange='MysManager.selectAll( event )' />", width:10, dataIndex:'checkbox', sortable: false},
					{header: "Name", dataIndex:'name', sortable: true},					
					{header: "Keyword(s)", dataIndex:'keyword', sortable: true}
				]);

				break;
			}								
			default:
			myDataModel = new Ext.data.Store({
			        proxy: new Ext.data.MemoryProxy(items),
			        reader: new Ext.data.ArrayReader({id: 0}, [
			               {name: 'checkbox'},
	                       {name: 'url'},
						   {name: 'name'}
			    	    ])
		        });
		    myDataModel.load();
			mysColModel = new Ext.grid.ColumnModel([

			{header: "<input id='my_main_check' type='checkbox' onchange='MysManager.selectAll( event )' />", width:10, dataIndex:'checkbox',  sortable: false},
			{header: Framework.Lang.AddTest_url, dataIndex:'url',    sortable: true},
			{header: Framework.Lang.Name,dataIndex:'name',      sortable: true}
		]);


		}

		el.innerHTML ='<div style="overflow: hidden; width: 100%;height:100%"></div>';
		var  grid = new Ext.grid.Grid(el.firstChild,{ ds: myDataModel, cm:mysColModel});
		grid.addListener("cellclick", MysManager.checkUncheckRow );
		try{
		grid.enableColumnMove = false;
		grid.enableDragDrop   = false;
        grid.render();
		grid.dataSource.addListener("datachanged", MysManager.callChangeFormStyle, this, true);
		}catch(ex){}

        el.mysGrid = grid;

		MysManager.fixDataColModel();

		if(items.length == 0)
			changeFormStyle($("mytagInfo"), false, false, false, true);
		else{
			MysManager.items = items;
			MysManager.timeInterval = setInterval("MysManager.changeStyle()", 1000);
		}
	},
	timeInterval:null,
	items:null,
	changeStyle:function(){
		contentTable = $("mytagInfo").getElementsByTagName("TABLE")[1];
		if(contentTable.firstChild.childNodes.length > 0){
			clearInterval(MysManager.timeInterval);
			changeFormStyle($("mytagInfo"), false, false, false, true);
		}

	},
	callChangeFormStyle: function()
	{
		changeFormStyle($("mytagInfo"), false, false, false, true);
	},

	bool_: true,

	requestGetData: function()
	{
		if( MysManager.prepareCall )
		{
			MysManager.request_getTagInfo( MysManager.mysURL );
			MysManager.prepareCall = false;
			return;
		}
	},

	fixDataColModel: function()
	{
		var el = $("mytagInfo");
		el.style.height =parseInt($("mysWindowBody").style.height)-$("mytagSelector").offsetHeight-5+"px";
		mysColModel = el.mysGrid.getColumnModel();
		var wd = (el.offsetWidth - 60)/(mysColModel.getColumnCount()-1);
		for(var i=1; i<mysColModel.getColumnCount(); i++)
			mysColModel.setColumnWidth(i, wd);
		if(MysManager.bool_) {
			mysColModel.setColumnWidth(0, 30);
			MysManager.bool_ = false;
		} else {
			mysColModel.setColumnWidth(0, 29);
			MysManager.bool_ = true;
		}
		el.mysGrid.autoSize();
	},
	checkUncheckRow: function( grid, rowNumber, colNumber, event )
	{
		var obj = event.target || event.srcElement || event.getTarget();
		if (obj.nodeName != "IMG"){
			var row = grid.getView().getRow( rowNumber );
			var check = row.getElementsByTagName("input")[0];
			check.changeValue(!check.checked);
		}

	},

	selectAll: function( event )
	{
		var maincheck = $("my_main_check");
		var mysGrid = $("mytagInfo").mysGrid;

		for( var i = 0; i < mysGrid.getView().ds.totalLength; i++)
		{
			check = mysGrid.getView().getRow(i).getElementsByTagName("input")[0];
			check.changeValue(maincheck.checked);

		}
	},
	*/
	removeLoading:function(){
		clearInterval(MysManager.timeInterval);
		$( "mytagInfoLoading" ).innerHTML = "";
		$( "mytagInfoLoading" ).style.height = "0px";
		
	},
	checkUncheckRow: function( index , checked)
	{
		if(MysManager.items[index].active == 1) MysManager.items[index].active = 0;
	 	else MysManager.items[index].active = 1;
		MysManager.drawTable();
	},
	checkAllRows: function(checked)
	{
		
		for(var i =0; i < MysManager.items.length; i++){
			MysManager.items[i].active = checked;
		}
		MysManager.checkAllCheckBox = checked;
		MysManager.drawTable();
	},
	getDataIndexById:function(idd){
		var index = null;
		for(var i = 0; i < MysManager.items.length;i++){
			if(MysManager.items[i].id == idd){index = i;break;}
		}
		return index;
	},
	myActioner: function( actionMode )
	{
		var actionMode = actionMode.scope;
		var checkedConfig = [];

		for( var i=0; i<MysManager.items.length; i++){
			if( MysManager.items[i].active  == 0 )continue;
			checkedConfig[checkedConfig.length] = MysManager.items[i];
		}

		var url;
		var moduleName;
		switch(MysManager.mode){
			case "SEO":
							url = Framework.seoURL + User.userId;
					   		moduleName="SEO";
							break;
			case "SEOBacklinks":
							url = Framework.seoRankingURL + User.userId;
					   		moduleName="SEOBacklinks";
							break;
			case "SEOIndexedPages":
							url = Framework.seoRankingURL + User.userId;
					   		moduleName="SEOIndexedPages";
							break;
			case "SEOPageRank":
							url = Framework.seoPageRankURL + User.userId;
					   		moduleName="SEOPageRank";
							break;
			case "SEORanking":
							url = Framework.seoRankingURL + User.userId;
					   		moduleName="SEORanking";
							break;
			case "SEOSocialBookmarks":
							url = Framework.seoRankingURL + User.userId;
					   		moduleName="SEOSocialBookmarks";
							break;
			case "SEOMyBuzz":
							url = Framework.seoMyBuzzURL + User.userId;
					   		moduleName="SEOMyBuzz";
							break;

		}
		switch(actionMode){
			case "remove":
			{

				var dataIds = [];
				for(var j = 0; j< checkedConfig.length; j++   )
				{
					var ind = MysManager.getDataIndexById(checkedConfig[j].id);
					MysManager.items.splice(ind,1);
					url += "/" + checkedConfig[j].id;
					dataIds.push( checkedConfig[j].id );
				}
				MysManager.drawTable();
				if(dataIds.length)MysManager.request_removeItem( url, {dataIds:dataIds,moduleName:moduleName} );
			
				break;
			}
			case "add":
			{
				for( var j = 0; j< checkedConfig.length; j++ ){
					PortletLoader.addPortletFromTree( { moduleName: moduleName, dataId: checkedConfig[j].id } );
				}
				break;
			}
		}
	},
	request_removeItem: function( url, params )
	{
		RequestDispatcher.send( url, "DELETE", null, MysManager.process_removeItem, params);
	},

	process_removeItem:function(req ,params )
	{
		var response = eval( "(" + req.responseText + ")" );

		if( response.status == "ok" )
		{
			var dataIds = params.dataIds;
			var moduleName = params.moduleName;
			Controller.closeModules( moduleName, dataIds );

		}
		PortletLoader.refresh_dependent_modules(moduleName);
	}
};

var TagManager = {

	TAG_ALL : "myTests",
	mode:null,
	init: function(){
		CloudWindow.init();
		TagManager.request_getTags();
	},

	refresh: function(){
		var cloudBody = $( "cloudBody" );
		var tagSelectorSPAN = $("'tagSelectorSPAN'");
		cloudBody.innerHTML = "<img src='images/loader.gif' />" + Framework.Lang.loading;
		TagManager.request_getTags();
	},

	request_getTags: function(){
		RequestDispatcher.connectGET( Framework.testURL + User.userId + "/tags", null , TagManager.process_getTags , null );
	},

	process_getTags: function(req, handlerParams){

		var result = eval("(" + req.responseText + ")" );

		var tagSelectorSPAN = $("tagSelectorSPAN");

		TagManager.CLOUD_MINCOUNT  = 100000;
		TagManager.CLOUD_MAXCOUNT  = 1;

		var counter = 0;

		var inner = "";

		TagManager.TAG_CLOUDS = result;

		for( var i=0; i<result.length; i++ )
		{
			var tag = result[i];
			var title = tag.title
			var rank  = parseInt(tag.rank);
			counter += rank;

			TagManager.CLOUD_MINCOUNT = (TagManager.CLOUD_MINCOUNT > rank)?rank:TagManager.CLOUD_MINCOUNT;
			inner += "<option value='" + title + "'>" + title.makeNBSP() + "</option>";
		}
		inner = "<select id='tagSelectorSELECT' onchange='TagManager.getSelectedTagInfo( event )'>" + "<option rank='"+counter+"' value='"+TagManager.TAG_ALL+"'>" + Framework.Lang.Cloud_all + "</option>" + inner + "</select>";
		tagSelectorSPAN.innerHTML = inner;

		TagManager.CLOUD_MAXCOUNT = counter;


		for( var i=0; i<TagManager.TAG_CLOUDS.length-1; i++ )
			for( var j=0; j<TagManager.TAG_CLOUDS.length-1-i; j++ )
			{
			    if( TagManager.TAG_CLOUDS[j+1].title < TagManager.TAG_CLOUDS[j].title  )
			    {
			      tmp = TagManager.TAG_CLOUDS[j];
			      TagManager.TAG_CLOUDS[j] = TagManager.TAG_CLOUDS[j+1];
			      TagManager.TAG_CLOUDS[j+1] = tmp;
			    }
			}
		TagManager.TAG_CLOUDS[ TagManager.TAG_CLOUDS.length ] = { "title": Framework.Lang.Cloud_all, "rank": counter};

		var cloudBody = $( "cloudBody" )
		cloudBody.innerHTML = "";

		for(  var i=TagManager.TAG_CLOUDS.length-1; i>=0 ; i--)
		{
			TagManager.addToCloud(  TagManager.TAG_CLOUDS[i].title , TagManager.TAG_CLOUDS[i].rank - 1 );
		}
		changeFormStyle($("tagSelectorSPAN"), false, true, false, false,false,false);
	},

	TAG_CLOUDS: [],
	CLOUD_MAXSIZE: 17,
	CLOUD_MINSIZE: 11,
	CLOUD_MAXCOUNT: null,
	CLOUD_MINCOUNT: null,

	addToCloud: function ( title, rank )
	{
		var font_size = (TagManager.CLOUD_MAXSIZE - TagManager.CLOUD_MINSIZE) * (rank/TagManager.CLOUD_MAXCOUNT)+ TagManager.CLOUD_MINSIZE;
		rank = rank +1;

		var attrTitle = title;
		if( title == Framework.Lang.Cloud_all )
			attrTitle = TagManager.TAG_ALL;

		title = title.makeNBSP();
		var node = "<span style='font-size:"+ font_size +"px' > <a href='javascript:void("+ rank +")' title_='"+attrTitle+"' onclick='TagManager.openTagInfo(event)'>"+ title +"</a></span>";
		$( "cloudBody" ).innerHTML += node;
	},

	TAG_GRIDS: {},

	getSelectedTagInfo: function()
	{
		var sel = $("tagSelectorSELECT", true);
		var optionValue = sel.getValue();
		TagManager.openTagInfo(null, optionValue );
	},
	openTagInfo: function( event , title, rank )
	{
		$("tagInfo").innerHTML = "<img src='images/loader.gif' />" + Framework.Lang.loading;
		if( event != null )
		{
			var tagItem = event.target || event.srcElement;
			CloudWindow.showDialog( $("cloudBody") );
		 	title = tagItem.getAttribute( "title_" );
			TagManager.SELECTED_TAG = tagItem;
			var tagSelectorSELECT = $("tagSelectorSELECT", true);
			tagSelectorSELECT.setValue( title );
		}

		TagManager.CURRENT_TAG_TITLE = title;


		var url = "";
		if( title == TagManager.TAG_ALL )
			url = Framework.testURL + User.userId + "/my/0/1/" + TagManager.TAG_ALL;
		else
			url = Framework.testURL + User.userId + "/my/0/1/"+encode(title);

		if( event != null )
		{
			TagManager.tagURL = url;
			TagManager.prepareCall = true;
		}
		else
		{
			TagManager.request_getTagInfo( url );
		}
	},

	tagURL: null,
	prepareCall: false,

	request_getTagInfo: function( url )
	{
		RequestDispatcher.connectGET( url, null , TagManager.process_getTagInfo );
	},

	CURRENT_TAG_TITLE: null,
	process_getTagInfo: function( req, handlerParams){
	   var tests;
	   try{
	   	tests = eval( "(" + req.responseText + ")" );
		}catch(ex){return;}

	   for (i = 0; i < tests.length; i++) {
	   	if( tests[i] == null )continue;
		tests[i][0] = "<input type='checkbox' testId="+ tests[i][0] +" />";
	   	tests[i][4] = "<img src='images/state-" + tests[i][4] + ".gif' status='"+ tests[i][4] +"'/>";
	   }



    tests_list_data_model = new Ext.data.Store({
		        proxy: new Ext.data.MemoryProxy(tests),
		        reader: new Ext.data.ArrayReader({id: 0}, [
		               {name: 'checkbox'},
                       {name: 'name'},
					   {name: 'url'},
					   {name: 'type'},
                       {name: 'status'},
					   {name: 'user_count'}
		        ])
        });
        tests_list_data_model.load();

        var colModel = new Ext.grid.ColumnModel([
				{header: "<input id='cloud_main_check' type='checkbox' onchange='TagManager.selectAllTests( event )' />",		  width:10,sortable: false, dataIndex: 'checkbox'},
				{header: Framework.Lang.Name, sortable: true, dataIndex: 'name', align:'left'},
				{header: Framework.Lang.URL,  sortable: true, dataIndex: 'url', align:'left'},
				{header: Framework.Lang.Type,  sortable: true, dataIndex: 'type', align:'left'},
				{header: Framework.Lang.Cloud_test_status, sortable: true, dataIndex: 'status', align: 'center'},
				{header: Framework.Lang.Cloud_test_users_count,   sortable: true, dataIndex: 'user_count', type: "float"}
		]);


		if (isIE) $("tagSelector").style.width = "99%";
		var el = $("tagInfo");
		$("tagInfo").style.height =  parseInt($("cloudWindowBody").style.height)-$("tagSelector").offsetHeight+"px";
		$("cloudWindowBody").setAttribute("style", "");

		el.innerHTML ='<div style="width: 100%; height: 100%"></div>';
     testsGrid = new Ext.grid.Grid(el.firstChild, {
            ds: tests_list_data_model,
            cm: colModel
        });
		testsGrid.getSelectionModel().singleSelect = true;
		testsGrid.addListener("cellclick", TagManager.checkUncheckRow );

		testsGrid.enableColumnMove = false;
		testsGrid.enableDragDrop   = false;

		testsGrid.render();
		testsGrid.dataSource.addListener("datachanged", TagManager.callChangeFormStyle, this, true);

		TagManager.TAG_GRIDS[TagManager.CURRENT_TAG_TITLE] = testsGrid;
        el.statisticsGrid = TagManager.TAG_GRIDS[TagManager.CURRENT_TAG_TITLE];

		TagManager.fixDataColModel();


		if(tests.length == 0)
			changeFormStyle($("tagInfo"), false, false, false, true, false);
		else{
			TagManager.tests = tests;
			TagManager.timeInterval = setInterval("TagManager.changeStyle()", 1000);
		}
	},
	timeInterval:null,
	tests:null,
	changeStyle:function(){
		contentTable = $("tagInfo").getElementsByTagName("TABLE")[1];
		if(contentTable.firstChild && contentTable.firstChild.childNodes.length > 0){
			clearInterval(TagManager.timeInterval);
			changeFormStyle($("tagInfo"), false, false, false, true, false);
		}
	},
	callChangeFormStyle: function()
	{
		changeFormStyle($("tagInfo"), false, false, false, true);
	},

	checkUncheckRow: function( grid, rowNumber, colNumber, event )
	{
		var obj = event.target || event.srcElement || event.getTarget();
		if (obj.nodeName != "IMG"){
			var row = grid.getView().getRow( rowNumber );
			var check = row.getElementsByTagName("input")[0];
			check.changeValue(!check.checked);
		}

	},

	selectAllTests: function( event )
	{
		var maincheck = $("cloud_main_check");
		var check = null;
		var checkboxes = $("tagInfo").getElementsByTagName("input");

		for( var i=0; i< checkboxes.length; i++ )
		{
			var check = checkboxes[i];
			if( check.type.toLowerCase() != 'checkbox' )continue;
			check.changeValue(maincheck.checked);
		}
	},
	cloudTestActioner: function( actionMode )
	{
		var actionMode = actionMode.scope;
		var statisticsGrid = $("tagInfo").statisticsGrid;

		var checkedTestsConfig = [];

		var itemsCount = statisticsGrid.getView().ds.data.items.length;
		for( var i=0; i<itemsCount; i++)
		{
			var row = statisticsGrid.getView().getRow(i);

			if( row == null )return;

			var check  = row.childNodes[0].getElementsByTagName("INPUT")[0];

			if( !check.checked )continue;

			var title  = row.childNodes[1].firstChild.firstChild.innerHTML;
			var url    = row.childNodes[2].firstChild.firstChild.innerHTML;
			var status = row.childNodes[4].firstChild.firstChild.firstChild.getAttribute( "status");
			var uc	   = parseInt(row.childNodes[5].firstChild.firstChild.innerHTML);
			checkedTestsConfig[ check.getAttribute("testId")  ] = {"title" : title, "url": url, "status": status , "row" : row, "uc": uc};
		}

		var dataModel = statisticsGrid.getDataSource();

		switch(actionMode){
			case "remove":
			{

				var url = Framework.testURL + User.userId;
				var testDataIds = [];
				var selectionModel=statisticsGrid.getSelectionModel();
				var gridRows=selectionModel.getSelections();
				for( var testId in checkedTestsConfig )
				{
					if( typeof(checkedTestsConfig[testId]) == "function" )continue;
					dataModel.remove( dataModel.getAt(checkedTestsConfig[testId].row.rowIndex));
					url += "/" + testId;
					testDataIds.push(  testId );
				}
				if(testDataIds.length)TagManager.request_removeTest( url, testDataIds );
				break;
			}
			case "add":
			{
				for( var testId in checkedTestsConfig )
				{
					if( typeof(checkedTestsConfig[testId]) == "function" )continue;
  					PortletLoader.addPortletFromTree( { moduleName: "Test", dataId: testId } );
				}
				break;
			}
			case "tag":
			{
				break;
			}
			case "suspend":
			case "activate":
			{
				var url = Framework.testURL + User.userId + "/" + actionMode + "/" + encode(TagManager.CURRENT_TAG_TITLE);
				var flag = false;
				var ucFlag = false;
				var testNames = "<ul id='unsuspendable_tests'>";
				for( var testId in checkedTestsConfig )
				{
					if( typeof(checkedTestsConfig[testId]) == "function" )continue;

					if( checkedTestsConfig[testId].uc != 1 )
					{
						ucFlag = true;
						testNames += "<li>"+ checkedTestsConfig[testId].title +"</li>"
					}
						url += "/" + testId;

					if( (actionMode == "suspend" &&	checkedTestsConfig[testId].status == TEST_STATUS_NA_STRING) ||
						(actionMode == "activate" &&	checkedTestsConfig[testId].status == TEST_STATUS_OK_STRING) )continue;

					flag = true;
				}
				testNames += "</ul>"
				if( ucFlag && actionMode != "activate")
				{
						MessageWindow.show( { header: Framework.Lang.message,
											  body: Framework.Lang.suspend_test_message.replace( "%0", testNames),
											  hideCancel: true
						});
				}
				if( flag )
				{
					$("tagInfo").innerHTML = "<img src='images/loader.gif' />";
					RequestDispatcher.sendPUT( url, TagManager.process_getTagInfo, {items: checkedTestsConfig, mode : actionMode, dataModel : dataModel});
				}
				break;
			}
		}
	},
	request_removeTest: function( url, testDataIds )
	{
		RequestDispatcher.send( url, "DELETE", null, TagManager.process_removeTest, testDataIds);
	},

	process_removeTest:function(req ,testDataIds )
	{
		var response = eval( "(" + req.responseText + ")" );

		if( response.status == "ok" )
		{
			Controller.closeModules( "Test", testDataIds );
			Controller.closeModules( "Report", eval(response.data) );
		}
		PortletLoader.refresh_dependent_modules("Test");
	},

	bool_:true,

	fixDataColModel: function()
	{
		var el = $("tagInfo");
		el.style.height = parseInt($("cloudWindowBody").style.height)-$("tagSelector").offsetHeight+"px";

		var wd = (el.offsetWidth - 250)/2;


		try{
			statisticsColModel = el.statisticsGrid.getColumnModel();
			statisticsColModel.setColumnWidth(0, 30);
			for(var i=1; i<3; i++)
				statisticsColModel.setColumnWidth(i, wd);
			statisticsColModel.setColumnWidth(3, 40);
			statisticsColModel.setColumnWidth(4, 70);

			if(TagManager.bool_) {
				statisticsColModel.setColumnWidth(5, 80);
				TagManager.bool_ = false;
			} else {
				statisticsColModel.setColumnWidth(5, 79);
				TagManager.bool_ = true;
			}


			el.statisticsGrid.autoSize();
		}catch(ex)
		{
			if( TagManager.prepareCall )
			{
				TagManager.request_getTagInfo( TagManager.tagURL );
				TagManager.prepareCall = false;
			}
		}
	}

}


var PORTLETS = new Array;
var	PORTLETS_CONFIG = new Array();
var TABS_CONFIG = new Array();
var MONITIS_IMG_ROOT = "/images/monitis/";

var User = {}


var PortletLoader = {
	PORTLETS_URL: "dev_tmp/modules.xml",
	TABS_URL:  Framework.layoutURL + "defuser/PagesXML/" + (-new Date().getTimezoneOffset()) + "/" + CURRENT_LANGUAGE,
	GHOST: null,

	NORMALIZE_HEIGHTS : false,

	DRAGGABLE_CONTENT: "",

	SHOW_IMG_URL: THEME_IMG_ROOT+"images/showMod.gif",
	HIDE_IMG_URL: THEME_IMG_ROOT+"images/hideMod.gif",
	CLOSE_IMG_URL: "images/monitis/closeMod.gif",
	MAXIMIZE_IMG_URL: "images/monitis/maximize.gif",
	RESTORE_IMG_URL: "images/monitis/restore.gif",
	EDIT_IMG_URL: "images/monitis/edit.gif",
	TABLEVIEW_IMG_URL: "images/monitis/table.gif",
	BARCHARVIEW_IMG_URL: "images/monitis/barchart.gif",
	LINECHARVIEW_IMG_URL: "images/monitis/linechart.gif",
	CALENDARVIEW_IMG_URL: "images/monitis/calendar.gif",
	MAPVIEW_IMG_URL: "images/monitis/map.gif",
	more_IMG_URL: "images/monitis/more.gif",
	ANGLE_IMG_URL: "images/monitis/response_time.gif",
	TRACEVIEW_IMG_URL: "images/monitis/trace_map.gif",
	hasTableView_IMG_URL: "images/monitis/table.gif",
	hasBarChartView_IMG_URL: "images/monitis/barchart.gif",
	hasLineChartView_IMG_URL: "images/monitis/linechart.gif",
	hasCalendarView_IMG_URL: "images/monitis/calendar.gif",
	hasMapView_IMG_URL: "images/monitis/map.gif",
	hasAngleView_IMG_URL: "images/monitis/response_time.gif",
	hasTraceView_IMG_URL: "images/monitis/trace_map.gif",

   	FASSET_COL_PREFIX: "body",

	init: function()
	{

		this.createPortletGhost();
		this.request_getTabs();
	},

	changePortletHeaderImg: function(){
		PortletLoader.SHOW_IMG_URL = THEME_IMG_ROOT+"images/showMod.gif";
		PortletLoader.HIDE_IMG_URL = THEME_IMG_ROOT+"images/hideMod.gif";
		var size = PORTLETS.length;
		for( var i = 0; i < size; i++ ) {
			if(PORTLETS[i] == null || !PORTLETS[i].setShowHideImg)continue;
			PORTLETS[i].setShowHideImg(THEME_IMG_ROOT);
		}
	},

	updatePermanent: function(permanent)
	{
		if(permanent != undefined && OPTIONS.showHeaderIcons != permanent)
		{
			var size = PORTLETS.length;
			for( var i = 0; i < size; i++ ) {
				if(PORTLETS[i] == null || !PORTLETS[i].isBuilt)continue;
				if(permanent) {
					PORTLETS[i].showHeaderIcons();
				} else {
					PORTLETS[i].hideHeaderIcons();
				}

			}
			OPTIONS.showHeaderIcons = permanent;
			RequestDispatcher.send(Framework.optionsURL + User.userId + "/header_icons/" + permanent, "PUT", "", checkStatus, null);
		}
	},

	createPortletGhost: function()
	{
		this.GHOST = document.createElement("div");
		this.GHOST.id = "portletGhost";
	},
	onLoadModule: function()
	{

	},
	refresh_dependent_modules: function( mode )
	{
			var moduleDefaultParams = Framework.Modules[ mode +"Widget" ];
			if( moduleDefaultParams != null )
			{
				var dependent_modules = moduleDefaultParams.dependent_modules;
				if( dependent_modules != null )
					for( var i=0; i<dependent_modules.length; i++ )
					{
						var modules = PortletLoader.getPortletsByName( dependent_modules[i] );
						for( var j=0; j<modules.length; j++ )
							modules[j].load( true );
					}
			}
			setTimeout( "PortletLoader.refresh_dependent_modules2( \'"+ mode + "\')", 1000);
	},

	refresh_dependent_modules2: function(mode)
	{
		var moduleDefaultParams = Framework.Modules[ mode+"Widget" ];
		if( moduleDefaultParams != null )
		{
			var additional_actions = moduleDefaultParams.additional_actions;
			if( additional_actions != null )
				for( var i=0; i<additional_actions.length; i++ )
				{
					try{
						additional_actions[i]();
					}catch(ex){}
				}
		}
	},

	saveUserDataResponse: function(response, arg)
	{
		if(response.responseText != "")
		{
			var respArgs = eval("("+response.responseText+")");

			try{
				arg.callback(arg.callbackArgs,respArgs);
			}
			catch(e){}

			if(respArgs["new"] == true)
			{
				try{
				PortletLoader.saveUserData('order');
				} catch(e){}
			}
		}
		
	},
	saveUserData: function( mode, obj, callback, callbackArgs )
	{
		var reqtype = '';
		var data = '';
		var docId = '';
		var arg = {callback:callback, callbackArgs:callbackArgs};
		switch(mode)
		{
			case 'moduleResize':
				reqtype = 'put';
				data = '/'+ callbackArgs["id"] + '/' + callbackArgs["height"];
				break;
			case 'unshare':
				reqtype = 'put';
				data = '/'+ callbackArgs["tabId"];
				break;
			case 'share':
				reqtype = 'put';
				data = '/'+ callbackArgs["tabId"] + "/" +  escape(callbackArgs["tags"]) + "/" +  escape(callbackArgs["descr"]);
				break;
			case 'tab_place':
				reqtype = 'put';
				data = '/'+ callbackArgs[0] + "/" +  callbackArgs[1];
				mode = "pageorder";
				break;
			case 'column_layout':
			case 'auto_layout':
				reqtype = 'put';
				var moduleOrder = this.getModulesOrder();
				var moduleHeights = this.getModulesHeights();
				if( GENERAL_SETTINGS.moduleOrder == moduleOrder )return;
				else GENERAL_SETTINGS.moduleOrder = moduleOrder;
				GENERAL_SETTINGS.moduleOrder = moduleOrder;
				data =  '/' + callbackArgs["tabId"];
				data += '/' + callbackArgs["colCount"];
				data += '/' + ((mode == 'column_layout')?"null":callbackArgs["rowCount"]);
				data += '/' + moduleOrder;
				mode = "pageLayout";
				break;
			case 'order':
				reqtype = 'put';
				var moduleOrder = this.getModulesOrder();
				if( GENERAL_SETTINGS.moduleOrder == moduleOrder )return;
				else GENERAL_SETTINGS.moduleOrder = moduleOrder;
				GENERAL_SETTINGS.moduleOrder = moduleOrder;
				data = '/'+ moduleOrder;
				break;
			case 'collapsed' :
				reqtype = 'put';
				data = '/'+ callbackArgs["id"] + '/' + callbackArgs["collapsed"];
				break;
			case 'close':
				mode = 'module';
				reqtype = 'del';
				data = '/'+obj.params.id;
				break;
			case 'new':
				mode = 'module';
				reqtype = 'post';
				var params = obj;
				var dataId = params.dataId;
				if(dataId == undefined)
				dataId = 0;
				var tabID = Controller.getTabConfig(params.tabNumber).id;
				data = '/'+ tabID +'/'+params.moduleName+'/'+dataId;
				break;
			case 'addPage' :
				mode = 'page';
				reqtype = 'post';
				data = '/' + encode(obj);
				break;
			case 'deletePage' :
				mode = 'page';
				reqtype = 'del';
				data = '/' + obj;
				break;
			case 'renamePage' :
				mode = 'page';
				reqtype = 'put';
				data = '/' + obj.id + '/' + encode(obj.title);
				break;

		}
		switch(reqtype)
		{
			case 'put' :
			RequestDispatcher.send(Framework.layoutURL + User.userId + "/"+mode+data,"PUT", "", this.saveUserDataResponse , arg);
			break;
			case 'post' :
			RequestDispatcher.send(Framework.layoutURL + User.userId + "/"+mode+data, "POST","", this.saveUserDataResponse, arg);
			break;
			case 'del' :
			RequestDispatcher.send(Framework.layoutURL + User.userId + "/"+mode+data, "DELETE","", this.saveUserDataResponse, arg);
			break;
		}
		
	},

	getModulesOrder: function()
	{
		var result = [];
		for( var id in TABS_CONFIG )
		{
			if( typeof(TABS_CONFIG[id]) == "function" )continue;

			var table = $("table_" + id );
			if( table == null )continue;

			var tbody = table.getElementsByTagName("TBODY")[0];
			var tds = tbody.firstChild.childNodes;
			var portlet_count = 0;

			var arr = [];
			for( var i=0; i<tds.length; i++ )
			{
				if( tds[i].tagName != "TD"  )continue;
				var arr2 = [];
				for( var j=0; j<tds[i].childNodes.length; j++ )
				{
					var portlet_DOMOBJ = tds[i].childNodes[j]
					if( portlet_DOMOBJ.className == "portlet" )
					{
 						if (portlet_DOMOBJ.id!=null) arr2.push(portlet_DOMOBJ.id);
					}
				}

				arr.push(arr2.join(','));
			}

			 result.push(encode(id)  + "_" + arr.join(":"));
		}
 		return result.join("!");
	},

	getModulesHeights: function(){
		var result = "";
		for( var i=0; i<PORTLETS.length; i++ )
			result += ";" + PORTLETS[i].id + ":" + PORTLETS[i].params["height"];
		return result.substr(1, result.length);
	},
	request_getPortlet: function( url )
	{
		RequestDispatcher.connectGET( url, null , PortletLoader.process_getPortlet , null );
	},

	process_getPortlet: function( req, handlerParams )
	{
		PortletLoader.generatePortlet( req.responseXML.firstChild );
	},
	request_getTabs: function()
	{
		RequestDispatcher.connectGET( PortletLoader.TABS_URL, null , PortletLoader.process_getTabs , null );
	},

	process_getTabs: function(req, handlerParams )
	{
		if( req.responseText == "" )return;
		var tabUserJSON = eval( "("+ req.responseText + ")" );
		User = tabUserJSON["user"];

		if( User  == null )return;
		User.hasUserAgent = parseBool( User.hasUserAgent );


		User.timezoneOffset = -(new Date().getTimezoneOffset());
		TABS_CONFIG = tabUserJSON["tabs"];
		OPTIONS = tabUserJSON["options"];


		theme_link = document.createElement("link");
		theme_link.setAttribute("rel", "stylesheet");
		theme_link.setAttribute("type", "text/css");
		theme_link.href = "themes/" + OPTIONS.theme + '/' + OPTIONS.theme + ".css";
		document.getElementsByTagName("head")[0].appendChild(theme_link);
		THEME_IMG_ROOT = "themes/"+OPTIONS.theme+"/";
		PortletLoader.SHOW_IMG_URL = THEME_IMG_ROOT+"images/showMod.gif";
		PortletLoader.HIDE_IMG_URL = THEME_IMG_ROOT+"images/hideMod.gif";

		Controller.numberOfColsForAllTabs = 0;

		for( var id in TABS_CONFIG )
		{
			var tab = TABS_CONFIG[id];
			if( typeof(tab) == "function" || tab == null)continue;

			tab['id'] = parseInt(id);

			if(  tab['colCount'] != null )
				tab['colCount'] = parseInt(tab['colCount']);
			else
				tab['colCount'] = GENERAL_SETTINGS.DEFAULT_COLUMNS_COUNT;

			if( tab['isMenuExist'] )
				tab['isMenuExist'] = parseBool( tab['isMenuExist'] );
			else
				tab['isMenuExist'] = true;

			if( tab['isShared'] )
				tab['isShared'] = parseBool( tab['isShared'] );
			else
				tab['isShared'] = false;

			if( tab['moduleHeight'] )
				tab['moduleHeight'] = parseInt( tab['moduleHeight'] );

			TABS_CONFIG[ id ][ "layout" ] = [ tab['rowCount'], tab['colCount'] ];
			if (Controller.numberOfColsForAllTabs == 0) Controller.numberOfColsForAllTabs = tab['colCount'];
			else if(Controller.numberOfColsForAllTabs != tab['colCount']) Controller.numberOfColsForAllTabs = null;

		}

		PortletLoader.sortByOrder();

		Controller.init2();
	},

	getPortletsByName: function( moduleName )
	{
		var returnValue = [];
		for( var i=0; i<PORTLETS.length; i++ )
		{
			if( PORTLETS[i].moduleName == moduleName )
				returnValue.push( PORTLETS[i] );
		}

		return returnValue;
	},

	getPortletsByNameAndDataId: function( moduleName, dataId )
	{
		var returnValue = null;
		for( var i=0; i<PORTLETS.length; i++ )
		{
			if( PORTLETS[i].params.moduleName == moduleName && PORTLETS[i].params.dataId == dataId){
				returnValue =  PORTLETS[i] ;
				break;
				}
		}

		return returnValue;
	},

	getPortlet: function( portletId )
	{
		for( var i=0; i<PORTLETS.length; i++ )
		{
			if( PORTLETS[i].id == portletId )
				return PORTLETS[i];
		}
	},


	getAvailableTabId: function()
	{
		if( TABS_CONFIG ==null || TABS_CONFIG.length == 0 )return "";
		return Layouter.getActiveTabId();
	},
	request_getPortlets: function()
	{
		var url = Framework.layoutURL + User.userId + "/modules";

		RequestDispatcher.connectGET( url , null , PortletLoader.process_getPortlets , null );
	},
	process_getPortlets: function( req, handlerParams)
	{
		PORTLETS_CONFIG = eval( "(" + req.responseText + ")");

		var count = PORTLETS_CONFIG.length;

		for( var i=0; i<count; i++ )
		{
			PORTLETS[ i ] = new Portlet( PORTLETS_CONFIG[i] );
		}

		PortletLoader.calculateTabModuleHeights();

/*
		for( var i=0; i<count; i++ )
			PORTLETS[ i ].build();
*/
		PortletLoader.loadPortlets();
		for( var i = 0; i < PORTLETS.length; i++ ) {
			if (PORTLETS[i] == null ) continue;
			try {
				if (!OPTIONS.showHeaderIcons) PORTLETS[i].hideHeaderIcons();
			} catch(ex) {}
		}

		Controller.tabWidth = $( PortletLoader.getAvailableTabId() + "_body1").offsetWidth;
		Controller.tabHeight = Layouter.getActiveTab().el.dom.offsetHeight;
		if($("main-page-loading")) $("main-page-loading").style.display = "none";
	},

	loadOnStartUp: function(checked){
		if (checked == OPTIONS.loadAllModules){
			PortletLoader.loadPortlets();
			OPTIONS.loadAllModules = !checked;
		    RequestDispatcher.send(Framework.optionsURL + User.userId + "/loadonstartup/" + OPTIONS.loadAllModules, "PUT", "", checkStatus, null);
		}
	},
	disableWeeklyReport:function(checked){
		if (checked != User.weeklyReport){
			User.weeklyReport = checked;
		    RequestDispatcher.send(Framework.optionsURL + User.userId + "/disableweeklyreport/" + User.weeklyReport, "PUT", "", checkStatus, null);
		}
	},

	isPortletsSorted: false,
	loadPortlets: function( reloadTab, tabId )
	{
		if( Controller.DONTLOAD )return;

		if( reloadTab == null ) reloadTab = false;

		if( tabId == null )tabId = Layouter.getActiveTabId();


		var tabConfig = TABS_CONFIG[ tabId ]

		if( tabConfig.isLoaded && reloadTab != true)return;
		var isLoadedCopy = tabConfig.isLoaded;

		var count = PORTLETS.length;

		for( var i=0; i<count; i++ )
		{
			if( !OPTIONS.loadAllModules )
			{	if( tabId == PORTLETS[i].params.tabNumber )
				{
					PORTLETS[i].build();
					PORTLETS[i].attachContent();
				}
			}
			else
			{
				if( !TABS_CONFIG[ PORTLETS[i].tabNumber ].isLoaded || reloadTab == true)
				{
					PORTLETS[i].attachContent();
				}
			}
		}

		TABS_CONFIG[ tabId ].isLoaded = true;
		setTimeout(animateHeaderIcons,1000*60*2);
	},

	calculateTabModuleHeights: function()
	{
		var tab, portlet, tabHeightFlag = true , noPortletsFlag = true, height = null;

		for( var id  in TABS_CONFIG )
		{
			if(  typeof(TABS_CONFIG[id]) == "function" )continue;
			tab = TABS_CONFIG[id];

			for( var j=0; j<PORTLETS.length; j++ )
			{
				portlet = PORTLETS[j];
				if( portlet.params.tabNumber != tab.id )continue;

				noPortletsFlag = false;

				if( height == null )height = portlet.params.height;

				if( portlet.params.height != height  )
					tabHeightFlag = false;
			}

			if( tabHeightFlag && !noPortletsFlag )
				TABS_CONFIG[ id ].moduleHeight = height;

			if( noPortletsFlag )
			{
				TABS_CONFIG[ id ].moduleHeight = GENERAL_SETTINGS.DEFAULT_MODULE_HEIGHT;
			}

			height = null;
			tabHeightFlag = true;
			noPortletsFlag = true;
		}
	},

	sortByOrder: function()
	{
		var arr = [], temp;
		for( var id in TABS_CONFIG )
			arr[arr.length] = { id: id, order: TABS_CONFIG[id].order };

		for( var i=1; i<arr.length; i++ )
			for( var j=0; j<arr.length-i; j++ )
			{
				if( arr[j].order > arr[j+1].order )
				{
					temp = arr[j];
					arr[j] = arr[j+1];
					arr[j+1] = temp;
				}
			}

		var arr2 = {};

		for( var i=0; i<arr.length; i++ )
			arr2[ arr[i].id ] = TABS_CONFIG[ arr[i].id ];

		TABS_CONFIG = arr2;
		PortletLoader.isTabsSorted = true;
	},

	sortByTabs: function()
	{
		var SORTED_PORTLETS = [];

		for( var id in TABS_CONFIG  )
		{
			if( typeof(TABS_CONFIG[id]) == "function" )continue;

			for( var i=0; i<PORTLETS.length; i++ )
			{
				if( PORTLETS[i].tabNumber == id )SORTED_PORTLETS.push( PORTLETS[i] );
			}
		}

		PORTLETS = SORTED_PORTLETS;
		PortletLoader.isPortletsSorted = true;
	},

	generatePortlet: function( portletDOM )
	{
		if( portletDOM.nodeType != 1 )return;

		var portletParamsDOM = portletDOM.childNodes;
		var params = [];

		for( var j=0; j<portletParamsDOM.length; j++ )
		{
			if( portletParamsDOM[j].nodeType != 1 )continue;
			var attrName  = portletParamsDOM[j].nodeName;
			var attrValue = portletParamsDOM[j].firstChild.nodeValue;
			params[ attrName ] = attrValue;
		}

		this.addPortlet(params);
	},

	addPortlet : function(params){

		if( PortletLoader.getPortlet(params[ "id" ])  != null )return;
		var length = PORTLETS_CONFIG.length;
		PORTLETS_CONFIG[length] = params;
		var lastInserted = PORTLETS.length;
		PORTLETS[lastInserted] = new Portlet( PORTLETS_CONFIG[length] );
		PORTLETS[lastInserted].build();
		PORTLETS[lastInserted].attachContent();
		if (!OPTIONS.showHeaderIcons)  PORTLETS[lastInserted].hideHeaderIcons();
	},

	addPortletFromTree : function(params){
		if ( !Controller.getTabConfig() ) {return;}
		var colNum = Controller.getTabConfig().colCount;
		if(colNum >=2)colNum = 2;


		if( params.colNumber == null )params.colNumber=colNum;
		if( params.tabNumber == null )params.tabNumber=parseInt(Layouter.getActiveTabId());
		if( params.before == null )params.before=true;
		if( params.dataId == null )params.dataId=0;


		if(typeof params=='undefined')
		{
			params = {
					moduleName:portletId,
					dataId: 0
				}
		}

		PortletLoader.saveUserData('new', params, PortletLoader.completeAddPortletFromTree, params);
	},
	completeAddPortletFromTree : function(params, respArgs){
		params.id = parseInt(respArgs.id);
		if( params.id == -1 )
		{
			var existedPortlet = PortletLoader.getPortletsByNameAndDataId( params.moduleName,params.dataId);
			if( existedPortlet == null )return;
			 var moduleTabId = existedPortlet.params["tabNumber"];

			if( Layouter.getActiveTabId() == moduleTabId )return;
			MenuManager.hideAllTooltips();
			MessageWindow.show( { header: Framework.Lang.message,
								  body: "<nobr'>"+Framework.Lang.module_replace_message+"</nobr>",
								  okHandler: PortletLoader.replace_module,
								  handlerParams: existedPortlet
								})
		}
		else
			PortletLoader.addPortlet(params);
		if(params.callMethod != undefined){
			params.callMethod(params);
		}
	},

	replace_module: function(portlet)
	{
		var obj = portlet.portlet_DOMOBJ;
		if(!obj){
			portlet.build();
			obj = portlet.portlet_DOMOBJ;
		} 
		var col_index = obj.parentNode.id;
		col_index = col_index.substr( col_index.indexOf("body") + 4, col_index.length );

		var rowIndex = 0;

		for( var i=0; i<obj.parentNode.childNodes.length; i++ )
		{
			var current = obj.parentNode.childNodes[i];
			if( current == obj )break;
			if( obj.parentNode.childNodes[i].className == "portlet")rowIndex++;

		}

		var curTab = Controller.getTabConfig( Layouter.getActiveTabId() );

		if( curTab.colCount < col_index )col_index = curTab.colCount;

		var td = $( curTab.id + "_body" + col_index);

		if( rowIndex > td.childNodes.length )rowIndex = td.childNodes.length;

		if( td.childNodes[rowIndex] == null  )
			td.appendChild( obj );
		else
			td.insertBefore( obj, td.childNodes[rowIndex] );


		portlet.params[ "tabNumber" ] = curTab.id;
		portlet.attachContent();
		PortletLoader.saveUserData('order', portlet, PortletLoader.replace_module_callback, portlet);
	},

	replace_module_callback: function(portlet, respArgs)
	{
	},



	collapseExpandAll: function( mode )
	{
		var size = PORTLETS.length;

		for( var i=0; i<size; i++ )
		{
			if(PORTLETS[i] == null )continue;
			switch( mode )
			{
				case "hide":PORTLETS[i].hide();break;
				case "show":PORTLETS[i].show();break;
			}

		}

		return false;
	}


}

function animateHeaderIcons(){
	OPTIONS.showHeaderIcons  = false;
	var size = PORTLETS.length;

	for( var i=0; i<size; i++ )
	{
		if(PORTLETS[i] == null )continue;

		try{
		PORTLETS[i].hideHeaderIcons();
		}catch(ex){}
	}

}

function getInnerHTML( id, root )
{
	var div = document.createElement("DIV");
	div.innerHTML = root.responseText;

	var inner =  getInnerHelper( id, div );
	return (inner)?inner:"";
}

function getInnerHelper( id, root )
{
	if( root.id == "id" )
		return root.innerHTML;

	var childs = root.childNodes;
	var size = childs.length;
	for(var i=0; i<size; i++)
	{
		if( childs[i].id == id )
			return childs[i].innerHTML;
		else
		{
			var inner = getInnerHelper( id , childs[i] );
			if( inner != null )
				return inner;
		}
	}

	return null;
}

function RequestInfo(url, method, data, config,  handler, handlerParams, dispathcer_func){
	this.url = url;
	this.method = (method)?method:"GET";
	this.data = data;
	this.handler = handler;
	this.handlerParams = handlerParams;
	this.dispathcer_func = dispathcer_func;
	this.config = config;
}

var RequestDispatcher =  {
	REQUEST_LOG : new Array(),
	HANDLER_NAME: "__MONITIS_AJAX_DEFAULT_HANDLER",

	init: function(){
	},

	doLastRequest: function(){
		if( handlerParams == null ) handlerParams = new Array();
		handlerParams[ RequestDispatcher.HANDLER_NAME ] = handler;
		handler = RequestDispatcher.postconnect;
		Request.send(url, method, data, handler, handlerParams);
	},

	preconnect: function( url, method, data, handler, handlerParams, dispathcer_func )
	{
		var config = {
		  success:handler,
		  failure: handler,
		  dispatcher: dispathcer_func,
		  argument: handlerParams
		}
		RequestDispatcher.REQUEST_LOG[ RequestDispatcher.REQUEST_LOG.length ] = new RequestInfo( url, method, data, config, handler, handlerParams, dispathcer_func );
		return config;
	},
	postconnect: function( o, handlerParams ){
		if( GENERAL_SETTINGS.POLLING_ENABLED )
		handlerParams = o.argument;
		if( handlerParams[ RequestDispatcher.HANDLER_NAME ] == null  )return;

		var resp;
		try{
		if(o != null )
			resp=eval("("+o.responseText+")");

		if(resp.status == STATUS_UPGRADE){
						alert("Trial version expiered. Please upgrade");
						User.old = true;
						OptionsManager.openUpgradeDialog($("Options"));
		}
		else if(resp.status == STATUS_FREEZE){
				alert("Your account is freezed. Please pay to continue");
		}
		else
		handlerParams[ RequestDispatcher.HANDLER_NAME ]( o, handlerParams["userParams"] );
		}catch(ex){}
	},

	send: function( url, method, data, handler, handlerParams ){
		var params={};
		if( handlerParams == null ) handlerParams = new Array();
		params[ RequestDispatcher.HANDLER_NAME ] = handler;
		params["userParams"]=handlerParams;
		handler = RequestDispatcher.postconnect;
		var callback = RequestDispatcher.preconnect( url, method, data, handler, params , RequestDispatcher.send);

		if(Browser.isSafari && method.toUpperCase() == "PUT" )
		{
			url = Framework.redirectPUT + url;
			method = "POST";
		}


		if( GENERAL_SETTINGS.POLLING_ENABLED )
		{
			var request = YAHOO.util.Connect.asyncRequest(method, url, callback, data);
			delete request;
		}
		else
			Request.send(url, method, data, handler, params);

	},
	sendGET: function( url , handler, handlerParams ){
		RequestDispatcher.send( url, "GET", null, handler, handlerParams );
	},
	sendPOST: function( url , data , handler, handlerParams ){
		RequestDispatcher.send(url, "POST", data, handler, handlerParams,true);
	},
	sendPUT: function( url , handler, handlerParams ){
		RequestDispatcher.send(url, "PUT", null, handler, handlerParams,true);
	},
	sendDELETE: function( url , handler, handlerParams ){
		RequestDispatcher.send(url, "DELETE", null, handler, handlerParams,true);
	},
	sendDEL: function( url , handler, handlerParams ){
		RequestDispatcher.send(url, "DELETE", null, handler, handlerParams,true);
	},
	connect: function( url, params, handler, handlerParams ){
		RequestDispatcher.send( url, "GET", null, handler, handlerParams );
	},
	connectGET: function( url , params , handler, handlerParams ){
		RequestDispatcher.send( url, "GET", null, handler, handlerParams );
	},
	connectPOST: function( url , data , handler, handlerParams ){
		RequestDispatcher.send(url, "POST", data, handler, handlerParams,true);
	}
}

function submitCallback(obj)
{
	var response = obj.responseText;
	response = response.split("<!")[0];
	document.getElementById("resp").innerHTML = response;
	eval(response);
}





var DialogWindow = function(){
	var self=this;
	var dialog;

	var isGenerated = false;

    var dialog, showBtn, action, isResized = false, minWidth = 300, minHeight = 30;
    return {
        init : function(){


			if( isGenerated )return;
			else isGenerated = true;

			var inner = "";
		    inner += "<div id='common-dlg'>";
			inner += "    <div class='x-dlg-hd' id='dialogWindowHead'>&nbsp;</div>";
			inner += "    <div class='x-dlg-bd' >";
			inner += "    	<div id='dialog_error_part'><ul></ul></div>";
			inner += "    	<div id='dialogWindowBody'></div>";
			inner += "   </div>";
			inner += "    <div class='ydlg-ft'> </div>";
		    inner += "</div>";


			var div = document.createElement( "DIV");
			div.innerHTML = inner;
			document.body.appendChild( div );


                dialog = new Ext.BasicDialog("common-dlg", {
                        modal:false,
                        width:DialogWindow.minWidth,
                        height:DialogWindow.minHeight,
                        shadow:true,
                        fixedcenter: true,
						proxyDrag: true,
						resizable:false,
						autoScroll:false
                });

                DialogWindow.dialog = dialog;
                dialog.addKeyListener(27, this.hide, dialog);
                if(OS.isMac || (Browser.isFirefox && OS.isLinux)) dialog.addListener("beforehide",Layouter.showCharts);
                dialog.addListener("beforehide",removeOptionsDiv);
				dialog.addListener("show",this.fixDialogSizes);
                dialog.addButton('Submit', null, action);
		},

		defaultActioner: function()
		{
			DialogWindow.disableButton();
			var actionHandler = dialog.el.dom.actionHandler;
			var returnValue = actionHandler();

			if( returnValue == true )
			{
				dialog.hide();
			}
		},

        showDialog : function( domNode , mode, actionHandler, dialogBody )
		{

			if(OS.isMac || (Browser.isFirefox && OS.isLinux)) Layouter.hideCharts();

			MenuManager.hideAllTooltips();
			this.removeErrorPart( true );

			DialogWindow.enableButton();

			switch(mode){
				case "Agent": if( User.hasUserAgent )DialogWindow.disableButton();
			}
			dialog.buttons[0].setText( getAddTitle( mode ) );
			dialog.buttons[0].purgeListeners();
			dialog.buttons[0].addListener('click', this.defaultActioner, actionHandler,true);
			dialog.el.dom.actionHandler = actionHandler;
			dialog.el.dom.mode = mode;
			DialogWindow.domNode = domNode;

			var dialogWindowBody = $("dialogWindowBody");
			dialogWindowBody.innerHTML = "";
			dialogWindowBody.appendChild( dialogBody );
			//move changeFormStyle for combo in Safari
			if(Browser.isSafari)
				changeFormStyle(dialogWindowBody, true, true ,true, true, true);

			var width  = parseInt(DialogWindow.domNode.getAttribute("dialogWidth"));
			var height = parseInt(DialogWindow.domNode.getAttribute("dialogHeight"));
			var anasunNode = $("dummyNode");
			anasunNode.appendChild( dialogWindowBody.firstChild );
			var curWidth  =  anasunNode.scrollWidth + 40;
			dialogWindowBody.appendChild( anasunNode.firstChild  );
			var curHeight =  dialogWindowBody.offsetHeight + 85;


			if( !isNaN(curWidth) )
				width  = Math.max( width, curWidth );
			if( !isNaN(curHeight) )
				height = Math.max( height, curHeight );

			dialog.resizeTo( width, height );

			dialog.show(domNode);
        },
		
		
        showDialogFromMenu : function( domNode , mode, actionHandler, dialogBody, widthParam, heightParam )
		{
			tempWidth = widthParam;
			tempHeight = heightParam; 
			if(Browser.isSafari) Layouter.hideCharts();

			MenuManager.hideAllTooltips();
			this.removeErrorPart( true );

			DialogWindow.enableButton();

			switch(mode){
				case "Agent": if( User.hasUserAgent )DialogWindow.disableButton();
			}
			dialog.buttons[0].setText( getAddTitle( mode ) );
			dialog.buttons[0].purgeListeners();
			dialog.buttons[0].addListener('click', this.defaultActioner, actionHandler,true);
			dialog.el.dom.actionHandler = actionHandler;
			dialog.el.dom.mode = mode;
			DialogWindow.domNode = domNode;

			var dialogWindowBody = $("dialogWindowBody");
			dialogWindowBody.innerHTML = "";
			dialogWindowBody.appendChild( dialogBody );
			//move changeFormStyle for combo in Safari
			if(Browser.isSafari){
				changeFormStyle(dialogWindowBody, true, true ,true, true, true);
			}
			var width;
			var height;
			if(Utils.exist(widthParam)){
				width = widthParam;
			} else {
				width = parseInt(DialogWindow.domNode.getAttribute("dialogWidth"));
			}
			if(Utils.exist(heightParam)){
				height = heightParam;
			} else {
				height = parseInt(DialogWindow.domNode.getAttribute("dialogHeight"));
			}
			var anasunNode = $("dummyNode");
			anasunNode.appendChild( dialogWindowBody.firstChild );
			var curWidth  =  anasunNode.scrollWidth + 40;
			dialogWindowBody.appendChild( anasunNode.firstChild  );
			var curHeight =  dialogWindowBody.offsetHeight + 85;


			if( !isNaN(curWidth) )
				width  = Math.max( width, curWidth );
			if( !isNaN(curHeight) )
				height = Math.max( height, curHeight );

			dialog.resizeTo( width, height );

			dialog.show();
        },		

		reCall : true,

		fixDialogSizes: function()
		{
			var dialogWindowBody = $("dialogWindowBody");
			var anasunNode = $("dummyNode");

			if( DialogWindow.reCall ){
				anasunNode.innerHTML = dialogWindowBody.innerHTML;				
				setTimeout( "DialogWindow.fixDialogSizes()", 100 );
				DialogWindow.reCall = false;
				return;
			}
			DialogWindow.reCall = true;
			var curWidth  =  anasunNode.scrollWidth + 40;

			anasunNode.innerHTML = "";

			if( dialog.isVisible() )
			{
				var width;
				var height;
				if(Utils.exist(tempWidth)){
					width = tempWidth;
				} else {
					width = parseInt(DialogWindow.domNode.getAttribute("dialogWidth")); 
				}
				if(Utils.exist(tempHeight)){
					height = tempHeight;
				} else {
					height = parseInt(DialogWindow.domNode.getAttribute("dialogHeight"));
				}
				
				if(Utils.exist(width) && Utils.exist(height)){
					var curHeight =  dialogWindowBody.scrollHeight + 80;
	
	
					if( this.minWidth >curWidth )curWidth =  this.minWidth;
					if( this.minHeight >curHeight )curHeight =  this.minHeight;
	
					width  = Math.max( width, curWidth );
					height = Math.max( height, curHeight );
	
					try{
						dialog.resizeTo( width, height );
					}catch(ex){
	
					}
				}
			}
		},

		disableButton: function()
		{
			dialog.buttons[0].disable();
		},

		enableButton: function()
		{
			dialog.buttons[0].enable();
		},

		log: function( errorMessages, append, type )
		{
			if( ! append )
				$("dialog_error_part").firstChild.innerHTML = "";

			for( var i=0; i<errorMessages.length; i++ )
				$("dialog_error_part").firstChild.innerHTML += "<li>" +errorMessages[i] + "</li>";
			$("dialog_error_part").style.display = "block";

			$("dialog_error_part").className = type;

			try{
				if( !isResized )
				{
					isResized = true;
					dialog.resizeTo(dialog.size.width, dialog.size.height + $("dialog_error_part").offsetHeight);
					isResized = true;
				}
			}catch(ex){}
		},

		error: function( errorMessages, append )
		{
			this.log( errorMessages, append, "log_error" );
			DialogWindow.enableButton();
		},

		info: function( message,append )
		{
			this.removeErrorPart( true );
			this.log( [message], append, "log_info" );
		},

		clear: function( )
		{
			this.removeErrorPart( true );
		},

		removeErrorPart: function( deleteErrors )
		{
			var dialog_error_part = $("dialog_error_part");

			try{
				if( isResized )
				{
					dialog.resizeTo(dialog.size.width, dialog.size.height - dialog_error_part.offsetHeight);
					isResized = false;
				}
			}catch(ex){}

			if( deleteErrors )dialog_error_part.firstChild.innerHTML = "";
			dialog_error_part.style.display = "none";
		},

		getFormData: function( serialize , makeRest )
		{
			var modeName = dialog.el.dom.mode;
			var returnValue = (serialize == true)?Form.serialize( $( modeName+ "_FORM") ):Form.makeKeyValue( $(modeName + "_FORM") );

			if( serialize && makeRest )
			{
				var returnValue = "";
				var myForm = Form.makeKeyValue( $(modeName + "_FORM") );
				for( var key in myForm )
				{
					if( typeof(myForm[key]) == "function" ) continue;
					returnValue += encode(myForm[ key ]) + "/";
				}

				if( myForm.length != 0 )returnValue = returnValue.substr(0, returnValue.length-1);
			}

			return returnValue;
		},

		getForm: function()
		{
			var modeName = dialog.el.dom.mode;
			return Form.getElements( $( modeName+ "_FORM") );
		},

		hide: function()
		{
			if( dialog.isVisible() )
					dialog.hide();
		}
    };
}();

var CloudWindow = function(){

	var self=this;
	var dialog;
	var isGenerated = false;
    var cloudDialog;

    return {
        init : function(){

			//if( isGenerated )return;
			//else isGenerated = true;
			
			if($("tag-cloud-dlg-container")) document.body.removeChild($("tag-cloud-dlg-container"));
			var inner = "";

			inner += "<div id='tag-cloud-dlg' >";
			inner += "    <div class='x-dlg-hd' id='tagInfoTitle'>"+ Framework.Lang.tag_info +"</div>";
			inner += "    <div class='x-dlg-bd' id='cloudWindowBody'>";
			if(!Browser.isMacFirefox){
				inner += "    	<div id='tagSelector'>";
				inner += "    			<span id='tagSelectorSPAN' class='tagSelectorClass'></span>";
				inner += "	    </div>";
			}
			inner += "    	<div id='tagInfoLoading' >";
			inner += "    		<img src='images/loader.gif' />" + Framework.Lang.loading;
			inner += "    	</div>";
			inner += "    	<div id='tagInfo' style='padding:5px;overflow:auto;'>";
			inner += "    	</div>";
			if(Browser.isMacFirefox){
				inner += "    	<div id='tagSelector'>";
				inner += "    			<span id='tagSelectorSPAN' class='tagSelectorClass'></span>";
				inner += "	    </div>";
			}
			inner += "   </div>";
			inner += "   <div class='x-dlg-ft'> </div>";
			inner += "</div>";

			var div = document.createElement( "DIV");
			div.id = "tag-cloud-dlg-container";
			div.innerHTML = inner;
			document.body.appendChild( div );

		
			cloudDialog = new Ext.BasicDialog("tag-cloud-dlg",
			{
                        modal:true,
                        width:640,
						height:300,
                        shadow:true,
                        minWidth:500,
                        draggable:(Browser.isMacFirefox ? false : true),
                       	proxyDrag:true,
						minHeight:160,
						resizable: false,
						autoScroll: false
			});
			CloudWindow.cloudDialog = cloudDialog;

				if(OS.isMac || (Browser.isFirefox && OS.isLinux)) cloudDialog.addListener("beforehide",Layouter.showCharts);
				cloudDialog.addListener("beforehide",removeOptionsDiv);
                cloudDialog.addKeyListener(27, cloudDialog.hide, cloudDialog);
				cloudDialog.addButton( Framework.Lang.Remove , TagManager.cloudTestActioner, "remove");
				cloudDialog.addButton( Framework.Lang.Suspend , TagManager.cloudTestActioner, "suspend");
				cloudDialog.addButton( Framework.Lang.Activate , TagManager.cloudTestActioner, "activate");
				cloudDialog.addButton( Framework.Lang.AddToWindow , TagManager.cloudTestActioner, "add");
				//cloudDialog.syncBodyHeight();
				cloudDialog.addListener("show", TagManager.drawTable);
		},

        showDialog : function( domNode )
		{
			if(OS.isMac || (Browser.isFirefox && OS.isLinux) ) 	Layouter.hideCharts();
		    cloudDialog.show(domNode);
        }
    };
}();

var SharedTabsWindow = function(){
    var stDialog, showBtn;
	var self=this;

	var isGenerated = false;
    return {
        init : function(){

			if( isGenerated )return;
			else isGenerated = true;

			var inner = "";
		    inner += "<div id='shared-tabs-dlg' >";
			inner += "    <div class='x-dlg-hd' ><script>" + Framework.Lang.add_shared_tab + "</div>";
			inner += "    <div class='x-dlg-bd' >";
			inner += "    	<div id='stWindowBody'>";
			inner += "    		<img src='images/loader.gif' />" + Framework.Lang.loading;
			inner += "    	</div>";
			inner += "    </div>";
			inner += "    <div class='ydlg-ft'> </div>";
			inner += "</div>";

			var div = document.createElement( "DIV");
			div.innerHTML = inner;
			document.body.appendChild( div );


           stDialog = new Ext.BasicDialog("shared-tabs-dlg", {
                        modal:false,
                        width:600,
						height:430,
                        shadow:true,
						resizable:true,
						proxyDrag:true,
                        minWidth:300,
						minHeight:200
                });

				if(OS.isMac) stDialog.addListener("beforehide",SharedTabsWindow.beforehide);
                stDialog.addKeyListener(27, stDialog.hide, stDialog);
				stDialog.addButton( Framework.Lang.Add , ShardTabsManager.addSharedTabs);
				stDialog.syncBodyHeight();
		},

        showDialog : function( domNode )
		{
			if(OS.isMac) Layouter.hideCharts();
		    stDialog.show(domNode);
        },

		disableButton: function()
		{
			stDialog.buttons[1].disable();
		},
		hide: function()
		{
			stDialog.hide();
		}
    };
}();


var MysWindow = function(){
	var self=this;
    var myDialog, showBtn;
	var isGenerated;

    return {
        init : function(){

			//if( isGenerated )return;
			//else isGenerated = true;
			
			if($("mys-dlg-container")) document.body.removeChild($("mys-dlg-container"));
			
			var inner = "";
			inner += "<div id='mys-dlg' >";
			inner += "    <div class='x-dlg-hd' id='mytagInfoTitle'>" + Framework.Lang.tag_info+ "</div>";
			inner += "    <div class='x-dlg-bd' id='mysWindowBody'>";
			if(!Browser.isMacFirefox){
				inner += "	<div id='mytagSelector' >";
				inner += "	</div>";
			}
			inner += "		<div id='mytagInfoLoading'><img src='images/loader.gif' /></div>";
			inner += "   	<div id='mytagInfo'  style='padding:5px'>";
			inner += "    		";
			inner += "    	</div>";
			if(Browser.isMacFirefox){
				inner += "	<div id='mytagSelector' >";
				inner += "	</div>";
			}
			inner += "    </div>";
			inner += "    <div class='x-dlg-ft'> </div>";
			inner += "</div>";

			var div = document.createElement( "DIV");
			div.id = "mys-dlg-container";
			div.innerHTML = inner;
			document.body.appendChild( div );

           myDialog = new Ext.BasicDialog("mys-dlg", {
                        modal:false,
                        width:600,
						height:320,
                        shadow:true,
						draggable:(Browser.isMacFirefox ? false : true),
                       	proxyDrag:true,
                        minWidth:370,
						minHeight:160
                });

				if(OS.isMac || (Browser.isFirefox && OS.isLinux)) myDialog.addListener("beforehide",Layouter.showCharts);
				myDialog.addListener("beforehide",removeOptionsDiv);
                myDialog.addKeyListener(27, myDialog.hide, myDialog);
				myDialog.addButton( Framework.Lang.Remove , MysManager.myActioner, "remove");
				myDialog.addButton( Framework.Lang.AddToWindow , MysManager.myActioner, "add");
				myDialog.syncBodyHeight();
				myDialog.addListener("show", MysManager.drawTable);
		},

       showDialog : function( domNode )
		{
			if(OS.isMac || (Browser.isFirefox && OS.isLinux)) Layouter.hideCharts();
		    myDialog.show(domNode);
        }
    };
}();

ACJSArray = function() {
    var oACDS;
    var oAutoComp;
    return {

        init: function( arr ) {

			if( arr == null )arr = [];
            oACDS = new YAHOO.widget.DS_JSArray(arr);

            oAutoComp = new YAHOO.widget.AutoComplete('statesinput','statescontainer', oACDS);

            oAutoComp.queryDelay = 0;
            oAutoComp.prehighlightClassName = "yui-ac-prehighlight";
            oAutoComp.typeAhead = true;
            oAutoComp.useShadow = true;
        },

       validateForm: function() {
            return false;
        }
    };
}();


var MenuManager = {
	tooltip_objects: [],
	tb: null,
	
	init: function()
	{
		this.createTopMenu();
		this.createSEOModuleMenu();
		this.createCollectionsMenu();
		this.createToolsMenu();
		this.createTooltips();
		this.animateStartMenu();
		//this.createOptionsMenu();
		this.createControlPanelMenu();
	},
	
	createTopMenu: function(){
		tb = new Ext.Toolbar('menuContainer');

		var usName = document.createElement("DIV");
		usName.className = "userName";
		usName.innerHTML = User.userAccount;		
		var signOutEl = document.createElement("DIV");
		signOutEl.className = "signout";
		signOutEl.innerHTML = "<a href='javascript:void(0)'>"+Framework.Lang.footerLink_signOut+"</a>";
		Ext.EventManager.addListener(  signOutEl, "click",Layouter.request_signOut);

		$("toolbarRightContainer").appendChild(signOutEl);
		$("toolbarRightContainer").appendChild(usName);
	},
	
	createControlPanelMenu : function(){
		controlPanel = new ControlPanel();
		var actionFunc = function(event){
			controlPanel.loadData();
		};
		tb.add("-");
		var item = tb.add({
			text: "Keywords",
			handler: controlPanel.loadData,
			tooltip: 'Click To Manage all your tests'
		});		
	},
	
	createOptionsMenu : function(){
		var skinItemsArray = new Array();
		var checked = false;
		var changeStyleFromMenu = function(object){
			changeStyle(object.name);
		}
		for(var i=0; i<GENERAL_SETTINGS.SKINS.length; i++) {
			var skin = GENERAL_SETTINGS.SKINS[i];
			checked = (OPTIONS.theme == skin);
			var skinItem = new Ext.menu.CheckItem({
								text: GENERAL_SETTINGS.SKIN_NAMES[i],
								checked: checked,
								name: skin,
								group: 'skins',
								hideOnClick: false 
							});
			skinItem.addListener("click", changeStyleFromMenu, [skin]);
			skinItemsArray[i] = skinItem;
		}
		

		var menuOptions = new Ext.menu.Menu({
			id: 'menuOptions',
			items: [{
		                text: 'Skins',
		                menu: {
		                    items: skinItemsArray
		                }
					}				
			]
		});
		tb.add({
				cls: 'x-btn-text-icon bmenu',
				text:'Options',
				menu: menuOptions
		}); 
	},
		
	createSEOModuleMenu: seoTree.createSEOModuleMenu,
	
	createAddModuleMenu: function()
	{
	  	var addModuleBody = $("addModuleBody");

		var items = {}
		

		addModuleBody.innerHTML = "";

		for( var addname in items )
		{
			if( typeof(Framework.Lang.Menu[ addname ]) == "function" )continue;
			var menuItem = "";
		    menuItem += "<li class='menuItem' >";
		    menuItem += ' <div id="'+ addname +'"    dialogWidth="'+items[addname]["width"]+'" dialogHeight="'+items[addname]["height"]+'"    onclick="Controller.showDialogPanel( event,\''+items[addname]["mode"]+'\')" >';
		    menuItem += "  <div class='"+ items[addname]["className"] +"'  ></div>";
			menuItem += Framework.Lang.Menu[ addname ];
	 	    menuItem += " </div>";
		    menuItem += "</li>";

			addModuleBody.innerHTML += menuItem ;
		}
	},

	createToolsMenu: function(){

	  var toolsBody = $("toolsBody");
		
		var menuTools = new Ext.menu.Menu({
			id: 'menuTools'
		});
		tb.add({
				cls: 'x-btn-text-icon bmenu',
				text:'Tools',
				menu: menuTools
		});
	  var items = [
	  	{name: "Notification", img:"images/monitis/16x16/contacts.gif"},
		{name: "Feedback", img:"images/monitis/16x16/feedback.gif"},
		{name: "Note", img: "images/monitis/16x16/note.gif"},
		{name: "Todo", img:"images/monitis/16x16/todo.gif"},
		{name: "Options", img: "images/monitis/16x16/options.gif"}		
		];

		toolsBody.innerHTML = "";

		for( var i=0; i<items.length; i++ )
		{
			var menuItem = "";
			menuItem += "<li class='menuItem' id='"+ items[i].name +"'>";

			switch( items[i].name )
			{
				/*
				case "Options":
				{
					menuItem += this.generateDialogedMenuItem( items[i].name, (CURRENT_LANGUAGE == "ru") ? 540 : 520, 300);

					break;
				}
				*/
				case "TellFriend":
				{
					
					menuItem += this.generateDialogedMenuItem( items[i].name, 337, 335);
					this.generateDialogFromMenu(menuTools, items[i], 337, 335);
					
					break;
				}
				case "Feedback":
				{
					menuItem += this.generateDialogedMenuItem( items[i].name, 400, 240);
					this.generateDialogFromMenu(menuTools, items[i], 400, 200);
					
					break;
				}
				case "Options":
				{
					var modeName = items[i].name;
//					modeName = modeName.substr(0, modeName.length-1);
					menuItem += "   <div class='container' onclick='OptionsManager.openOptionsDialog( event )' align='center'>";
					menuItem += 		"<div class='iconStyle icon"+ items[i].name +"'  ></div>";
					menuItem += 		"<span class='itemName'>" + Framework.Lang.Menu[ modeName ] + "</span>";
					menuItem += "</div>";
					
					var actionFunc = function(event){
						OptionsManager.openOptionsDialog(event);
					};
					var item = menuTools.add({
						text: Framework.Lang.Menu[items[i].name],
						handler: actionFunc,
						icon: items[i].img
					});
					item.on("click", actionFunc);
										
					break;
				}
				case "SharedTabs":
				{
					menuItem += "   <div class='container' onclick='ShardTabsManager.openAddTabDialog()' align='center'>";
					menuItem += 		"<div class='iconStyle icon"+ items[i].name +"'  ></div>";
					menuItem += 		"<span class='itemName'>" + Framework.Lang.Menu[ items[i].name ] + "</span>";
					menuItem += "</div>";
					break;
				}
				
		
				case "Note":				
				{
					menuItem += '   <div class="container" onclick="generateDialogContent(\'Note\')" align="center">';
					menuItem += 		"<div class='iconStyle icon"+ items[i].name +"'  ></div>";
					menuItem += 		"<span class='itemName'>" + Framework.Lang.Menu[ items[i].name ] + "</span>";
					menuItem += "   </div>";
					
					var actionFunc = function(event){
						generateDialogContent('Note');
					};
					var item = menuTools.add({
						text: Framework.Lang.Menu[items[i].name],
						handler: actionFunc,
						icon: items[i].img 
					});
					
					
					
					break;
				}
				default:
				{
					menuItem += '   <div class="container" onclick="PortletLoader.addPortletFromTree( { moduleName : \''+ items[i].name +'\'});" align="center">';
					menuItem += 		"<div class='iconStyle icon"+ items[i].name +"'  ></div>";
					menuItem += 		"<span class='itemName'>" + Framework.Lang.Menu[ items[i].name ] + "</span>";
					menuItem += "   </div>";
					this.addPortletFromMenu(menuTools, items[i]);
				}
			}

			menuItem += "</li>";
			toolsBody.innerHTML += menuItem ;
		}
	},

	createCollectionsMenu: function()
	{
		var menuManage = new Ext.menu.Menu({
			id: 'menuManage'
		});
		tb.add({
				cls: 'x-btn-text-icon bmenu',
				text:'Manage',
				menu: menuManage
		});		
	  var collectionsBody = $("collectionsBody");

	  var items = [];		
		items[items.length] = {name: "SEO", img: "images/monitis/16x16/position.gif"};
		items[items.length] = {name: "SEOBacklinks", img: "images/monitis/16x16/backlinks.gif"};
		items[items.length] = {name: "SEOIndexedPages", img: "images/monitis/16x16/indexed_pages.gif"};
		items[items.length] = {name: "SEOPageRank", img: "images/monitis/16x16/page_ranks.gif"};
		items[items.length] = {name: "SEORanking", img: "images/monitis/16x16/ranking.gif"};
		items[items.length] = {name: "SEOSocialBookmarks", img: "images/monitis/16x16/social_bookmarks.gif"};
	
		collectionsBody.innerHTML = "";
		var menuItem = "";
		for( var i=0; i<items.length; i++ )
		{

			menuItem += "<li class='menuItem' id='"+ items[i].name +"'>";

			switch( items[i].name )
			{
				case "SEO":
				case "SEOBacklinks":
				case "SEOIndexedPages":
				case "SEOPageRank":
				case "SEORanking":
				case "SEOSocialBookmarks":
				{
					menuItem += 	'<div class="container" class="container" onclick="MysManager.openTagInfo(\''+items[i].name+'\', true)" align="center">';
					menuItem += 		"<div class='iconStyle icon"+ items[i].name +"Big' align='center'></div>";
					menuItem += 		"<span class='itemName'>" + Framework.Lang.Menu[items[i].name] + "</span>";
					menuItem += 	"</div>";
					this.generateDialogFromManageMenu(menuManage, items[i]);
					break;
				}
				default:
				{
					menuItem += '   <div class="container" onclick="PortletLoader.addPortletFromTree( { moduleName : \''+ items[i].name +'\'});" align="center">';
					menuItem += 		"<div class='iconStyle icon"+ items[i].name +"'  ></div>";
					menuItem += 		"<span class='itemName'>" + Framework.Lang.Menu[ items[i].name ] + "</span>";
					menuItem += "   </div>";
					this.addPortletFromMenu(menuManage, items[i]);
				}
			}

			menuItem += "</li>";
		}
		var myBuzzItem = {name: "SEOMyBuzz", img: "images/monitis/16x16/my_buzz.gif"};
		this.generateDialogFromManageMenu(menuManage, myBuzzItem);


		collectionsBody.innerHTML += menuItem ;
	},
	generateDialogedMenuItem: function( mode, width, height ){
		var menuItem = "";
		menuItem += '   <div class="container" onclick="Controller.showDialogPanel(event,\''+mode+'\')" dialogWidth="'+width+'" dialogHeight="'+height+'" align="center">';
		menuItem += 		"<div class='iconStyle icon"+ mode +"' dialogWidth='"+width+"' dialogHeight='"+height+"'></div>";
		menuItem += 		"<span class='itemName' dialogWidth='"+width+"' dialogHeight='"+height+"'>" + Framework.Lang.Menu[ mode ] + "</span>";
		menuItem += "</div>";
		return menuItem;
	},
	generateDialogFromManageMenu : function(menuToAdd, itemParam){
		var item = menuToAdd.add({
			text: Framework.Lang.Menu[itemParam.name],
			icon: itemParam.img
		});
		var actionFunc = function(event){
			MysManager.openTagInfo(itemParam.name, true);
		};
		item.on("click", actionFunc);		
	},
	generateDialogFromMenu : function(menuToAdd, itemParam, width, height){
		var item = menuToAdd.add({
			text: Framework.Lang.Menu[itemParam.name],
			icon: itemParam.img
		});
		var actionFunc = function(event){
			Controller.showDialogPanel(event, itemParam.name, null, width, height);
		};
		item.on("click", actionFunc);
	},
	addPortletFromMenu : function(menuToAdd, itemParam){
		var actionFunc = function(event){
			PortletLoader.addPortletFromTree({ moduleName : itemParam.name});
		};
		var item = menuToAdd.add({
			text: Framework.Lang.Menu[itemParam.name],
			handler: actionFunc,
			icon: itemParam.img
		});
		
	},

	createTooltips : function()
	{
	  var tooltips = ["SEO", "SEOBacklinks", "SEOIndexedPages", "SEOPageRank", "SEORanking", "SEOSocialBookmarks",
	  					"AddSEO", "AddSEOBacklinks", "AddSEOIndexedPages", "AddSEOPageRank", "AddSEORanking", "AddSEOSocialBookmarks",
						"Notification", "Note", "Todo", "Feedback", "Options"];
	  
	  var tooltipsSpace = $("tooltipsSpace");
	  for (var k = 0; k < tooltips.length; k++)
	  {
		var str = '<div class=tooltip id="'+tooltips[k] + '_tooltip">' + Framework.Lang['default' + tooltips[k] +'_infos']   + '</div>';
		tooltipsSpace.innerHTML += str;
	  }
	  for (var k = 0; k < tooltips.length; k++){
   				this.tooltip_objects[k] = new Tooltip(tooltips[k], tooltips[k] + '_tooltip');
   	  }
	  tooltipsSpace.style.visibility = "visible";
	},
	hideAllTooltips: function() {
	 	for(  var i=0; i<this.tooltip_objects.length; i++)
  			 this.tooltip_objects[i].hideTooltip();
	},
	animateStartMenu: function()
	{
		var oOptions=
		{
			dependent:true,
			openedIds:['my-dt-1'],
			seconds:0.3,
			easeOut:true,
			animation:false
		}
		var setting = new AccordionMenu.setting('my-dl',oOptions);
	},

	expandCollapse: function (target) {
	}
}

var MessageWindow = function(){
	var self=this;
	var isGenerated = false;

    var messageDialog;
	var okHandler;
	var cancelHandler;

	var handlerParams;

    return {
        init : function(){


			if( isGenerated )return;
			else isGenerated = true;

			var inner = "";
		    inner += "<div id='message-dlg'  class='unvisible'>";
			inner += "    <div class='x-dlg-hd' id='message_title'>Yani title</div>";
			inner += "    <div class='x-dlg-bd' >";
			inner += "    	<div id='message_body'>";
			inner += "    		<img src='images/loader.gif' /> "+ Framework.Lang.loading+"</script>";
			inner += "    	</div>";
			inner += "    </div>";
			inner += "    <div class='ydlg-ft'> </div>";
			inner += "</div>";


			var div = document.createElement( "DIV");
			div.innerHTML = inner;
			document.body.appendChild( div );


				var handleCancel = function(e) {
					messageDialog.hide();
					try{
					cancelHandler(handlerParams);
					}catch(ex){};

				}

				var handleOK = function(e) {
					messageDialog.hide();
					try{
					okHandler(handlerParams);
					}catch(ex){};

				}

	           messageDialog = new Ext.BasicDialog("message-dlg", {
	                        modal:false,
	                        width:300,
							height:300,
	                        shadow:true,
							fixedcenter: true,
							draggable: false,
							resizable:false,
	                        minWidth:300,
							minHeight:200
	                });
				MessageWindow.messageDialog = messageDialog;
				if(OS.isMac || (Browser.isFirefox && OS.isLinux)) messageDialog.addListener("beforehide",Layouter.showChartsForMsgDialog);
                messageDialog.addButton( Framework.Lang.Cancel , handleCancel);
				messageDialog.addButton( Framework.Lang.ok     , handleOK);

                messageDialog.addKeyListener(27, messageDialog.hide, messageDialog);
				messageDialog.setDefaultButton( messageDialog.buttons[1] );
				messageDialog.syncBodyHeight();
		},

        show: function( config )
		{
			$("message_title").innerHTML = config.header;
			var message_body = $("message_body")
			message_body.innerHTML  = config.body;

			okHandler     = config.okHandler;
			cancelHandler = config.cancelHandler;
			handlerParams = config.handlerParams;


			messageDialog.resizeTo( message_body.offsetWidth + 20, message_body.offsetHeight + 80 );
			if(OS.isMac || (Browser.isFirefox && OS.isLinux)) 	Layouter.hideCharts();
		    messageDialog.show( $("dummyNode") );

			if( config.hideCancel )
			{
				messageDialog.buttons[0].hide();
			}
			if( config.hideOk){
				messageDialog.buttons[1].hide();
			}
        }
    };
}();



var OptionsManager = {
	openOptionsDialog: function( event )
	{
		if(OS.isMac || (Browser.isFirefox && OS.isLinux)) Layouter.hideCharts();
		OptionsWindow.show( event );
	},
	openUpgradeDialog: function(event){
		if(OS.isMac || (Browser.isFirefox && OS.isLinux)) Layouter.hideCharts();
		OptionsWindow.show(event);
		var tabsPanel = OptionsWindow.optionsDialog.getTabs();
		tabsPanel.activate(tabsPanel.getCount() - 1 );

	},
	openSMSDialog: function(event){
		if(OS.isMac || (Browser.isFirefox && OS.isLinux)) Layouter.hideCharts();
		OptionsWindow.show(event);
		var tabsPanel = OptionsWindow.optionsDialog.getTabs();
		tabsPanel.activate(tabsPanel.getCount() - 1 );

	}
}

var OptionsWindow = function(){
    var optionsDialog, showBtn;
	var self=this;
	var isGenerated = false;
    return {
		show: function( event )
		{

            if(!optionsDialog){
			if( isGenerated )return;
			else isGenerated = true;

				var inner = "";
				var innerArray = [];
			    innerArray.push( "<div id='options-dlg' >" );
				innerArray.push( "    <div class='x-dlg-hd' id='message_title'>"+ Framework.Lang.appOptions +"</div>" );
				innerArray.push( "    <div class='x-dlg-bd' id='options_body'>" );
		        innerArray.push( "			<div class='x-dlg-tab' title='"+Framework.Lang.options.genSettings+"'>" );
		        innerArray.push( "   			 <div class='inner-tab'>" );
		        innerArray.push( getOptionsContent() );
		        innerArray.push( "    			</div>" );
		        innerArray.push( "			</div>" );
		        innerArray.push( "			<div class='x-dlg-tab' title='"+Framework.Lang.options.skins+"'>" );
		        innerArray.push( "   			 <div class='inner-tab'>" );
		        innerArray.push( getSkinsList() );
		        innerArray.push( "   			 </div>" );
		        innerArray.push( "			</div>" );
				innerArray.push( "			<div class='x-dlg-tab' title='"+Framework.Lang.options.myAccount+"'>" );
		        innerArray.push( "   			 <div class='inner-tab'>" );
		        innerArray.push( getProfile() );
		        innerArray.push( "   			 </div>" );
		        innerArray.push( "			</div>" );
				innerArray.push( "			<div class='x-dlg-tab' title='"+Framework.Lang.options.sms+"'>" );
		        innerArray.push( "   			 <div class='inner-tab'>" );
		        innerArray.push( getSMSContent() );
		        innerArray.push( "   			 </div>" );
		        innerArray.push( "			</div>" );
				innerArray.push( "    </div>" );
				innerArray.push( "    <div class='ydlg-ft'> </div>" );
				innerArray.push( "</div>" );

				inner = innerArray.join('');

				var div = document.createElement( "DIV");
				div.innerHTML = inner;
				document.body.appendChild( div );
				changeFormStyle($("options_body"), true, false, true, true, false);

	            optionsDialog = new Ext.BasicDialog("options-dlg", {
							modal:false,
							proxyDrag:true,
	                        width:(User.plan == FREEPLAN) ? 880 : 840,
	                        height:460,
	                        shadow:true,
	                        minWidth:300,
	                        minHeight:300,
							autoTabs: true,
							autoScroll:true,
							resizable: true
	                });
	                if(OS.isMac || (Browser.isFirefox && OS.isLinux)) optionsDialog.addListener("beforehide",Layouter.showCharts);
	                optionsDialog.addKeyListener(27, optionsDialog.hide, optionsDialog);
	                optionsDialog.addButton('Done', optionsDialog.hide, optionsDialog);
					OptionsWindow.optionsDialog = optionsDialog;
	            }

			//var node = event.target || event.srcElement;
            optionsDialog.show();
//			optionsDialog.setContentSize(optionsDialog.body);

			 if( isGenerated && Browser.isIE){
			 		setTimeout( "OptionsWindow.resizeForIE()", 1200 );
			  }

      	},
      	resizeForIE:function(){
      	  		optionsDialog.resizeTo((User.plan == FREEPLAN) ? 880 : 840,460);

      	}
    };
}();
