function wezyrTrim(str) {
    return str.replace(/^\s\s*/, '').replace(/\s\s*$/, '');
}

function proceedAfterLogon(doWhenLogged, loginMsg) {
    proceedAfterLogonIfNeeded(doWhenLogged, false, loginMsg);
}

function proceedAfterLogonIfNeeded(doWhenLogged, skipLogonCheck, loginMsg) {
    //alert("proceedAfterLogonIfNeeded: isUserLogged=" + isUserLogged() + ", skipLogonCheck=" + skipLogonCheck);
    if (isUserLogged() || skipLogonCheck) {
        doWhenLogged();
    } else {
        //alert("proceedAfterLogonIfNeeded: showAjaxLoginForm()");
        showAjaxLoginForm(doWhenLogged, {
            "loginMsg": loginMsg
        });
    }
}

var isChangingPageStarted = false;

function reloadCurrentPage() {
    isChangingPageStarted = true;
    window.location.reload();
}

function setCurrentPage(urlPart) {
    isChangingPageStarted = true;
    window.location.href = app_url_base + urlPart;
}

function setCurrentAlfaPage(urlPart) {
    setCurrentPage(alfaNamespace + urlPart);
}

//ajaxCallSeed = 0;

seedChars = "0123456789abcdefghijklmnopqrstuvwxyz";

function generateRandomSeed() {
    var res = new Array(10);
    for (var i = 0; i < 10; i++) {
        res[i] = seedChars.charAt(Math.floor(Math.random()*seedChars.length));
    }
    return res.join("");
}

function execAjaxCallBase(urlPart, dataStr, onComplete) {
    if (dataStr != null && dataStr.length > 0) {
        dataStr += "&";
    } else {
        dataStr = "";
    }

    dataStr += "ajax=" + generateRandomSeed()/*(ajaxCallSeed++)*/;

    $.ajax({
        type: "POST",
        url: app_url_base + urlPart,
        data: dataStr,
        success: onComplete
    });
}

function execAjaxCall(urlPart, dataStr, onSuccess, onFailure, needLogon) {
    //alert("execAjaxCall: start. urlPart=" + urlPart + ", dataStr=" + dataStr);
    var doIt = function () {
        //alert("execAjaxCall: doIt starts()");
        execAjaxCallBase(urlPart, dataStr, function(msg) {
            //alert("on complete: msg=" + msg);
            var responseObj = eval("(" + msg + ")");
            //alert("on complete: responseObj=" + responseObj);
            //alert("on complete: responseObj.success=" + responseObj.success);
            //alert("on complete: responseObj.message=" + responseObj.message);
            if (responseObj.needLogon) {
                showAjaxLoginForm(function () {
                    execAjaxCall(urlPart, dataStr, onSuccess, onFailure, needLogon)
                });
                return;
            }
        
            if (responseObj.success) {
                onSuccess(responseObj.message, responseObj);
            } else {
                //alert("on failure: data=" + responseObj.data);
                onFailure(responseObj.message, responseObj);
            }
        });
    };
    proceedAfterLogonIfNeeded(doIt, !needLogon);
//    if (!needLogon || isUserLogged()) {
//        doIt();
//    } else {
//        //alert('needLogon && user is not logged!');
//        showAjaxLoginForm(doIt);
//    }
}

function showErrorMsgOnPage(errMsgEleSelector, msg) {
    var fEle = $(errMsgEleSelector);
    if (fEle.is(':visible')) {
        fEle.fadeOut("fast");
    }
    fEle.html(msg).fadeIn('slow');
}

function execAjaxCallShowFailure(urlPart, dataStr, failureEleId, onSuccess, auxOnFailure) {
    var fEle = $("#" + failureEleId);
    execAjaxCall(urlPart, dataStr, onSuccess, function (respFailureMsg, fullResult) {
        //alert('failure: msg=' + respFailureMsg);
        //        if (fEle.is(':visible')) {
        //            fEle.fadeOut("fast");
        //        //hide('fast');
        //        }
        //        fEle.html(respFailureMsg).fadeIn('slow');
        showErrorMsgOnPage(fEle, respFailureMsg);

        if (auxOnFailure != null) {
            auxOnFailure(fullResult);
        }
    });
}

function execAjaxCallForForm(urlPart, formEleId, failureEleId, onSuccess) {
    var formEle = $("#" + formEleId);
    var formStr = formEle.serialize();
    //alert("execAjaxCallForForm: serialized form=" + formStr);
    execAjaxCallShowFailure(urlPart, formStr, failureEleId, onSuccess, function (fullResult) {
        markBadFormFields(document.getElementById(formEleId).name,
            fullResult.invalidFields, fullResult.missingFields);
    });
}

function setOnClick(eleId, onClick) {
    document.getElementById(eleId).onclick = onClick;
}

function wezyrShowMessage(msgTxt, onClose) {
    //alert("wezyrShowMessage: msgTxt=" + msgTxt);
    $("#message_form_msg").html(msgTxt);

    var f = function(okClicked) {
        return (function() {
            $.unblockUI(); 
            if (onClose != null) {
                onClose(okClicked);
            }
        });
    };

    //$("#message_form_anchor").click(f(true));
    //$("#box_zamknij_msg").click(f(false));

    setOnClick("message_form_anchor", f(true));
    setOnClick("box_zamknij_msg", f(false));

    //alert("wezyrShowMessage: before blockUI");
    $.blockUI({
        message: $('.wiadomosc'),
        centerX: true,
        css: {
            top: '150px',
            width: '195px',
            backgroundColor: '#666',
            '-webkit-border-radius': '10px',
            '-moz-border-radius': '10px',
            border: 'none'
        }
    });
//alert("wezyrShowMessage: after blockUI");
//$('.blockOverlay').attr('title','Kliknij by zamkn\u0105?').click(f(false));
//alert("wezyrShowMessage: after blockOverlay set click");
}

function isUserLogged() {
    return is_user_logged;
}

function getHrefServerPart() {
    var urlPart = location.href;
    return urlPart.replace(/^http:\/\/([^\/]*).*$/, "$1");
}

function loadJavaScriptAndProceed(url, doIt) {
    var script = document.createElement("script");
    script.type="text/javascript";
    script.__already_loaded__ = false;

    script.onload = function() {
        if (script.__already_loaded__)
            return;

        script.__already_loaded__ = true;
        doIt();
    };
    script.onreadystatechange = function() {
        if (script.__already_loaded__)
            return;

        if (script.readyState == 'loaded' || script.readyState == 'complete') {
            script.script.__already_loaded__ = true;
            doIt();
        }
    };

    script.src = url;
    document.getElementsByTagName("head")[0].appendChild(script); //
}

function showGoogleMap(eleId, latLngStr) {
    //ensureGoogleMapsInitedAndProceed(function () {
    if (googleMapsApiInited) {
        showGoogleMapWhenInited(eleId, latLngStr);
    }
//});
}

function showGoogleMapWhenInited(eleId, latLngStr) {
    //return;
    var mapCanvasEle = document.getElementById(eleId);

    if (mapCanvasEle == null) {
        return;
    }

    if (googleMapsApiSupported && GBrowserIsCompatible()) {
        var map = new GMap2(mapCanvasEle);
        //eval('map.setCenter(new GLatLng(' + latLngStr + '), 13)');

        var point = eval('new GLatLng(' + latLngStr + ')');
        map.setCenter(point, 15);
        map.addOverlay(new GMarker(point));
    } else {
        mapCanvasEle.innerHTML = googleMapsApiSupported ?
        "Twoja przegl\u0105darka nie obsługuje Google Maps" :
        "Twój url (http://" + getHrefServerPart() + "/) nie ma klucza do Google Maps";
    }
//map.setUIToDefault();
}

function getDef(obj, propName, defVal) {
    var res = defVal;

    if (obj != null) {
        res = obj[propName];
        if (res == null) {
            res = defVal;
        }
    }

    if (res == undefined) {
        res = null;
    }
    
    return res;
}

//kaptchaseed = 0;

function refreshKaptchaCodeEx(eleId) {
    var kaptchaImgEle = document.getElementById(eleId);
    kaptchaImgEle.src = app_url_base + "kaptcha.jpg?seed=" + generateRandomSeed()/*(kaptchaseed++)*/;
}

function refreshKaptchaCode() {
//    refreshKaptchaCodeEx('kaptcha_img');
}

function refreshKaptchaCode2() {
//    refreshKaptchaCodeEx('kaptcha_img2');
//    document.getElementById('captcha_input').value = '';
}

function initWezyrDialog(dialogNameId) {
    markBadFormFields(dialogNameId, [], []);
    $("#" + dialogNameId + "_msg").html("").hide();
    document.forms[dialogNameId].reset();
}

function initRegisterDialog() {
    //alert('init!');
    refreshKaptchaCode();
    initWezyrDialog("register_form");
//markBadFormFields('register_form', [], []);
//    $("#register_form_msg").html("").hide();
//    document.forms['register_form'].reset();
}

function initLoginDialog() {
    initWezyrDialog("login_form");
//    $("#login_form_msg").html("").hide();
//    document.forms['login_form'].reset();
}

function arrayIndexOf(a, obj) {
    var i = a != null ? a.length : 0;
    while (i--) {
        if (a[i] == obj) {
            return i;
        }
    }
    return -1;
}

function arrayContains(a, obj) {
    return arrayIndexOf(a, obj) != -1;
}

function addOrRemoveElementClass(ele, className, doAdd) {
    var eleAllClasses = ele.className;
    if (eleAllClasses == null) {
        eleAllClasses = "";
    }
    var eleClasses = eleAllClasses.split(" ");
    var foundIdx = arrayIndexOf(eleClasses, className);
    if (foundIdx == -1 && !doAdd) {
        return;
    }
    if (foundIdx != -1 && doAdd) {
        return;
    }
    if (doAdd) {
        eleClasses[eleClasses.length] = className;
    } else {
        eleClasses.splice(foundIdx, 1);
    }
    eleAllClasses = eleClasses.join(" ");
    ele.className = eleAllClasses;
}

function markBadFormFields(formName, invalidFields, missingFields) {
    var formEle = document[formName];
    for(var i=0; i < formEle.elements.length; i++)
    {
        var fieldEle = formEle.elements[i];
        var fieldName = fieldEle.name;
        var isBad = arrayContains(invalidFields, fieldName) || arrayContains(missingFields, fieldName);
        addOrRemoveElementClass(fieldEle, "input_err", isBad);
    }
}

function prepareTimeInfoStr(delta, resolution, partName, arr) {
    if (delta == 0) {
        return 0;
    }
    var val = delta % resolution;
    arr.push(val + " " + partName);
    return (delta - val) / resolution;
}

function secsAsTimeInfo(secs) {
    var arr = [];
    var delta = secs;
    delta = prepareTimeInfoStr(delta, 60, "sek.", arr);
    delta = prepareTimeInfoStr(delta, 60, "min.", arr);
    delta = prepareTimeInfoStr(delta, 24, "godz.", arr);
    delta = prepareTimeInfoStr(delta, 100000, "dn.", arr);
    if (arr.length == 0) {
        arr.push("0 sek.");
    }
    arr.reverse();
    return arr.join(" ");
}

function showElapsedTimeInfo(eleId, elapsedSecs) {
    //    var arr = [];
    //    var delta = elapsedSecs;
    //    delta = prepareTimeInfoStr(delta, 60, "sek.", arr);
    //    delta = prepareTimeInfoStr(delta, 60, "min.", arr);
    //    delta = prepareTimeInfoStr(delta, 24, "godz.", arr);
    //    delta = prepareTimeInfoStr(delta, 100000, "dn.", arr);
    //    arr.reverse();
    //    document.getElementById(eleId).title = "Ostatnio sprawdzałeś " + arr.join(" ") + " temu";
    document.getElementById(eleId).title = "Ostatnio sprawdzałeś " +
    secsAsTimeInfo(elapsedSecs) + " temu";
}

function calcElapsedSecs(startDate, endDate) {
    return Math.floor((endDate - startDate) / 1000);
}

function setUpPeriodicElapsedTimeInfo(eleId, initialElapsedSecs) {
    var startDate = new Date();
    var f = function () {
        var elapsedSecs = initialElapsedSecs + //Math.floor((new Date() - startDate) / 1000);
        calcElapsedSecs(startDate, new Date());
        showElapsedTimeInfo(eleId, elapsedSecs);
    };
    
    setInterval(f, 1000);
}

function wwLogMsg(msg) {
    if (true) return;
    try {
        console.log(msg);
    } catch (ex) {
    // no-op
    }
}

function setEleVisible(eleOrId, visible) {
    var ele = typeof eleOrId == 'string' ? document.getElementById(eleOrId) : eleOrId;
    if (ele == null) {
        return;
    }
    ele.style.display = visible ? "" : "none";
}


function updateToAuctionEndInfoPart(partEleId, delta, resolution) {
    var partVal = delta % resolution;
    partVal = partVal.toString();
    if (partVal.length < 2) {
        partVal = "0" + partVal;
    }
    document.getElementById(partEleId).innerHTML = partVal;
    return (delta - partVal) / resolution;
}

function updateToAuctionEndInfoSingle(auctionId) {
    if (isChangingPageStarted) {
        return;
    }
    var auctionRemainingSeconds = auctionRemainingTimes[auctionId];
    if (auctionRemainingSeconds == null) {
        return;
    }
    var d = new Date();
    var delta = auctionRemainingSeconds - Math.floor((d - auctionShowStartDate) / 1000);
    if (delta < 1) {
        reloadCurrentPage();
        return;
    }
    var eleIdPrefix = "sart_" + auctionId + "_";
    delta = updateToAuctionEndInfoPart(eleIdPrefix + "s", delta, 60);
    delta = updateToAuctionEndInfoPart(eleIdPrefix + "m", delta, 60);
    delta = updateToAuctionEndInfoPart(eleIdPrefix + "h", delta, 24);
    updateToAuctionEndInfoPart(eleIdPrefix + "d", delta, 10000000);
}

function updateToAuctionEndInfo() {
    for (var i = 0; i < priceFallInfoIds.length; i++) {
        updateToAuctionEndInfoSingle(priceFallInfoIds[i]);
    }

//    var d = new Date();
//    var delta = auctionRemainingSeconds - Math.floor((d - auctionShowStartDate) / 1000);
//    if (delta < 1) {
//        reloadCurrentPage();
//        return;
//    }
//    delta = updateToAuctionEndInfoPart("toAuctionEnd_Seconds", delta, 60);
//    delta = updateToAuctionEndInfoPart("toAuctionEnd_Minutes", delta, 60);
//    delta = updateToAuctionEndInfoPart("toAuctionEnd_Hours", delta, 24);
//    updateToAuctionEndInfoPart("toAuctionEnd_Days", delta, 10000000);
}

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(';');
    for(var i=0;i < ca.length;i++) {
        var 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 isStrEmptyOrWS(str) {
    if (str == null) {
        return true;
    }
    if (wezyrTrim(str) == '') {
        return true;
    }
    return false;
}

function markInvalidFormEleValueGD(ele, isBad) {
    var divEle = ele/*.parentNode*/;
    //addOrRemoveElementClass(divEle, "input_3", !isBad);
    addOrRemoveElementClass(divEle, "input_err", isBad);
}

function validateFormAFR(f){
    var anyBad = false;
    for (var i = 0; i < f.elements.length; i++) {
        var ele = f.elements[i];
        if (ele.type != 'submit') {
            var isBad = isStrEmptyOrWS(ele.value);
            if (isBad) {
            //alert('field ' + ele.name + ' is bad');
            }
            markInvalidFormEleValueGD(ele, isBad);
            anyBad = anyBad || isBad;
        }
    }

    //alert('is anything bad: ' + anyBad);
    return !anyBad;
}
