
//SPLICE doesn't work in IE :(
// http://developer.mozilla.org/en/docs/Core_JavaScript_1.5_Reference:Global_Objects:Array:splice
// ----------------------------------------------------------------
if(!Array.splice) Array.splice = function(iStart, iLength) {
// ----------------------------------------------------------------
	if(iLength < 0) iLength = 0;

	var aInsert = new Array();
	if(arguments.length > 2) {
		for(var i=2; i<arguments.length; i++) {
			aInsert.push(arguments[i]);
		}
	}

	var aHead = this.subarray(0, iStart);
	var aDelete = this.subarr(iStart, iLength);
	var aTail = this.subarray(iStart + iLength);

	var aNew = aHead.concat(aInsert, aTail);

	// Rebuild yourself
	this.length = 0;
	for(var i=0; i<aNew.length; i++) {
		this.push(aNew[i]);
	}

	return aDelete;
}


// Using Javascript module pattern
YAHOO.namespace("CLWRWidget.Favorites");

YAHOO.CLWRWidget.Favorites = function() {

	/*********** Private variables ****************/
	var numOfWidgetFavs=0;
	var widgetFavsLoaded=0;

	var widgetFavs = new Array();

	widgetFavs.length=numOfWidgetFavs;

	//var widgetFavHTML='<li class="show">';
	var widgetPagingHTML='';
	var wfSelectedPage = 0;

	/*********** Private methods ****************/

	getWidgetFavHTML = function(startIndex) {
		var widgetFavHTML='<li class="show">';
		var widgetShowCount = (widgetFavs.length-startIndex > 3) ? 3: widgetFavs.length-startIndex;
		for(var i=startIndex; i<startIndex+widgetShowCount; i++)
		{
			
			//if ((i!=0) && (i%3)==0){
			//	widgetFavHTML+='</li><li>';
			//}

			widgetFavHTML+='<div class="wfItem">';
			widgetFavHTML+='<iframe id="iframeFav'+i+'" src="'+widgetFavs[i].widget_iframe_src+'" class="container" frameborder="0" scrolling="no" allowtransparency="true"></iframe>';
			widgetFavHTML+='<p><input type="text" size="1" value="'+(i+1)+'" id="newMove_'+i+'"> of '+numOfWidgetFavs+'</span>';
			widgetFavHTML+='<span id="widgetMove_'+i+'"><a href="javascript:YAHOO.CLWRWidget.Favorites.makeWFMove('+i+')">Move</a></span>|';
			widgetFavHTML+='<span><a href="javascript:YAHOO.CLWRWidget.Favorites.deleteWidgetFav('+i+')">Delete</a></span></p></div>';
		}

		widgetFavHTML+='</li>';

		return widgetFavHTML;
	},

	reloadWidgetFavs = function(){
		//var curPage = wfCurrentPage();
		var curPage = wfSelectedPage;

		totalWidgetPages=Math.round((numOfWidgetFavs/3)+.3);

		var selectedPage; 
		if( curPage >=  totalWidgetPages )
			selectedPage = totalWidgetPages - 1;
		else if( curPage < 0  )
			selectedPage = 0; 
		else
			selectedPage = curPage; 

		wfSelectedPage = selectedPage;

		/*widgetFavHTML='';
		for(var i=0; i<widgetFavs.length; i++)
		{
			if ((i%3)==0){
				widgetFavHTML += '<li ';
				if ((i/3)== selectedPage){
					widgetFavHTML+=' class="show"';
				}
				widgetFavHTML += '>'; 
			}


			widgetFavHTML+='<div class="wfItem">';
			widgetFavHTML+='<iframe id="iframeFav'+i+'" src="'+widgetFavs[i].widget_iframe_src+'" class="container" frameborder="0" scrolling="no" allowtransparency="true"></iframe>';
			//widgetFavHTML+='<p><span id="widgetFavNum_'+i+'">'+(i+1)+' of '+numOfWidgetFavs+'</span>';
			widgetFavHTML+='<p><input type="text" size="1" value="'+(i+1)+'" id="newMove_'+i+'"> of '+numOfWidgetFavs+'</span>';
			widgetFavHTML+='<span id="widgetMove_'+i+'"><a href="javascript:YAHOO.CLWRWidget.Favorites.makeWFMove('+i+')">Move</a></span>|';
			widgetFavHTML+='<span><a href="javascript:YAHOO.CLWRWidget.Favorites.deleteWidgetFav('+i+')">Delete</a></span></p></div>';
			
			if ((i%3)==2 || (i == (widgetFavs.length-1))){
				widgetFavHTML+='</li>';
			}
		}

		widgetFavHTML+='</li>';
		*/

		var list = document.getElementById('wfWidgetList').getElementsByTagName('LI');
		list[0].parentNode.removeChild(list[0]);
		document.getElementById('wfWidgetList').innerHTML=getWidgetFavHTML(selectedPage*3);

		widgetPagingHTML='';


		for(i=0;i<totalWidgetPages;i++){
			widgetPagingHTML+='<a';
			if (i==selectedPage){
				widgetPagingHTML+=' class="selected"';
			}
			widgetPagingHTML+=' href="javascript:YAHOO.CLWRWidget.Favorites.wfSelectPage('+i+');">';
			widgetPagingHTML+=(i+1);
			widgetPagingHTML+='</a>';
		}
		document.getElementById('wfPaging').innerHTML=widgetPagingHTML;
	}

	dupeArray = function(arrayOne,arrayTwo){
		arrayOne.length=arrayTwo.length;
		for(i=0;i<arrayOne.length;i++){
			arrayOne[i]=arrayTwo[i];
		}
		return arrayOne;
	}

	generateSaveWidgetFavsXMLRequest = function ()
	{
		// Initiate the XML
		var xml = '<?xml version="1.0" encoding="utf-8" ?>';

		xml += '<WidgetList>';


		for( var i=0; i< widgetFavs.length; i++)
		{

			xml += '<Widget>';
			xml += '<InstanceID>' + widgetFavs[i].widget_instance_id + '</InstanceID>';
			xml += '<FavoritePosition>' + i + '</FavoritePosition>';
			xml += '</Widget>';
		}
		xml += '</WidgetList>';

		return xml;

	}
		
	/*wfCurrentPage = function() {
		var curIndex = 0;
		var list = document.getElementById('wfWidgetList').getElementsByTagName('LI');
		for (var i=0; i<list.length; i++) {
			if(list[i].className == 'show') {
				curIndex = i;
			}
		}

		return curIndex;
	}*/

	loadWidgetFavs = function (){

		YAHOO.example.Local_XML = new function() {
			this.connectionCallback = {
				cache: false,
				success: function(o) {
					var xmlDoc = o.responseXML.documentElement;
					var widgets=xmlDoc.getElementsByTagName("Widget");
					numOfWidgetFavs = widgets.length;

					var totalWidgetPages=Math.round((numOfWidgetFavs/3)+.4);
					
					// Create the widget favorites array. 
					widgetFavs = new Array();
					for(var i=0;i<widgets.length;i++){
						var widgetItem = new Object();

						widgetItem.widget_instance_id=xmlDoc.getElementsByTagName("InstanceID")[i].childNodes[0].nodeValue;
						widgetItem.widget_id=xmlDoc.getElementsByTagName("WidgetID")[i].childNodes[0].nodeValue;
						widgetItem.widget_url=replaceURLSizeParams(xmlDoc.getElementsByTagName("WidgetURI")[i].childNodes[0].nodeValue);
						widgetItem.widget_iframe_src= "widgets/container.jsp?id="+widgetItem.widget_id+"&uri="+escape(widgetItem.widget_url)+"&instanceID="+widgetItem.widget_instance_id;

						widgetFavs[i]=widgetItem;
					}
					
					// Generate the HTML for the widgets
					widgetPagingHTML = '';

					for(i=0;i<totalWidgetPages;i++){
						widgetPagingHTML+='<a';
						if (i==0){
							widgetPagingHTML+=' class="selected"';
						}
						widgetPagingHTML+=' href="javascript:YAHOO.CLWRWidget.Favorites.wfSelectPage('+i+');">';
						widgetPagingHTML+=(i+1);
						widgetPagingHTML+='</a>';
					}
					document.getElementById('wfPaging').innerHTML=widgetPagingHTML;

					/*widgetFavHTML='<li class="show">';
					var widgetShowCount = (widgetFavs.length > 3) ? 3: widgetFavs.length;
					for(var i=0; i<widgetShowCount; i++)
					{
						
						//if ((i!=0) && (i%3)==0){
						//	widgetFavHTML+='</li><li>';
						//}

						widgetFavHTML+='<div class="wfItem">';
						widgetFavHTML+='<iframe id="iframeFav'+i+'" src="'+widgetFavs[i].widget_iframe_src+'" class="container" frameborder="0" scrolling="no" allowtransparency="true"></iframe>';
						widgetFavHTML+='<p><input type="text" size="1" value="'+(i+1)+'" id="newMove_'+i+'"> of '+numOfWidgetFavs+'</span>';
						widgetFavHTML+='<span id="widgetMove_'+i+'"><a href="javascript:YAHOO.CLWRWidget.Favorites.makeWFMove('+i+')">Move</a></span>|';
						widgetFavHTML+='<span><a href="javascript:YAHOO.CLWRWidget.Favorites.deleteWidgetFav('+i+')">Delete</a></span></p></div>';
					}

					widgetFavHTML+='</li>';*/

					var widgetFavHTML = getWidgetFavHTML(0);

					wfSelectedPage = 0;

					document.getElementById('wfWidgetList').innerHTML=widgetFavHTML;

					YAHOO.CLWRWidget.Favorites.hideElement('wfBusy');
					if( numOfWidgetFavs <= 0)
						YAHOO.CLWRWidget.Favorites.showElement('wfSteps');
					else
					{
						YAHOO.CLWRWidget.Favorites.hideElement('wfSteps');
						YAHOO.CLWRWidget.Favorites.showElement('wfWidgets');
					}

				},
				failure: function(o) {

				}
			};

			this.getXML = YAHOO.util.Connect.asyncRequest("GET",
					"GetWidgets",
					this.connectionCallback);
		   };
		   widgetFavsLoaded=1;
	}//end of loadWidgetFavs

	saveWidgetFavs = function()
	{
		// Indicate that the widget canvas is out of sync with the backend. 
		syncState = false;

		YAHOO.example.Local_XML = new function() {
			var xml = generateSaveWidgetFavsXMLRequest();
			this.connectionCallback = {
				success: function(o) {
				},
				failure: function(o) {
					// Dont do anything for now. Sync state is false, we'll try again when the DOM unloads. 
				}
			};

			this.getXML = YAHOO.util.Connect.asyncRequest("POST",
					"SaveWidgetFavorites",
					this.connectionCallback,
					xml);
		};
	}

	/*================== End of Private methods =======================*/

	
	/*********** Public methods ****************/
	return {


		deleteWidgetFav: function (toDelete){
			if(confirm("Are you sure you wish to delete this from your Widget Favorites?")){
				var instanceID = widgetFavs[toDelete].widget_instance_id;
				widgetFavs.splice(toDelete,1);
				
				numOfWidgetFavs--;
				
				YAHOO.CLWRWidget.Favorites.removeWidget(instanceID);

				if (numOfWidgetFavs==0){
					this.hideElement('wfWidgets');
					this.showElement('wfSteps');
				}
				reloadWidgetFavs();


				toggleAddFavoritesLink( instanceID, true);
			}//confirm
		}, 

		makeWFMove: function (toMove){
			toMoveTo=document.getElementById('newMove_'+toMove).value;
			if(toMoveTo >= numOfWidgetFavs){
				widgetFavs.push(widgetFavs[toMove]);
				widgetFavs.splice(toMove,1);
			} else if (toMoveTo <= 1) {
				var tempWFArray=[];
				tempWFArray=dupeArray(tempWFArray,widgetFavs);
				widgetFavs[0]=tempWFArray[toMove];
				tempWFArray.splice(toMove,1);
				for(i=1;i<widgetFavs.length;i++){
					widgetFavs[i]=tempWFArray[i-1];
				}
			} else {
				toMoveTo--;
				var tempWFArray=[];
				tempWFArray=dupeArray(tempWFArray,widgetFavs);
				widgetMoving=tempWFArray.splice(toMove,1);
				var alreadyMoved=0;
				for(i=0;i<tempWFArray.length+1;i++){
					if(i<toMoveTo){
						widgetFavs[i]=tempWFArray[i];
					} else if (i==toMoveTo) {
						widgetFavs[i]=widgetMoving[0];
					} else {
						widgetFavs[i]=tempWFArray[i-1];
					}
				}
			}
			
			reloadWidgetFavs();

			// Save the favorites to the backend.
			saveWidgetFavs()
		}, 

		betterConfirm: function (message){
			document.getElementById('confirmMessage').innerHTML=message;
			YAHOO.CLWRWidget.Favorites.confirmPanel.show();
		}, 
		


		wfScroller: function(scrollAmount) {
			
			var list = document.getElementById('wfWidgetList').getElementsByTagName('LI');
			var pagingList = document.getElementById('wfPaging').getElementsByTagName('a');
			
			//var curIndex = wfCurrentPage();
			var curIndex = wfSelectedPage;
			
			if(curIndex == 0 && scrollAmount < 0) {
				curIndex = pagingList.length-1;
			} else if(curIndex == (pagingList.length-1) && scrollAmount > 0) {
				curIndex = 0;
			} else {
				curIndex = curIndex + scrollAmount;
			}

			wfSelectedPage = curIndex;
			
			for (var i=0; i<pagingList.length; i++) {
				//list[i].className = null;
				pagingList[i].className = null;
			}
			
			//list[curIndex].className = 'show';
			pagingList[curIndex].className = 'selected'; 

			list[0].parentNode.removeChild(list[0]);
			document.getElementById('wfWidgetList').innerHTML = getWidgetFavHTML(wfSelectedPage*3);

		}, 

		wfSelectPage: function(page) {
			var list = document.getElementById('wfWidgetList').getElementsByTagName('LI');
			var pagingList = document.getElementById('wfPaging').getElementsByTagName('a');
			
			for (var i=0; i<pagingList.length; i++) {
				//list[i].className = null;
				pagingList[i].className = null;
			}
			
			wfSelectedPage = page;

			//list[page].className = 'show';
			pagingList[page].className = 'selected';	

			list[0].parentNode.removeChild(list[0]);
			document.getElementById('wfWidgetList').innerHTML = getWidgetFavHTML(wfSelectedPage*3);
		}, 
				
		showElement: function(obj) {
			if( document.getElementById(obj) ) {
				document.getElementById(obj).style.display = 'block';
				
				// IE specific bug fix #2767. 
				if( obj == "wfWidgets" && YAHOO.env.ua.ie > 0) {
					document.getElementById('next').style.visibility = 'visible';
					document.getElementById('prev').style.visibility = 'visible';
					document.getElementById('widgetLoginButton').style.visibility = 'visible';
				}
			}
		}, 

		hideElement: function (obj) {
			if( document.getElementById(obj) ) {
				document.getElementById(obj).style.display = 'none';
				
				// IE specific bug fix #2767. 
				if( obj == "wfWidgets" && YAHOO.env.ua.ie > 0) {
					document.getElementById('next').style.visibility = 'hidden';
					document.getElementById('prev').style.visibility = 'hidden';
					document.getElementById('widgetLoginButton').style.visibility = 'hidden';
				}
			}
		}, 

/*
		widgetManDepressed: function (aLink,shownOrNot){
			if (shownOrNot){
				document.getElementById('widgetManConnect').style.background='url(images/widgetfavorites/widget_favorites_link_selected.gif) repeat-x';
				aLink.style.color='#FFFFFF';
			} else {
				document.getElementById('widgetManConnect').style.background='';
				aLink.style.color='#676B38';
			}
		},
*/		

		getWidgetFavorites: function ()	{
			this.hideElement('wfLogin');
			this.hideElement('wfSteps');
			this.hideElement('wfWidgets');
			this.showElement('wfBusy');

			loadWidgetFavs();
		},

		addWidget: function (widgetInstanceID) {
			
			if( widgetFavs.length >= 15 ) {
				alert("You can only add up to 15 widgets to your favorites. To add more widgets, delete some widgets from your favorites and try again. ");
				return;
			}

			toggleAllAddFavoritesLinks( false );
			YAHOO.example.Local_XML = new function() {
				this.connectionCallback = {
					success: function(o) {
						toggleAllAddFavoritesLinks( true );
						
						var status = ""; 
						if( o.getResponseHeader['X-status'] )
							status = o.getResponseHeader['X-status']; 
						else if( o.getResponseHeader['X-Status'] )
							status = o.getResponseHeader['X-Status'];

						if( status.indexOf("success") < 0) {
							alert("Unable to add this widget to favorites at this time. Please try again later.");
						}
						else {
							// If widget favorites is already open, update it
							//if( document.getElementById('widgetFavorites').style.display != 'none' )
								YAHOO.CLWRWidget.Favorites.getWidgetFavorites();
							toggleAddFavoritesLink(widgetInstanceID, false);
						}
							 
						
					},
					failure: function(o) {
						toggleAllAddFavoritesLinks( true );
						alert("Unable to add this widget to favorites at this time. Please try again later.");
					}
				};

				this.getXML = YAHOO.util.Connect.asyncRequest("POST",
						"SetWidgetFavorites",
						this.connectionCallback,
						"InstanceID="+widgetInstanceID+"&action=add");
			};
			
		},

		removeWidget: function (widgetInstanceID) {
			YAHOO.example.Local_XML = new function() {
				this.connectionCallback = {
					success: function(o) {
						unmarkWidgetFavorite(widgetInstanceID);
						toggleAllAddFavoritesLinks( true );

						var status = ""; 
						if( o.getResponseHeader['X-status'] )
							status = o.getResponseHeader['X-status']; 
						else if( o.getResponseHeader['X-Status'] )
							status = o.getResponseHeader['X-Status'];

						if( status.indexOf("success") < 0) {
							alert("Unable to remove this widget from favorites at this time. Please try again later.");
						}
							 
						
					},
					failure: function(o) {
						alert("Unable to remove this widget from favorites at this time. Please try again later.");
					}
				};

				this.getXML = YAHOO.util.Connect.asyncRequest("POST",
						"SetWidgetFavorites",
						this.connectionCallback,
						"InstanceID="+widgetInstanceID+"&action=remove");
			};
			
		}



	}; // End public methods
}();// Causes the above module to execute and makes the namespace methods available. 

YAHOO.namespace("CLWRWidget.CustomWidget");



function initCustomWidget(){
	YAHOO.CLWRWidget.CustomWidget.panel = new YAHOO.widget.Panel("customWidgetPanel", 
				{ 
					effect:{effect:YAHOO.widget.ContainerEffect.FADE,duration:0.45}, 
					fixedcenter:true,
					constraintoviewport:true,
					underlay:"shadow",
					close:false,
					visible:false,
					draggable:false, 
					modal:true,
					width:"390px"
				} );
				YAHOO.CLWRWidget.CustomWidget.panel.render();
}

YAHOO.util.Event.addListener(window, "load", initCustomWidget);

function addCustomWidget(widgetName, sectionID, sectionName, keyword, amgID) {


	// If the pop up is already visible, do not show it again.
	if( YAHOO.CLWRWidget.CustomWidget.panel.cfg.getProperty("visible")  == true )
		return;

	var el = document.getElementById("customWidgetAddHeader");
	el.innerHTML= "<h4>Add a ("+keyword+") Widget:</h4>"
	el = document.getElementById("customWidgetAddBody");
	el.innerHTML = "<span>Please wait while the widget is being added.</span><br /><img src=\"images/loading.gif\" height=\"20\" width=\"20\" align=\"top\" />";

	document.getElementById("customWidgetPanel").style.display = 'block';
	YAHOO.CLWRWidget.CustomWidget.panel.show();

	// Add the widget here. 
	YAHOO.example.Local_XML = new function() {
        this.connectionCallback = {
			success: function(o) {
				
				var status = ""; 
				if( o.getResponseHeader['X-status'] )
					status = o.getResponseHeader['X-status']; 
				else if( o.getResponseHeader['X-Status'] )
					status = o.getResponseHeader['X-Status'];
				
				var el = document.getElementById("customWidgetAddBody");
				if( status.indexOf("success") >= 0 ){
				
					el.innerHTML = "Your widget has been successfully created and added to your widgets page.";
				} else {
					el.innerHTML = o.responseText;
				}

            },
            failure: function(o) {
				var el = document.getElementById("customWidgetAddBody");
				el.innerHTML = "Unable to add the widget at this time.";
	        }
        };
		var requestData = "widgetName="+widgetName+"&section="+sectionID+"&keyword="+keyword;
		if( amgID )
			requestData += "&amgID="+ amgID;
        this.getXML = YAHOO.util.Connect.asyncRequest("POST",
                "AddCustomWidget",
                this.connectionCallback,
				requestData);
    };
}


// http://www.netlobo.com/url_query_string_javascript.html
function getUrlParam( url, name ) {
  name = name.replace(/[\[]/,"\\\[").replace(/[\]]/,"\\\]");
  var regexS = "[\\?&]"+name+"=([^&#]*)";
  var regex = new RegExp( regexS );
  
  var results = regex.exec( url );
  if( results == null )
	return "";
  else
	return results[1];
}

function replaceURLSizeParams(url) {
	var newHeight, newWidth, newXWidth, newXHeight; 
	var height = getUrlParam(url, "height");
	var xheight = getUrlParam(url, "xheight");
	var width = getUrlParam(url, "width");
	var xwidth = getUrlParam(url, "xwidth");
	

	if( height && height < 202 )
		url = url.replace("height="+height, "height=202");
	if( xheight && xheight < 212 )
		url = url.replace("xheight="+xheight, "xheight=212");
	else if(!xheight) {
		if( url.charAt(url.length-1) != '&' )
			url += "&";
		url += "xheight=212&";
	}
	if( width && width < 274 )
		url = url.replace("width="+width, "width=284");
	if( xwidth && xwidth < 284 )
		url = url.replace("xwidth="+xwidth, "xwidth=284");
	else if( !xwidth ) {
		if( url.charAt(url.length-1) != '&' )
			url += "&";
		url += "xwidth=284&";
	}


	return url;
}

function toggleAddFavoritesLink(instanceID, state)
{
	if( typeof(widgetList) != "undefined" ) {
		var el = document.getElementById("addToFavorites_"+instanceID);
		if ( !el )
			return;

		if (state == true)	{
			el.style.color = ""; 
			el.innerHTML = getAddFavoritesHref(instanceID);
		}else {
			//el.style.color = "#aaaaaa"; 
			//el.innerHTML = "+ Add To Favorites&nbsp;";
			el.innerHTML = "";
		}
	}
}

// Disable or enable Add To Favs links
// Links are disabled when a favorite addition is in progress and re-enabled after completion. 
function toggleAllAddFavoritesLinks(state)
{
	if( typeof(widgetList) != "undefined" ) {
		for( var i=0; i<widgetList.length; i++) {
			// Disable all links; Re-enable links only if that widget is not already in favorites
			if( (state == false) || (widgetList[i].widget_position_favorites == -1) )
				toggleAddFavoritesLink(widgetList[i].widget_instance_id, state);
		}
	}
}

function unmarkWidgetFavorite(instanceID)
{
	if( typeof(widgetList) != "undefined" ) {
		var index = parseInt( findWidgetIndex( instanceID ) );

		widgetList[index].widget_position_favorites = -1;
	}
}
