if (window.XMLHttpRequest) {
    xmlhttp = new XMLHttpRequest();
} else if (window.ActiveXObject) {
    xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
} else {
	xmlhttp = false;
}

////////////////////////////////////////////////////////////////////////////////
function change_id (input_id, value_1, value_2)
// change particular HTML ID
{
	var input = document.getElementById(input_id);
	
	if (!value_2) {
		if (input) {
			input.className = value_1;
		} 
	} else {
		if (input.className == value_1) {
			input.className = value_2;
		} else {
			input.className = value_1;
		}
	}
	
  	return;
} // change_id

////////////////////////////////////////////////////////////////////////////////
function control_button (text_id, button_id)
// hide/show button based on textbox value
{
 	var text   = document.getElementById(text_id);
	var button = document.getElementById(button_id);
 	
	if (trim(text.value) != '') {
		button.disabled = false;
	} else {
		button.disabled = true;
	}
	
 	return;
} // control_button

////////////////////////////////////////////////////////////////////////////////
function focus_control (div_id, text_id, class_name)
// control focus of textbox
{
	var div  = document.getElementById(div_id);
	var text = document.getElementById(text_id);
	
	if (class_name) {
		if (div.className == class_name) {
			text.focus();
		} 
	} else {
		if (div.className == 'expanded') {
			text.focus();
		} 
	}

  	return;
} // focus_control

////////////////////////////////////////////////////////////////////////////////
function focus_id_control (text_id)
// control focus of textbox
{
	var text = document.getElementById(text_id);

	if (text) {
		text.focus();
	} 

  	return;
} // focus_id_control

////////////////////////////////////////////////////////////////////////////////
function div_control (div_id, s)
// expanded/contracted div class when onclick
{
	var div = document.getElementById(div_id);

	if (div.className == 'expanded') {
		div.className = 'contracted';

		if (s != '') {
			change_session_value(s, -1);
		}
	} else {
		div.className = 'expanded';
		
		if (s != '') {
			change_session_value(s, 1);
		}
	}

  	return;
} // div_control

////////////////////////////////////////////////////////////////////////////////
function openwin (url, width, height, scrollbar, resizable) 
// open pop up window
{
	window.open(url, 'newwindow', 'width = '+width+', height = '+height+', resizable = '+resizable+', scrollbars='+scrollbar+', toolbar=no, menubar=no, location=no, status=no');

	return;
} // openwin

////////////////////////////////////////////////////////////////////////////////
function change_language (page_url, pid, lang_id) 
// change language value 
{
	if (!lang_id) {
		var lang = document.getElementById('reselect_language').value;
	} else {
		if (lang_id == 'language_select') {
			var lang = document.getElementById(lang_id).value;
		} else if (lang_id == 'language_select_upper') {
			var lang = document.getElementById(lang_id).value;
		} else if (lang_id == 'language_select_lower') {
			var lang = document.getElementById(lang_id).value;
		} else {
			var lang = lang_id;
		}
	}
	
	var url = '/anobi/ajax/language.php?language='+lang+'&ajax=1';
	
 	xmlhttp.open('GET', url, true);
 	
 	xmlhttp.onreadystatechange = function() {
   		if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
   			var result = xmlhttp.responseText;

   			if (result == '1') {
   				location.replace(page_url);
   			}
    	} 
    };

    xmlhttp.send(null); 
  
  	return;
} // change_language

////////////////////////////////////////////////////////////////////////////////
function search_general (f, s_type, w, div, type) 
// for search engine
{
	var form   = document.getElementById(f);
	var s      = document.getElementById(s_type);
	var word   = document.getElementById(w);

    var fid    = escape(form.value);
    var search = word.value;
    var type   = escape(type); 
    var s_type = s.value; 
    
    search = search.replace(/&/g, '%26');

    if (s_type == '1') {
    	var post_string = 'fid='+fid+'&search='+search+'&type='+type+'&s_type='+s_type+'&ajax=1';
    } else {
        var shelf_type    = document.getElementById('shelf_type').value;
        var subscriber_id = document.getElementById('search_subscriber_id').value;
    
    	var post_string = 'fid='+fid+'&search='+search+'&type='+type+'&s_type='+s_type+'&shelf='+shelf_type+'&s='+subscriber_id+'&ajax=1';
    }
    
	xmlhttp.open('POST', '/anobi/ajax/search.php', true);
	xmlhttp.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
	
    xmlhttp.onreadystatechange = function() {
   		if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
   			var div_id = document.getElementById(div);
   			var result = xmlhttp.responseText;
   			
   			var pattern_redirect = /redirect:/;
   			
   			if (result.match(pattern_redirect)) {
   				result = result.replace(/\s/g, "");
   			}
   			
   			var pattern      = /^redirect:/;
            var pattern_item = /^redirect:\/books\//;
            
   			if (result.match(pattern_item)) {
   				var url = result.substring(9, result.length);
 
   				location.replace(url);
   			} else if (result.match(pattern)) {
   				var url = result.substring(9, result.length);
 
   				location.replace("/anobi/"+url);
 			} else {
 				div_id.innerHTML = result;
 			} 
    	} 
    };

    xmlhttp.send(post_string);

    return;
} // search_general

////////////////////////////////////////////////////////////////////////////////
function invite (f, e, div, type) 
// send invite email 
{
	var form = document.getElementById(f);
	var eid  = document.getElementById(e);

    var fid   = escape(form.value);
    var email = escape(eid.value);
    var type  = escape(type); 
    
	var post_string = 'fid='+fid+'&email='+email+'&type='+type+'&ajax=1';
	
	xmlhttp.open('POST', '/anobi/ajax/invite.php', true);
	xmlhttp.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
	
    xmlhttp.onreadystatechange = function() {
   		if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
   			var div_id = document.getElementById(div);
   			div_id.innerHTML = xmlhttp.responseText;
    	} 
    };

    xmlhttp.send(post_string);
    
    return;
} // invite

////////////////////////////////////////////////////////////////////////////////
function change_home_view (id, page_url) 
// change home view 
{
  	var url = '/anobi/ajax/session.php?view='+id+'&ajax=1';
  
 	xmlhttp.open('GET', url, true);
 	
 	xmlhttp.onreadystatechange = function() {
   		if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
   			var result = xmlhttp.responseText;

   			if (result != '') {
   				location.replace(page_url);
   			}
    	} 
    };

    xmlhttp.send(null); 
  	
  	return;
} // change_home_view

////////////////////////////////////////////////////////////////////////////////
function extractString (aString, arrCharToFilter, boolKeep) 
// boolKeep -- (true) return string only contains arrCharToFilter, 
// (false) return string contains char(s) other than arrCharToFilter	
{
	var result, arrChar, flag;
	arrChar = aString.split("");
				
	result = ' ';
			
	for (var i = 0; i < arrChar.length; i++) {
		 flag = true;
				 
		 for (var j = 0; j < arrCharToFilter.length; j++) {				
		      if (arrChar[i] == arrCharToFilter[j]) {
				  if (boolKeep) {
					  result += arrChar[i]; 
				  }
						  
				  flag = false;
							  
				  break;
			  }				
		 }
			     
		 if (flag && !boolKeep) {
			 result += arrChar[i];
		 }
	}
				
	return result.substr(1, result.length - 1);
} // extractString

////////////////////////////////////////////////////////////////////////////////
function string_count (input_string, target_string) 
// count target string
{
	var total = 0;
	
	result = input_string.split("");
	
	for (var i = 0; i < result.length; i++) {
		 var check = result[i];
		 
		 if (check == target_string) {
		 	 total++;
		 }		
    }
		
	return total;
} // string_count

////////////////////////////////////////////////////////////////////////////////
function validateISBN (str) 
// check ISBN is valid or not
{
	if (str.length != 10) {
 		return false;
    }
			
 	var isbn = str.toUpperCase();
 	var sum = 0;
			
 	for (var i = 0; i < 9; i++) { 
 		sum += (10 - i) * isbn.substr(i, 1); 
 	}

	if (isbn.substr(9, 1) == 'X') { 
		sum += 10;
	} else {
		sum += parseInt(isbn.substr(9, 1));
	}
			
	return (sum % 11 == 0);
} // validateISBN
		
////////////////////////////////////////////////////////////////////////////////		
function validateBarcode (str)
// check barcode is valid or not
{
	if (str.length != 13) {
		return false;
	}
			
	var barcode_pattern = new RegExp("^(978)[0-9]{10}$", 'i');
	
	if (!barcode_pattern.test(str)) {
		return false;
	}
			
	var checksum = 0;
	
	for (var i = 0; i < 12; i++) {
		 if (i % 2 == 0) {
		 	checksum += parseInt(str.substr(i, 1));
		 } else {
		 	checksum += parseInt(str.substr(i, 1)) * 3;
		 }
	}
	
	checksum = 10 - checksum % 10;
	checksum = (checksum == 10) ? 0 : checksum;
			
	return (checksum == str.substr(12, 1)) ;      
} // validateBarcode

////////////////////////////////////////////////////////////////////////////////
function input_wizard (input_id, word_id, msg_id, button_id) 
// Parameter:
// input_id (str) : success / has_error
// word_id  (str) : id of the input tag
// msg_id   (str) : id for tag for valid/invalid message, also digit count
// arrVAlidMsg (str[]) : an array of string for :
//				   [0] : valid ISBN
//				   [1] : invalid ISBN
//				   [2] : valid Barcode
//				   [3] : invalid Barcode
///////////////////////////////////////////////////////////////////
{
	var arrValidMsg = new Array('Valid ISBN', 'Invalid ISBN', 'Valid Barcode', 'Invalid Barcode');
	
	var o_input  = document.getElementById(input_id);
	var o_word   = document.getElementById(word_id);
	var o_msg    = document.getElementById(msg_id);
	var o_button = document.getElementById(button_id);

	var status = o_msg.className;
	
	var pattern = /no_count/;
	
	if (status.match(pattern)) {
		return;
	}

	var phase_1 = extractString(o_word.value, new Array('-', ' '), false);
	var isbn_pattern    = new RegExp("^\\d\\d\\d\\d\\d\\d", 'i');
	var barcode_pattern = new RegExp("^(978)\\d\\d\\d", 'i');
	var max_length;
	var input_class;

	o_msg.saveSearchWordLabel = (o_msg.saveSearchWordLabel) ? o_msg.saveSearchWordLabel : o_msg.innerHTML;
	o_word.saveMaxLength = (o_word.saveMaxLength && o_word.maxLength) ? o_word.saveMaxLength : o_word.maxLength;

    // find out the possible type
	var inputType = 'keywords'; // default input type
	o_word.maxLength = 100;     // default max length
	
	var input = '';			
	input = extractString(phase_1, new Array('0', '1', '2', '3', '4', '5', '6', '7', '8', '9'), true);
	
	if (barcode_pattern.test(phase_1) && input.length <= 13) { 
		inputType = 'barcode';
	} else if (isbn_pattern.test(phase_1)) { 
		input = extractString(phase_1, new Array('0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'x', 'X'), true);
		
		if (input.length <= 10) {
			inputType = 'isbn';
		}
	}
			
    // perform wizard tips after assumed the possible input type
	var isValidSoFar = true; 
	var labelText = '';

	switch (inputType) {
		case ('isbn') :
		    var total_minus = string_count(o_word.value, '-');
		    
		    if (input.length == 10) {
				o_word.maxLength = 10 + total_minus;
		    }
			
			labelText = 'Digit-count: <span style="background-color: yellow;">'+input.length+'</span>/'+10;
			
			if (input.length == 10) {
				isValidSoFar = validateISBN(input);
				
				labelText = 'Digit-count: <b>'+10+'</b>/'+10;
			} else if ('' != extractString(phase_1, new Array('0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'x', 'X'), false)) {
				isValidSoFar = false;	
			} 
									
			// perform visual effect
			if (o_msg.innerHTML != labelText) {
				o_msg.innerHTML = labelText;
			}

			input_class = '';
			o_input.className = input_class;
			
			if (input.length == 10) {
				if (isValidSoFar) {
					input_class = 'success';
					o_msg.innerHTML = arrValidMsg[0];
					
					if (button_id) {
						o_button.disabled = false;
					}
				} else {
					input_class = 'has_error';
					o_msg.innerHTML = arrValidMsg[1];
					
					if (button_id) {
			    		o_button.disabled = true;
					}
				}
				
				o_input.className = input_class;
			} else {
				if (button_id) {
					o_button.disabled = true;
				}	
			}
	
			break;		
		case ('barcode') :
		    var total_minus = string_count(o_word.value, '-'); 
	
		    if (input.length == 13) {
		    	o_word.maxLength = 13 + total_minus;
		    }
			
			if (input.length == 13) {
				isValidSoFar = validateBarcode(input);
				
				labelText = 'Digit-count: <b>'+13+'</b>/'+13;
			} else if ('' != extractString(phase_1, new Array('0', '1', '2', '3', '4', '5', '6', '7', '8', '9'), true)) {
				isValidSoFar = false;
				
				labelText = 'Digit-count: <span style="background-color: yellow;">'+input.length+'</span>/'+13;
			}

			// perform visual effect			
			if (o_msg.innerHTML != labelText) {
				o_msg.innerHTML = labelText;
			}
			
			input_class = '';
			o_input.className = input_class;

			if (input.length == 13) {	
				if (isValidSoFar) {
					input_class = 'success';
				    o_msg.innerHTML = arrValidMsg[2];
				    
				    if (button_id) {
						o_button.disabled = false;
					}
				} else {
					input_class = 'has_error';
					o_msg.innerHTML = arrValidMsg[3];
					
					if (button_id) {
			    		o_button.disabled = true;
					}
				} 
				
				o_input.className = input_class;
			} else {
				if (button_id) {
					o_button.disabled = true;
				}	
			}

			break;
		case ('keywords') :
			default:
			    input_class = '';
				o_input.className = input_class;
			
			    o_msg.innerHTML = '<span class="invisible">.</span>';	
			   
			    if (button_id) {
			    	if (trim(o_word.value) != '') {
			    	    o_button.disabled = false;
			    	} else {
			    		o_button.disabled = true;
			    	}
			    }
				
				break;
	}

	if (input_id == 'search_item_class') {
		o_input.className = 'input_wrap '+input_class;
	} 

	if (o_msg.innerHTML == '<span class="invisible">.</span>') {
		o_msg.className = 'invisible';
	}
	
	return;
} // input_wizard

///////////////////////////////////////////////////////
function edit_all_close() 
// edit all close
{
	var url = '/anobi/ajax/session.php?edit_all=1';

	xmlhttp.open('GET', url, true);
  	xmlhttp.send(null);  
  
	return;
} // edit_all_close

////////////////////////////////////////////////////////////////////////////////
function shelf_visit_log (personId, personIdTarget)
// for shelf visit log
{
  	var url = '/InternalAPI/html/log/shelf-visit-log?personId='+personId+'&personIdTarget='+personIdTarget;
  	
  	xmlhttp.open('GET', url, true);
  	xmlhttp.send(null);  
  	
  	return;
} // shelf_visit_log

////////////////////////////////////////////////////////////////////////////////
function wishlist_visit_log (personId, personIdTarget) 
// for wishlist visit log
{
  	var url = '/InternalAPI/html/log/wishlist-log?personId='+personId+'&personIdTarget='+personIdTarget;
  	
  	xmlhttp.open('GET', url, true);
  	xmlhttp.send(null);  
  	
  	return;
} // wishlist_visit_log