// This is very needed for this to work correkt for pageinator!
var perPage = 20;
// Fetch default values for search
try {
	var preFetch = fetchData("/?ajax_call=212",{"action":"defaultValues"});
	var defaultData = preFetch.defaults;

	if (typeof(preFetch.saved) == 'object') {
		var savedData = preFetch.saved;
	}

} catch(err) {
	console.log('Anslutning till DB nere!!');
}

// Do magic stuff - This is needed for reseting session if we don't have class remember
// This is need to be here so even if the page not been loaded we clear the session
// Live is needed for links loaded with ajax.
$('a').live('click', function(event) {
	if (!$(this).hasClass('remeber')) {
	//	console.log('Reset session');
		var tmp = fetchData("/?ajax_call=212",{"action":"Unset"});			
	}
});

// This object is for imageplay
var jspPlay = {
	picturePlay: function() 
	{
		// This needs to be first else we mess up the css
		$('div.car_details').hide();
		$('div.car_details:first').show();
		$("li.listcars.first").hide();
		//$("div.car_details").hide();
		$('a.isList').bind('click', function(event) {
			// Disable the link. Added by Kenneth
			event.preventDefault();
			var carid = $(this).attr("data-id");
			$('.isActive[data-id="'+carid+'"]').each(function() {
				Shadowbox.setup();
			});
	 		$('.car_details:[data-id="'+carid+'"]').fadeIn("slow").show();
	 		$('.car_details:[data-id!="'+carid+'"]').each(function() {
	 			$(this).fadeOut("slow").hide();
			});	
			$('li.listcars').each(function() {
				$(this).show(); 
				$("li.listcars:[data-id='"+carid+"']").hide(); 
			});
			$('#latest_cars li').removeClass('last');
			$('#latest_cars li:not(:hidden):last').addClass('last');
			
			return false;
		
		});
	

	} 	
};
$(document).ready(function(){
	Shadowbox.init({
		players:    ["img"],
		skipSetup: true,
		language: 'sv'
    }); 
	// Let's Add nice default data!
	// Let's ignore clicks from these!
	$('#vehicle_type li a').addClass('remeber');
	$('#fuel_type li a').addClass('remeber');
	$('#transmission_type li a').addClass('remeber');
	// Fordons typ
	//$('#vehicle_type li a.bil').addClass('chosen');
	$('span.vehicle_type_data').text('Samtliga');
	$('input.vehicle_type_data').val('Samtliga');		
	// Bränsle
	$('#fuel_type li:not(:first)').hide();
	$('span.fuel_type_data').text('Samtliga');
	$('input.fuel_type_data').val('Samtliga');		
	//Växellåda
	$('#transmission_type li:not(:first)').hide();;
	$('span.transmission_type_data').text('Samtliga');
	$('input.transmission_type_data').val('Samtliga');
			
//	var defaultData = fetchData("/?ajax_call=212",{"action":"defaultValues"});

	$('#car_free_text').attr('value',Utf8.decode('Sök bland våra fordon'));
	
	jspPlay.picturePlay(); // Picture play object
	if (typeof(defaultData) == 'object') {
		// Add sliders
		$('#price_range').slider({
			range: true,
			min: 0,
			max: parseInt(defaultData.values.out_price.length-1),
			values: [0,parseInt(defaultData.values.out_price.length-1)],
			slide: function( event, ui ) {
				$("span.price_from").text(defaultData.values.out_price[ui.values[0]]);
				$("span.price_to").text(defaultData.values.out_price[ui.values[1]]);

				$(this).find('a:first').attr('title',defaultData.values.out_price[ui.values[0]]);
				$(this).find('a:last').attr('title',defaultData.values.out_price[ui.values[1]]);
			},
			create: function( event, ui ) {
				$("span.price_from" ).text(defaultData.values.out_price[0]);
				$("span.price_to" ).text(defaultData.values.out_price[defaultData.values.out_price.length-1]);
				$("input.price_from" ).val(defaultData.values.out_price[0]);
				$("input.price_to" ).val(defaultData.values.out_price[defaultData.values.out_price.length-1]);

				$(this).find('a:first').attr('title',defaultData.values.out_price[0]);
				$(this).find('a:last').attr('title',defaultData.values.out_price[defaultData.values.out_price.length-1]);
			},
			stop: function(event,ui) {
				$("input.price_from").val(defaultData.values.out_price[ui.values[0]]);
				$("input.price_to").val(defaultData.values.out_price[ui.values[1]]).change();			
			}
		});
		$('#year_range').slider({
			range: true,
			min: 0,
			max: parseInt(defaultData.values.year.length-1),
			values: [0,parseInt(defaultData.values.year.length-1)],
			slide: function( event, ui ) {
				$("span.year_from").text(defaultData.values.year[ui.values[0]]);
				$("span.year_to").text(defaultData.values.year[ui.values[1]]);

				$(this).find('a:first').attr('title',defaultData.values.year[ui.values[0]]);
				$(this).find('a:last').attr('title',defaultData.values.year[ui.values[1]]);
			},
			create: function( event, ui ) {
				$("span.year_from" ).text(defaultData.values.year[0]);
				$("span.year_to" ).text(defaultData.values.year[defaultData.values.year.length-1]);
				$("input.year_from" ).val(defaultData.values.year[0]);
				$("input.year_to" ).val(defaultData.values.year[defaultData.values.year.length-1]);

				$(this).find('a:first').attr('title',defaultData.values.year[0]);
				$(this).find('a:last').attr('title',defaultData.values.year[defaultData.values.year.length-1]);
			},
			stop: function(event,ui) {
				$("input.year_from").val(defaultData.values.year[ui.values[0]]);
				$("input.year_to").val(defaultData.values.year[ui.values[1]]).change();			
			}

		});

		$('#mileage_range').slider({
			range: true,
			min: 0,
			max: parseInt(defaultData.values.mileage.length-1),
			values: [0,parseInt(defaultData.values.mileage.length-1)],
			slide: function( event, ui ) {
				$("span.mileage_from").text(defaultData.values.mileage[ui.values[0]]);
				$("span.mileage_to").text(defaultData.values.mileage[ui.values[1]]);

				$(this).find('a:first').attr('title',defaultData.values.mileage[ui.values[0]]);
				$(this).find('a:last').attr('title',defaultData.values.mileage[ui.values[1]]);
			},
			create: function( event, ui ) {
				$("span.mileage_from" ).text(defaultData.values.mileage[0]);
				$("span.mileage_to" ).text(defaultData.values.mileage[defaultData.values.mileage.length-1]);
				$("input.mileage_from").val(defaultData.values.mileage[0]);
				$("input.mileage_to").val(defaultData.values.mileage[defaultData.values.mileage.length-1]);
				$(this).find('a:first').attr('title',defaultData.values.mileage[0]);
				$(this).find('a:last').attr('title',defaultData.values.mileage[defaultData.values.mileage.length-1]);
			},
			stop: function(event,ui) {
				$("input.mileage_from").val(defaultData.values.mileage[ui.values[0]]);
				$("input.mileage_to").val(defaultData.values.mileage[ui.values[1]]).change();			
			}

		});

		// The end of adding sliders to elements

		// Add qTip 2 for slider and all the elements that need em
		$('.ui-slider a, #latest_cars img, #vehicle_type a').qtip({
	        style: {
	            tip: {
	                corner: true,
	                width: 7,
	                height: 7,
		            size: {
	     				x: 10,
	       				y: 10
	       			}
	            },
	            classes: 'ui-tooltip-dark ui-tooltip-rounded ui-tooltip-shadow'

	        },
	        position: {
	            my: 'bottom center', // Position my top left...
	            at: 'top center', // at the bottom right of...
	            adjust: {
	                y: 0
	            }
	        },
			hide: {
	        	fixed: true 
	        }
		});


	} else {
		$('.data_buttons button:[type="submit"]').attr('disable','disable');
	}

	// Click events down blelow

	$('#fuel_type li:not(:first)').click(function(event) {
		event.preventDefault();
		if ($(this).hasClass('selected')) {
			$(this).removeClass('selected');
		} else {
			$(this).addClass('selected');
		}
		var selected_vals = new Array();

		if ($('#fuel_type li.selected').length <5){
			$('#fuel_type li.selected').each(function(i,v) {
				selected_vals[i] = $(this).find('a:first').attr('title');
			});
		} else {			
			selected_vals[0] = 'Samtliga';
		}
		if ($('#fuel_type li.selected').length == 0) {
			selected_vals[0] = 'Samtliga';
		}		
		$('span.fuel_type_data').text(selected_vals.join(','));
		$('input.fuel_type_data').val(selected_vals.join(',')).change();

	});

	$('#transmission_type li:not(:first)').click(function(event) {
		event.preventDefault();
		if ($(this).hasClass('selected')) {
			$(this).removeClass('selected');
		} else {
			$(this).addClass('selected');
		}
		var selected_vals = new Array();

		if ($('#transmission_type li.selected').length <3){
			$('#transmission_type li.selected').each(function(i,v) {
				selected_vals[i] = $(this).find('a:first').attr('title');
			});
		} else {			
			selected_vals[0] = 'Samtliga';
		}
		if ($('#transmission_type li.selected').length == 0) {
			selected_vals[0] = 'Samtliga';
		}		
		$('span.transmission_type_data').text(selected_vals.join(','));
		$('input.transmission_type_data').val(selected_vals.join(',')).change();		
	
	});

	$('#vehicle_type li').click(function(event) {
		event.preventDefault();

		if ($(this).find('a').hasClass('chosen')) {
			$(this).find('a').removeClass('chosen');
		} else {
			$(this).find('a').addClass('chosen');
		}
		var selected_vals = new Array();

		if ($('#vehicle_type li a.chosen').length <6){
			$('#vehicle_type li a.chosen').each(function(i,v) {
				selected_vals[i] = $(this).attr('title');
			});
		} else {
			selected_vals[0] = 'Samtliga';
		}
		if ($('#vehicle_type li a.chosen').length == 0) {
			selected_vals[0] = 'Samtliga';
		}		
		$('span.vehicle_type_data').text(selected_vals.join(','));
		$('input.vehicle_type_data').val(selected_vals.join(',')).change();		

	});

	// Focus moments
	$('#car_free_text').focus(function() {
		$(this).attr('value','');
	});

	$('#car_free_text').blur(function() {
		if ($('#search_result_wrapper').css('display') == 'block') {
			resetPageinator();
			FetchTable();
			PageInator();		
		}
	});

	// Let's check for changes
	$('#cq_car_search input').change(function() {
		FetchNumRow();
		if ($('#search_result_wrapper').css('display') == 'block') {
			$('#cq_result_count').show();
			$('.paginationControl').show();
			resetPageinator();
			FetchTable();
			PageInator();		
		}
	});

	// Fuck data!
	$('#cq_car_search').submit(function(event) {
		event.preventDefault();
		resetPageinator();
		FetchTable();
		$('#show_newest_cars').hide();
		$('#search_result_wrapper').show();
		try {
			var pageTitle = Utf8.encode($('#nav_ul li.current').find('a').html());
			pageTitle = pageTitle.substring(3,pageTitle.length);
			pageTitle = pageTitle.substring(0,pageTitle.length-3);						
			$('#nav_ul li.current').removeClass('current')
				.find('a').html(Utf8.decode(pageTitle));
			$('#nav_ul li').find('a').eq(1)
				.html("&raquo; "+$('#nav_ul li').find('a').eq(1).text()+" &laquo;")
				.parent('li').addClass('current').find('a').addClass('remeber');
		} catch (err) { 
		}
		PageInator();
	});

	$('div.data.buttons button:[type="reset"]').click(function(event) {
		event.preventDefault();
		resetSearch();
	});

	 $("#transmission_type, #fuel_type").mouseleave(function(){
	 	$(this).removeClass('active');
	 	$(this).find('li:not(:first)').slideUp(400);
	 });

	 $("#transmission_type, #fuel_type").mouseenter(function(){
	 	$(this).find('li:not(:first)').slideDown(400);
	 	$(this).addClass('active');
	 });

	$('#search_result tbody td').live('click', function() {
		window.location = $(this).parent('tr').find('td:last').find('a.button').attr('href');
	});	 

	$('#search_result tbody td img').live('click', function() {
		window.location = $(this).parent('tr').find('td:last').find('a.button').attr('href');
	});	 


	$('.paginationControl a').live('click',function(event) {
		event.preventDefault();

		var pageAction = $(this).attr('class');
		var offset = parseInt($(this).attr('data-page'));
		$('.paginationControl').attr('data-action',pageAction);
		$('.paginationControl').attr('data-offset',parseInt(offset));

		FetchTable();
		$('.paginationControl').attr('data-action','');
		$('.paginationControl').attr('data-offset',0);
		switch(pageAction) {
			case "page":
				var new_next = parseInt($(this).attr('data-page'))+perPage;
				var new_prev = parseInt($(this).attr('data-page'));
				
				$('.paginationControl .next').attr('data-page',new_next);
				$('.paginationControl .previous').attr('data-page',new_prev);
				break;

			case "next":
				var new_next = parseInt($(this).attr('data-page'))+perPage;
				var new_prev = parseInt($('.paginationControl .previous').attr('data-page'))+perPage;
				
				$('.paginationControl .next').attr('data-page',new_next);
				$('.paginationControl .previous').attr('data-page',new_prev);
				break;
			case "previous":
				var new_next = parseInt($(this).attr('data-page'))+perPage;
				var new_prev = parseInt($('.paginationControl .previous').attr('data-page'))+perPage;			
				$('.paginationControl .previous').attr('data-page',$(this).attr('data-page')-perPage);
				$('.paginationControl .next').attr('data-page',$('.paginationControl .next').attr('data-page')-perPage);

				break;
		}
		PageInator();
		$('html,body').animate({scrollTop: $('#cq_result_count').offset().top},300)
	});

	// Load init data and result.
	if (typeof(savedData) == 'object') {
		try {
			//console.log('savedData');
			setSearchValues();
			FetchNumRow();

			var pageTitle = Utf8.encode($('#nav_ul li.current').find('a').html());
			pageTitle = pageTitle.substring(3,pageTitle.length);
			pageTitle = pageTitle.substring(0,pageTitle.length-3);						
			$('#nav_ul li.current').removeClass('current')
				.find('a').html(Utf8.decode(pageTitle));
			$('#nav_ul li').find('a').eq(1)
				.html("&raquo; "+$('#nav_ul li').find('a').eq(1).text()+" &laquo;")
				.parent('li').addClass('current').find('a').addClass('remeber');
		} catch (err) {
			
		}
		$('.paginationControl').attr('data-offset',parseInt(savedData.page));
		$('.paginationControl').attr('data-action',savedData.pageAction);
		var next = parseInt(parseInt(savedData.page)+parseInt(perPage));
		if (!savedData.page) {
			next = perPage;
			savedData.page = next
		}
		$('.paginationControl .next').attr('data-page',next);
		$('.paginationControl .previous').attr('data-page',parseInt(savedData.page)-perPage);		

		FetchTable();
		PageInator();
	} else if ($('#nav_ul li.current a[title="Fordon i lager"]').parent('li').hasClass('current')){
		//console.log('Visa result');
		FetchNumRow();
		FetchTable();
		resetPageinator();
		PageInator();
		$('#show_newest_cars').hide();
		$('#search_result_wrapper').show();		
	} else {
		//console.log('Hämta rows');
		FetchNumRow();
		//FetchTable();
		//resetPageinator();
		//PageInator();
	}

});

function FetchNumRow() {
	if (typeof(defaultData) == 'object') {
		var formData = new Object();
		formData['search'] = BuildSearch();
		formData['action'] = "fetchNumRows";
		var returnData = fetchData("/?ajax_call=212",formData);
		$('#data_selected span.hits').text(returnData.hits);	
	}
}

function FetchTable() {
	var formData = new Object();
	var pageAction = $('.paginationControl').attr('data-action');
	formData['search'] = BuildSearch();
	formData['action'] = "FetchResult";
	if (pageAction != '') {
		formData['page'] = $('.paginationControl').attr('data-offset');
		formData['pageAction'] = pageAction;
	}
	formData['perPage'] = perPage;
	var returnData = fetchData("/?ajax_call=212",formData);
	if (returnData.rows == 0) {
		$('#search_result thead').hide();
	} else {
		$('#search_result thead').show();
	}
	$('#search_result tbody').html(Utf8.decode(returnData.table));
	return formData;		
}

function BuildSearch() {
	var formData = new Object();
	formData['search'] = new Object();
	$('#cq_car_search input').each(function(i,v) {
		if ($(this).attr('value') == 'Sök bland våra fordon') {
			$(this).attr('value','');
			var resetFree = true;
		}
		formData.search[$(this).attr('name')] = $(this).attr('value');
		if ($(this).attr('value') == '' && $(this).attr('id') == 'car_free_text' && resetFree) {
			$(this).attr('value',Utf8.decode('Sök bland våra fordon'));
		}
	});
	return formData['search'];
}

function PageInator() {
	var next = parseInt($('.paginationControl .next').attr('data-page'));
	var prev = parseInt($('.paginationControl .previous').attr('data-page'));
	var total = parseInt($('.number_hits .hits').text());
	if (prev == 0 && total < perPage) {
		$('.paginationControl').hide();
		$('#cq_result_count').hide();
	} else {
		if (prev == 0) {
			$('.paginationControl .previous').hide();
		} else {
			$('.paginationControl .previous').show();
		}

		if (total-next+perPage <= perPage) {
			$('.paginationControl .next').hide();
		} else {
			$('.paginationControl .next').show();
		}
		$('#cq_result_count').show();		
		$('.paginationControl').show();
	}
	var total_pages = parseInt(Math.ceil(total/perPage));
	var current_page = parseInt(parseInt(total_pages)-(parseInt(total_pages)-parseInt(next)/parseInt(perPage)));
	var result_text = 'Visar sidan '+current_page+' av '+total_pages;
	var pageMeny = "";
	for(page=1;page<=total_pages;page++) {
		var calc_offset = page*perPage-perPage;
		if (page != current_page) {
			pageMeny += '<a href="#" class="page" data-page="'+calc_offset+'">'+page+'</a>';
		} else {
			pageMeny += '<span>'+page+'</span>&nbsp;';
		}
	}

	$('#pages').html(pageMeny);
	$('#cq_result_count').text(result_text);

}

function resetPageinator() {
	$('.paginationControl .next').attr('data-page',perPage);
	$('.paginationControl .previous').attr('data-page','0');
}

function resetSearch() {
	// Reset sliders
	$('#mileage_range').slider('values',0,0);
	$('#mileage_range').slider('values',1,defaultData.values.mileage.length-1);
	$('#year_range').slider('values',0,0);
	$('#year_range').slider('values',1,defaultData.values.year.length-1);
	$('#price_range').slider('values',0,0);	
	$('#price_range').slider('values',1,defaultData.values.out_price.length-1);
	// Reset slider inputs and spans
	$("span.mileage_from" ).text(defaultData.values.mileage[0]);
	$("span.mileage_to" ).text(defaultData.values.mileage[defaultData.values.mileage.length-1]);
	$("input.mileage_from" ).val(defaultData.values.mileage[0]);
	$("input.mileage_to" ).val(defaultData.values.mileage[defaultData.values.mileage.length-1]);

	$("span.year_from" ).text(defaultData.values.year[0]);
	$("span.year_to" ).text(defaultData.values.year[defaultData.values.year.length-1]);
	$("input.year_from" ).val(defaultData.values.year[0]);
	$("input.year_to" ).val(defaultData.values.year[defaultData.values.year.length-1]);

	$("span.price_from" ).text(defaultData.values.out_price[0]);
	$("span.price_to" ).text(defaultData.values.out_price[defaultData.values.out_price.length-1]);
	$("input.price_from" ).val(defaultData.values.out_price[0]);
	$("input.price_to" ).val(defaultData.values.out_price[defaultData.values.out_price.length-1]);	


	//Fordonstyp
	$('#vehicle_type li a').removeClass('chosen');
	$('#fuel_type li').removeClass('selected');
	$('#transmission_type li').removeClass('selected');
	//$('#vehicle_type li a.bil').addClass('chosen');
	$('span.vehicle_type_data').text('Samtliga');
	$('input.vehicle_type_data').val('Samtliga');		
	// Bränsle
	//$('#fuel_type li:not(:first)').addClass('selected').hide();
	$('span.fuel_type_data').text('Samtliga');
	$('input.fuel_type_data').val('Samtliga');		
	//Växellåda
	//$('#transmission_type li:not(:first)').addClass('selected').hide();;
	$('span.transmission_type_data').text('Samtliga');
	$('#car_free_text').attr('value',Utf8.decode('Sök bland våra fordon'));	
	$('input.transmission_type_data').val('Samtliga').change();	
}

function setSearchValues() {

	var year_index = new Array();
	$.each(defaultData.values.year, function(i,v) {
		if (savedData.search.year_from == v) {
			year_index[0] = i;
		}
		if (savedData.search.year_to == v) {
			year_index[1] = i;
		}
	});

	var price_index = new Array(); 
	$.each(defaultData.values.out_price, function(i,v) {
		if (savedData.search.price_from == v) {
			price_index[0] = i;
		}
		if (savedData.search.price_to== v) {
			price_index[1] = i;
		}
	});

	var mileage_index = new Array(); 
	$.each(defaultData.values.mileage, function(i,v) {
		if (savedData.search.milage_from == v) {
			mileage_index[0] = i;
		}
		if (savedData.search.milage_to== v) {
			mileage_index[1] = i;
		}
	});


	$('#year_range').slider('values',0,year_index[0]);
	$('#year_range').slider('values',1,year_index[1]);
	
	$('#price_range').slider('values',0,price_index[0]);	
	$('#price_range').slider('values',1,price_index[1]);

	$('#mileage_range').slider('values',0,mileage_index[0]);
	$('#mileage_range').slider('values',1,mileage_index[1]);

	// Reset slider inputs and spans
	$("span.mileage_from" ).text(savedData.search.milage_from);
	$("span.mileage_to" ).text(savedData.search.milage_to);
	$("input.mileage_from" ).val(savedData.search.milage_from);
	$("input.mileage_to" ).val(savedData.search.milage_to);

	$("span.year_from" ).text(savedData.search.year_from);
	$("span.year_to" ).text(savedData.search.year_to);
	$("input.year_from" ).val(savedData.search.year_from);
	$("input.year_to" ).val(savedData.search.year_to);

	$("span.price_from" ).text(savedData.search.price_from);
	$("span.price_to" ).text(savedData.search.price_to);
	$("input.price_from" ).val(savedData.search.price_from);
	$("input.price_to" ).val(savedData.search.price_to);
	if (savedData.search.vehicle_type == 'Samtliga') {
		$('#vehicle_type li a').addClass('chosen');
		$('span.vehicle_type_data').text('Samtliga');
		$('input.vehicle_type_data').val('Samtliga');	
	} else {
		var tmp = savedData.search.vehicle_type.split(',');

		$('span.vehicle_type_data').text(savedData.search.vehicle_type);
		$('input.vehicle_type_data').val(savedData.search.vehicle_type);		
		$('#vehicle_type li a').removeClass('chosen');
		if (tmp.length > 0 && tmp[0] != '') { 
			$.each(tmp,function(i,v) {
				var lc_tmp = v.toLowerCase();	
				$('#vehicle_type li a.'+lc_tmp).addClass('chosen');	
			});
		}
	}
	if (savedData.search.fuel_type == 'Samtliga') {
		$('#vehicle_type li').addClass('selected');
		$('span.fuel_type_data').text('Samtliga');
		$('input.fuel_type_data').val('Samtliga');		
	} else {
		var tmp = savedData.search.fuel_type.split(',');
		$('span.fuel_type_data').text(savedData.search.fuel_type);
		$('input.fuel_type_data').val(savedData.search.fuel_type);		
		$('#fuel_type li').removeClass('selected');
		if (tmp.length > 0 && tmp[0] != '') { 
			$.each(tmp,function(i,v) {
				$('#fuel_type li a:[title="'+v.toLowerCase()+'"]').parent('li').addClass('selected');
				
			});
		}
	}
	if (savedData.search.transmission_type == 'Samtliga') {
		$('#transmission_type li').addClass('selected');
		$('span.transmission_type_data').text('Samtliga');
		$('input.transmission_type_data').val('Samtliga');		
	} else {
		var tmp = savedData.search.transmission_type.split(',');
		$('span.transmission_type_data').text(savedData.search.transmission_type);
		$('input.transmission_type_data').val(savedData.search.transmission_type);		
		$('#transmission_type li').removeClass('selected');
		if (tmp.length > 0 && tmp[0] != '') { 
			$.each(tmp,function(i,v) {
				$('#transmission_type li a:[title="'+v+'"]').parent('li').addClass('selected');	
			});
		}
	}
	$('#car_free_text').attr('value',Utf8.decode(savedData.search.brand));
	$('#show_newest_cars').hide();
	$('#search_result_wrapper').show();

}


// I hate this with mixed encodings...
var Utf8 = {
 
	// public method for url encoding
	encode : function (string) {
		try {
			string = string.replace(/\r\n/g,"\n");
			var utftext = "";
	 
			for (var n = 0; n < string.length; n++) {
	 
				var c = string.charCodeAt(n);
	 
				if (c < 128) {
					utftext += String.fromCharCode(c);
				}
				else if((c > 127) && (c < 2048)) {
					utftext += String.fromCharCode((c >> 6) | 192);
					utftext += String.fromCharCode((c & 63) | 128);
				}
				else {
					utftext += String.fromCharCode((c >> 12) | 224);
					utftext += String.fromCharCode(((c >> 6) & 63) | 128);
					utftext += String.fromCharCode((c & 63) | 128);
				}
	 
			}
	 
			return utftext;
		} catch (err) {
			return string;
		}
	},
 
	// public method for url decoding
	decode : function (utftext) {
		var string = "";
		var i = 0;
		var c = c1 = c2 = 0;
 		try  {
			while ( i < utftext.length ) {
	 
				c = utftext.charCodeAt(i);
	 
				if (c < 128) {
					string += String.fromCharCode(c);
					i++;
				}
				else if((c > 191) && (c < 224)) {
					c2 = utftext.charCodeAt(i+1);
					string += String.fromCharCode(((c & 31) << 6) | (c2 & 63));
					i += 2;
				}
				else {
					c2 = utftext.charCodeAt(i+1);
					c3 = utftext.charCodeAt(i+2);
					string += String.fromCharCode(((c & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63));
					i += 3;
				}
	 
			}
		} catch(err) {
			string = utftext;
		}
 
		return string;
	}
}
