var NOT_SELECTED = 0;
var OWNER_WAIT_FOR_DRAGGING = 1;
var OWNER_DRAGGING = 2;
var NOT_OWNER_WAIT_FOR_MOUSE_UP = 3;
var OWNER_SELECTED_AGAIN_WAIT_FOR_DRAGGING = 4;
var RIGHT_MOUSE_BUTTON_CLICK	= 5;

var elem_x = 0;
var elem_y = 0;
//var img_id = null;
var nav_app_ie = 0;
var shelf_pos_array = new Array();
var prev_shelf_index = -1;
var elem_dx = 0;
var elem_dy = 0;
var max_elem_x = 0;
var max_elem_y = 0;
var elem_start_x = 0;
var elem_start_y = 0;

var shift_key_pressed = false;
var ctrl_key_pressed = false;
var shift_key_press_check_timer = null;
var ctrl_key_press_check_timer = null;
var drag_objs = new Array();

var drag_elem = null;
var drag_item_owner_id = 0;
var img_id = null;
var drag_state = NOT_SELECTED;

function findPosX(obj)
{
	var curleft = 0;
	if (obj.offsetParent)
	{
		while (obj.offsetParent)
		{
			curleft += obj.offsetLeft
			obj = obj.offsetParent;
		}
	}
	else if (obj.x)
		curleft += obj.x;
	return curleft;
}

function findPosY(obj)
{
	var curtop = 0;
	if (obj.offsetParent)
	{
		while (obj.offsetParent)
		{
			curtop += obj.offsetTop
			obj = obj.offsetParent;
		}
	}
	else if (obj.y)
		curtop += obj.y;
	return curtop;
}

function abs_val(val)
{
	val *= 1;
	if(val < 0)
		return -val;
	else
		return val;
}

function get_xy(evnt)
{
	elem_x = (evnt.clientX) + document.body.scrollLeft;
	elem_y = (evnt.clientY) + document.body.scrollTop;
}

function mouse_move(evnt)
{
check_for_right_click_mouse_move(this, evnt);
if(drag_elem == null)
	return;
if(drag_state == NOT_SELECTED || drag_state == NOT_OWNER_WAIT_FOR_MOUSE_UP)
	{
	return true;
	}
if(user_view_type == DETAIL_VIEW )//|| item_clicked == true)
	return true;
	
if(nav_app_ie == 0)
	{
	evnt.stopPropagation();
	}
else
	{
  evnt = window.event;                                 // IE event model
  drag_elem.cancelBubble = true;                            //Prevent bubbling
	}

get_xy(evnt);
if(elem_x > max_elem_x)
	{
	max_elem_x = elem_x;
	}
if(elem_y > max_elem_y)
	{
	max_elem_y = elem_y;
	}

if(drag_state == OWNER_WAIT_FOR_DRAGGING || drag_state == OWNER_SELECTED_AGAIN_WAIT_FOR_DRAGGING)
	{
	if(prepare_dragging())
		{
		drag_state = OWNER_DRAGGING;
		}
	}

var shelf_index = get_shelf_underneath(elem_x, elem_y);
if(shelf_index != -1)
	{
	if(shelf_index != prev_shelf_index)
		{
		if(prev_shelf_index != -1)
			{
			var prev_shelf_obj = shelf_pos_array[prev_shelf_index].obj;
			prev_shelf_obj.style.backgroundColor="";
			}
		var shelf_obj = shelf_pos_array[shelf_index].obj;
		var back_color = theme_color;
		shelf_obj.style.backgroundColor= '#FFC690';

		prev_shelf_index = shelf_index;
		}
	}
else
	{
	if(prev_shelf_index != -1)
		{
		var prev_shelf_obj = shelf_pos_array[prev_shelf_index].obj;
		prev_shelf_obj.style.backgroundColor="";
		prev_shelf_index = -1;
		}
	}
var dx = elem_x - elem_dx - parseInt(drag_elem.style.left);
var dy = elem_y - elem_dy - parseInt(drag_elem.style.top);

move_all_selected_object(dx, dy);
var obj = drag_elem; 
if(obj != null)
	{
	var top = parseInt(obj.style.top);
	var high = parseInt(obj.style.height);
	var total_height = (top + high) + 200;
	var diff_y = 0;
	if(top < document.body.scrollTop)
		{
		//diff_y = top;
		window.scroll(document.body.scrollLeft, top);
		}
	else if((total_height > screen.availHeight) && (total_height < avail_height))
		{		
		diff_y = total_height - screen.availHeight; 
		if(diff_y > document.body.scrollTop)
			{
			window.scroll(document.body.scrollLeft, diff_y);
			}
		}
	}	
return false;
}

function selected_object(obj, img_id, item_owner_id)
{
//this.selected_objs = new Array();
//this.add = add_selected_object;
//this.remove = remove_selected_object;
this.elem_original_position = '';
this.elem_zindex = 0;
this.drag_item_owner_id = item_owner_id;
this.drag_elem = obj;
this.img_id = img_id;
this.elem_start_x = 0;
this.elem_start_y = 0;
//this.elem_dx = 0;
//this.elem_dy = 0;

this.move = function(dx, dy)
{
this.drag_elem.style.left = parseInt(this.drag_elem.style.left) + dx;
this.drag_elem.style.top = parseInt(this.drag_elem.style.top) + dy;
}

function clone(obj)
{
if(obj == null || typeof(obj) != 'object')
    return obj;
var temp = new obj.constructor(); // changed (twice)
for(var key in obj)
    temp[key] = clone(obj[key]);
return temp;
}
this.start = function()
	{
	//var obj = this.drag_elem.offsetParent; 
	//this.drag_elem = clone(this.drag_elem);
	this.elem_start_x = findPosX(this.drag_elem);
	this.elem_start_y = findPosY(this.drag_elem);
	this.drag_elem.style.zIndex = 100;
	this.img_id.style.zIndex = 101;
	this.drag_elem.style.position='absolute';
	this.drag_elem.style.left = this.elem_start_x;
	this.drag_elem.style.top = this.elem_start_y;
	//obj.innerHTML = 'Rana'
	}

this.restore_position = function()
	{
	if(this.elem_start_y != 0 && this.elem_start_x != 0)
		{
		this.drag_elem.style.top = this.elem_start_y;
		this.drag_elem.style.left = this.elem_start_x;
		this.drag_elem.style.zIndex = 0;
		this.img_id.style.zIndex = 0;
		this.drag_elem.style.position='';
		this.drag_elem.style.visibility="visible";
		}
	}

this.stop = function()
	{
	this.select(false);
	this.restore_position();	
	}

this.hide = function()
	{
	this.drag_elem.style.visibility="hidden";
	this.img_id.style.visibility="hidden";
	this.drag_elem.style.display="none";
	this.img_id.style.display="none";
	hide_borrow_status_image(this.drag_item_owner_id);
	}

this.select = function(show)
	{
	this.drag_elem.style.visibility="visible";
	if(show)
		{
		this.drag_elem.style.backgroundColor = theme_color;
		this.drag_elem.style.filter = "alpha(opacity=50)";
		this.drag_elem.style.opacity = '0.50';
		this.img_id.style.cursor="move";
		if(user_view_type == LIST_VIEW)
			this.drag_elem.style.cursor="move";
		}
	else
		{
		this.drag_elem.style.backgroundColor = "";
		this.drag_elem.style.filter = "alpha(opacity=100)";
		this.drag_elem.style.opacity = '1.0';
		this.img_id.style.cursor = 'hand';
		this.img_id.style.cursor = 'pointer';
		this.drag_elem.style.cursor="hand";
		this.drag_elem.style.cursor="pointer";
		this.drag_elem.style.zIndex = 0;
		this.img_id.style.zIndex = 0;
		}	
	}
}

/*
moves every selected object 
*/
function move_all_selected_object(dx, dy)
{
var i;
var obj;
for(i = 0; i < drag_objs.length; ++i)
	{
	obj = drag_objs[i];
	if(obj != null)
		{
		obj.move(dx, dy);
		}	
	}
update_position_of_all_status_images();
}

function add_selected_object(obj, img_id, item_owner_id)
{
var i;
var index = -1;
var obj1;
for(i = 0; i < drag_objs.length; ++i)
	{
	obj1 = drag_objs[i];
	if(drag_objs[i] == null)
		{
		index = i;
		}
	else if(obj1.drag_elem == obj)
		{
		obj1.select(true);
		return;
		}	
	}
if(index == -1)
	{
	index = i;
	}
drag_elem = obj;
obj1 = new selected_object(obj, img_id, item_owner_id);
drag_objs[index] = obj1;
obj1.select(true);
//alert('selected');
}

function hide_all_selected_objects()
{
var i;
for(i = 0; i < drag_objs.length; ++i)
	{
	if(drag_objs[i] != null)
		{
		drag_objs[i].hide();
		drag_objs[i] = null;
		}		
	}
drag_objs = new Array();
}

function remove_all_selected_objects()
{
var i;
for(i = 0; i < drag_objs.length; ++i)
	{
	if(drag_objs[i] != null)
		{
		drag_objs[i].stop();
		drag_objs[i] = null;
		}		
	}
drag_objs = new Array();
}

function remove_selected_object(obj)
{
var i;
for(i = 0; i < drag_objs.length; ++i)
	{
	if(drag_objs[i] != null)
		{
		if(drag_objs[i].drag_elem == obj)
			{
			drag_objs[i].stop();
			drag_objs[i] = null;
			if(obj == drag_elem)
				drag_elem = null;
			}	
		}	
	}
}

function get_selected_object(obj)
{
var i;
for(i = 0; i < drag_objs.length; ++i)
	{
	if(drag_objs[i] != null)
		{
		if(drag_objs[i].drag_elem == obj)
			{
			return drag_objs[i];
			}	
		}
	}
return null;
}

function is_selected()
{
var i;
for(i = 0; i < drag_objs.length; ++i)
	{
	if(drag_objs[i] != null)
		{
		if(drag_objs[i].drag_elem == drag_elem)
			{
			return true;
			}	
		}	
	}
return false;
}

function open_link(item_owner_id)
{
if(item_owner_id == 0)
	return true;
var item_link = "http://www.gurulib.com/title/"+item_owner_id;
//return false;
if((ctrl_key_pressed == false || (owner == false)))
	{
	if(shift_key_pressed)
		{
		//setTimeout("window.open('"+item_link+"','_new')",100);
		window.open(item_link, "_blank");
		}
	else
		{
		window.open(item_link, "_self");
		//show_loading();
		//alert(item_link);
		//setTimeout("window.open('"+item_link+"','_self')",100);
		}
	return true;
	}	
return false;
}

function check_shift_key_down(evnt)
{
	var key = get_partial_result_key_code(evnt);
	if(key == 16)
		{
		shift_key_pressed = true;
		if(shift_key_press_check_timer != null)
			{
			clearTimeout(shift_key_press_check_timer);
			shift_key_press_check_timer = null;
			}
		shift_key_press_check_timer = setTimeout("shift_key_pressed=false;",400);
		}
	else if(key == 17)
		{
		ctrl_key_pressed = true;
		if(ctrl_key_press_check_timer != null)
			{
			clearTimeout(ctrl_key_press_check_timer);
			ctrl_key_press_check_timer = null;
			}
		ctrl_key_press_check_timer = setTimeout("ctrl_key_pressed=false;",400);
		}
	else
		{	
		shift_key_pressed = false;
		ctrl_key_pressed = false;
		}
}

function mouse_down(evnt)
{
get_xy(evnt);
if(elem_x > max_elem_x)
		max_elem_x = elem_x;
if(elem_y > max_elem_y)
	max_elem_y = elem_y;

elem_start_x = findPosX(drag_elem);
elem_start_y = findPosY(drag_elem);

elem_dx = elem_x - elem_start_x;
elem_dy = elem_y - elem_start_y;
return true;
}

function mouse_up(evnt)
{
check_for_right_click_abort(this,evnt);
if(drag_state != NOT_SELECTED)
	{
	if(nav_app_ie == 0)
		{
		document.removeEventListener("mouseup", mouse_up, true);
		if(drag_state != NOT_OWNER_WAIT_FOR_MOUSE_UP)
			{			
			document.removeEventListener("mousemove", mouse_move, true);
			}
		evnt.stopPropagation();

		}
	else
		{
		evnt = window.event;                                 // IE event model
    document.detachEvent("onmouseup", mouse_up);     //Unregister
    if(drag_state != NOT_OWNER_WAIT_FOR_MOUSE_UP)
    	{
    	document.detachEvent("onmousemove", mouse_move); //Unregister
    	}
    evnt.cancelBubble = true;                            //Prevent bubbling
		}
	if(is_right_click_menu_active())
		return false;
	if(drag_state == OWNER_SELECTED_AGAIN_WAIT_FOR_DRAGGING)
		{
		if(open_link(drag_item_owner_id) == false)
			{
			remove_selected_object(drag_elem);
			}
		else
			{
			restore_item();
			}	
		}
	else if(drag_state == OWNER_WAIT_FOR_DRAGGING || drag_state == NOT_OWNER_WAIT_FOR_MOUSE_UP)
		{
		//item was not moved
		if(open_link(drag_item_owner_id) == true)
			{
			restore_item();
			}
		}
	else if(drag_state == OWNER_DRAGGING)
		{
		if(prev_shelf_index != -1)
			{
			//a shelf has been selected for moving
			var prev_shelf_obj = shelf_pos_array[prev_shelf_index].obj;
			var shelf_id = (prev_shelf_obj.id.substring(12)*1);
			//drag_elem.style.visibility="hidden";
			//hide_borrow_status_image(this.drag_item_owner_id);
			//hide_selected_borrow_status_image();
			prev_shelf_obj = document.getElementById('shelf_link_'+shelf_id);
			var shelf_name = prev_shelf_obj.innerHTML;
			var item_name = get_selected_item_titles();
			if(item_name.length > 60)
				{
				item_name = item_name.substring(0,60) + "...";
				}
			
			window_confirm("Move Items", "This will move "+item_name+" to shelf '"+shelf_name+"'", "move_item_confirmed("+prev_shelf_index+")", "restore_item()");		
			//if(nav_app_ie == 0)
			//	return false;
			}
		else
			{
			get_xy(evnt);
			var val_x = abs_val(elem_x - elem_start_x - elem_dx);
			var val_y = abs_val(elem_y - elem_start_y - elem_dy)
			var max_val_x = abs_val(max_elem_x - elem_start_x - elem_dx);
			var max_val_y = abs_val(max_elem_y - elem_start_y - elem_dy)
			if((val_x < 25 && val_y < 25) && (max_val_x < 25 && max_val_y < 25))
				{
				//alert(right_click_state);
				if(is_right_click_menu_active()  == false)
				{
				if(open_link(drag_item_owner_id) == true)
					{
					restore_item();
					}
				else
					{
					restore_item_position();
					update_position_of_all_status_images();
					}	
				}
				else
					{
					//alert('exiting');
					return false;
					}
				}
			else
				{
				restore_item();
				}
			}
		}
	
	if(prev_shelf_index != -1)
		{
		var prev_shelf_obj = shelf_pos_array[prev_shelf_index].obj;
		prev_shelf_obj.style.backgroundColor="";
		prev_shelf_index = -1;
		}
	drag_elem = null;
	drag_item_owner_id = 0;
	drag_state = NOT_SELECTED;
	}
if(nav_app_ie == 0)
	return false;
}

function move_item_confirmed(shelf_index)
{
var prev_shelf_obj = shelf_pos_array[shelf_index].obj;
var shelf_id = (prev_shelf_obj.id.substring(12)*1);
var item_owner_ids = get_selected_item_owner_ids();
move_multiple_items(item_owner_ids, shelf_id);
hide_all_selected_objects();
}

function hide_selected_borrow_status_image()
{			
var i;
var arr;
for(i = 0; i < drag_objs.length; ++i)
	{
	obj = drag_objs[i];
	if(obj != null)
		{
		hide_borrow_status_image(obj.drag_item_owner_id);
		}
	}
}

function show_selected_borrow_status_image()
{			
var i;
var arr;
for(i = 0; i < drag_objs.length; ++i)
	{
	obj = drag_objs[i];
	if(obj != null)
		{
		show_borrow_status_image(obj.drag_item_owner_id);
		}
	}
}

function get_selected_item_owner_ids()
{
var item_owner_id= new Array();
var i, j;
var arr;
j = 0;
for(i = 0; i < drag_objs.length; ++i)
	{
	obj = drag_objs[i];
	if(obj != null)
		{
		item_owner_id[j++] = obj.drag_item_owner_id;
		}
	}
return item_owner_id.join(",");
}

function get_selected_item_titles()
{
var item_name = new Array();
var i, j;
var arr;
j = 0;
for(i = 0; i < drag_objs.length; ++i)
	{
	obj = drag_objs[i];
	if(obj != null)
		{
		arr = get_item_info_from_item_owner_id(obj.drag_item_owner_id);
		item_name[j++] = "'"+arr['title']+"'";
		}
	}
return item_name.join(", ");
}

function replace_chars(str, search, replace)
{
var arr = str.split(search);
if(arr.length > 0)
	return arr.join(replace);
else
	return str;
}

function restore_item()
{
//alert('restore');
remove_all_selected_objects();
update_position_of_all_status_images();
drag_elem = null;
drag_item_owner_id = 0;
drag_state = NOT_SELECTED;
hide_all_menu();
hide_all_popup_menu();
}

function restore_item_position()
{
var i;
for(i = 0; i < drag_objs.length; ++i)
	{
	if(drag_objs[i] != null)
		{
		drag_objs[i].restore_position();
		}
	}
}

function mouse_out(evnt)
{
	return mouse_up(evnt);
}

function cloneObject(what)
{
	var clone = new Object();
	for (var i in what)
	{
		clone[i] = what[i];
	}
return clone;
}

function prepare_dragging()
{
if(drag_elem == null)
	return false;
var i;
for(i = 0; i < drag_objs.length; ++i)
	{
	if(drag_objs[i] != null)
		{
		drag_objs[i].start();
		}	
	}
return true;
}

function start_dragging(book_id, img_id_name, item_owner_id, evnt)
{
nav_app_ie = (navigator.appName == "Microsoft Internet Explorer")?1:0;
if(drag_state == RIGHT_MOUSE_BUTTON_CLICK)
	restore_item();

drag_state = NOT_SELECTED;
drag_elem = book_id;
drag_item_owner_id = item_owner_id;
var img_id = document.getElementById(img_id_name);
if(is_right_mouse_button_clicked(evnt))
	{
	restore_item();
	drag_elem = book_id;
	drag_item_owner_id = item_owner_id;
	drag_state = RIGHT_MOUSE_BUTTON_CLICK;
	add_selected_object(drag_elem, img_id, drag_item_owner_id);	
	return;
	}
if(owner)
	{
	if(is_selected() == false)
		{
		//first time the owner selected the item
		add_selected_object(drag_elem, img_id, drag_item_owner_id);
		drag_state = OWNER_WAIT_FOR_DRAGGING;
		}
	else
		{
		drag_state = OWNER_SELECTED_AGAIN_WAIT_FOR_DRAGGING
		}	
	init_shelf_position();
	max_elem_x = max_elem_y = 0;
	mouse_down(evnt);

	if(nav_app_ie == 1)
		{
		document.attachEvent("onmousemove", mouse_move);   //Register handler
	  document.attachEvent("onmouseup", mouse_up);       //Register handler
	
	  evnt.cancelBubble = true;                             //Prevent bubbling
	  evnt.returnValue = false;                             //Prevent action
		}
	else
		{
		document.addEventListener("mousemove", mouse_move, true); //Register handlr
	  document.addEventListener("mouseup", mouse_up, true);     //Register handlr
	
	  evnt.stopPropagation();                        //Stop propagation so no
	  evnt.preventDefault();                         //one else handles it
		}
	}
else
	{
	if(nav_app_ie == 1)
		{
	  document.attachEvent("onmouseup", mouse_up);       //Register handler

	  evnt.cancelBubble = true;                             //Prevent bubbling
	  evnt.returnValue = false;                             //Prevent action
		}
	else
		{
	  document.addEventListener("mouseup", mouse_up, true);     //Register handlr

	  evnt.stopPropagation();                        //Stop propagation so no
	  evnt.preventDefault();                         //one else handles it
		}

	drag_state = NOT_OWNER_WAIT_FOR_MOUSE_UP;
	}

if(nav_app_ie == 0)
	return true;
}

function init_shelf_position()
{
get_draggable_shelfs();
}

function get_draggable_shelfs()
{
shelf_pos_array = new Array();
var arr = document.getElementsByTagName('table');
var i;
var search_str = 'shelf_table_';
for(i = 0; i < arr.length; ++i)
	{
	var elem = arr[i];
	var id = elem.id;
	if(id.indexOf(search_str) == 0)
		{
		var shelf_id = parseInt(id.substring(search_str.length));
		
		if(shelf_id != req_shelf_id && shelf_id != 0)
			{
			add_shelf_position(elem);
			}
		}
	}
}

function get_shelf_underneath(x, y)
	{
	var i;
	for(i = 0; i < shelf_pos_array.length; ++i)
		{
		if(shelf_pos_array[i].is_inside(x, y))
			{
			return i;
			}
		}
	return -1;
	}

function add_shelf_position(obj)
	{
	var x = findPosX(obj);
	var y = findPosY(obj);
	var wide = 180;
	var high = 43;
	var pos = new shelf_position(x, y, wide, high, obj);
	shelf_pos_array.push(pos);
	}

function shelf_position(x, y, wide, high, obj)
	{
	this.x = x;
	this.y = y;
	this.wide = wide;
	this.high = high;
	this.obj = obj;
	}

shelf_position.prototype.is_inside = function(x, y)
	{
	var ret =  ((x > this.x && x < (this.x + this.wide) && y > this.y && y < (this.y + this.high))?true:false);
	return ret;
	}

shelf_position.prototype.toString = function()
	{
	return "x="+this.x+", y="+this.y+", width="+this.wide+", height="+this.high;
	}

function set_all_item_cursor(cursor)
{
	var elem = document.getElementsByTagName("*");
	var i;
	for(i = 0; i < elem.length; ++i)
		{
		var str = elem[i].id;
		if(str.indexOf("item_img_") == 0)
			{
			elem[i].style=cursor;
			}
		}
}

function set_key_state(state, event)
{
var value = 0;
if (document.all)
	{
	value = event.keyCode;
	}
 else if (document.getElementById)
	{
	value = event.which;
	}
 else if(document.layers)
	{
	value = event.which;
	}

}

function get_current_item_owner_id()
{
if(drag_elem != null)
	{
	var item_owner_id = drag_elem.id;
 	var temp = item_owner_id.split('_');
	item_owner_id =  parseInt(temp[2]);		
	//alert(item_owner_id);
	return item_owner_id;
	}
return 0;
}
