var browserName = navigator.appName;
var Ajax = Ajax.extend({

	options: {
		method: 'post',
		async: true,
		postBody: null,
		update: null,
		evalScripts: false,
		evalResponse: false,
		encoding: 'utf-8'
	},
	
	initialize: function(url, options){
		this.addEvent('onSuccess', this.onComplete);
		this.setOptions(options);
		/*compatibility*/
		this.options.data = this.options.data || this.options.postBody;
		/*end compatibility*/
		if (this.options.method != 'post' && this.options.method != 'get'){
			this._method = '_method=' + this.options.method;
			this.options.method = 'post';
		}
		this.parent();
		this.setHeader('X-Requested-With', 'XMLHttpRequest');
		this.setHeader('Accept', 'text/javascript, text/html, application/xml, text/xml, */*');
		
		// The main reason for extending is here
		// Prefix URL with /xsp/* if protocol is HTTPS
		if (window.location.protocol.toLowerCase() == 'https:') {
			this.url = url.replace('protected', 'xsp/protected');
		} else {
			this.url = url;
		}
	}
});


/**
 * Pagination for Reservation
 */
var jsPaginationReservation = {
		
	totalRec: null,
	fromAjax: null, 
		
	init:function(el,args) {
			var nextArgs = new Array();
			var prevArgs = new Array();
		 	prevArgs[1] = 'prevPage';
		    $("prevPage").addEvent("click",function(){ jsPaginationReservation.page(el, prevArgs) });
		    nextArgs[1] = 'nextPage';
		    $("nextPage").addEvent("click",function(){ jsPaginationReservation.page(el, nextArgs) });
		
	},
	
	update: function(el, args) {
		var elTable = $(args[1]);
		if (!elTable) {
			if(el.tagName == "A") {
				el.nullifyLink();
			}
			return true;
		} else {
			var showVal = parseInt(el.getSelectedValue());
			var elTbody = elTable.getElements("TBODY")[0];
			var elTRList = elTbody.getElements("TR");
			var totalRows = elTRList.length;
			this.totalRec = totalRows;
			
			for (var i=0; i < totalRows; i++) {
				var elTR = elTRList[i];
					elTR.style.display = "";
				if (i >= showVal) {
					elTR.style.display = "none";
				}
			}
			
			var elSelect = $("range");
			var indicator = $("moreIndicator");
			
			elSelect.options.length = 0;
			elSelect.options[elSelect.options.length] = new Option(1 + "-" + showVal, 1);
			for(var i=1; i*showVal < totalRows;) {
				elSelect.options[elSelect.options.length] = new Option(i++*showVal+1 + "-" + showVal*i, i);
			}
			if (indicator.value == 'true'){
				totalRows = totalRows + 20;
				for(var i=1; i*showVal < totalRows;) {
					elSelect.options[elSelect.options.length] = new Option(i++*showVal+1 + "-" + showVal*i, i);
				}
			}
			
			var elSelectPage = $("per_page");
			if (indicator.value == 'true'){
				elSelectPage.options[elSelectPage.options.length] = new Option(showVal*2, showVal*2);
			}
			
			elSelect.addEvent("change", jsPaginationReservation.page);
			
			
		}
		
	},
	
	page: function(el, args) {
		var elSelectRange = $("range");
		var elSelectPage = $("per_page");
		if (args) {
			if (args[1] == PREV_PAGE) {
				if (elSelectRange.selectedIndex-1 >= 0) {
					elSelectRange.options[elSelectRange.selectedIndex-1].selected = true;
				}
			} else if (args[1] == NEXT_PAGE) {
				if (elSelectRange.selectedIndex+1 < elSelectRange.options.length) {
					elSelectRange.options[elSelectRange.selectedIndex+1].selected = true;
				}
			}
		}

		var showVal = parseInt(elSelectPage.getSelectedValue()); // Number of record per page
		var page = parseInt(elSelectRange.getSelectedValue()); // Page Id of per page set
		var currIndex = elSelectRange.selectedIndex;
		var currShow = elSelectRange.selectedIndex;
		var total = $("totalRows").innerHTML;
		var indicator = $("moreIndicator");
		var callAjax = false;
		var index = $('range').value;
		var valFromDrop = showVal * index;
		if (index == 1){
			if (showVal > total){
				callAjax = true;
			} 
		} else if (index > 1){
			if (valFromDrop > total){
			callAjax = true;
			}
		}
		
		if (indicator.value == 'true' && callAjax == true ){
			new Ajax("/protected/cruisematch/UpdateReservations.do?shipBrand=" + $('shipBrand').value + 
			"&shipName=" + $('selectLarge').value + "&fromDay=" + $('sailingDateDay').value + "&fromMonthYear=" + $('sailingDateMonthYear').value 
			+ "&name=" 	+ $('reservationName').value,
				{method:'get',onComplete:function(request){
					var divId = document.getElementById("ajaxRsvResult");
					divId.innerHTML = request;
					this.fromAjax = true;
					jsPaginationReservation.getResults(el, args, page, showVal, this.totalRec, this.fromAjax);
			}}).request();
		} else {
			this.fromAjax = false;
			jsPaginationReservation.getResults(el, args, page, showVal, this.totalRec, this.fromAjax);
		}
	},
	
	getResults:  function(el, args, page, val, totalRows, fromAjax) {
		var elTable = document.getElementById("sortTableBody");
		var elTbody = elTable.getElementsByTagName("tbody")[0];
		var elTRList = elTbody.getElementsByTagName("TR");
		
		var totalRows = elTRList.length;
		this.totalRec = totalRows
			for (var i=0; page > 0 && i < totalRows; i++) {
			var elTR = elTRList[i];
				elTR.style.display = "";
				
				if (i < page*val-val || i >= page*val) {
					elTR.style.display = "none";
				}
		}
		
		jsPaginationReservation.updateDropDown(el, args, this.totalRec, val, page, fromAjax);
	},
	
	updateDropDown: function (el, args, totalRows, showVal, page, fromAjax){
			var elSelect = $("range");
			var elSelectPage = $("per_page");
			var indicator = $("moreIndicator");
			var newCounter = 1;
				
			if (fromAjax == true){
			elSelect.options.length = 0;
			elSelect.options[elSelect.options.length] = new Option(1 + "-" + showVal, 1);
			for(var i=1; i*showVal < totalRows; ) {
				elSelect.options[elSelect.options.length] = new Option(i++*showVal+1 + "-" + showVal*i, i);
				newCounter = i;
			}
			if (indicator.value == 'true'){
				var newTotal = (showVal*elSelect.options.length) + showVal;
				if (newTotal <= totalRows+showVal){
				elSelect.options[elSelect.options.length] = new Option(showVal*elSelect.options.length + 1 + "-" + newTotal, newCounter+1);
				}
			}
			
				elSelectPage.options.length = 0;
				for(var i=0; i <= totalRows; i= i + 20) {
					elSelectPage.options[elSelectPage.options.length] = new Option(i+20, i+20);
				}
				elSelectPage.setSelectedValue(showVal);
			
			} else {
				var selectedOption = elSelect.selectedIndex;
				elSelect.options.length = 0;
				elSelect.options[elSelect.options.length] = new Option(1 + "-" + showVal, 1);
					for(var i=1; i*showVal < totalRows;) {
						elSelect.options[elSelect.options.length] = new Option(i++*showVal+1 + "-" + showVal*i, i);
						newCounter = i;
					}
				elSelect.setSelectedValue(selectedOption+1);
			}
			elSelect.setSelectedValue(page);
			if (indicator.value == 'true'){
				var newTotal = (showVal*elSelect.options.length) + showVal;
				if (newTotal <= totalRows+showVal){
				elSelect.options[elSelect.options.length] = new Option(showVal*elSelect.options.length + 1 + "-" + newTotal, newCounter+1);
				}
			}
			var elLabel = $("totalRows");
			elLabel.innerHTML = totalRows;
			jsSortable.init($("sortTableBody"));
	}
}


/**
 *	Modal popup window widget
 */
var jsModalPopup = {
	
	/**
	 *	modal The modal popup window widget
	 *  popup The popup content holder
	 *  secondPopup The seconday popup content holder
	 *  addedCSS CSS includes from the popup content pulled in
	 *  parentCSS CSS includes from the parent document
	 */
	modal: null,
	popup: null,
	secondPopup: null,
	addedCSS: [],
	parentCSS: [],
	
	/**
	 *	Initializes the various objects on the page and hooks them to the correct functionality
	 *	@param {Object} el The element being hooked
	 *	@param {Array} args Array of arguments from parent object
	 */
	init: function(el,args) {


		if(args[1] == "open") {
			if (el && el.removeEvents("click")){
			el.removeEvents("click").addEvent("click", function(e) { jsModalPopup.open(false,this.href); });
			el.onclick = function() { return false; }
			}
		}
		if(args[1] == "close") {
			el.addEvent('click',jsModalPopup.close);
		}
	},
	
    
	/**
	 *	Open the modal popup widget and pull in the popup content
	 */
	open: function() {
		jsModalPopup.modal = new Modalizer();
		// handle old style (false,url) parameters
		if(arguments.length > 1) {
			url = arguments[1];
				
		} else {
			url = arguments[0];
		}

		var ajaxOptions = {
			method: "post",
			onComplete: function(txt) {
				// grab just the <body> content for the popup
				var matches = txt.match(/<body([^>]*)>([\w\W\s\S\n\r]*)<\/body>/i);
				var bodyAttrs = matches[1]; // need this to handle some css issues
				var bodyText = matches[2];
				var bodyClass = "";
				if(bodyAttrs.length > 0) {
					bodyClass = bodyAttrs.match(/class=\"([^"]*)\"/i)[1];
				}
				
				// send the body content to the screen after all css is loaded
				jsModalPopup.display(bodyText,bodyClass);
			}
		}
		// load the content for the popup
		new Ajax(url,ajaxOptions).request();
	},
	
	/**
	 *	Load the popup content into the modal widget
	 *  @param {Object} content The popup content
	 *  @param {String} bodyClass The class of the popup content body
	 */
	display: function(content,bodyClass) {
		
		if(!$("DynamicModalPopup")) {
			var winWidth = (window.ie) ? (window.getScrollWidth()-20)+"px" : window.getScrollWidth()+"px";
			var winHeight = window.getScrollHeight() + "px";
			if (browserName=="Microsoft Internet Explorer" ) winHeight = "5000px";
			jsModalPopup.modal.modalShow(
				{	hideOnClick:false,
					modalStyle:
					{	'width':winWidth,
						'height':winHeight,
						'z-index':'2000'
					}
				});
			// hide select elements in IE only
			
			if(window.ie) {
				popIFrame = new Element('iframe');
				popIFrame.setProperty("src","/public/sp/blankpage.html");
				popIFrame.setProperty("id","DynamicModalPopupIFrame");
				popIFrame.setStyles(
					{	"z-index":"1000",
						"position":"absolute",
						"top":"0",
						"left":"0",
						"border":"5",
						"filter":"alpha(opacity=0)",
						"width": winWidth,
						"height": winHeight
					});
				$(document.body).adopt(popIFrame);
			}

			var popDiv = new Element("div");
			popDiv.setProperty("id","DynamicModalPopup");

			var popDivContent = new Element("div");
			popDivContent.innerHTML = content;
			popDivContent.setStyle("position","relative");
			popDivContent.addClass(bodyClass);
			popDiv.adopt(popDivContent);
			$(document.body).adopt(popDiv);

			popDiv.setStyle("z-index","5000");
			popDiv.setStyle("position","absolute");
			popDiv.setStyle("top",(window.getScrollTop()+80)+"px");
			popDiv.setStyle("left","20px");
			popDiv.show();

			// initialize the new content
			Unobtrusive.init(popDiv);
			popDiv.getElements(".jsModalPopup_close").each(function(el) {
					el.nullifyLink();
					el.removeEvents("click").addEvent("click",function() { 
						jsModalPopup.close(); 
					});
			});

			popDiv.focus();

		} else {
			// hide the first popup behind the iframe
			$("DynamicModalPopup").hide();
			$("DynamicModalPopup").setStyle("z-index","99"); // put it behind the iframe
			$("DynamicModalPopup").show();
			var spopDiv = new Element("div");
			spopDiv.setProperty("id","DynamicSecondaryModalPopup");
			
			var spopDivContent = new Element("div");
			spopDivContent.innerHTML = content;
			spopDivContent.setStyle("position","relative");
			spopDivContent.addClass(bodyClass);
			spopDiv.adopt(spopDivContent);
			$(document.body).adopt(spopDiv);

			spopDiv.setStyle("z-index","5000");
			spopDiv.setStyle("position","absolute");
			spopDiv.setStyle("top",(window.getScrollTop()+100)+"px");
			spopDiv.setStyle("left","30px");
			spopDiv.show();	

			// initialize the new content
			Unobtrusive.init(spopDiv);
			spopDiv.getElements(".jsModalPopup_close").each(function(el) {
					el.nullifyLink();
					el.removeEvents("click").addEvent("click",function() { 
						jsModalPopup.close(); 
					});
			});
		}
	},
	
	/**
	 *	Close the modal popup widget
	 */
	close: function() {
		if($("DynamicSecondaryModalPopup")) {
			$("DynamicSecondaryModalPopup").remove();
			// IE blanks out the content after we bring it back
			// so, we're going to hide it before bringing it on top of the iframe
			// and then show it again so it re-paints the screen
			$("DynamicModalPopup").hide();
			$("DynamicModalPopup").setStyle("z-index","5000");
			$("DynamicModalPopup").show();
		} else {
			try {
				$("modalOverlay").remove();
				$("DynamicModalPopup").remove();
				if(window.ie) { $("DynamicModalPopupIFrame").remove(); }
			} catch(err) {
			}
		}
		
		
	
	},
	
	/**
	 *	Refresh the popup content
	 */
	refresh: function() {
		if($("DynamicSecondaryModalPopup")) {
			$("DynamicSecondaryModalPopup").hide();
			$("DynamicSecondaryModalPopup").show()
		} else if($("DynamicModalPopup")) {
			$("DynamicModalPopup").hide();
			$("DynamicModalPopup").show();
		}
	}
}