var RatesProgress = {
	processed : [],
	total : 0,
	qTimes : 0,
	isDone : false,
	init : function(input) {
		this.total = input; // total hotel number in table = 133
		// alert('total hotels: '+this.total.length);
		this.queue = [];
		this.pending = [];
		this.lastStart = 0;
		this.lastTotal = this.total.length;
		// this.oTable = $('#hotels').dataTable();
	},
	run : function(oSettings) {
		/*
		 * var start = oSettings._iDisplayStart; var end =
		 * oSettings._iDisplayEnd; //var lastEnd = (this.lastStart+this.length);
		 * //alert('start: '+this.lastStart+', end: '+lastEnd); alert('start:
		 * '+start+', end: '+end); this.setPending(start, end);
		 */
		// alert ('run');
		this.getAjaxQueue();
		// this.getAjax();
		return;

	},
	check : function(oSettings) {

		this.tableSettings = oSettings;
		var oTable = $('#hotels').dataTable();
		if (this.total.length < 1) { // total number of hotel <1
			return;
		}

		this.run(oSettings);
		return;

	},

	recheck : function() {
		var oTable = $('#hotels').dataTable();
		var oSettings = oTable.fnSettings();

		oTable.fnStandingRedraw();
		
		if (this.processed.length >= this.total.length) {
			document.getElementById('currency').disabled = false;
			
			if (oSettings.oLoadedState != null) {
				var loadedState = oSettings.oLoadedState;

				updateSortingFilter(loadedState.aaSorting.slice());
				updateSorting();
				
				oSettings._iDisplayStart = loadedState.iStart;
				oSettings.iInitDisplayStart = loadedState.iStart;
				oSettings._iDisplayEnd = loadedState.iEnd;
				oSettings._iDisplayLength = loadedState.iLength;
				oSettings.aaSorting = loadedState.aaSorting.slice();
				oSettings.oApi._fnDraw(oSettings);
			}
			return;
		}

		this.run(oSettings);
		return;
	},

	isRunning : function() {

		if (this.queue.length < 1) {
			return false;
		}

		return true;
	},
	setPending : function(getStart, getEnd) {

		this.pending = [];

		for ( var i = getStart; i < getEnd; i++) {
			var hotelID = this.total[i];
			// alert(hotelID)

			var cacheIndex = ratesCache.check(hotelID);
			if (cacheIndex > -1) {
				var cacheData = ratesCache.get(hotelID);
				this.setAjax(cacheData);
			} else if (jQuery.inArray(hotelID, this.processed) < 0) {
				this.pending.push(hotelID);
			}
		}
	},
	getAjaxQueue : function(queue) {
		var checkin = $('#checkin').val();
		var checkout = $('#checkout').val();

		var currencyBox = $('#currency option:selected').val();
		var currency = currencyBox.split(',');
		var currencyRate = currency[0];
		var currencyCode = currency[1];
		var district_id = $('#district_id option:selected').val();

		if (district_id == -1)
			district_id = 0;

		this.qTimes = parseInt(this.qTimes + 1);
		var requestURL = '/ajax/bestrate/' + checkin + '/' + checkout + '/'
				+ this.qTimes + '/' + currencyCode + '/' + district_id; // new

		$.ajax({
			url : requestURL,
			dataType : 'json',
			success : function(json) {
				RatesProgress.setAjax(json);
			}
		});
	},
	setAjax : function(ratesData) {

		var oTable = $('#hotels').dataTable();
		var oSettings = oTable.fnSettings();

		if (ratesData == null) {
			document.getElementById('currency').disabled = false;

			return;
		}

		var dataLen = ratesData.length;

		for ( var i = 0; i < dataLen; i++) {
			var hotelData = ratesData[i];
			var hotelID = hotelData.hotel_id;

			this.processed.push(hotelID);

			var rowIndex = parseInt(oTable.fnFindCellRowIndexes(hotelID, 1));
			
		//	alert('hotel: '+hotelID+', row: '+rowIndex);
			
			oTable.fnDataUpdate(hotelData, rowIndex, 6);
			this.tableSettings = oSettings;
		}
		this.recheck();

		return;
	}
};

/*
 * $.fn.dataTableExt.afnFiltering.push(function(oSettings, aData, iDataIndex) {
 * return true;
 * 
 * var buy_value = $('#best_buy option:selected').val(); // alert(buy_value);
 * var hotel_type = aData[2]; // if (buy_value == 'e') { // return true; // }
 * 
 * if (buy_value == 'c') { return true; }
 * 
 * return true; });
 */

/*
 * Filter functions
 */

$.fn.dataTableExt.afnFiltering.push(function(oSettings, aData, iDataIndex) {
	var iMax = Number($('#h_stars option:selected').val());
	var hStars = aData[3] == "" ? 0 : aData[3] * 1;

	if (iMax < 1) {
		return true;
	} else if (hStars >= iMax && hStars < (iMax + 1)) {
		return true;
	}

	return false;
});

$.fn.dataTableExt.afnFiltering.push(function(oSettings, aData, iDataIndex) {
	var priceIndex = 6;
	var roomPrice = aData[priceIndex];

	if (roomPrice < 0) {
		return false;
	}

	return true;
});

/*
 * API functions
 */

$.fn.dataTableExt.oApi.fnDataUpdate = function(oSettingsInstance, aData,
		iRowIndex, iColumnIndex) {
	
	if (iRowIndex == undefined) {
		return;
	}
	
	var currRow = oSettingsInstance.aoData[iRowIndex];
	if (currRow == undefined) {
		return;
	}

	var dataRow = currRow._aData;
	
	switch (iColumnIndex) {
	case 6:
		if (aData != undefined) {
			hotelBox = $('<div/>').html(dataRow[7]);
			
			var roomPrice = Math.floor(aData.price);
			if (roomPrice < 1) {
				roomPrice = -1;
			}
			dataRow[iColumnIndex] = roomPrice;

			if (roomPrice < 1) {
				hotelBox.find('.p_name').hide();
				hotelBox.find('.h_price_curr').hide();
				hotelBox.find('.h_price').text('N/A');
				hotelBox.find('.h_price2').text('N/A');
			} else {
				var currencyBox = $('#currency option:selected').val();
				var currency = currencyBox.split(',');
				var currencyRate = currency[0];
				var currencyCode = currency[1];
				var promo_name = aData.promo_name;

				hotelBox.find('.p_name').text(promo_name);
				hotelBox.find('.h_price_curr').text(currencyCode);
				hotelBox.find('.h_price').text(roomPrice);
				hotelBox.find('.h_price2').text(roomPrice);
				var img_src = hImage[aData.hotel_id];			
				//var img_src = document.getElementById('i'+aData.hotel_id);
				//alert(img_src.value);
				if(img_src!=null){				
					var img ='<img src="'+img_src+'" width="75" >';
					hotelBox.find('.thumbnail').html(img);
				}
								
			}

			var roomSelling = aData.selling_price;
			if (roomSelling > 0) {
				if (roomSelling == roomPrice) {
					hotelBox.find('.p_selling_box').hide();
				} else {
					hotelBox.find('.h_selling_curr').text(currencyCode);
					hotelBox.find('.h_selling').text(roomSelling);
					hotelBox.find('.h_selling2').text(roomSelling);
				}
			} else {
				hotelBox.find('.p_selling_box').hide();
			}

			dataRow[7] = hotelBox.html();
			
			var hotelID = aData.hotel_id;
			var dispBox = $('#hotel_' + hotelID);
			if (dispBox.html() != null) {
				dispBox.html(hotelBox.html());
			}
			
		}
		break;
	}
}

$.fn.dataTableExt.oApi.fnPageLengthUpdate = function(oSettings, sLength) {
	/* Update all other length options for the new display */
	/*
	 * var n = oSettings.aanFeatures.l; for ( i=0, iLen=n.length ; i<iLen ; i++ ) {
	 * if ( n[i] != this.parentNode ) { $('select', n[i]).val( iVal ); } }
	 */

	/* Redraw the table */
	oSettings._iDisplayLength = parseInt(sLength, 10);
	oSettings.oApi._fnCalculateEnd(oSettings);

	/*
	 * If we have space to show extra rows (backing up from the end point - then
	 * do so
	 */
	if (oSettings.fnDisplayEnd() == oSettings.fnRecordsDisplay()) {
		oSettings._iDisplayStart = oSettings.fnDisplayEnd()
				- oSettings._iDisplayLength;
		if (oSettings._iDisplayStart < 0) {
			oSettings._iDisplayStart = 0;
		}
	}

	if (oSettings._iDisplayLength == -1) {
		oSettings._iDisplayStart = 0;
	}

	oSettings.oApi._fnDraw(oSettings);
};

$.fn.dataTableExt.oApi.fnFindCellRowIndexes = function(oSettings, sSearch,
		iColumn) {
	var i, iLen, j, jLen, aOut = [], aData;

	for (i = 0, iLen = oSettings.aoData.length; i < iLen; i++) {
		aData = oSettings.aoData[i]._aData;

		if (typeof iColumn == 'undefined') {
			for (j = 0, jLen = aData.length; j < jLen; j++) {
				if (aData[j] == sSearch) {
					aOut.push(i);
				}
			}
		} else if (aData[iColumn] == sSearch) {
			aOut.push(i);
		}
	}

	return aOut;
}

$.fn.dataTableExt.oApi.fnStandingRedraw = function(oSettings) {

	if (oSettings.oFeatures.bServerSide === false) {
		var before = oSettings._iDisplayStart;
		oSettings.oApi._fnReDraw(oSettings);
		oSettings._iDisplayStart = before;
		oSettings.oApi._fnCalculateEnd(oSettings);
	}

	// draw the 'current' page
	oSettings.oApi._fnDraw(oSettings);
};

$.fn.dataTableExt.oPagination.extStyle = {
	/*
	 * Function: oPagination.extStyle.fnInit Purpose: Initalise dom elements
	 * required for pagination with a list of the pages Returns: - Inputs:
	 * object:oSettings - dataTables settings object node:nPaging - the DIV
	 * which contains this pagination control function:fnCallbackDraw - draw
	 * function which must be called on update
	 */
	"fnInit" : function(oSettings, nPaging, fnCallbackDraw) {
		nPaging.innerHTML = '';

		$('#pageNationButton .first').click(function() {
			if (oSettings.oApi._fnPageChange(oSettings, "first")) {
				fnCallbackDraw(oSettings);
			}
		}).bind('selectstart', function() {
			return false;
		});

		$('#pageNationButton .previous').click(function() {
			if (oSettings.oApi._fnPageChange(oSettings, "previous")) {
				fnCallbackDraw(oSettings);
			}
		}).bind('selectstart', function() {
			return false;
		});

		$('#pageNationButton .next').click(function() {
			if (oSettings.oApi._fnPageChange(oSettings, "next")) {
				fnCallbackDraw(oSettings);
			}
		}).bind('selectstart', function() {
			return false;
		});

		$('#pageNationButton .last').click(function() {
			oSettings.oApi._fnPageChange(oSettings, "last");
			fnCallbackDraw(oSettings);
		}).bind('selectstart', function() {
			return false;
		});
		
		
		$('#pageNationButton1 .first').click(function() {
			if (oSettings.oApi._fnPageChange(oSettings, "first")) {
				fnCallbackDraw(oSettings);
			}
		}).bind('selectstart', function() {
			return false;
		});

		$('#pageNationButton1 .previous').click(function() {
			if (oSettings.oApi._fnPageChange(oSettings, "previous")) {
				fnCallbackDraw(oSettings);
			}
		}).bind('selectstart', function() {
			return false;
		});

		$('#pageNationButton1 .next').click(function() {
			if (oSettings.oApi._fnPageChange(oSettings, "next")) {
				fnCallbackDraw(oSettings);
			}
		}).bind('selectstart', function() {
			return false;
		});

		$('#pageNationButton1 .last').click(function() {
			oSettings.oApi._fnPageChange(oSettings, "last");
			fnCallbackDraw(oSettings);
		}).bind('selectstart', function() {
			return false;
		});
	},

	/*
	 * Function: oPagination.extStyle.fnUpdate Purpose: Update the list of page
	 * buttons shows Returns: - Inputs: object:oSettings - dataTables settings
	 * object function:fnCallbackDraw - draw function which must be called on
	 * update
	 */
	"fnUpdate" : function(oSettings, fnCallbackDraw) {
		if (!oSettings.aanFeatures.p) {
			return;
		}

		var iStart = oSettings._iDisplayStart + 1, iEnd = oSettings
				.fnDisplayEnd(), iMax = oSettings.fnRecordsTotal(), iTotal = oSettings
				.fnRecordsDisplay(), sStart = oSettings.fnFormatNumber(iStart), sEnd = oSettings
				.fnFormatNumber(iEnd), sMax = oSettings.fnFormatNumber(iMax), sTotal = oSettings
				.fnFormatNumber(iTotal);

		$("#pagiNation .pageStartNum").html(sStart);
		$("#pagiNation .pageEndNum").html(sEnd);
		$("#pagiNation .pageTotalNum").html(sTotal);
		$("#pagiNation .pageMaxNum").html(sMax);
		$("#pagiNation2 .pageStartNum2").html(sStart);
		$("#pagiNation2 .pageEndNum2").html(sEnd);
		$("#pagiNation2 .pageTotalNum2").html(sTotal);
		$("#pagiNation2 .pageMaxNum2").html(sMax);

		var iPageCount = $.fn.dataTableExt.oPagination.iFullNumbersShowPages;
		var iPageCountHalf = Math.floor(iPageCount / 2);
		var iPages = Math.ceil(oSettings.fnRecordsDisplay()
				/ oSettings._iDisplayLength);
		var iCurrentPage = Math.ceil(oSettings._iDisplayStart
				/ oSettings._iDisplayLength) + 1;
		var sList = "";
		var iStartButton, iEndButton, i, iLen;
		var oClasses = oSettings.oClasses;

		/* Pages calculation */
		if (iPages < iPageCount) {
			iStartButton = 1;
			iEndButton = iPages;
		} else {
			if (iCurrentPage <= iPageCountHalf) {
				iStartButton = 1;
				iEndButton = iPageCount;
			} else {
				if (iCurrentPage >= (iPages - iPageCountHalf)) {
					iStartButton = iPages - iPageCount + 1;
					iEndButton = iPages;
				} else {
					iStartButton = iCurrentPage - Math.ceil(iPageCount / 2) + 1;
					iEndButton = iStartButton + iPageCount - 1;
				}
			}
		}

		for (i = iStartButton; i <= iEndButton; i++) {
			if (iCurrentPage != i) {
				sList += '<span class="af ' + oClasses.sPageButton + '">' + i
						+ '</span>';
			} else {
				sList += '<span class="af ' + oClasses.sPageButtonActive + '">'
						+ i + '</span>';
			}

			sList += '&nbsp;';
		}
		$('.paginate_button .numbers').html(sList);

		$('.paginate_button .numbers span').click(function() {
			var iTarget = (this.innerHTML * 1) - 1;
			oSettings._iDisplayStart = iTarget * oSettings._iDisplayLength;
			fnCallbackDraw(oSettings);
			//fnUpdatePhoto(iTarget);	// add by Ivan	
		});
	}
};

var Currency = {
	selected : $('#currency option:selected').val(),
	isChange : false
};

function updateSortingFilter(savedSort) {
	// Update sorting select box
	savedSort.reverse();
	$.each(savedSort, function(index, item) {
		var field = '';
		var value = item[1];
		
		switch(item[0]) {
		case 3 : field = '#h_starts';
			break;
		case 6 : field = '#price_sorting';
			break;
		case 8 : field = '#guest_rating';
			break;
		case 9 : 
			field = '#price_sorting';
			value = 'promo';
			break;
		}
		
		if (field != '') {
			$(field+' option[value="'+value+'"]').attr('selected', 'selected');
		}
	}); 
}

function updateSorting() {
	var oTable = $('#hotels').dataTable();
	var guestSortCode = $('#guest_rating option:selected').val();
	var priceSortCode = $('#price_sorting option:selected').val();
	var sortOrder = [];

	if (guestSortCode != '') {
		sortOrder.push([8, guestSortCode]);
	}

	if (priceSortCode == 'promo') {
		$('#price_sorting option[value=""]').attr('selected', 'selected');
	} else if (priceSortCode != '') {
		sortOrder.push([6, priceSortCode]);
	}

	if (sortOrder.length > 0) {
		oTable.fnSort(sortOrder);
		return
	} 
		
	oTable.fnSort([[ 0, 'asc' ]]);
}

$(document)
		.ready(
				function() {
					$('#panel').tabs();
					$('#hotels')
							.dataTable(
									{
										"aaSorting" : [ [ 0, "asc" ],
												[ 2, "desc" ], [ 6, "asc" ],
												[ 8, "asc" ] ],
										"bPaginate" : true,
										"bInfo" : true,
										"bStateSave" : true,
										"fnStateLoadCallback": function ( oSettings, oData ) {
											oData.sFilter = "";

											updateSortingFilter(oData.aaSorting.slice());
											return true;
										},
										"sDom" : '<tp><r>',
										"sPaginationType" : "extStyle",
										// "sPaginationType" : "full_numbers",
										// "bServerSide" : true,
										// "sAjaxSource" : "/ajax/list",
										// "fnServerData" :
										// fnHotelRatesPipeline,
										/*
										 * "fnDrawCallback" :
										 * function(oSettings) { } ,
										 */

										// "sDom" : 'pr',
										"aoColumns" : [ {
											"sType" : "numeric"
										}, {
											"sType" : "numeric"
										}, {
											"sType" : "string"
										}, {
											"sType" : "numeric"
										}, {
											"sType" : "string"
										}, {
											"sType" : "string"
										}, {
											"sType" : "numeric"
										}, {
											"bSearchable" : true,
											"sType" : "string"
										}, {
											"sType" : "numeric"
										} ],

										"fnRowCallback" : function(nRow, aData,
												iDisplayIndex,
												iDisplayIndexFull) {
											var dispIndex = 7;
											//updateRate();

											/*
											var current_currency = $('#currency option:selected').val();
											if (Currency.isChange) {
												var currency = current_currency.split(',');
												var currencyRate = currency[0];
												var currencyCode = currency[1];

												var roomPrice = aData[6];
												roomPrice = (roomPrice * currencyRate);
												roomPrice = Math.floor(roomPrice);

												var newDisp = $('<div/>').html(aData[dispIndex]);
												newDisp.find('.h_price_curr').text(currencyCode);
												newDisp.find('.h_price').text(roomPrice);
												aData[dispIndex] = newDisp.html();
											}
											*/

											var currency = document.getElementById('currency').value;
											var currency_new = currency.split(',');
											var select_currency = document.getElementById('select_currency').value;
										
											//if (currency_new[0] != select_currency) {
											//alert('curr: '+currency_new[0]+', se: '+select_currency);
											var newDisp = $('<div/>').html(aData[dispIndex]);
											
											var roomPrice = aData[6];
											if (roomPrice > 0) {
												// Save net price value
												aData[6]	= roomPrice;
												//newDisp.find('.h_price2').text(roomPrice);
												
												// Calculate selected currency value
												roomPrice = Number(currency_new[0])*roomPrice/Number(select_currency);
												
												newDisp.find('.h_price_curr').text(currency_new[1]);
												newDisp.find('.h_price').text(Math.floor(roomPrice));
												aData[dispIndex] = newDisp.html();
											}

											var roomSelling = Number(newDisp.find('.h_selling2').text());
											if (roomSelling > 0) {
												// Calculate selected currency value
												roomSelingCurr = Number(currency_new[0])*roomSelling/Number(select_currency);
												
												newDisp.find('.h_selling_curr').text(currency_new[1]);
												newDisp.find('.h_selling').text(Math.floor(roomSelingCurr));
												aData[dispIndex] = newDisp.html();
											}
											
											var display = nRow.getElementsByTagName('td')[dispIndex].innerHTML;
											if (display != aData[dispIndex]) {
												//var hotelBox = $('#hotel_'+ aData[1]);
												//alert(hotelBox.html());
												//hotelBox.html(aData[dispIndex]);
												nRow.getElementsByTagName('td')[dispIndex].innerHTML = aData[dispIndex];
											}

											/*
											 * var ratesData =
											 * RatesProgress.getCache(iDisplayIndexFull);
											 * 
											 * if (ratesData != undefined) { var
											 * roomPrice = ratesData.room_price;
											 * var roomSelling =
											 * ratesData.room_selling; var
											 * hotelBox = 'td:last-child';
											 * 
											 * if (roomPrice < 1) { $(hotelBox + '
											 * .p_name', nRow).hide();
											 * $(hotelBox + ' .p_roomtype_name',
											 * nRow).hide(); $(hotelBox + '
											 * .h_price_curr', nRow).hide();
											 * $(hotelBox + ' .h_price',
											 * nRow).text('N/A'); } else {
											 * $(hotelBox + ' .p_name',
											 * nRow).text(ratesData.promo_name+'');
											 * $(hotelBox + ' .p_roomtype_name',
											 * nRow).text(ratesData.roomtype_name+''); //
											 * $('#' + hotelID + '
											 * .h_price_curr').text(currency);
											 * $(hotelBox + ' .h_price',
											 * nRow).text(roomPrice);
											 * 
											 * if (roomSelling > 0) { //
											 * roomSelling =
											 * getCurrencyRate(currency,
											 * this.room_selling); // $('#' +
											 * hotelID + '
											 * .h_selling_curr').text(currency);
											 * $(hotelBox + ' .h_selling',
											 * nRow).text(roomSelling); } else {
											 * $(hotelBox + ' .p_selling_box',
											 * nRow).hide(); } } }
											 */

											return nRow;
										},
										"fnInitComplete" : function(oSettings) {
											var total = oSettings
													.fnRecordsTotal();

											var hotels = [];
											for ( var i = 0; i < total; i++) {
												var row = this.fnGetData(i);
												var hotelID = row[1];
												hotels.push(hotelID);
											}

											RatesProgress.init(hotels);
											RatesProgress.check(oSettings);
											// this.lastPage =
											// oSettings._iDisplayStart;

											$('#hotels').dataTable().fnFilter($('#searchFilter').val());
											$('#hotels').dataTable().fnSort([ [ 0, 'asc' ] ]);
										}
									});

					var oTable = $('#hotels').dataTable();
					var oSettings = oTable.fnSettings();

					$('#searchFilter').keyup(function() {
						var keywords = $(this).val();
						if (keywords == '') {
							return;
						}

						$('#hotels').dataTable().fnFilter(keywords);
						}).blur(function() {
							if ($(this).val() == '') {
								$('#hotels').dataTable().fnFilter('');
							}
						});

					$('#h_stars').change(function() {
						$('#hotels').dataTable().fnDraw();
					});

					$('#currency').change(function() {
					 $('#hotels').dataTable().fnStandingRedraw(); 
					 });

					$('select.page_length').change(
							function() {
								$('select.page_length').val($(this).val());
								$('#hotels').dataTable().fnPageLengthUpdate($(this).val());
							});

					$('#guest_rating').change(function() {
						updateSorting();
					});
					
					$('#price_sorting').change(function() {
						var oTable = $('#hotels').dataTable();
						var priceSortCode = $('#price_sorting option:selected').val();
						var sortOrder = [];

						if (priceSortCode == 'promo') {
							sortOrder = [[9, 'desc'], [ 6, 'asc']];
							oTable.fnSort(sortOrder);
							
							$('#guest_rating option[value=""]').attr('selected', 'selected');
							$('#h_stars option[value=""]').attr('selected', 'selected');
							return;
						}
						
						updateSorting();
					});
				});

