var vmap_deals = Array(20);
var last_deal_id = 0;
var show_deal_timer;
var vmap_is_loading_deal = false; // Check if it is loading the update
var vmap_request = null;
var vmap_first_request_success = false; // Success means in proper XML format even no data.
var vmap_next_index = -1;
var vmap_last_index = -1;
var vmap_content_max_index = -1;
var vmap_show_deal_count = 0;
var vmap_svr_different_time = 0; // Time different from browser time.
var vmap_showtime_time_limit = 20; // Don't show this minute ago.
var vmap_timing = 1; // Second for updating count_time;
var show_deal_count_time = 0; // Second for counting for showing the vmap item
var vmap_fade_in_time = 450; // miliseconds
var vmap_fade_out_time = 450; // miliseconds
var vmap_record_show_time = 3; // seconds. include vmap_fade_in_time & vmap_fade_out_time
var vmap_record_per_request = 10;
var vmap_prod_name_max_char_per_row = 13;
var vmap_prod_name_max_char = 39;

// Function: Trim string function
String.prototype.trim = function() {
    //skip leading and trailing whitespace
    //and return everything in between
    var x=this;
    x=x.replace(/^\s*(.*)/, "$1");
    x=x.replace(/((.|\n|\r)*?)\s*$/, "$1");
    return x;
};

function vmap_createRequest() {
	try {
		vmap_request = new XMLHttpRequest();
	} catch (trymicrosoft) {
		try {
			vmap_request = new ActiveXObject("Msxml2.XMLHTTP");
		} catch (othermicrosoft) {
			try {
				vmap_request = new ActiveXObject("Microsoft.XMLHTTP");
			} catch (failed) {
				vmap_request = null;
			}
		}
	}
}


// Function: Get update.
function vmap_get_deal(){
	// Don't want to make more than one request. If there is already a request loading, don't make a request again.
	if( !vmap_is_loading_deal ) {
		set_vmap_is_loading_deal(true);
		var request_url = "vmap_light_batch_request_ajax.cfm?last_deal_id=" + last_deal_id + "&ts=" + new Date().getTime();
		vmap_request.open("GET", request_url, true);
		vmap_request.onreadystatechange = vmap_receive_deal;
		vmap_request.send(null);
	}
}


function vmap_receive_deal(){
	
	if(vmap_request.readyState == 4){
		set_vmap_is_loading_deal(false);
		if (vmap_request.status == 200) {
			var response_xml = vmap_request.responseXML;
			var vmap_tags = response_xml.getElementsByTagName("vmap");
			var response_valid = true;
			if(vmap_tags.length > 0){
				try {
					var vmap_deal_tags = vmap_tags[0].getElementsByTagName("vmap_deal");
					var vmap_deal_temp;
					if( vmap_deal_tags.length > 0 ){
						for( var i=vmap_deal_tags.length-1; i>=0; i-- ){
							vmap_deal_temp = new Object();
							vmap_deal_temp.product_name = "";
							for( var j=0; j<vmap_deal_tags[i].getElementsByTagName("product_name")[0].childNodes.length; j++ ){
								vmap_deal_temp.product_name += vmap_deal_tags[i].getElementsByTagName("product_name")[0].childNodes[j].nodeValue;
							}
							vmap_deal_temp.product_name = vmap_wrap_word(vmap_set_max_string(vmap_trim_all_spaces(vmap_deal_temp.product_name),vmap_prod_name_max_char), vmap_prod_name_max_char_per_row);
							vmap_deal_temp.product_url = vmap_deal_tags[i].getElementsByTagName("product_url")[0].firstChild.nodeValue;
							vmap_deal_temp.deal_type = vmap_deal_tags[i].getElementsByTagName("deal_type")[0].firstChild.nodeValue;
							vmap_deal_temp.deal_date = vmap_deal_tags[i].getElementsByTagName("deal_date")[0].firstChild.nodeValue;
							vmap_deals.pop(); // Pop the last item
							vmap_deals.unshift(vmap_deal_temp); // Push on the new item
							if( i == 0 )
								last_deal_id = vmap_deal_tags[i].getElementsByTagName("deal_id")[0].firstChild.nodeValue;
							if( (vmap_next_index + 1) < 20 )
								vmap_next_index += 1;
						}
						//alert("updated");
						
					}
					
					if( vmap_content_max_index < (20-1) ){
						for(var i=0; i<vmap_deals.length; i++){
							if( !vmap_deals[i] )
								break;
						}
						vmap_content_max_index = i-1;
					}
					
					//alert(debug_vmap_deals());
				}
				catch (error){
					response_valid = false;
					//alert("error");
				}
			}
			if( response_valid )
				vmap_first_request_success = true;
		}
	}
	
}


function show_deal(){
	
	if( vmap_content_max_index >= 0 ){
	
		if( vmap_next_index != -1 ){
		
			vmap_last_index = vmap_next_index;
			var curr_product_name = vmap_deals[vmap_next_index].product_name;
			var curr_product_url = vmap_deals[vmap_next_index].product_url;
			var curr_deal_type = vmap_deals[vmap_next_index].deal_type;
			var curr_deal_date = vmap_deals[vmap_next_index].deal_date;
			vmap_next_index -= 1;
			//alert(curr_product_name);
		
		}
		else{
			
			if( vmap_content_max_index >= 9 )
				var rand_range = 9;
			else
				var rand_range = vmap_content_max_index;
			
			var rand_no = Math.round( Math.random() * rand_range );
			if( vmap_last_index == rand_no ){
				if( (rand_no - 1) >= 0 )
					rand_no -= 1;
				else if( (rand_no + 1) <= vmap_content_max_index )
					rand_no += 1;
			}
			if( vmap_last_index != rand_no ){
				var curr_product_name = vmap_deals[rand_no].product_name;
				var curr_product_url = vmap_deals[rand_no].product_url;
				var curr_deal_type = vmap_deals[rand_no].deal_type;
				var curr_deal_date = vmap_deals[rand_no].deal_date;
				vmap_last_index = rand_no;
				//alert("vmap_next_index: " + vmap_next_index + "\n" + curr_product_name + "\n" + rand_no);
				
			}
		}
		var minute_ago = vmap_cal_deal_minute(curr_deal_date);
		if( minute_ago <= vmap_showtime_time_limit ){
			var vmap_light_loading = document.getElementById("vmap_light_loading");
			var has_loading_text = false;
			var display_deal_func = function(){
				vmap_display_product_name(curr_product_name, curr_product_url);
				vmap_display_deal_name(curr_deal_type);
				vmap_display_deal_minute(minute_ago);
				vmap_light_div_fade_in();
			}
			if( vmap_light_loading ){
				if( vmap_light_loading.style.display == "block" || vmap_light_loading.style.display == "" ){
					has_loading_text = true;
					vmap_light_loading_fade_out(
						function(){
							display_deal_func();
						}
					);
				}
			}
			if( !has_loading_text ){
				var vmap_light_div = document.getElementById("vmap_light_div");
				if( vmap_light_div.style.display != "none" ){
					vmap_light_div_fade_out(
						function(){
							display_deal_func();
						}
					);
				}
				else{
					display_deal_func();
				}
			}
		}
		else{
			var vmap_light_loading = document.getElementById("vmap_light_loading");
			if( vmap_light_loading )
				if( vmap_first_request_success && (vmap_light_loading.style.display == "block" || vmap_light_loading.style.display == "") )
					vmap_light_loading_fade_out(null);
		}
		
	}
	else{
		var vmap_light_loading = document.getElementById("vmap_light_loading");
		if( vmap_light_loading )
			if( vmap_first_request_success && (vmap_light_loading.style.display == "block" || vmap_light_loading.style.display == "") )
				vmap_light_loading_fade_out(null);
	}
	
}


function vmap_light_loading_fade_out(finish_func){
	var finish_func1 = function(){
		if( finish_func )
			finish_func();
		document.getElementById("vmap_light_loading").style.display = "none";
	}
	var fade_out = new Spry.Effect.Fade("vmap_light_loading", {finish:finish_func1, duration: vmap_fade_out_time, from: 100, to: 0, toggle:false});
	fade_out.start();
}

function vmap_light_div_fade_out(finish_func){
	var fade_out = new Spry.Effect.Fade("vmap_light_div", {finish:finish_func, duration: vmap_fade_out_time, from: 100, to: 0, toggle:false});
	fade_out.start();
}

function vmap_light_div_fade_in(){
	var fade_out = new Spry.Effect.Fade("vmap_light_div", {duration: vmap_fade_in_time, from: 0, to: 100, toggle:false});
	fade_out.start();
}


function vmap_display_product_name(product_name, product_url){
	var link_tag = document.getElementById("vmap_light_product_link");
	vmap_empty_node(link_tag, 2);
	link_tag.setAttribute("href", product_url);
	link_tag.appendChild(document.createTextNode(product_name));
	
	
}

function vmap_display_deal_name(deal_type){
	var link_tag = document.getElementById("vmap_deal_name");
	vmap_empty_node(link_tag, 2);
	switch( deal_type ){
		case "product_buy" : var deal_name = "purchased"; break;
		default : var deal_name = "viewed"; break;
	}
	link_tag.appendChild(document.createTextNode(deal_name));
}

function vmap_display_deal_minute(d_minute){
	var link_tag = document.getElementById("vmap_minute_ago");
	vmap_empty_node(link_tag, 2);
	if( d_minute > 1 ){
		link_tag.appendChild(document.createTextNode(d_minute+" minutes"));
	}
	else{
		link_tag.appendChild(document.createTextNode(d_minute+" minute"));
	}
}

function vmap_cal_deal_minute(deal_date_str){

	// Date. Original format: yyyy-mm-dd HH:mm:ss
	var deal_date_array = deal_date_str.split(" ");
	
	var date_part_array = deal_date_array[0].split("-");
	var d_year = eval(date_part_array[0]);
	var d_month = eval(date_part_array[1])-1; // Month is 0-11 in JavaScript
	var d_day = eval(date_part_array[2]);
	
	var time_part_array = deal_date_array[1].split(":");
	var d_hour = eval(time_part_array[0]);
	var d_minute = eval(time_part_array[1]);
	var d_second = eval(time_part_array[2].split(".")[0]); // Use 00 format instead of 00.0
	
	var deal_date = new Date(d_year, d_month, d_day, d_hour, d_minute, d_second);
	
	var one_minute = 1000*60;
	var now = new Date();

	// Calculate difference btw the two dates, and convert to minutes
	// Need to plus time different from server.
	var d_different_minute = Math.round( ( (now.getTime()+vmap_svr_different_time)-deal_date.getTime() ) / one_minute );

	return d_different_minute;

}

function vmap_empty_node(target_node, node_type){ // node_type: 1: node ID string; 2: node object;
	if( node_type == 1 )
		var d_node = document.getElementById(target_node);
	else
		var d_node = target_node;
	while(d_node.childNodes.length >0){
		d_node.removeChild(d_node.childNodes[0]);
	}
}


function debug_vmap_deals(){
	var str = "";
	for( var i=0; i<vmap_deals.length; i++ ){
		str += "\n" + vmap_deals[i].product_name;
	}
	return str;
}


function show_deal_timing(){
	show_deal_count_time += vmap_timing;
	if( show_deal_count_time >= vmap_record_show_time ){
		show_deal();
		show_deal_count_time = 0;
		vmap_show_deal_count += 1;
		if( vmap_show_deal_count == (vmap_record_per_request/2) ){
			vmap_get_deal();
		}
		if( vmap_show_deal_count >= vmap_record_per_request ){
			vmap_show_deal_count = 0;
		}
	}
}


// Function: Run the update.
function vmap_run_show_deal(){
	show_deal_timer = setInterval("show_deal_timing()", 1000*vmap_timing); // Create interval for update.
}

// Function: Pause the update, delete the interval object.
function vmap_pause_show_deal(){
	// Stop the update request timer
	if( show_deal_timer ){
		clearInterval(show_deal_timer);
	}
}

// Function: Set vmap_is_loading_deal.
function set_vmap_is_loading_deal(d_value){
	vmap_is_loading_deal = d_value;
}


function init_vmap_elements(){
	var link_tag = document.getElementById("vmap_light_product_link");
	link_tag.onmouseover = function(){
		vmap_pause_show_deal();
	};
	link_tag.onmouseout = function(){
		vmap_run_show_deal();
	};
}

function vmap_wrap_word(input, len){
	var output = "";
	var pointer = 0;
	while( pointer < input.length ){
		item_temp = input.substr(pointer, len);
		if( item_temp.indexOf(" ") < 0 ){
			item_temp += " ";
			pointer += len;
		}
		else{
			var last_space_index = item_temp.lastIndexOf(" ");
			item_temp = item_temp.substr(0, last_space_index+1);
			pointer +=  last_space_index + 1;
		}
		output += item_temp;
	}
	return output;
}

function vmap_set_max_string(input, len){
	if( input.length > len ){
		input = input.substr(0, len-3) + "...";
	}
	return input;
}

function vmap_trim_all_spaces(input){
	input = input.trim();
	input = input.replace(/\n/g, " ");
	input = input.replace(/\t/g, " ");
	while( input.indexOf("  ") >= 0 ){
		input = input.replace(/  /g, " ");
	}
	return input;
}

function vmap_get_svr_time_n_start(){
	
	var request_url = "vmap_get_svr_time_ajax.cfm?ts=" + new Date().getTime();
	vmap_request.open("GET", request_url, true);
	vmap_request.onreadystatechange = function(){
		
		if(vmap_request.readyState == 4){
			var get_success = false;
			if (vmap_request.status == 200) {
				var now_temp = new Date();
				var response_xml = vmap_request.responseXML;
				var vmap_tags = response_xml.getElementsByTagName("vmap");
				if(vmap_tags.length > 0){
					try {
						var svr_time_tags = vmap_tags[0].getElementsByTagName("svr_time");
						var svr_time_value = svr_time_tags[0].firstChild.nodeValue.trim();
						var svr_time_value_splited = svr_time_value.split(" ");
						var svr_date_array = svr_time_value_splited[0].split("-");
						var svr_time_array = svr_time_value_splited[1].split(":");
						var svr_year_temp = eval(svr_date_array[0] + " + 0");
						var svr_month_temp = eval(svr_date_array[1] + " - 1");
						var svr_day_temp = eval(svr_date_array[2] + " + 0");
						var svr_hour_temp = eval(svr_time_array[0] + " + 0");
						var svr_minute_temp = eval(svr_time_array[1] + " + 0");
						var svr_second_temp = eval(svr_time_array[2] + " + 0");
						var svr_date = new Date(svr_year_temp, svr_month_temp, svr_day_temp, svr_hour_temp, svr_minute_temp, svr_second_temp);
						// Calculate server different time. To be added in the comparing later.
						vmap_svr_different_time = svr_date.getTime()- now_temp.getTime();
						get_success = true;
					}
					catch(error){
					}
				}
			}
			if( get_success ){
				// Start do things
				vmap_get_deal();
				vmap_run_show_deal();
			}
			else{
				setTimeout("vmap_get_svr_time_n_start()", 1000*6); // Get again after 6 secs.
			}
		}
	};
	vmap_request.send(null);
}

var vmap_old_window_onload = window.onload;

window.onload = function(){
	if( vmap_old_window_onload )
		vmap_old_window_onload();
	vmap_createRequest();
	init_vmap_elements();
	vmap_get_svr_time_n_start();
}