var ajaxurl = "http://www.cosmeticsbusiness.com/system/ajaxServer.php";
function trace(str) {
var ul = getElemId("ulTrace");
if (ul != null) {
ul.innerHTML += "
"+str+"";
}
}
var searchInfo = new Array();
var ajaxObj = getAjaxObject();
function autoSuggest2(id, resWrapID, resListID, operation, e, fFormatter, fAction, pOther) {
var keyCode = getKeyCode(e, 'keyup');
if (keyCode == 40 || keyCode == 38 || keyCode == 13) {// ignore up and down arrows and return
return false;
}
var searchInput = trim(getElemId(id).value);
trace("term typed: " + searchInput);
if (searchInput == '') {
suggest.reset();
return;
}
var sA = suggest.findSearchArea(id);
if (sA == null) {
sA = new searchArea(id, resWrapID, resListID, operation, fFormatter, fAction, pOther);
suggest.addSearchArea(sA);
}
sA.addSearch();
return false;
}
function getAjaxObject() {
var XMLHttpRequestObject = false;
if (window.XMLHttpRequest) {
XMLHttpRequestObject = new XMLHttpRequest();
}
else if (window.ActiveXObject) {
XMLHttpRequestObject = new ActiveXObject("Microsoft.XMLHTTP");
}
if (!XMLHttpRequestObject) {
alert("Your browser does not support Ajax.");
return false;
}
return XMLHttpRequestObject;
}
function sendRequest(xmlHTTPObject, parameters, handleResponse, id) {
if (xmlHTTPObject) {
if (xmlHTTPObject.readyState == 4 || xmlHTTPObject.readyState == 0) {
xmlHTTPObject.open("POST", ajaxurl, true);
xmlHTTPObject.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
xmlHTTPObject.onreadystatechange = function() {handleResponse(id)};
xmlHTTPObject.send(parameters);
}
}
}
function handleSuggestResponse(id) {
if (ajaxObj.readyState == 4) {
if (ajaxObj.status == 200) {
try {
var search = suggest.findRequestMarkActive(id); //searchInfo[id];
if (search == null || search == undefined) {
alert('no search information available for ' + id);
return;
}
if (ajaxObj.responseText == undefined) {
if (search.NumRetries == 3) {
alert('unable to get data after 3 goes');
return;
}
++search.NumRetries;
setTimeout('handleSuggestResponse("' + id + '")', 100);
return;
}
trace("response " + id + " to " + search.searchText);
search.Status = StateCompleted;
// extract list of responses
var XMLResponse = ajaxObj.responseXML.documentElement;
// work with the xml response
var keywordsTag = XMLResponse.getElementsByTagName('item');
search.searchResults = new Array();
for (var i = 0; i < keywordsTag.length; i++) {
var row = keywordsTag.item(i);
if (row.nodeType == 1) // elements only
{
var info = new Array();
search.searchResults.push(info);
for (var itemNum = 0; itemNum < row.childNodes.length; ++itemNum) {
var node = row.childNodes[itemNum];
if (node.nodeType == 1) {
var item = node.firstChild.data.toString();
info[node.nodeName] = item;
}
}
}
}
search.showResults();
}
catch (e) {// on error show alert and clost box
suggest.hideAll();
if (trim(ajaxObj.responseText) !== "")
alert(e.description + "\n" + e.lineNumber + "\n" + ajaxObj.responseText);
}
}
}
}
function searchArea(id, resWrapID, resListID, operation, fFormatter, fAction, pOther) {
this.index = 0;
this.ActiveDisplay = null;
this.LastSearchReq = null;
this.searches = new Array();
this.id = id;
this.ResWrap = getElemId(resWrapID);
this.ResList = getElemId(resListID);
this.Operation = operation;
this.Formatter = fFormatter;
this.OnSelect = fAction;
this.Other = pOther;
this.activeIndex = -1;
function _resultID(index) {
return this.id + "-" + index;
}
function _LowlightActive() {
var selected = getElemId(this.resultID(this.activeIndex));
selected.style.backgroundColor = "#F9F9F9";
selected.style.color = "#006";
}
function _HighlightActive() {
var selected = getElemId(this.resultID(this.activeIndex));
selected.style.backgroundColor = "#555";
selected.style.color = "#FFF";
}
function _HandleKey(keyCode) {
if (this.ActiveDisplay == null)
return true;
if (keyCode == 40) // down arrow
{
if (this.activeIndex == -1) {
this.activeIndex = 0;
this.highlightActive();
}
else {
if (this.activeIndex >= 0 && this.activeIndex < this.ActiveDisplay.countItems() - 1) {
if (this.activeIndex < this.ActiveDisplay.countItems() - 1)
this.lowlightActive();
this.activeIndex++;
this.highlightActive();
}
}
}
else if (keyCode == 38) //up arrow
{
if (this.activeIndex > 0) {
this.lowlightActive();
this.activeIndex--;
this.highlightActive();
}
}
else if (keyCode == 27) { // escape
this.hide();
}
else if (keyCode == 13 && this.activeIndex > -1) // enter
{
if (this.ActiveDisplay != null)
this.ActiveDisplay.selectResult();
return false;
}
return true;
}
function _FindByIndex(index) {
for (var i = 0; i < this.searches.length; ++i) {
if (this.searches[i].Index == index)
return i;
}
return -1;
}
function _FindCached(str) {
for (var i = 0; i < this.searches.length; ++i) {
if (str.toLowerCase() == this.searches[i].searchText.toLowerCase())
return this.searches[i];
}
return null;
}
function _ActiveFromOffset(index) {
this.ActiveDisplay = this.searches[index];
return this.ActiveDisplay;
}
function _Add(search) {
if (this.searches.length > 20)
this.searches.shift();
search.Index = this.index++;
this.LastSearchReq = search;
this.searches.push(search);
}
function _AddSearch() {
var text = getElemId(this.id).value;
var existing = this.findCached(text);
if (existing != null) {
this.LastSearchReq = existing;
if (existing.Status == StateCompleted) {
trace("reponse from cache to " + this.LastSearchReq.searchText);
existing.showResults();
}
}
else { // new search
this.add(new searchDetails(text, this));
}
}
function _Poll() {
if (this.LastSearchReq == null || this.LastSearchReq.Status != StateInit)
return;
this.LastSearchReq.doSearch();
}
function _HasTargetID(id) {
if (this.searches.length == 0)
return false;
else
return this.searches[0].targetID == id;
}
function _Hide() {
this.ResWrap.style.visibility = "hidden";
}
function _Show() {
this.ResWrap.style.visibility = "visible";
}
this.resultID = _resultID;
this.highlightActive = _HighlightActive;
this.lowlightActive = _LowlightActive;
this.handleKey = _HandleKey;
this.findByIndex = _FindByIndex;
this.findCached = _FindCached;
this.activeFromOffset = _ActiveFromOffset;
this.add = _Add;
this.poll = _Poll;
this.hasTargetID = _HasTargetID;
this.hide = _Hide;
this.show = _Show;
this.addSearch = _AddSearch;
}
function autoEngine() {
this.Requests = new Object();
this.LastSearch = null;
function _FindSearchArea(id) {
if (id in this.Requests) {
this.LastSearch = this.Requests[id];
return this.LastSearch;
}
else
return null;
}
function _AddSearchArea(sa) {
this.Requests[sa.id] = sa;
this.LastSearch = sa;
}
function _FindRequestMarkActive(searchid) {
var last = searchid.lastIndexOf('_');
var id = searchid.substr(0, last);
var search_index = searchid.substr(last+1);
var instance = this.Requests[id];
var ins_index = instance.findByIndex(search_index);
if (ins_index == -1)
return null;
else {
return instance.activeFromOffset(ins_index);
}
}
function _AddRequest(searchReq) {
if (searchReq.id in this.Requests)
this.LastSearch = this.Requests[searchReq.id];
else
{
this.Requests[searchReq.id] = new searchArea();
this.LastSearch = this.Requests[searchReq.id];
}
var existing = this.LastSearch.findCached(searchReq.searchText);
if (existing != null) {
this.LastSearch.LastSearchReq = existing;
if (existing.Status == StateCompleted) {existing.showResults();}
}
else { // new search
this.LastSearch.add(searchReq);
// searchReq.doSearch();
}
}
function _GetActiveDisplay(id) {
if (!(id in this.Requests))
return null;
var instance = this.Requests[id];
return instance.ActiveDisplay;
}
function _Poll() {
if (this.LastSearch == null)
return;
if (ajaxObj.readyState == 4 || ajaxObj.readyState == 0) {this.LastSearch.poll();}
}
function _InTarget(id) {
for (var instance in this.Requests) {
if (this.Requests[instance].ResWrap.id == id)
return true;
}
return false;
}
function _HideAllExcept(item) {
for (var instance in this.Requests) {
if (this.Requests[instance].ResWrap != item) {this.Requests[instance].hide();}
}
}
function _HideAll() {
for (var instance in this.Requests) {this.Requests[instance].hide();}
}
function _Reset() {
this.hideAll();
this.LastSearch.LastSearchReq = null;
}
this.findRequestMarkActive = _FindRequestMarkActive;
this.addRequest = _AddRequest;
this.getActiveDisplay = _GetActiveDisplay;
this.poll = _Poll;
this.inTarget = _InTarget;
this.hideAllExcept = _HideAllExcept;
this.hideAll = _HideAll;
this.findSearchArea = _FindSearchArea;
this.addSearchArea = _AddSearchArea;
this.reset = _Reset;
}
var suggest = new autoEngine();
function pollSuggest() {suggest.poll();}
setInterval(pollSuggest, 100);
var StateInit = 0;
var StateRequested = 1;
var StateCompleted = 2;
var StateAborted = 3;
function searchDetails(text, parent) {
this.parent = parent;
this.searchText = text;
this.searchResults = new Array();
this.NumRetries = 0;
this.Status = StateInit;
this.Index = -1;
// utilities
function _searchID() {
return this.parent.id + "_" + this.Index;
}
function _ValueOfIndex(index, name) {
return this.searchResults[index][name];
}
function _SetSelectedSearch() {
this.parent.setInputString(this.valueOfIndex(this.activeIndex, "name"));
}
function _SetInputString(str) {
var input = getElemId(this.parent.id);
input.value = str;
input.focus();
}
function _CountItems() {
return this.searchResults.length;
}
function _HighlightString(str) {
try {
var regex = new RegExp('(' + this.searchText + ')', 'gi');
ToDisplay = html_entity_decode(str);
ToDisplay = ToDisplay.replace(regex, "$1");
return ToDisplay
} catch (e) {
alert("bad something " + str);
return str;
}
}
// display
function _ShowSearchResults() {
if (this.parent.LastSearchReq == null) // aborted
{
this.parent.hide();
return;
}
this.parent.activeIndex = -1;
if (this.countItems() == 0) {
this.parent.hide();
return;
}
else
this.parent.show();
this.parent.ResList.innerHTML = "";
for (var i = 0; i < this.countItems(); i++) {
var ToDisplay;
if (this.parent.Formatter == null) {
ToDisplay = this.searchResults[i]["name"];
ToDisplay = this.highlightString(ToDisplay);
this.parent.ResList.innerHTML += "" + ToDisplay + "";
}
else {
ToDisplay = this.parent.Formatter(this, i);
this.parent.ResList.innerHTML += ToDisplay;
}
}
}
function _SelectResultByIndex(index) {
if (this.parent.OnSelect == null) {
var row = this.searchResults[index];
this.parent.hide();
this.setInputString(row['name']);
}
else {
this.parent.activeIndex = index;
this.parent.OnSelect(this);
}
}
function _SelectResult() {this.selectResultByIndex(this.parent.activeIndex);}
// searching
function _DoSearch() {
var params = "operation=" + this.parent.Operation + "&name=" + escape(this.searchText);
if (this.parent.Other)
params += '&other=' + this.parent.Other;
this.Status = StateRequested;
trace("performing search id = " + this.s_ID() + ", term = " + this.searchText);
sendRequest(ajaxObj, params, handleSuggestResponse, this.s_ID());
}
this.s_ID = _searchID;
this.valueOfIndex = _ValueOfIndex;
this.setSelectedSearch = _SetSelectedSearch;
this.setInputString = _SetInputString;
this.countItems = _CountItems;
this.highlightString = _HighlightString;
this.showResults = _ShowSearchResults;
this.selectResult = _SelectResult;
this.selectResultByIndex = _SelectResultByIndex;
this.doSearch = _DoSearch;
}
function keyBoardNav(e, id) {
var keyCode = getKeyCode(e, 'keydown');
var search = suggest.findSearchArea(id);
if (search == null)
return true;
return search.handleKey(keyCode);
}
function as_SelectResult(id, index) {
var search = suggest.getActiveDisplay(id);
if (search != null)
search.selectResultByIndex(index);
}
function getKeyCode(e, action) {
e = (!e) ? window.event : e;
code = (e.charCode) ? e.charCode : ((e.keyCode) ? e.keyCode : ((e.which) ? e.which : 0));
if (e.type == action) {
return code;
}
}
function getElemId(id) {
if (document && document.getElementById(id)) {
return document.getElementById(id);
}
else {
return false;
}
}
function trim(s) {
return s.replace(/(^\s+)|(\s+$)/g, "");
}
function html_entity_decode(str) {
try {
var tarea = document.createElement('textarea');
tarea.innerHTML = str; return tarea.value;
tarea.parentNode.removeChild(tarea);
}
catch (e) {
//for IE add to the page
document.getElementById("htmlconverter").innerHTML = '';
var content = document.getElementById("innerConverter").value;
document.getElementById("htmlconverter").innerHTML = "";
return content;
}
}
document.onclick = check;
function check(e) {
var target = (e && e.target) || (event && event.srcElement);
var found = null;
while (target.parentNode != null) {
if (suggest.inTarget(target.id)) {
found = target;
break;
}
target = target.parentNode;
}
suggest.hideAllExcept(found);
}
function jsWebSafe(coname) {
var str = coname.replace("&", " and ");
str = str.replace(" ", "_");
str = str.replace("__", "_");
str = str.replace("/[^a-zA-Z0-9-_\s]/", "");
if (str.length > 100)
str = str.substring(0, 100);
return str;
}