/*

	review.js
	
	Functions for pages that contain time and expense tables for review.
	
*/

var Review = {
	SimpleInit: function() {
		//this function is for billables, payables and company only
		//this is a simple init to reduce the functions that need to be loaded for the page
		//it doesn't need funcTable functions before ajax load etc. because billalbes, payables and company's review are from magifier click but not from function table click
		$j('.ajaxable').not('.reviewInitialized').addClass('reviewInitialized').each(function() {
			var isExpense = $j(this).parents('table:first').is('.expense');
			var isApproval = $j(this).is('.approvalLink');
			var ajaxOptions = {};

			if(isApproval)
				return true;

			ajaxOptions.afterReplaceElements = function(dialogElem, options) {
				if(isApproval)
					return true;

				if (isExpense)
					ExpenseUtil.init(dialogElem);
				else
					TimecardUtil.init();
			};

			if (Ajax.ajaxAvailable()) {
				$j(this).click(function() {
					//if it is regular ajax available, do following
					if(isApproval) {
						return false;
					};

					if (!isExpense) {
						// View timecard
						Popup.ajaxSend($j(this), $j.extend(ajaxOptions, {
							title: 'Review Timecard',
							url: $j(this).attr('href')
						}));
					} else {
						// View expense report
						Popup.ajaxSend($j(this), $j.extend(ajaxOptions, {
							title: 'Review Expense Report',
							url: $j(this).attr('href')
						}));
					}
					//stop the <a>
					return false;
				});
			}
			//no else needed here because if no ajax, then it is regular click for <a>
		});
	},

	init: function() {

		$j('table.reviewable').not('.reviewInitialized').addClass('reviewInitialized').each(function() {
			var tableElem = $j(this);
			var isExpense = tableElem.is('.expense');

			// View or edit a row
			var rowDo = function(rowElem, operation) {
				var isEdit = operation == 'edit';

				if (isEdit) {
					if (!isExpense) {
						// Edit timecard
						var date = Date.parseExact($j('.date', rowElem).text(), DocumentData.dateFormats);
						if ($j('.tito', rowElem).text() == '1') {
						//alert(date.toString('d') + " || " + new Date(date).addDays(6).toString('d'));
							// Edit TITO
							TitoUtil.getPage({
								userid: $j('.userid', rowElem).text(),
								startDate: date.toString('d'),
								endDate: new Date(date).addDays(6).toString('d')
							});
						} else {
							// Edit Timecard
							TimecardUtil.getPage({
								userid: $j('.userid', rowElem).text(),
								date: date.toString('d')
							});
						}
					} else {
						// Edit expense report
						ExpenseUtil.getPage({
							userid: $j('.userid', rowElem).text(),
							expenseid: $j('.expenseid', rowElem).text(),
							edit: EXPENSEEDIT_NONE,
							row: -1
						});
					}

				} else {
					// View timecard or expense report via AJAX popup
					var ajaxOptions = {
						beforeAjax: function(elem) {
							FuncTable.unhighlightAll();
							FuncTable.setRowState(rowElem, { highlighted: true });
						},
						// Add some horizinal padding for expense, so that there's plenty of room for the attachment widget on the same line as the report header
						widthPadding: isExpense ? 200 : null
					};
					ajaxOptions.afterReplaceElements = function(dialogElem, options) {

						if (tableElem.is('.expense'))
							ExpenseUtil.init(dialogElem);
						else
							TimecardUtil.init();

						var menubar = $j('.menubar', dialogElem);

						if ($j('.rowCheckBox', rowElem).attr('checked')) {
							$j('td.uncheck', menubar).show();
							$j('button.uncheck', menubar).click(function() {
								$j.modal.close();
								FuncTable.setRowState(rowElem, { checked: false });
							});
						} else {
							$j('td.check', menubar).show();
							$j('button.check', menubar).click(function() {
								$j.modal.close();
								if(rowElem.find('input.rowCheckBox').attr("disabled") != true) {
									FuncTable.setRowState(rowElem, { checked: true });
								}
							});
						}
					};
					if (Ajax.ajaxAvailable()) {
						//if it is regular ajax available, do following
						if (!isExpense) {
							// View timecard
							Popup.ajaxSend(rowElem, $j.extend(ajaxOptions, {
								title: 'Review Timecard',
								url: TimecardUtil.getPageUrl({
									operation: 'view',
									userid: $j('.userid', rowElem).text(),
									date: $j('.date', rowElem).text()
								})
							}));
						} else {
							// View expense report
							Popup.ajaxSend(rowElem, $j.extend(ajaxOptions, {
								title: 'Review Expense Report',
								url: ExpenseUtil.getPageUrl({
									operation: 'view',
									expenseid: $j('.expenseid', rowElem).text(),
									row: -1
								})
							}));
						}
					}
					else {
						//if no ajax available, redirect to:
						var url = "";
						if (!isExpense) {
							url = TimecardUtil.getPageUrlWithOutTimecardDll({
								operation: 'view',
								userid: $j('.userid', rowElem).text(),
								date: $j('.date', rowElem).text()
							});
						}
						else {
							url = ExpenseUtil.getPageUrlWithOutTimecardDll({
								operation: 'view',
								expenseid: $j('.expenseid', rowElem).text(),
								row: -1
							});
						}
						//redirect to the url
						window.location = getBaseUrl() + url;
					}
				}
			}

			if(tableElem.is('.simpleTable')) {
				FuncTable.init(tableElem, { simpleTable: true });
			} else {
				FuncTable.init(tableElem, {
					rowClick: function(rowElem) {
						rowDo(rowElem, 'view');
					},
					rowMenuId: 'rowMenu',
					rowMenuOptions: {
						onShowMenu: function(event, menu) {
							var rowElem = $j(event.target).parents('.funcRow:first');
							if (rowElem.is('.nonViewable'))
								$j('#itemView', menu).remove();
							if (!rowElem.is('.editable'))
								$j('#itemEdit', menu).remove();
							return menu;
						},
						bindings: {
							'itemEdit': function(elem) {
								rowDo($j(elem).parents('.funcRow:first'), 'edit');
							},
							'itemView': function(elem) {
								rowDo($j(elem).parents('.funcRow:first'), 'view');
							}
						}
					}
				});
			}

		});
	},

	LinkClick: function(elem) {
		elem = $j(elem);
		var isAlreadyInPopup = elem.parents("div.dialogPopup:first");
		var isRowMenuTrigger = elem.find('.rowMenuTrigger');
		var isContextMenu    = elem.parents('li:first');

		var isApproval = elem.is('.approvalLink');
		var isTimecard = elem.is('.timecardLink');
		//not review popup, or approval popup, will do it in html review, not popup review
		if(isRowMenuTrigger.length > 0 || isContextMenu.length > 0) {
			//always try to use ajax if row menu.
		} else if((isAlreadyInPopup.length > 0 && isApproval)) {
			window.open(elem.attr('href'));
			return false;
		} else if (isAlreadyInPopup.length == 0 && elem.attr('href') != undefined) {
			window.location = elem.attr('href');
			return false;
		}

		var ajaxOptions = {};

		ajaxOptions.afterReplaceElements = function(dialogElem, options) {
			if(isApproval)
				return true;
		};
		if (Ajax.ajaxAvailable()) {
			if(isApproval) {
				Popup.ajaxSend(elem, $j.extend(ajaxOptions, {
					title: 'Approval Status',
					url: elem.attr('href')
				}));
			} else if (isTimecard) {
				Popup.ajaxSend(elem, $j.extend(ajaxOptions, {
					title: 'Review Timecard',
					url: elem.attr('href')
				}));
			} else {
				Popup.ajaxSend(elem, $j.extend(ajaxOptions, {
					title: 'Review Expense Report',
					url: elem.attr('href')
				}));
			}
			//stop the <a>
			return false;
		}
		//no else needed here because if no ajax, then it is regular click for <a>
		return true;
	},

	viewSingle: function(event, elem) {
		elem = $j(elem);
		elem.find('a').click();
		return false;
	},

	viewMultiple: function(event, elem) {
		elem = $j(elem);
		elem.not('.initialized').addClass('initialized').contextMenu('reviewList', {
			trigger: 'click',
			direction: 'down',
			xdirection: 'left',
			autohide: 'false',
			timeout: 'false',
			closeicon: 'true',
			event: event,
			onContextMenu: function() {
				return true;
			},
			onShowMenu: function(event, menu, cur) {
				var ul = menu.find("ul");
				ul.children().remove();
				ul.append(elem.next().children().clone());

				//extra restyle needed here after we copy the list.
				var content = ul;
				var li = content.find('li');
				li.each(function() {
					var lio = $j(this);
					lio.find("a").attr("onclick", ""); //cleanup onclick event. the event should be li click
					lio.css(cur.itemStyle).hover(
						function() {
							// DRP: added noHover for non-menu items
							lio.not('.noHover').css(cur.itemHoverStyle);
						},
						function(){
							lio.css(cur.itemStyle);
						}
					).find('img').css({verticalAlign:'middle',paddingRight:'2px'});
				});
				return menu;
			}
		});
		return true;
	},

	manualCloseMenu: function(elem) {
		elem = $j(elem);
		var parent = elem.parent('#jqContextMenu:first');
		parent.hide(); //close menu
		parent.children().remove();
		parent.next().hide(); //close shadow
		return false;
	}

}
