// data
try {
    var captchaSrc = document.getElementById('captcha_img').src;
} catch(e) {}
try {
    var loginText = document.getElementById('login_text').value;
} catch(e) {}
try {
    var registerText = document.getElementById('register_text').value;
} catch(e) {}
try {
    var waitingText = document.getElementById('waiting_text').value;
} catch(e) {}
try {
    var invalidUrlText = document.getElementById('invalid_url').value;
} catch(e) {}
var pageID = getCookie('pageid');
if (pageID == null) pageID = 0;
var pageFormID = getCookie('pageformid');
if (pageFormID == null) pageFormID = 0;
var pageBoardID = getCookie('pageboardid');
if (pageBoardID == null) pageBoardID = 0;
try {
    var emptyText = document.getElementById('empty_text').value;
} catch(e) {}
// set the name field from cookies
if (getCookie('username')) {
    try {
        document.getElementById('linkdirectory_name').value = getCookie('username');
    } catch(e) {}
}
// holds an instance of XMLHttpRequest
var xmlHttp = createXmlHttpRequestObject();
// holds the remote server addresses
// to check name
var serverAddress = "?id="+pageID+"&linkdirectory[action][checkName]";
// to verify login
var serverAddressLogin = "?id="+pageID+"&linkdirectory[action][verifyLogin]";
// to log out
var serverAddressLogout = "?id="+pageID+"&linkdirectory[action][logout]";
// to forgot password
var serverAddressFgtPass = "?id="+pageID+"&linkdirectory[action][forgotPass]";
// to validate url
var serverAddressValidateUrl = "?id="+pageID+"&linkdirectory[action][validateUrl]";
// to commit link
var serverLinkCommit = "/?id="+pageFormID+"&linkdirectory[action][addLinkCommit]";
// to commit edit link
var serverLinkEditCommit = "/?id="+pageFormID+"&linkdirectory[action][editLinkCommit]";
// to edit link
var serverLinkEdit = "/?id="+pageFormID+"&linkdirectory[action][editLink]";
// to delete link
var serverLinkDel = "/?id="+pageFormID+"&linkdirectory[action][deleteLink]";
// when set to true, display detailed error messages
var showErrors = true;
// initialize the validation requests cache 
var cache = new Array();
String.prototype.wordWrap = function(m, b, c){
    var i, j, s, r = this.split("\n");
    if(m > 0) for(i in r){
        for(s = r[i], r[i] = ""; s.length > m;
            j = c ? m : (j = s.substr(0, m).match(/\S*$/)).input.length - j[0].length
            || j.input.length + (j = s.substr(m).match(/^\S*/)).input.length + j[0].length,
            r[i] += s.substr(0, j) + ((s = s.substr(j)).length ? b : "")
        );
        r[i] += s;
    }
    return r.join("\n");
};
// go to form where we can add link
function goAddLink() {
    clearTimeout(show);
    var url = document.getElementById('add_link_url').value;
    if (url && url != '' && (false != checkUrl(url))) {
        document.getElementById("addlink_url_error").innerHTML = 'wait...';
    } else {
        document.getElementById("addlink_url_error").innerHTML = invalidUrlText;
    }
}
// get value of variable from get parameters
function getURLParam(strParamName){
    var strReturn = "";
    var strHref = window.location.href;
    if ( strHref.indexOf("?") > -1 ) {
        var strQueryString = strHref.substr(strHref.indexOf("?")).toLowerCase();
        var aQueryString = strQueryString.split("&");
        for (var iParam = 0; iParam < aQueryString.length; iParam++) {
           if (aQueryString[iParam].indexOf(strParamName.toLowerCase() + "=") > -1 ) {
               var aParam = aQueryString[iParam].split("=");
               strReturn = aParam[1];
               break;
           }
       }
    }
    return unescape(strReturn);
}
// creates an XMLHttpRequest instance
function createXmlHttpRequestObject() {
// will store the reference to the XMLHttpRequest object
    var xmlHttp;
// this should work for all browsers except IE6 and older
    try {
// try to create XMLHttpRequest object
      xmlHttp = new XMLHttpRequest();
    }
    catch(e) {
// assume IE6 or older
    var XmlHttpVersions = new Array("MSXML2.XMLHTTP.6.0",
                                    "MSXML2.XMLHTTP.5.0",
                                    "MSXML2.XMLHTTP.4.0",
                                    "MSXML2.XMLHTTP.3.0",
                                    "MSXML2.XMLHTTP",
                                    "Microsoft.XMLHTTP");
// try every id until one works
    for (var i=0; i<XmlHttpVersions.length && !xmlHttp; i++) {
        try { 
// try to create XMLHttpRequest object
            xmlHttp = new ActiveXObject(XmlHttpVersions[i]);
        }
        catch (e) {} // ignore potential error
      }
    }
// return the created object or display an error message
    if (!xmlHttp) {
        displayError("Error creating the XMLHttpRequest object.");
    } else {
        return xmlHttp;
    }
}
// function that displays an error message
function displayError($message) {
// ignore errors if showErrors is false
    if (showErrors) {
// turn error displaying Off
        showErrors = false;
// display error message
        alert("Error encountered: \n" + $message);
// retry validation after 10 seconds
        setTimeout("validate()", 10000);
    }
}

function validate() {
    try {
        var name = document.getElementById('linkdirectory_name').value;
    } catch(e) {}
    if (name == '') {
        showError(emptyText);
        return;
    }
// only continue if xmlHttp isn't void
    if (xmlHttp) {
// encode values for safely adding them to an HTTP request query string
    name = encodeURIComponent(name);
// add the values to the queue
    cache.push("name=" + name);
// try to connect to the server
        try {
// continue only if the XMLHttpRequest object isn't busy
// and the cache is not empty
            if ((xmlHttp.readyState == 4 || xmlHttp.readyState === 0) && cache.length > 0) {
// get a new set of parameters from the cache
                var cacheEntry = cache.shift();
// make a server request to validate the extracted data
                xmlHttp.open("POST", serverAddress, true);
                xmlHttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
                xmlHttp.onreadystatechange = handleRequestStateChange;
                xmlHttp.send(cacheEntry);
                clearAllFields();
                showLoading(true);
                loginButton('wait');
            }
        }
        catch (e) {
// display an error when failing to connect to the server
            displayError(e.toString());
        }
    }
}

function validateUrl(url) {
    if (xmlHttp) {
        url = encodeURIComponent(url);
        cache.push('url=' + url);
        try {
            if ((xmlHttp.readyState == 4 || xmlHttp.readyState === 0) && cache.length > 0) {
                var cacheEntry = cache.shift();
                xmlHttp.open("POST", serverAddressValidateUrl, true);
                xmlHttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
                xmlHttp.onreadystatechange = handleRequestStateChangeValidateUrl;
                xmlHttp.send(cacheEntry);
            }
        }
        catch (e) {
            displayError(e.toString());
        }
    }
}

function loginUser() {
    if (document.getElementById('linkdirectory_name').value === '') {
		var divError = document.getElementById('login_error');
        divError.innerHTML = emptyText;
        return;
    }
    if (document.getElementById('linkdirectory_pass').value === '') {
		var divError = document.getElementById('pass_error');
        divError.innerHTML = emptyText;
        return;
    }
    if (xmlHttp) {
        var name = document.getElementById("linkdirectory_name").value;
        var url = document.getElementById("linkdirectory_url").value;
        var password = document.getElementById("linkdirectory_pass").value;
        var register = document.getElementById("register").value;
        var captcha = document.getElementById("security_code").value;
    
        name = encodeURIComponent(name);
        url = encodeURIComponent(url);
        password = encodeURIComponent(password);
        captcha = encodeURIComponent(captcha);
        cache.push("name=" + name + "&pass=" + password //+ "&pass_again=" + password_again
                 + "&register=" + register + "&security_code=" + captcha
                 + "&url=" + url);
        try {
            if ((xmlHttp.readyState == 4 || xmlHttp.readyState === 0) && cache.length > 0) {
                var cacheEntry = cache.shift();
                xmlHttp.open("POST", serverAddressLogin, true);
                xmlHttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
                xmlHttp.onreadystatechange = handleRequestStateChangeLogin;
                xmlHttp.send(cacheEntry);
                clearAllFields();
                showLoading(true);
                loginButton('wait');
            }
        }
        catch (e) {
            displayError(e.toString());
        }
    }
}

function logoutUser() {
    document.dashboard.onsubmit = function() { return true; };
	document.dashboard.action = '/?' + pageID + '&linkdirectory[action][logout]';
	document.dashboard.submit();
}

function forgotPass() {
  showFgtPassError();
  var name = document.getElementById("linkdirectory_name_forgot").value;
  name = encodeURIComponent(name);
  if (xmlHttp) {
    cache.push("name=" + name);
    try {
      if (xmlHttp.readyState == 4 || xmlHttp.readyState === 0) {
        xmlHttp.open("POST", serverAddressFgtPass, true);
        xmlHttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
        xmlHttp.onreadystatechange = handleRequestStateChangeForgotPass;
        var cacheEntry = cache.shift();
        xmlHttp.send(cacheEntry);
        //showFgtPass();
        clearAllFields();
      }
    }
    catch (e) {
      // display an error when failing to connect to the server
      displayError(e.toString());
    }
  }
}

// function that handles the HTTP response (validate name)
function handleRequestStateChange() {
  // when readyState is 4, we read the server response
  if (xmlHttp.readyState == 4) {
    // continue only if HTTP status is "OK"
    if (xmlHttp.status == 200) {
      try {
        // read the response from the server
        clearAllFields();
        readResponse();
      }
      catch(e) {
        // display error message
        displayError(e.toString());
      }
    } else {
      // display error message
      displayError(xmlHttp.statusText);
    }
  }
}

function handleRequestStateChangeForgotPass() {
  // when readyState is 4, we read the server response
  if (xmlHttp.readyState == 4) {
    // continue only if HTTP status is "OK"
    if (xmlHttp.status == 200) {
      try {
        // read the response from the server
        clearAllFields();
        readResponseForgotPass();
      }
      catch(e) {
        // display error message
        displayError(e.toString());
      }
    } else {
      // display error message
      displayError(xmlHttp.statusText);
    }
  }
}

function handleRequestStateChangeValidateUrl() {
    if (xmlHttp.readyState == 4) {
        if (xmlHttp.status == 200) {
            try {
                readResponseValidateUrl();
            }
            catch(e) {}
        } else {
            displayError(xmlHttp.statusText);
        }
    }
}

function handleRequestStateChangeLogin() {
  // when readyState is 4, we read the server response
  if (xmlHttp.readyState == 4) {
    // continue only if HTTP status is "OK"
    if (xmlHttp.status == 200) {
      try {
        // read the response from the server
        showLoading();
        readResponseLogin();
      }
      catch(e) {
        // display error message
        displayError(e.toString());
      }
    } else {
      // display error message
      displayError(xmlHttp.statusText);
    }
  }
}
// to login user
function readResponseLogin() {
    var response = xmlHttp.responseText;
    if (response.indexOf("ERRNO") >= 0 || response.indexOf("error:") >= 0
     || response.length === 0) {
        throw(response.length === 0 ? "Server error." : response);
    }
    responseXml = xmlHttp.responseXML;
    xmlDoc = responseXml.documentElement;
    result = xmlDoc.getElementsByTagName("response")[0].firstChild.data;
    if (result != 'ok') {
        if (document.getElementById('register').value == 1) {
            loginButton('register');
        } else {
            loginButton();
        }
        if (result.indexOf("login") >= 0) {
            tmp = result.replace(/^([^:]+:) ([^@]+@.+)$/,"$1 <a href=\"mailto:$2\">$2</a>");
            loginButton();
            showError(tmp);
        } else
        if (result.indexOf('url') > 0 || result.indexOf('Link') >= 0) {
            showUrlError(result);
            if (document.getElementById('register').value == 1) {
                showCaptcha(true);
            } else {
                showCaptcha(false);
            }
        } else {
            if (result.indexOf('pass') > 0 || result.indexOf('char') > 0) {
                showPassError(result);
                loginButton();
            } else {
                showLoginError(true,result);
            }
        }
    } else {
        if (document.getElementById('linkdirectory_url').value) {
            document.linkdirectory_form.action = '/?' + pageFormID;
            //window.location.href = '/?' + pageFormID;
        } else {
            document.linkdirectory_form.action = '/?' + pageBoardID;
            //window.location.href = '/?' + pageBoardID;
        }
        document.linkdirectory_form.onsubmit = function() { return true; };
        document.linkdirectory_form.submit();
    }  
}

// read server's response (verify name) 
function readResponse() {
    var response = xmlHttp.responseText;
    if (   response.indexOf("ERRNO") >= 0 
        || response.indexOf("error:") >= 0
        || response.length === 0)
        { throw(response.length === 0 ? "Server error." : response); }
    var responseXml = xmlHttp.responseXML;
    xmlDoc = responseXml.documentElement;
    result = xmlDoc.getElementsByTagName("response")[0].firstChild.data;
    if (result == 'ok') {
        clearAllFields();
    } else {
        if (result.indexOf("login") >= 0) {
            tmp = result.replace(/^([^:]+:) ([^@]+@.+)$/,"$1 <a href=\"mailto:$2\">$2</a>");
            showError(tmp);
        } else
            showLoginError(true,result);
    } 
}

// read server's response (forgot password)
function readResponseForgotPass() {
    var response = xmlHttp.responseText;
    if (   response.indexOf("ERRNO") >= 0 
        || response.indexOf("error:") >= 0
        || response.length === 0)
        { throw(response.length === 0 ? "Server error." : response); }
    var responseXml = xmlHttp.responseXML;
    xmlDoc = responseXml.documentElement;
    result = xmlDoc.getElementsByTagName("response")[0].firstChild.data;
    if (result == '') {
        clearAllFields();
    } else {
        if (result.indexOf("login") >= 0) {
            tmp = result.replace(/^([^:]+:) ([^@]+@.+)$/,"$1 <a href=\"mailto:$2\">$2</a>");
            showFgtPassError(tmp);
        } else
            showFgtPassError(result);
    } 
}

function readResponseValidateUrl() {
    var response = xmlHttp.responseText;
    if (   response.indexOf("ERRNO") >= 0 
        || response.indexOf("error:") >= 0
        || response.length === 0)
        { throw(response.length === 0 ? "Server error." : response); }
    var responseXml = xmlHttp.responseXML;
    xmlDoc = responseXml.documentElement;
    result = xmlDoc.getElementsByTagName("response")[0].firstChild.data;
    //document.getElementById("addlink_url_error").innerHTML = '';
    if (result == 'ok') {
        document.dashboard.onsubmit = function() { return true; };
        document.dashboard.action = '/?' + pageFormID;
        document.dashboard.submit();
    } else {
        document.getElementById("addlink_url_error").innerHTML = result;
    } 
}

function loginButton(mode) {
    if (mode == 'register') {
        document.getElementById('sbm').value = registerText;
        document.getElementById('sbm').className = 'btn-primary';
        document.getElementById('sbm').disabled = false;
    } else {
         if (mode == 'wait') {
             document.getElementById('sbm').value = waitingText;
             document.getElementById('sbm').className = 'btn-secondary-wait';
             document.getElementById('sbm').disabled = true;
         } else {
            document.getElementById('sbm').value = loginText;
            document.getElementById('sbm').className = 'btn-primary';
            document.getElementById('sbm').disabled = false;
         }
    }
}

function showError(text) {
    if (text) {
        //text = text.wordWrap(30, "\n", true);
        document.getElementById("login_error").innerHTML = text;
        document.getElementById("login_error").style.display = 'block';
        document.getElementById("login_error_img").style.display = "inline";
    } else {
        document.getElementById("login_error").innerHTML = '';
        document.getElementById("login_error").style.display = 'none';
        document.getElementById("login_error_img").style.display = "none";
    }
}

function showUrlError(text) {
    if (text) {
        document.getElementById("url_error").innerHTML = text;
        document.getElementById("url_error").style.display = 'block';
        document.getElementById("url_error_img").style.display = "block";
    } else {
        document.getElementById("url_error").innerHTML = '';
        document.getElementById("url_error").style.display = 'none';
        document.getElementById("url_error_img").style.display = "none";
  }
}

function showPassError(text) {
    if (text) {
        document.getElementById("pass_error").innerHTML = text;
        document.getElementById("pass_error").style.display = 'block';
        document.getElementById("pass_error_img").style.display = "block";
    } else {
        document.getElementById("pass_error").innerHTML = '';
        document.getElementById("pass_error").style.display = 'none';
        document.getElementById("pass_error_img").style.display = "none";
    }
    document.getElementById('linkdirectory_pass').value = '';
}

function showCaptcha(flag) {
    if (flag) {
        document.getElementById('security_code').value = '';
        document.getElementById("captcha").style.display = 'block';
        document.getElementById('captcha_img').src = (captchaSrc + '&' + Math.random());
    } else {
        document.getElementById("captcha").style.display = 'none';
        document.getElementById('captcha_img').src = '';
    }
}

function showLoading(flag) {
    if (flag) {
        document.getElementById("loader_img").style.display = 'block';
    } else {
        document.getElementById("loader_img").style.display = 'none';
    }
}

function showLoginError(flag,text) {
    if (flag === true) {
        showError(text);
        if (text.indexOf('email') > 0) {
            loginButton();
            document.getElementById("register").value = 0;
        } else {
            loginButton('register');
            document.getElementById("register").value = 1;
            showCaptcha(true);
        }
    } else {
    clearAllFields();
  }
}

function clearAllFields() {
    document.getElementById("loader_img").style.display = 'none';
    document.getElementById("login_error_img").style.display = 'none';
    document.getElementById("url_error_img").style.display = 'none';
    document.getElementById("pass_error_img").style.display = 'none';
    document.getElementById("login_error").style.display = 'none';
    document.getElementById("url_error").style.display = 'none';
    document.getElementById("pass_error").style.display = 'none';
    document.getElementById("captcha").style.display = 'none';
    loginButton();
    showPassError();
}

function checkKeyPressed(evt, func, params) {
    evt = (evt) ? evt : (window.event) ? event : null;
    if (evt) {
        var charCode = (evt.charCode) ? evt.charCode :
                       ((evt.keyCode) ? evt.keyCode :
                       ((evt.which) ? evt.which : 0));
        if (charCode == 13) {
            func(params);
        }
    }
}

function showFgtPass(flag) {
    showFgtPassError('');
    if (flag) {
        document.getElementById('fgtPassForm').style.display = 'block';
        document.getElementById('loginform-in').style.display = 'none';
    } else {
        document.getElementById('fgtPassForm').style.display = 'none';
        document.getElementById('loginform-in').style.display = 'block';
    }
}

function showFgtPassError(result) {
    if (result) {
        document.getElementById('fgt_pass_error').innerHTML = result;
    } else {
        document.getElementById('fgt_pass_error').innerHTML = '';
    }
}

function backLogin() {
    var pageid = 0;
    eraseCookie('url');
    pageid = getCookie('pageboardid');
    window.location.href = '/?' + pageid;
}

function backForm(page) {
    window.location.href = page;
//    document.backAdd.action = page;
//    document.backAdd.onsubmit = function() { return true; };
//    document.backAdd.submit();
}

function hideAddLink() {
   document.getElementById('add_link').style.display = 'none';
}

function showAddLink() {
    document.getElementById("addlink_url_error").innerHTML = '';
    document.getElementById('add_link').style.display = 'block';
    show = setTimeout(hideAddLink,4000);
}

// get value from cookies by name
function getCookie(name) {
    var cookie = " " + document.cookie;
    var search = " " + name + "=";
    var setStr = null;
    var offset = 0;
    var end = 0;
    if (cookie.length > 0) {
        offset = cookie.indexOf(search);
        if (offset != -1) {
            offset += search.length;
            end = cookie.indexOf(";", offset);
            if (end == -1) {
                end = cookie.length;
            }
            setStr = unescape(cookie.substring(offset, end));
        }
    }
    return(setStr);
}

function createCookie(name,value,days) {
    var expires;
    if (days) {
        var date = new Date();
        date.setTime(date.getTime()+(days*24*60*60*1000));
        expires = "; expires="+date.toGMTString();
    }
    else {
        expires = "";
    }
    document.cookie = name+"="+value+expires+"; path=/";
}

function readCookie(name) {
    var nameEQ = name + "=";
    var ca = document.cookie.split(';');
    var c;
    for(var i=0; i < ca.length; i++) {
        c = ca[i];
        while (c.charAt(0)==' ') {
            c = c.substring(1,c.length);
        }
        if (c.indexOf(nameEQ) === 0) {
            return c.substring(nameEQ.length,c.length);
        }
    }
    return null;
}

function eraseCookie(name) {
    createCookie(name,"",-1);
}

function checkUrl(url) {
    //var regexp = new RegExp();
    //regexp.compile("^[A-Za-z]+://[A-Za-z0-9-_æøå]+\\.[æøåA-Za-z0-9-_%&\?\/.=]+$"); 
    //if (!regexp.test(url))
    //    return false;
    //else {
        return validateUrl(url);
    //}
}

function checkCats() {
    var els = document.forms['linkdirectory_form'].elements['linkdirectory[cats][]'];
    var len = els.length;
    for (var i = 0; i < len; i++) {
        if (els[i].checked)
            return true;
    }
    return false;
}

function goCheckAddLink() {
    var category = checkCats();
    var catSuggest = document.getElementById('linkdirectory_cat_suggest').value;
    if (!category && !catSuggest) {
        setCatError(true);
        setError(true);
        return;
    } else {
        setCatError(false);
        setError(false);
    }
    var label = document.getElementById('linkdirectory_lable').value;
    if (!label) {
        setLableError(true);
        setError(true);
        return;
    } else {
        setLableError(false);
        setError(false);
    }
    document.getElementById('linkdirectory_form').submit();
}

function setError(flag) {
    var divId = document.getElementById('req_error');
    if (flag) {
        divId.style.display = 'block';
    } else {
        divId.style.display = 'none';
    }
}

function goAddLinkCommit() {
	window.location.href = serverLinkCommit;
}

function goEditLinkCommit() {
	window.location.href = serverLinkEditCommit;
}

function setCatError(flag) {
    var divImg = document.getElementById('cats_error_img');
    if (flag) {
        divImg.style.display = 'inline';
    } else {
        divImg.style.display = 'none';
    }
}

function setLableError(flag) {
    var divImg = document.getElementById('lable_error_img');
    if (flag) {
        divImg.style.display = 'inline';
    } else {
        divImg.style.display = 'none';
    }
}

function setVipContent(uid) {
    //var start_rem = '<!-- LinkDirectory id=' + uid +' -->';
    //var end_rem = '<!-- /LinkDirectory -->';
    document.getElementById('vip_content').style.display = 'block';
    var tmp = document.getElementById('htmlid_' + uid).innerHTML;
    tmp = tmp.replace(/&gt;/g,">");
    tmp = tmp.replace(/&lt;/g,"<");
    //document.getElementById('linkdirectory_vip_html').value = start_rem + "\n" + tmp + "\n" + end_rem;
    document.getElementById('linkdirectory_vip_html').value = tmp;
    document.getElementById('linkdirectory_vip_uid').value = uid;
}

function editLink(uid) {
    var formName = "link_" + uid;
    var form = document.getElementById(formName);
    form.onsubmit = 'return true';
    form.action = serverLinkEdit + '&dash=1&no_cache=1';
    form.submit();
}

function delLink(uid) {
    var answ = confirm('Are you sure?');
    if (false == answ)
        return;
    var formName = "link_" + uid;
    var form = document.getElementById(formName);
    form.onsubmit = 'return true';
    form.action = serverLinkDel;
    form.submit();
}

