/*--------------------------------------------------------------------------

  (C) 2009 Brian Modra <brian@zwartberg.com>

  This library is free software; you can redistribute them and/or modify
  it under the terms of the GNU Lesser General Public License as published by
  the Free Software Foundation; either version 2.1 of the License,
  or (at your option) any later version.

  This library is distributed in the hope that it will be useful,
  but WITHOUT ANY WARRANTY; without even the implied warranty of
  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  See the GNU Lesser General Public License for more details.

  You should have received a copy of the GNU Lesser General Public License
  along with these libraries; if not, write to the Free Software Foundation,
  Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA

--------------------------------------------------------------------------*/

var timers = new Array();
var username = null;
var password = null;
var permission = 0;
var sessionid = null;
var login_submit_field = null;
var username_field = null;
var password_field = null;

function karooClientInit(host)
{
    initCave(5000, "/" + host + "/");
}

function checkLoginFields()
{
    if (!login_submit_field || !username_field || !password_field) {
	login_submit_field = document.getElementById("login-submit");
	username_field = document.getElementById("login-username");
	password_field = document.getElementById("login-password");
    }
}

function setInputType(old_input, new_type, new_value)
{
    var isMSIE=/*@cc_on!@*/false; //http://dean.edwards.name/weblog/2007/03/sniff/
    if (!isMSIE){
	old_input.type = new_type;
	if (new_value)
	    old_input.value = new_value;
	return old_input;
    }

    var new_input = document.createElement('span');
    new_input.innerHTML='<input type="'+new_type+'" name="'+old_input.name+'">';
    new_input=new_input.firstChild;

    var props=['name','id','className','size','tabIndex','accessKey'];
    for (var i = 0; i < props.length; i++){
	if (old_input[props[i]]) {
	    new_input[props[i]] = old_input[props[i]];
	}
    }

    if (new_value) {
	new_input.value = new_value;
    }
    else {
	new_input.value = old_input.value;
    }

    old_input.parentNode.replaceChild(new_input, old_input);
    return new_input;
}


function logout()
{
    checkLoginFields();
    var n = username_field.previousSibling;
    while (n && n.nodeType == 3) {
	var nxt = n.previousSibling;
	n.parentNode.removeChild(n);
	n = nxt;
    }
    var n = password_field.previousSibling;
    while (n && n.nodeType == 3) {
	var nxt = n.previousSibling;
	n.parentNode.removeChild(n);
	n = nxt;
    }
    zapTransactions();
    password_field = setInputType(password_field, "password");
    username_field = setInputType(username_field, "text");
    login_submit_field = setInputType(login_submit_field, "submit", "Login");
    username = null;
    password = null;
    permission = 0;
    var txt = document.createTextNode("Username:");
    username_field.parentNode.insertBefore(txt, username_field);
    txt = document.createTextNode("Password:");
    password_field.parentNode.insertBefore(txt, password_field);
}

function login(unm, pwd, perm)
{
    try {
    if (unm) {
	username = unm;
	passwd = pwd;
	permission = perm;
    }
    checkLoginFields();
    var n = username_field.previousSibling;
    while (n && n.nodeType == 3) {
	var nxt = n.previousSibling;
	n.parentNode.removeChild(n);
	n = nxt;
    }
    var n = password_field.previousSibling;
    while (n && n.nodeType == 3) {
	var nxt = n.previousSibling;
	n.parentNode.removeChild(n);
	n = nxt;
    }
    password_field = setInputType(password_field, "hidden");
    username_field = setInputType(username_field, "hidden");
    login_submit_field = setInputType(login_submit_field, "submit", "Logout");
    var txt = document.createTextNode(username);
    username_field.parentNode.insertBefore(txt, username_field);
    txt = document.createTextNode(" ");
    username_field.parentNode.insertBefore(txt, username_field);
    }
    catch (e) {
	alert("exception in login: "+e);
    }
}

function initKE(host)
{
    var permission_field = document.getElementById("login-permission");
    if (permission_field) {
	permission = parseInt(permission_field.value);
	username = document.getElementById("login-username").value;
	sessionid = document.getElementById("login-sessionid").value;
	if ((permission & 1) == 1) {
	    login(username, "", permission);
	    karooClientInit(host);
	}
    }
}

function loginSubmit(submit_id, username_id, password_id, host)
{
    try {
	if (submit_id) {
	    login_submit_field = document.getElementById(submit_id);
	    username_field = document.getElementById(username_id);
	    password_field = document.getElementById(password_id);
	}
	checkLoginFields();
	var n = username_field.previousSibling;
	while (n && n.nodeType == 3) {
	    var nxt = n.previousSibling;
	    n.parentNode.removeChild(n);
	    n = nxt;
	}
	var n = password_field.previousSibling;
	while (n && n.nodeType == 3) {
	    var nxt = n.previousSibling;
	    n.parentNode.removeChild(n);
	    n = nxt;
	}
    }
    catch (e) {
	alert("error while initialising fields: "+e);
    }
    var isLogin = true;
    try {
	isLogin = login_submit_field.value == "Login";
    }
    catch (e) {
	alert("error while analysing login field: "+e);
    }
    if (isLogin) {
	try {
	    username = username_field.value;
	    password = password_field.value;
	    password_field = setInputType(password_field, "hidden");
	    username_field = setInputType(username_field, "hidden");
	    login_submit_field = setInputType(login_submit_field, "submit", "Logout");
	    karooClientInit(host);
	    doLogin();
	}
	catch (e) {
	    alert("error in login: "+e);
	}
    }
    else {
	try {
	    doLogout();
	    login_submit_field = setInputType(login_submit_field, "submit", "Login");
	    password_field = setInputType(password_field, "password");
	    username_field = setInputType(username_field, "text");
	    username = null;
	    password = null;
	    permission = 0;
	    sessionid = null;
	}
	catch (e) {
	    alert("error in logout: "+e);
	}
    }
    return false;
}

function doneNewPropertyCallback(trans)
{
    var params = new Array();
    params[0] = new caveParam("id");
    findParametersInTransaction(trans, params);
    var id = null;
    if (params[0].value) {
	id = params[0].value;
    }
    if (id != null && id > 0) {
	location.href = "/fab/update/by_id_sessionid/"+id+"_"+sessionid+".html";
    }
    else {
	alert("failed to create new property");
    }
    caveStop();
}

function newProperty()
{
    if (permission == 0) {
	alert("You must log in first");
	return false;
    }
    else if ((permission & 3) != 3) {
	alert("You don't have permission to use this feature");
	return false;
    }

    if (!caveQueryInProgress("new")) {
	var params = new Array();
	params[0] = new caveParam("template-id", DB_DATA_TYPE_INT_32, 0);
	params[1] = new caveParam("sessionid", DB_DATA_TYPE_INT_32, sessionid);
	sendCaveQuery("new", "new-property", params, doneNewPropertyCallback, "ke-cave");
    }

    return false;
}

function doneDeletePropertyCallback(trans)
{
    var params = new Array();
    params[0] = new caveParam("id");
    findParametersInTransaction(trans, params);
    var id = null;
    if (params[0].value) {
	id = params[0].value;
    }
    if (id == null) {
	alert("failed to delete that property");
    }
    navigateTo("editlist");
}

function deleteProperty(id)
{
    if (permission == 0) {
	alert("You must log in first");
	return false;
    }
    else if ((permission & 3) != 3) {
	alert("You don't have permission to use this feature");
	return false;
    }

    if (!caveQueryInProgress("delete")) {
	var params = new Array();
	params[0] = new caveParam("id", DB_DATA_TYPE_INT_32, id);
	params[1] = new caveParam("sessionid", DB_DATA_TYPE_INT_32, sessionid);
	sendCaveQuery("delete", "delete-property", params, doneDeletePropertyCallback, "ke-cave");
    }

    return false;
}

function fileDoneCallback(trans, img_id)
{
    var params = new Array();
    params[0] = new caveParam("success");
    findParametersInTransaction(trans, params);
    var success = false;
    if (params[0].value) {
	success = params[0].value;
	success = success == "true" || success == "TRUE" || success == "t" || success == "T" || success == true;
    }
    if (success) {
	var img_field = document.getElementById(img_id);
	if (img_field) {
	    var src = img_field.src;
	    src = src+'#'+Math.random();
	    img_field.setAttribute("src", src);
	    img_field.src = src;
	}
    }
    setBusy(false);
    caveStop();
}

function fileDoneCallback1(trans)
{
    fileDoneCallback(trans, 'sample-small-img');
}

function fileDoneCallback2(trans)
{
    fileDoneCallback(trans, 'sample-small-img2');
}

function fileDoneCallback3(trans)
{
    fileDoneCallback(trans, 'sample-small-img3');
}

function prepareFileSend(hex_id, name, id, id_key, id_val, calback_name)
{
    if (permission == 0) {
	alert("You must log in first");
	return false;
    }
    else if ((permission & 3) != 3) {
	alert("You don't have permission to use this feature");
	return false;
    }
    var callback;
    eval("callback = "+calback_name+";");
    var trans = beginTransaction(name, callback);
    setBusy(true);
    var params = new Array();
    params[0] = new caveParam(id_key, DB_DATA_TYPE_INT_32, id_val);
    params[1] = new caveParam("sessionid", DB_DATA_TYPE_INT_32, sessionid);
    var hex = getHexOfPreparedCaveQuery(name, id, params, trans.seq);
    document.getElementById(hex_id).value = hex;
    cave_poller.poll();
    return true;
}

function doneLoginCallback(trans)
{
    var params = new Array();
    params[0] = new caveParam("permission");
    params[1] = new caveParam("sessionid");
    findParametersInTransaction(trans, params);
    permission = 0;
    sessionid = null;
    if (params[0].value) {
	permission = params[0].value;
    }
    if (params[1].value) {
	sessionid = params[1].value;
    }

    if (permission == 0) {
	alert("invalid username or password");
    }
    else if ((permission & 3) != 3) {
	alert("no permission to make changes");
    }

    if ((permission & 3) != 3) {
	logout();
    }
    else {
	login();
    }
    caveStop();
}

function doLogin()
{
    if (!caveQueryInProgress("login")) {
	var params = new Array();
	params[0] = new caveParam("username", DB_DATA_TYPE_STRING, username);
	params[1] = new caveParam("password", DB_DATA_TYPE_STRING, password);
	sendCaveQuery("login", "login", params, doneLoginCallback, "ke-cave");
    }
}

function doneLogoutCallback(trans)
{
    caveStop();
}

function doLogout()
{
    if (!caveQueryInProgress("logout")) {
	var params = new Array();
	params[0] = new caveParam("sessionid", DB_DATA_TYPE_INT_32, sessionid);
	sendCaveQuery("logout", "logout", params, doneLogoutCallback, "ke-cave");
    }
}

function doneDetailsCallback(trans)
{
    var form = document.getElementById("desc");
    var outp = document.getElementById("desc-submit-output");
    var n = outp.firstChild;
    while (n && n.nodeType == 3) {
	var nxt = n.nextSibling;
	n.parentNode.removeChild(n);
	n = nxt;
    }

    var params = new Array();
    params[0] = new caveParam("success");
    findParametersInTransaction(trans, params);
    var success = false;
    if (params[0].value) {
	success = params[0].value;
	success = success == "true" || success == "TRUE" || success == "t" || success == "T" || success == true;
    }
    if (success) {
	var txt = document.createTextNode("Success: sent details");
	outp.className = "desc-submit-output";
	outp.appendChild(txt);
    }
    else {
	var txt = document.createTextNode("Failed");
	outp.className = "desc-submit-output";
	outp.appendChild(txt);
    }
    form.appendChild(outp);
    caveStop();
}

function sendDetails(location_id, short_id, short_id2, erf_id, area_id, id)
{
    if (permission == 0) {
	alert("You must log in first");
	return false;
    }
    else if ((permission & 3) != 3) {
	alert("You don't have permission to use this feature");
	return false;
    }

    try {
    var outp = document.getElementById("desc-submit-output");
    outp.className = "desc-submit-output-nothing";
    var n = outp.firstChild;
    while (n && n.nodeType == 3) {
	var nxt = n.nextSibling;
	n.parentNode.removeChild(n);
	n = nxt;
    }
    var location_field = document.getElementById(location_id);
    var short_field = document.getElementById(short_id);
    var short_field2 = document.getElementById(short_id2);
    var erf_field = document.getElementById(erf_id);
    var area_field = document.getElementById(area_id);

    if (!caveQueryInProgress("desc")) {
	var params = new Array();
	params[0] = new caveParam("location", DB_DATA_TYPE_STRING, location_field.value);
	params[1] = new caveParam("short", DB_DATA_TYPE_STRING, short_field.value);
	params[2] = new caveParam("short2", DB_DATA_TYPE_STRING, short_field2.value);
	params[3] = new caveParam("erf", DB_DATA_TYPE_FLOAT, erf_field.value);
	params[4] = new caveParam("area", DB_DATA_TYPE_FLOAT, area_field.value);
	params[5] = new caveParam("id", DB_DATA_TYPE_INT_32, id);
	params[6] = new caveParam("sessionid", DB_DATA_TYPE_INT_32, sessionid);
	sendCaveQuery("desc", "set-details", params, doneDetailsCallback, "ke-cave");
    }
    }
    catch (e) { alert(e); }
    return false;
}

function doneLongDescriptionCallback(trans)
{
    var form = document.getElementById("long-desc");
    var outp = document.getElementById("long-desc-submit-output");
    var n = outp.firstChild;
    while (n && n.nodeType == 3) {
	var nxt = n.nextSibling;
	n.parentNode.removeChild(n);
	n = nxt;
    }

    var params = new Array();
    params[0] = new caveParam("success");
    findParametersInTransaction(trans, params);
    var success = false;
    if (params[0].value) {
	success = params[0].value;
	success = success == "true" || success == "TRUE" || success == "t" || success == "T" || success == true;
    }
    if (success) {
	var txt = document.createTextNode("Success: sent details");
	outp.className = "desc-submit-output";
	outp.appendChild(txt);
    }
    else {
	var txt = document.createTextNode("Failed");
	outp.className = "desc-submit-output";
	outp.appendChild(txt);
    }
    form.appendChild(outp);
    caveStop();
}

function sendLongDescription(desc1_id, desc2_id, desc3_id, desc4_id, desc5_id, id)
{
    if (permission == 0) {
	alert("You must log in first");
	return false;
    }
    else if ((permission & 3) != 3) {
	alert("You don't have permission to use this feature");
	return false;
    }

    var outp = document.getElementById("long-desc-submit-output");
    outp.className = "desc-submit-output-nothing";
    var n = outp.firstChild;
    while (n && n.nodeType == 3) {
	var nxt = n.nextSibling;
	n.parentNode.removeChild(n);
	n = nxt;
    }
    var desc1_field = document.getElementById(desc1_id);
    var desc2_field = document.getElementById(desc2_id);
    var desc3_field = document.getElementById(desc3_id);
    var desc4_field = document.getElementById(desc4_id);
    var desc5_field = document.getElementById(desc5_id);

    if (!caveQueryInProgress("long-desc")) {
	var params = new Array();
	params[0] = new caveParam("long_desc1", DB_DATA_TYPE_STRING, desc1_field.value);
	params[1] = new caveParam("long_desc2", DB_DATA_TYPE_STRING, desc2_field.value);
	params[2] = new caveParam("long_desc3", DB_DATA_TYPE_STRING, desc3_field.value);
	params[3] = new caveParam("long_desc4", DB_DATA_TYPE_STRING, desc4_field.value);
	params[4] = new caveParam("long_desc5", DB_DATA_TYPE_STRING, desc5_field.value);
	params[5] = new caveParam("id", DB_DATA_TYPE_INT_32, id);
	params[6] = new caveParam("sessionid", DB_DATA_TYPE_INT_32, sessionid);
	sendCaveQuery("long-desc", "set-long-desc", params, doneLongDescriptionCallback, "ke-cave");
    }
    return false;
}

function doneSpecsCallback(trans)
{
    var form = document.getElementById("specs");
    var outp = document.getElementById("specs-submit-output");
    outp.className = "desc-submit-output-nothing";
    var n = outp.firstChild;
    while (n && n.nodeType == 3) {
	var nxt = n.nextSibling;
	n.parentNode.removeChild(n);
	n = nxt;
    }

    var params = new Array();
    params[0] = new caveParam("success");
    findParametersInTransaction(trans, params);
    var success = false;
    if (params[0].value) {
	success = params[0].value;
	success = parseBoolean(success);
    }
    if (success) {
	var txt = document.createTextNode("Success: sent details");
	outp.className = "desc-submit-output";
	outp.appendChild(txt);
    }
    else {
	var txt = document.createTextNode("Failed");
	outp.className = "desc-submit-output";
	outp.appendChild(txt);
    }
    form.appendChild(outp);
    caveStop();
}

function sendSpecs(price_id, rooms_id, bedrooms_id, bathrooms_id, ensuites_id, garages_id, carports_id, sold_id, id)
{
    if (permission == 0) {
	alert("You must log in first");
	return false;
    }
    else if ((permission & 3) != 3) {
	alert("You don't have permission to use this feature");
	return false;
    }

    var outp = document.getElementById("specs-submit-output");
    outp.className = "desc-submit-output-nothing";
    var n = outp.firstChild;
    while (n && n.nodeType == 3) {
	var nxt = n.nextSibling;
	n.parentNode.removeChild(n);
	n = nxt;
    }
    var price_field = document.getElementById(price_id);
    var rooms_field = document.getElementById(rooms_id);
    var bedrooms_field = document.getElementById(bedrooms_id);
    var bathrooms_field = document.getElementById(bathrooms_id);
    var ensuites_field = document.getElementById(ensuites_id);
    var garages_field = document.getElementById(garages_id);
    var carports_field = document.getElementById(carports_id);
    var sold_field = document.getElementById(sold_id);

    var prop_type = 0;
    var rooms = parseInt(rooms_field.value);
    var bedrooms = parseInt(bedrooms_field.value);
    var bathrooms = parseInt(bathrooms_field.value);
    var ensuites = parseInt(ensuites_field.value);
    if (rooms || bedrooms || bathrooms || ensuites) {
	prop_type |= 1;
    }

    if (!caveQueryInProgress("specs")) {
	var params = new Array();
	params[0] = new caveParam("price", DB_DATA_TYPE_FLOAT, price_field.value);
	params[1] = new caveParam("rooms", DB_DATA_TYPE_INT_32, rooms);
	params[2] = new caveParam("bedrooms", DB_DATA_TYPE_INT_32, bedrooms);
	params[3] = new caveParam("bathrooms", DB_DATA_TYPE_INT_32, bathrooms);
	params[4] = new caveParam("ensuites", DB_DATA_TYPE_INT_32, ensuites);
	params[5] = new caveParam("garages", DB_DATA_TYPE_INT_32, parseInt(garages_field.value));
	params[6] = new caveParam("carports", DB_DATA_TYPE_INT_32, parseInt(carports_field.value));
	params[7] = new caveParam("id", DB_DATA_TYPE_INT_32, id);
	params[8] = new caveParam("sold", DB_DATA_TYPE_BOOL, sold_field.checked);
	params[9] = new caveParam("prop_type", DB_DATA_TYPE_INT_32, prop_type);
	params[10] = new caveParam("sessionid", DB_DATA_TYPE_INT_32, sessionid);
	sendCaveQuery("specs", "set-specs", params, doneSpecsCallback, "ke-cave");
    }
    return false;
}

function animMouseOver(id, src, pos, anim)
{
    var img = document.getElementById(id);
    if (img && timers[id]) {
	img.setAttribute("src", src+pos+".png");
	if (pos < anim) {
	    pos++;
	    setTimeout("animMouseOver('"+id+"','"+src+"',"+pos+","+anim+")", 75);
	}
	else {
	    timers[id] = null;
	}
    }
}

function mouseOver(img, src, pos, anim)
{
    if (anim) {
	var id = img.getAttribute("id");
	timers[id] = setTimeout("animMouseOver('"+id+"','"+src+"',"+pos+","+anim+")", 1);
    }
    else {
	img.setAttribute("src", src);
    }
}

function mouseDown(img, src)
{
    var id = img.getAttribute("id");
    if (timers[id]) {
	clearTimeout(timers[id]);
	timers[id] = null;
    }
    img.setAttribute("src", src);
}

function mouseUp(img, src, loc)
{
    var id = img.getAttribute("id");
    if (timers[id]) {
	clearTimeout(timers[id]);
	timers[id] = null;
    }
    img.setAttribute("src", src);
    self.location = loc;
}

function mouseOut(img, src)
{
    var id = img.getAttribute("id");
    if (timers[id]) {
	clearTimeout(timers[id]);
	timers[id] = null;
    }
    img.setAttribute("src", src);
}

function navigateTo(page, id)
{
    if (page.charAt(0) == '/' || page.substr(0,5) == "http:" || page.substr(0,6) == "https:") {
	location.href = page;
    }
    else if (id) {
	if (permission == 0) {
	    alert("You must log in first");
	    return false;
	}
	else if ((permission & 3) != 3) {
	    alert("You don't have permission to use this feature");
	    return false;
	}
	location.href = "/fab/"+page+"/by_id_sessionid/"+id+"_"+sessionid+".html";
    }
    else if (sessionid != null && sessionid != 0) {
	location.href = "/fab/"+page+"/by_sessionid/"+sessionid+".html";
    }
    else {
	if (permission == 0) {
	    alert("You must log in first");
	    return false;
	}
	location.href = "/fab/"+page+".html";
    }
    return false;
}

function printFrame(frame_id)
{
    try {
	var frame = document.getElementById(frame_id);
	frame.contentWindow.print();
    }
    catch (e) { alert(e); }
    return false;
}

var isNetscape = false;

function detectBrowser()
{
    var browser = navigator.appName;
    var b_version = navigator.appVersion;
    var version = parseFloat(b_version);
    isNetscape = browser == "Netscape";
}

