//-------------------------------------------------------------------
// AJAX ENGINE (COMPONENT 1 of (2 or 3))
//-------------------------------------------------------------------
function js_get_xml_http_object() { 
	var objXMLHttp=null;
	if (window.XMLHttpRequest) {
		objXMLHttp=new XMLHttpRequest();
	} else if (window.ActiveXObject) {
		objXMLHttp=new ActiveXObject("Microsoft.XMLHTTP");
	}
	return objXMLHttp;
}

//-------------------------------------------------------------------	
//Jumpmenu functionality...
//-------------------------------------------------------------------
function js_jump_menu(targ,selObj,restore){ //v3.0
  eval(targ+".location='"+selObj.options[selObj.selectedIndex].value+"'");
  if (restore) selObj.selectedIndex=0;
}

//-------------------------------------------------------------------
// JavaScript functions to replicate PHP functionality...
//-------------------------------------------------------------------
function js_urlencode(str) {
    str = (str + '').toString();
    // Tilde should be allowed unescaped in future versions of PHP (as reflected below), but if you want to reflect current
    // PHP behavior, you would need to add ".replace(/~/g, '%7E');" to the following.
    return encodeURIComponent(str).replace(/!/g, '%21').replace(/'/g, '%27').replace(/\(/g, '%28').
    replace(/\)/g, '%29').replace(/\*/g, '%2A').replace(/%20/g, '+');
}

function js_urldecode(str) {    
    return decodeURIComponent(str.replace(/\+/g, '%20'));
}

function js_trim(str, chars) {
	return js_ltrim(js_rtrim(str, chars), chars);
}
 
function js_ltrim(str, chars) {
	chars = chars || "\\s";
	return str.replace(new RegExp("^[" + chars + "]+", "g"), "");
}
 
function js_rtrim(str, chars) {
	chars = chars || "\\s";
	return str.replace(new RegExp("[" + chars + "]+$", "g"), "");
}

function js_is_array(input){
	return typeof(input)=='object'&&(input instanceof Array);
}

function js_in_array(needle, haystack, argStrict) {
	// example 1: js_in_array('van', ['Kevin', 'van', 'Zonneveld']);
	// returns 1: true
	var found = false, key, strict = !!argStrict;
	for (key in haystack) {
		if ((strict && haystack[key] === needle) || (!strict && haystack[key] == needle)) {
			found = true;
			break;
		}
	}
	return found;
}
	
function js_strpos(haystack, needle, offset) {   
	// example 1: js_strpos('Kevin van Zonneveld', 'e', 5);
	// returns 1: 14 
	var i = (haystack+'').indexOf( needle, offset ); 
	return i===-1 ? false : i;
}	

function js_file_exists(my_url) {
	// http://phpjs.org/functions/file_exists:399    
	var req = this.window.ActiveXObject ? new ActiveXObject("Microsoft.XMLHTTP") : new XMLHttpRequest();
	if (!req) {throw new Error('XMLHttpRequest not supported');}
	// HEAD Results are usually shorter (faster) than GET
	req.open('HEAD', my_url, false);
	req.send(null);
	if (req.status == 200){
		return true;
	}
	return false;
}

function js_substr_count(haystack, needle, offset, length) {
// Returns the number of times a substring occurs in the string
// http://phpjs.org/functions/substr_count
    var pos = 0, cnt = 0;
    haystack += '';
    needle += '';
    if (isNaN(offset)) {offset = 0;}
    if (isNaN(length)) {length = 0;}
    offset--;
    while ((offset = haystack.indexOf(needle, offset+1)) != -1){
        if (length > 0 && (offset+needle.length) > length){
            return false;
        } else{
            cnt++;
        }
    }
    return cnt;
} // end function

function js_htmlspecialchars(string , quote_style, charset, double_encode) {
// Convert special characters to HTML entities 
// http://phpjs.org/functions/htmlspecialchars
    var optTemp = 0, i = 0, noquotes= false;
    if (typeof quote_style === 'undefined' || quote_style === null) {        quote_style = 2;
    }
    string = string.toString();
    if (double_encode !== false) { // Put this first to avoid double-encoding
        string = string.replace(/&/g, '&amp;');    }
    string = string.replace(/</g, '&lt;').replace(/>/g, '&gt;');
 
    var OPTS = {
        'ENT_NOQUOTES': 0,        'ENT_HTML_QUOTE_SINGLE' : 1,
        'ENT_HTML_QUOTE_DOUBLE' : 2,
        'ENT_COMPAT': 2,
        'ENT_QUOTES': 3,
        'ENT_IGNORE' : 4    };
    if (quote_style === 0) {
        noquotes = true;
    }
    if (typeof quote_style !== 'number') { // Allow for a single string or an array of string flags        quote_style = [].concat(quote_style);
        for (i=0; i < quote_style.length; i++) {
            // Resolve string input to bitwise e.g. 'PATHINFO_EXTENSION' becomes 4
            if (OPTS[quote_style[i]] === 0) {
                noquotes = true;            }
            else if (OPTS[quote_style[i]]) {
                optTemp = optTemp | OPTS[quote_style[i]];
            }
        }        quote_style = optTemp;
    }
    if (quote_style & OPTS.ENT_HTML_QUOTE_SINGLE) {
        string = string.replace(/'/g, '&#039;');
    }    if (!noquotes) {
        string = string.replace(/"/g, '&quot;');
    }
 
    return string;
 }
 
function js_str_replace(search, replace, subject, count) {
    var i = 0, j = 0, temp = '', repl = '', sl = 0, fl = 0,
            f = [].concat(search),
            r = [].concat(replace),
            s = subject,
            ra = r instanceof Array, sa = s instanceof Array;
    s = [].concat(s);
    if (count) {
        this.window[count] = 0;
    }
    for (i=0, sl=s.length; i < sl; i++) {
        if (s[i] === '') {
            continue;
        }
        for (j=0, fl=f.length; j < fl; j++) {
            temp = s[i]+'';
            repl = ra ? (r[j] !== undefined ? r[j] : '') : r[0];
            s[i] = (temp).split(f[j]).join(repl);
            if (count && s[i] !== temp) {
                this.window[count] += (temp.length-s[i].length)/f[j].length;}
        }
    }
    return sa ? s : s[0];
} // end function 
 
function js_implode (glue, pieces) {
    var i = '', retVal='', tGlue='';
    if (arguments.length === 1) {
        pieces = glue;
        glue = '';
    }
    if (typeof(pieces) === 'object') {
        if (pieces instanceof Array) {
            return pieces.join(glue);
        }
        else {
            for (i in pieces) {
                retVal += tGlue + pieces[i];
                tGlue = glue;
            }
            return retVal;
        }
    }
    else {
        return pieces;
    }
} // end function
 
 
function js_number_format(number, decimals, dec_point, thousands_sep) {
    number = (number + '').replace(/[^0-9+\-Ee.]/g, '');
    var n = !isFinite(+number) ? 0 : +number,
        prec = !isFinite(+decimals) ? 0 : Math.abs(decimals),
        sep = (typeof thousands_sep === 'undefined') ? ',' : thousands_sep,
        dec = (typeof dec_point === 'undefined') ? '.' : dec_point,
        s = '',
        toFixedFix = function (n, prec) {
            var k = Math.pow(10, prec);
            return '' + Math.round(n * k) / k;
        };
    // Fix for IE parseFloat(0.55).toFixed(0) = 0;
    s = (prec ? toFixedFix(n, prec) : '' + Math.round(n)).split('.');
    if (s[0].length > 3) {
        s[0] = s[0].replace(/\B(?=(?:\d{3})+(?!\d))/g, sep);
    }
    if ((s[1] || '').length < prec) {
        s[1] = s[1] || '';
        s[1] += new Array(prec - s[1].length + 1).join('0');
    }
    return s.join(dec);
} // end function
 
 
//-------------------------------------------------------------------
// Load a local document containing XML data...
//-------------------------------------------------------------------
function js_load_xml_doc(dname) {
	var xmlDoc;
	if (window.XMLHttpRequest) {
		xmlDoc=new window.XMLHttpRequest();
		xmlDoc.open("GET",dname,false);
		xmlDoc.send("");
		return xmlDoc.responseXML;
	
	} else if(ActiveXObject("Microsoft.XMLDOM")) {
		// IE 5 and IE 6
		xmlDoc=new ActiveXObject("Microsoft.XMLDOM");
		xmlDoc.async=false;
		xmlDoc.load(dname);
		return xmlDoc;
	}
	alert("Error loading document (js_shared.js line 36)");
	return null;
} // end fucntion

//-------------------------------------------------------------------
// Load a string containing XML data...
//-------------------------------------------------------------------
function js_load_xml_string(text) {
	try //Internet Explorer
	{
		xmlDoc=new ActiveXObject("Microsoft.XMLDOM");
		xmlDoc.async="false";
		xmlDoc.loadXML(text);
	}
	catch(e)
	{
		try // Firefox, Mozilla, Opera, etc.
		{
			parser=new DOMParser();
			xmlDoc=parser.parseFromString(text,"text/xml");
		}
		catch(e)
		{
			alert(e.message);
			return;
		}
	}
	return xmlDoc;
	//document.getElementById("order_shipping_name_span_1").innerHTML=xmlDoc.getElementsByTagName("to")[0].childNodes[0].nodeValue;
	//document.getElementById("from").innerHTML=xmlDoc.getElementsByTagName("from")[0].childNodes[0].nodeValue;
	//document.getElementById("message").innerHTML=xmlDoc.getElementsByTagName("body")[0].childNodes[0].nodeValue;
} // end function
//-------------------------------------------------------------------

//-------------------------------------------------------------------
// "DYNAMIC" AJAX ENGINE (COMPONENT 2 of 2)
// This function takes the following parameters:
//		MyData = The data to be parsed by the remote script
//					MyData may be either a variable ('one')
//					-or- an array (['one', 'two', 'three'])
//		MyURL = The path to the remote script (ie: ajax/example.php)
//		MySpan = The ID of the span (or other item) to be updated
//					If getElementById(MySpan)==null, then the results will 
//					be displayed in an "overlib" javascript popup with this title.
//					Otherwise, the innerHTML of the span will be updated.
//		MyEval = (optional) code that will be run on ajax completion.

var ajax_count = 0; //Set the global "ajax counter" var. AJAX will only connect to the .php file when ajax_counter == 0
var ajax_delay = 500; //Set the AJAX delay. 1000 = one second

//Prep the AJAX data and forward it along to the trigger function...
function js_ajax_throttled(MyDataRaw, MyURL, MySpan, MyEval) { 
	if(js_is_array(MyDataRaw)==true) {
		var MyData = '[\''+js_implode('\', \'', MyDataRaw)+'\']';
	} else {
		var MyData = '\''+MyDataRaw+'\'';	
	}   
   ajax_count = ajax_count+1;
   MyEval = js_str_replace('\'', '_APOSTROPHE_', MyEval);
   //alert('ajax_count = '+ajax_count+'\nMyData = '+MyData+'\nMyURL = '+MyURL+'\nMySpan = '+MySpan+'\nMyEval = '+MyEval);
   setTimeout("js_ajax_trigger("+ajax_count+", "+MyData+", '"+MyURL+"', '"+MySpan+"', '"+MyEval+"')", ajax_delay);
}

//Forward the AJAX request along only when ajax_counter == 0 (ie: When the user is done typing.)
function js_ajax_trigger(currCount, MyData, MyURL, MySpan, MyEval) {
   if(currCount == ajax_count) {
      ajax_count = 0;
      //alert('Line 216: Calling js_ajax() function!');
      js_ajax(MyData, MyURL, MySpan, MyEval);
   }
}

//Perform the AJAX request!
function js_ajax(MyData, MyURL, MySpan, MyEval) {		
	var ajax_v_general;
	MyEval = js_str_replace('_APOSTROPHE_', '\'', MyEval);
	//alert('ajax_count = '+ajax_count+'\nMyData = '+MyData+'\nMyURL = '+MyURL+'\nMySpan = '+MySpan+'\nMyEval = '+MyEval);
	if (MyData.length==0) {
		return; //Previously, return came AFTER the innerHTML. Moved 2010-06-03
		document.getElementById(MySpan).innerHTML='No data submitted to AJAX function.';
		
	}
	ajax_v_general=js_get_xml_http_object();
	if (ajax_v_general==null) {
		alert('Request failed: This browser does not support HTTP Requests.');
		return;
	}
	var AjaxURL=MyURL+'?checksum='+Math.random();
	if(js_is_array(MyData)==true) {
		for ( i=0; i < MyData.length ; i++) {
			AjaxURL=AjaxURL+'&v'+[i]+'='+MyData[i];
		} // end for	
	} else {
		AjaxURL=AjaxURL+'&v0='+MyData;	
	}
	ajax_v_general.onreadystatechange=function() {
		if (ajax_v_general.readyState==4 || ajax_v_general.readyState=='complete') {
			
//			var period_strpos = (MySpan+'').indexOf( '.', 0 ); 
			
			
			if(MySpan == 'shipping_engine_block_span')  {
					var prechecked_ship_methods = ajax_v_general.responseText;
					//document.getElementById('shipping_input_test').value=prechecked_ship_methods;
					//alert(prechecked_ship_methods);
					
					//id="prechecked_ship_methods" value="shipoption_1316629160_0o0_32_1.01"
					var patt1=/name="prechecked_ship_methods" value="[^"]*" id="prechecked_ship_methods"/gi;
					var prechecked_ship_methods_sub = prechecked_ship_methods.match(patt1, '').toString();
					//alert('prechecked_ship_methods_sub = '+prechecked_ship_methods_sub);
					var prechecked_ship_methods_arr = prechecked_ship_methods_sub.split('"');
					//alert(prechecked_ship_methods_arr[3]); 
					var ship_spans_to_update = prechecked_ship_methods_arr[3].toString().split('---');
					for(var i in ship_spans_to_update) {
					    //alert('Going to update shipping span: '+ship_spans_to_update[i]);
					    if(js_trim(ship_spans_to_update[i]) != '') {
					    	js_update_ship_spans(ship_spans_to_update[i]);
					   }
					} // end for
			} // end if span == shipping_engine_block_span
			
			
			if(MySpan == 'parent_session_time_started_span')  {
					//alert('a period found in MySpan');
					parent.document.getElementById('session_time_started_span').innerHTML=ajax_v_general.responseText;

			} else if(MySpan == 'parent_admin_session_modal_status_span')  {
					//alert('a period found in MySpan');
					parent.document.getElementById('admin_session_modal_status_span').innerHTML=ajax_v_general.responseText;
			
//			} else if(period_strpos > -1) {
//				document.getElementById(js_str_replace('parent.', '', MySpan)).innerHTML=ajax_v_general.responseText;
			
			} else if(MySpan != 'null') {
				if(document.getElementById(MySpan)==null) {
					var overlibData = ajax_v_general.responseText; 
					return overlib(overlibData, STICKY, SHADOW, CAPTION, MySpan);					
				} else {
					document.getElementById(MySpan).innerHTML=ajax_v_general.responseText;		
					if(document.getElementById('go_to_next_page') != null) {
						document.getElementById('go_to_next_page').disabled = false;
					}	
				}
			}
			if(MyEval != null) {
				//alert('Going to eval(): '+MyEval);	
				eval(MyEval);
			}
		}
	}
	ajax_v_general.open('GET',AjaxURL,true);
	ajax_v_general.send(null);
	return '1';
}
