var advQuery = null;
var advForm = null;
var formOper = ' and ';

function auth_check() {
    auth.check(advMain, function () { window.location = "login.html";} );
}

function advMain() {
    
    if (auth.styleCss && document.getElementById("stylesheet")) {
        document.getElementById("stylesheet").href = auth.styleCss;
    }
    
    advForm = document.advanced;
    // Transfer query from simple search page to key words field
    transferSimpleQuery();
    //TODO fix timing issues    
    // Get library logo
    loadComponents();
    renderComponent("authLogoComp", auth);
    renderComponent("authInfoComp", auth);
    controlRegister.loadControls();
    loadSettings(function (setts) { populateAdvForm(setts); });
    advFormChange(); 
    
}

function populateAdvForm(setts) {
    advForm.sort.value = setts["sort"];
    advForm.perpage.value = setts["perpage"];
    if (setts["isbn"]) {
      advForm.isbn.value = setts["isbn"];
    }
    controlRegister.populateControls(setts);
}

function saveAdvForm() {
    var setts = {};    
    // setts["key"] = advForm.key.value;    
    setts["sort"] = advForm.sort.value;
    setts["perpage"] = advForm.perpage.value;
    if (advForm.isbn) {
    	setts["isbn"] = advForm.isbn.value;
    }
    controlRegister.populateArray(setts);
    saveSettings(setts);
}

function transferSimpleQuery () {
    window.location.parameters = parseQueryString(window.location.search);
    if (window.location.parameters["query"]) {
        document.advanced.key.value = window.location.parameters["query"];
    }
}

function advFormSubmit() {
    if (advQuery != null) {    	
        var params = {};                
        putParam(params, "query", advQuery);
        putParam(params, "sort", advForm.sort.value);
        putParam(params, "perpage", advForm.perpage.value);
        window.location = "search.html?" + qsToString(params);
    } else {
        alert("Please specify at least one term.");
    }
}

function advFormChange() {
    advQuery = constructQuery(advForm, formOper);
    if (advQuery != null) {
        document.getElementById("advQuery").innerHTML = advQuery;
    }
}

function constructQuery(form, oper) {
    var query = new Array();
    //push terms
    safePush(query, constructClause('term', form.key.value, getSelRadioValue(form.keykind)));
    safePush(query, constructClause('ti', form.ti.value, getSelRadioValue(form.tikind)));
    safePush(query, constructClause('au', form.au.value, getSelRadioValue(form.aukind)));
    safePush(query, constructClause('su', form.su.value, getSelRadioValue(form.sukind)));
    if (form.isbn) {
        safePush(query, constructClause('isbn',form.isbn.value));
    }
    if (form.date) {
       safePush(query, constructClause('date',form.date.value));
    }
    //continue only if at least one specified
    if (query.length == 0)
        return null;
    //push the rest
    //safePush(query, constructClause('type', form.type.value));
    return query.join(oper);
}

/**
 * Constructs a search clause from a form input name, value and type
 */
function constructClause(name, value, type) {
    if (!(name && value)) return null;
    switch (type) {
        case 'phrase' :
            return name + '=' + '"' + value + '"';
        case 'all' :
            return joinTerms(name, value, ' and ');
        case 'any' :
            return joinTerms(name, value, ' or ');
         default: 
             return name + '=' + value;
    }
}

/**
 * Converts all n whitespace seperated terms in the string value into:
 * "name=value[n] operator name=value[n-1] ..." string
 */
function joinTerms(name, value, operator) {
    var terms = value.split(/\s/);
    var clause = "";
    var sep = "";
    for (var i=0; i<terms.length; i++) {
        var term = terms[i];
        if (term == '') continue;
        clause += sep + name + "=" + '"' + term + '"';
        sep = operator;
    }
    return clause;    
}

/**
 * Returns selected radio button value in a group of singly named radio btns.
 */
function getSelRadioValue(buttonGroup) { 
   if (buttonGroup[0]) {
      for (var i=0; i<buttonGroup.length; i++) {
         if (buttonGroup[i].checked)
            return buttonGroup[i].value;
      }
   } else {
       if (buttonGroup.checked)
           return buttonGroup.value;
   }
   return null;
}

/**
 * Returns an array of selected checkbox values in a group of single named
 * checkboxes.
 */
function getSelCbValues(cbGroup) {
    var selected = new Array();
    for (var i = 0; i < cbGroup.length; i++) {
        var cb = cbGroup[i];
        if (cb.checked && cb.value)
            selected.push(cb.value);    
    }
    return selected;
}

/**
 * Array push with a guard.
 */
function safePush (array, elem) {
    if (elem != null) array.push(elem);
}

/**
 * Put param to map with a value guard.
 */
function putParam(qsMap, key, value) {
    if (value) {
        qsMap[key] = value;
    }
}

/**
 * Encode map to a query string.
 */
function qsToString(qsMap) {
    var qs = "";
    var sep = "";
    for (var key in qsMap) {
        qs += sep + key + "=" + encodeURIComponent(qsMap[key]);
        sep = "&";
    }
    return qs;
}


