/**
* This javascript library is used to handle interactive content of RELAX-CRM system
*
* @author Jiri Malek
* @version 1.0
* @copyright Art Data, s.r.o., 2007
*/

// find element by id
function adFindElement(id) {
    if (document.all && document.all[id]) {
        return document.all[id];
    } else {
        var e = document.getElementById(id);
        if (e) return e;
    }
    return null;
}

// write text to container by name
function adWriteContainer(containerName, newContent) {
    // get container
    var container = adFindElement(containerName);
    if (!container) {
        return true;
    }

    if (container.innerHTML) {
        container.innerHTML = newContent;
    } else {
        if (document.getElementById && !document.all) {
            container.innerHTML = newContent;
        } else {
            container.document.open("text/html");
            container.document.writeln(newContent);
            container.document.close();
        }
    }
    return true;
}

// get form element value
function adGetValue(aElement) {
    var ielement = adFindElement(aElement);
    if (ielement) {
        return ielement.value;
    } else {
        return '0';
    }
}

// set form element value
function adSetValue(aElement, avalue) {
    var ielement = adFindElement(aElement);
    if (ielement) {
        ielement.value = avalue;
    }
    return true;
}

// empty listbox/combo specified by form and name
function adClearListBox(aElement) {
    var ielement = adFindElement(aElement);
    if (ielement && ielement.length) {
        while (ielement.length > 0) {
            ielement.remove(0);
        }
    }
    return true;
}

// retrieve text of a XML document element (elements using namespaces are possible)
function adGetElementTextNS(prefix, local, parentElem, index) {
    var result = "";
    if (prefix && window.ActiveXObject) {
        // IE/Windows can not handle namespaces
        result = parentElem.getElementsByTagName(prefix + ":" + local)[index];
    } else {
        // namespace-aware versions of the method
        result = parentElem.getElementsByTagName(local)[index];
    }
    if (result) {
        // get text of a node
        if (result.childNodes.length > 1) {
            return result.childNodes[1].nodeValue;
        } else {
            return result.firstChild.nodeValue;
        }
    } else {
        return "n/a";
    }
}

// create new option tag and append it to specified listbox/combo
function adAppendToListBox(select, value, content) {
    var opt;
    opt = document.createElement("option");
    opt.value = value;
    opt.appendChild(content);
    select.appendChild(opt);

    return true;
}

// build listbox/combo of specified name and form from XML data
function adBuildListBoxFromXML(aElement, aXml) {
    // get listbox
    var ielement = adFindElement(aElement);
    if (!ielement) return false;

    // scan results
    var items = aXml.getElementsByTagName("item");
    if (items && items.length) {
        for (var i = 0; i < items.length; i++) {
            adAppendToListBox(ielement,
            adGetElementTextNS("", "value", items[i], 0),
            document.createTextNode(adGetElementTextNS("", "label", items[i], 0)));
        }
    }
    return true;
}

// clear advanced combo
function adClearAdvancedBox(aCollection, aElement) {
    // get advanced listbox data element
    var ielement = adFindElement(aElement);
    if (!ielement) return false;

    // if collection is valid options container, do the job
    if (aCollection.size) {
        aCollection.clear();
        ielement.value = '';
        ielement = adFindElement(aElement + '__');
        if (ielement) ielement.value = '';
    }
}

// build listbox/combo of specified name and form from XML data
function adBuildAdvancedBoxFromXML(aCollection, aElement, aXml) {
    // get advanced listbox data element
    var ielement = adFindElement(aElement);
    if (!ielement) return false;

    // if collection is valid options container, do the job
    if (aCollection.size) {
        aCollection.clear();

        var items = aXml.getElementsByTagName("item");
        var key = null;
        var label = null;

        // process
        if (items && items.length) {
            var first = true;
            for (var i = 0; i < items.length; i++) {
                aCollection.add(new adKeyItem(
                adGetElementTextNS("", "value", items[i], 0),
                adGetElementTextNS("", "label", items[i], 0)
                ));

                // on the first cycle
                if (first) {
                    key = adGetElementTextNS("", "value", items[i], 0);
                    label = adGetElementTextNS("", "label", items[i], 0);
                    first = false;
                }
            }
        }

        // update default values of the box elements is any
        if (key != null) {
            ielement.value = key;
            ielement = adFindElement(aElement + '__');
            if (ielement) ielement.value = label;
        }
    }

    return true;
}

// prepare global AJAX variables
var adAJAXreq;
var adAJAXcallback;
var adAJAXresponseText;
var adAJAXresponseXML;

// process changes in AJAX call status
function adProcessAjaxStatusChange() {
    // request goes through multiple states before final end
    if (adAJAXreq && (adAJAXreq.readyState == 4)) {
        try {
            // on successfull request do preocessing
            if (adAJAXreq.status == 200) {
                adAJAXresponseText = adAJAXreq.responseText;
                adAJAXresponseXML = adAJAXreq.responseXML;
                adAJAXreq = false;

                // call callback function
                if (adAJAXcallback) {
                    adAJAXcallback();
                }
            } else {
                alert("Interactive communication with server failed.\n" + adAJAXreq.statusText);
            }
        } catch (e) {
            // AJAX object is broken, probably request source has been lost
            alert("Interactive communication with server failed.\n" + e);
        }
    }

    return true;
}

// send AJAX request to the server
function adAjaxSendRequest(url, acallback) {
    adAJAXreq = false;
    adAJAXcallback = false;

    // try native XMLHttpRequest
    if (window.XMLHttpRequest && !window.ActiveXObject) {
        try {
            adAJAXreq = new XMLHttpRequest();
        } catch(e) {
            adAJAXreq = false;
        }
        // MS/Explorer ActiveX version of the object
    } else if (window.ActiveXObject) {
        try {
            adAJAXreq = new ActiveXObject("Msxml2.XMLHTTP");
        } catch(e) {
            try {
                adAJAXreq = new ActiveXObject("Microsoft.XMLHTTP");
            } catch(e) {
                adAJAXreq = false;
            }
        }
    }

    // some way to send request is available
    if(adAJAXreq) {
        adAJAXcallback = acallback;
        adAJAXreq.onreadystatechange = adProcessAjaxStatusChange;
        adAJAXreq.open("GET", url, true);
        adAJAXreq.send("");
    }

    return true;
}

// this will set listbox selection by value
function setListboxOption(listbox, avalue) {
    if (listbox.options && (listbox.options.length > 0)) {
        for (var i = 0; i < listbox.options.length; i++) {
            if (listbox.options[i].value == avalue) {
                listbox.selectedIndex = i;
                break;
            }
        }
    }
}

// this will set advanced listbox selection by value
function setAdvancedListboxOption(id, data, key) {
    // get advanced listbox data element
    var ielement = adFindElement(id);
    if (!ielement) return false;

    if (data.size) {
        var asize = data.size();
        for (var i = 0; i < asize; i++) {
            if (data[i].key == key) {
                ielement.value = key;

                ielement = adFindElement(id + '__');
                if (ielement) ielement.value = data[i].label;
                break;
            }
        }
    }
}

// CLASS: advanced listbox item
function adKeyItem(key, label) {
    this.key = key;
    this.label = label;
    return this;
}

var adCSTimer;
var adCSElementId;
var adCSCollection;
var adCSOnChange;
var adCSPopupSize;

// this will schedule a search for customer
function scheduleCustomerSearch(evt, elementId, data, onch, s) {
    // clear previous timer
    if (adCSTimer) {
        clearTimeout(adCSTimer);
    }

    // remember needed data
    adCSElementId = elementId;
    adCSCollection = data;
    adCSOnChange = onch;
    adCSPopupSize = s;

    // set timer for searching
    adCSTimer = setTimeout("adSearchForCustomer()", 500);
}

// init search for customer using AJAX and schedule overlib popup after AJAX will be served
function adSearchForCustomer() {
    // dispose timer
    clearTimeout(adCSTimer);
    adCSTimer = false;

    // request AJAX search
    var ae = adFindElement(adCSElementId + '__');
    if (ae && (ae.value != '')) {
        adAjaxSendRequest('ajax_get_xml.php?type=cus&txt='+ae.value, adDisplayCustomersOptions);
    }
}

// this will display overlib selectbox from loaded customers
function adDisplayCustomersOptions() {
    adCSCollection.clear();

    // process incoming XML data into collection
    var items = adAJAXresponseXML.getElementsByTagName("item");
    if (items && items.length) {
        for (var i = 0; i < items.length; i++) {
            adCSCollection.add(new adKeyItem(
            adGetElementTextNS("", "value", items[i], 0),
            adGetElementTextNS("", "label", items[i], 0)
            ));
        }
    }

    // display overlib
    overlib(getListboxBody(adCSCollection, adCSElementId, adCSElementId + '__', adCSOnChange),REF,adCSElementId + '__',NOCLOSE,REFY,27,WIDTH,adCSPopupSize);
}

// get overlib listbox content from collection
function getListboxBody(data, keyId, textId, change) {
    // prepare empty result
    var txt = '-';

    // verify if there is a size (object is a propper class)
    if (data.size) {
        txt = '<div class="sblock">';

        var asize = data.size();
        for (var i = 0; i < asize; i++) {
            // start element
            txt += '<a href="javascript:void(0);"';

            // add onClick event handler
            txt += ' onclick="el=document.getElementById(\'' + textId + '\');el.value=\'' + data[i].label + '\';el=document.getElementById(\'' + keyId + '\');el.value=\'' + data[i].key + '\';nd();';

            // add onchange function call (if any)
            if (change) {
                txt += change + ';';
            }

            txt += '">';
            txt += data[i].label;
            txt += '</a>';
        }
        txt += '</ul></div>';
    }

    // return build result
    return txt;
}

// get overlib checkbox content from collection
function getCheckboxBody(data, keyId, cSize, cText) {
    // prepare empty result
    var txt = '-';
    var checked = false;

    // verify if there is a size (object is a propper class)
    if (data.size) {
        txt = '<div class="sblock">';

        var asize = data.size();
        for (var i = 0; i < asize; i++) {
            // start element
            txt += '<label><input type="checkbox" name="' + keyId + '_check" value="1"';

            // add onChange event handler
            txt += ' onChange="adSetValue(\'' + keyId + '_' + data[i].key + '\', (this.checked?1:0));collectCheckboxOptions(' + keyId + '_data, \'' + keyId + '\', ' + cSize + ', \'' + cText + '\');"';

            // set actual check value
            checked = (adGetValue(keyId + '_' + data[i].key) == '1');
            if (checked) {
                txt += ' checked="checked"';
            }

            txt += 'class="checkbox" />';
            txt += data[i].label;
            txt += '</label>';
        }

        txt += '</div>';
    }

    // return build result
    return txt;
}

// prepare list of names of selected options and write it to check container
function collectCheckboxOptions(data, keyId, cSize, cText) {
    var checked = false;

    if (data && data.size) {
        var txt = '';
        var asize = data.size();

        // cycle all options and collect checked one
        for (var i = 0; i < asize; i++) {
            checked = (adGetValue(keyId + '_' + data[i].key) == '1');
            if (checked) {
                txt += ((txt != '') ? ', ' : '') + data[i].label;
            }
        }

        // on no options insert base text
        if (txt == '') txt = cText;

        // set char size for output text
        while (txt.length != cSize) {
            if (txt.length < cSize) {
                txt += ' ';
            } else {
                txt = txt.substring(0, cSize);
            }
        }

        // write result to container
        txt = txt.replace(/[\s]/g, '&nbsp;');
        adWriteContainer(keyId + '_tag', txt);
    }

    return true;
}

// --------------------------------------------------------------
// CLASS: collection of elements
// --------------------------------------------------------------
function adCollection() {
    var lsize = 0;

    // methods
    this.add = _add;
    this.remove = _remove;
    this.size = _size;
    this.clear = _clear;
    this.isEmpty = _isEmpty;

    // add new element into collection
    function _add(element) {
        if (element == null) return;
        lsize++;
        this[(lsize - 1)] = element;
    }

    // remove element with specified index from collection
    function _remove(index) {
        // verify index validity
        if ((index < 0) || (index > this.length - 1)) {
            return;
        }

        // reset element on the index
        this[index] = null;

        // move remaining elements one index down
        for (var i = index; i <= lsize; i++) {
            this[i] = this[i + 1];
        }
        lsize--;
    }

    // return number of elements in the collection
    function _size() {
        return lsize
    }

    // remove all elements in the collection
    function _clear() {
        for (var i = 0; i < lsize; i++) {
            this[i] = null;
        }
        lsize = 0;
    }

    // verify is the collection is empty
    function _isEmpty() {
        return (lsize == 0);
    }
}

// --------------------------------------------------------------
// capture enter and dispose it to avoid unwanted form submits
// --------------------------------------------------------------
//function kH(e) {
//    var pK = e ? e.which : window.event.keyCode;
//    return pK != 13;
//}
//document.onkeypress = kH;
//if (document.layers) document.captureEvents(Event.KEYPRESS);
