var req = false;
var page = "";
var divLoading;
var lnkClicked;

var eFocus;

/* -------------------------------------------------------------------------- */
/* Site Functions */
/* -------------------------------------------------------------------------- */

function searchComic() {
    var eSearchBy = document.getElementById("searchBy");
    var eKeyWord = document.getElementById("keyWord");

    if (eKeyWord.value.trim == '') {
        return;
    }

    sPage = "list.comic.php";
    sSearch = "searchBy=" + eSearchBy.selectedIndex + "&keyWord=" + eKeyWord.value.trim();
    hashListener.setHash(sPage + "?" + sSearch);
}

function newMessage() {
    var eForm = document.getElementById("frmMessage");
    var send = "action=new";

    var ret = isFormValid(eForm);
    if (ret == false) {
        return;
    }

    var eMessage = document.getElementById("messageContent");
    if (eMessage.value.trim() == '') {
        alert(eMessage.title);
        eMessage.focus();
        return;
    }
    ret += "&messageContent=" + eMessage.value.trim();

    send += ret;

    loadXMLDoc("message.add.php", openPage, "POST", send);
}

function selectAll() {
    var eCheck = document.getElementById('tblListComic').getElementsByTagName("input");
    for (i = 0; i < eCheck.length; i++) {
        if (eCheck[i].type == "checkbox" && !eCheck[i].disabled) {
            eCheck[i].checked = !eCheck[i].checked;
        }
    }
    lnkClicked.blur();
}

function purchaseAll() {
    var eCheck = document.getElementById('tblListComic').getElementsByTagName("input");
    //var eLink = document.getElementById('tblListComic').getElementsByTagName("a");
    for (i = 0; i < eCheck.length; i++) {
        if (eCheck[i].type == "checkbox" && eCheck[i].checked && !eCheck[i].disabled) {
            var ePurchase = getElementsByClassName("purchaseButton",eCheck[i].parentNode.parentNode)[0];
            ePurchase.innerHTML = '<div class="comicPurched">adicionado ao carrinho</div>';
            loadXMLDoc("basket.add.php?prodId=" + eCheck[i].value, function() { }, "GET", "");
            eCheck[i].disabled = true;
        }
    }
    lnkClicked.blur();
}

/* -------------------------------------------------------------------------- */
/* Cart Functions */
/* -------------------------------------------------------------------------- */

function addToCart(cid) {
    lnkClicked.innerHTML = 'aguarde...';
    loadXMLDoc("basket.add.php?prodId=" + cid, processAddToCart, "GET", "");

}

function processAddToCart() {
    if (req.readyState == 4) {
        if (req.status == 200) {
            var eCheck = lnkClicked.parentNode.parentNode.getElementsByTagName("input")[0];
            eCheck.disabled = true;
            lnkClicked.parentNode.innerHTML = '<div class="comicPurched">adicionado ao carrinho</div>';
        }
        else {
            lnkClicked.innerHTML = 'comprar';
        }
    }
}

function updateCart() {
    var eProdId = document.getElementsByName("prodId[]");
    var eProdCount = document.getElementsByName("prodCount[]");

    send = '';

    for (i = 0; i < eProdId.length; i++) {
        send += 'prodId[]=' + eProdId[i].value + '&prodCount[]=' + eProdCount[i].value + '&';
    }

    loadXMLDoc("basket.update.php", openPage, "POST", send);
}

/* -------------------------------------------------------------------------- */
/* User functions */
/*----------------------------------------------------------------------------*/

function doLogin() {
    var eMail = document.getElementById("userMail");
    if (eMail.value.trim() == '') {
        alert("Informe seu e-mail!");
        eMail.focus();
        return;
    }
    if (!checkMail(eMail)) {
        alert("O e-mail informado não é válido!");
        eMail.focus();
        eMail.select();
        return;
    }
    if (document.getElementById("newUser").checked) {
        var processMailExists = function() {
            if (req.readyState == 4 && req.status == 200) {
                if (req.responseText == "1") {
                    alert("O e-mail informado já está cadastrado!");
                    eMail.select();
                    eMail.focus();
                }
                else {
                    loadXMLDoc("user.account.new.php", openPage, "POST", "userMail=" + eMail.value.trim());
                }
            }
        };

        loadXMLDoc("user.mail.exists.php", processMailExists, "POST", "userMail=" + eMail.value.trim());
    }
    else {
        var ePass = document.getElementById("userPass");
        if (ePass.value.trim() == '') {
            alert("Informe sua senha!");
            ePass.focus();
            return;
        }
        var processUserExists = function() {
            if (req.readyState == 4) {
                if (req.status == 200) {
                    if (req.responseText == "1") {
                        loadXMLDoc("user.continue.php", openPage, "GET", "");
                    }
                    else {
                        alert("E-mail ou senha incorretos!\n\nVerifique e tente novamente.");
                        eMail.select();
                        eMail.focus();
                    }
                }
                else {
                    alert("Não foi possível se registrar no sistema!");
                }
            }
        };
        loadXMLDoc("user.exists.php", processUserExists, "POST", "userMail=" + eMail.value.trim() + "&userPass=" + ePass.value);
    }
}

function forgotPassword() {
    var eMail = document.getElementById("userMail");
    if (eMail.value.trim() == '') {
        alert("Informe seu e-mail!");
        eMail.focus();
        return;
    }
    if (!checkMail(eMail)) {
        alert("O e-mail informado não é válido!");
        eMail.focus();
        eMail.select();
        return;
    }
    
    var processMailExists = function() {
        if (req.readyState == 4 && req.status == 200) {
            if (req.responseText == "1") {
                var processForgot = function() {
                    if (req.readyState == 4 && req.status == 200) {
                        if (req.responseText == "true") {
                          alert("Foi enviado por e-mail, um link para você criar uma nova senha.");
                        }
                    }
                };


                loadXMLDoc("user.account.password.forgot.php", processForgot, "POST", "userMail=" + eMail.value.trim());
            }
            else {
                alert("O e-mail informado não está cadastrado!");
                eMail.select();
                eMail.focus();
            }
        }
    };

    loadXMLDoc("user.mail.exists.php", processMailExists, "POST", "userMail=" + eMail.value.trim());
}

function changePassword() {  
    var eMail = document.getElementById("userMail");
    if (eMail.value.trim() == '') {
        alert(eMail.title);
        eMail.focus();
        return;
    }
    if (!checkMail(eMail)) {
        alert("O e-mail informado não é válido!");
        eMail.focus();
        eMail.select();
        return;
    }
    
    var eUserPass = document.getElementById("userPass");
    if (eUserPass.value.trim() == '') {
        alert(eUserPass.title);
        eUserPass.focus();
        return;
    }
    if (eUserPass.value != document.getElementById("userPass2").value) {
        alert("A senha é diferente da informada no campo de confirmação.");
        eUserPass.focus();
        eUserPass.select();
        return;
    }

    ret = "&userMail=" + eMail.value.trim();
    ret += "&userPass=" + eUserPass.value.trim();
    ret += "&infoIndex=6&key=" + sSearch;
    
    var processMailExists = function() {
        if (req.readyState == 4 && req.status == 200) {
            if (req.responseText == "1") {
                var processUserUpdate = function() {
                    if (req.readyState == 4 && req.status == 200) {
                        if (req.responseText == "ok") {
                            alert("Nova senha criada com sucesso!");
                            goTo("user.account.php");
                        }
                        else {
                            alert(req.responseText);
                        }
                    }
                };

                loadXMLDoc("user.account.update.php", processUserUpdate, "POST", ret);
            }
            else {
                alert("O e-mail informado não está cadastrado!");
                eMail.select();
                eMail.focus();
            }
        }
    };

    loadXMLDoc("user.mail.exists.php", processMailExists, "POST", "userMail=" + eMail.value.trim());
}

function newUserAccount() {
    var eForm = document.getElementById("frmUserAccount");

    var ret = isFormValid(eForm);
    if (ret == false) {
        return;
    }

    var processMailExists = function() {
        if (req.readyState == 4 && req.status == 200) {
            if (req.responseText == "1") {
                alert("O e-mail informado já está cadastrado!");
            }
            else {
                loadXMLDoc("user.account.add.php", openPage, "POST", ret);
            }
        }
    };
    var eMail = document.getElementById("userMail");
    loadXMLDoc("user.mail.exists.php", processMailExists, "POST", "userMail=" + eMail.value.trim());
}

function updateUserAccount() {
    var eForm = document.getElementById("frmUserAccount");

    var ret = isFormValid(eForm);
    if (ret == false) {
        return;
    }


    var processUserUpdate = function() {
        if (req.readyState == 4 && req.status == 200) {
            if (req.responseText == "ok") {
                alert("Atualização realizada com sucesso!");
                goTo("user.account.php");
            }
        }
    };

    var infoIndex = document.getElementById("infoIndex").value;

    if (infoIndex == "5") {
        var eUserPass = document.getElementById("userPass");
        if (eUserPass.value != document.getElementById("userPass2").value) {
            alert("A senha é diferente da informada no campo de confirmação.");
            eUserPass.focus();
            eUserPass.select();
            return;
        }
    }
    else if (infoIndex == "4") {
        var eMail = document.getElementById("userMail");

        var processMailExists = function() {
            if (req.readyState == 4 && req.status == 200) {
                if (req.responseText == "1") {
                    alert("O e-mail informado já está cadastrado!");
                    eMail.select();
                    eMail.focus();
                }
                else {
                    loadXMLDoc("user.account.update.php", processUserUpdate, "POST", ret);
                }
            }
        };

        loadXMLDoc("user.mail.exists.php", processMailExists, "POST", "userMail=" + eMail.value.trim());

        return;
    }

    loadXMLDoc("user.account.update.php", processUserUpdate, "POST", ret);
}

function sendOrder() {
    var payment = "";

    var pt = document.getElementsByName("paymentType");
    for (var i = 0; i < pt.length; i++) {
        if (pt[i].checked) {
            payment = pt[i].value;
        }
    }
    //var payment = document.getElementById("paymentType").value;
    var freight = document.getElementById("freight").value;
    var addressDeliverTo = document.getElementById("addressDeliverTo").value.urlEncode();
    var addressStreet = document.getElementById("addressStreet").value.urlEncode();
    var addressNumber = document.getElementById("addressNumber").value.urlEncode();
    var addressComplement = document.getElementById("addressComplement").value.urlEncode();
    var addressQuarter = document.getElementById("addressQuarter").value.urlEncode();
    var addressZipCode = document.getElementById("addressZipCode").value.urlEncode();
    var addressCity = document.getElementById("addressCity").value.urlEncode();
    var addressState = document.getElementById("addressState").value.urlEncode();

    var send = "pid=" + payment +
               "&freight=" + freight +
               "&addressDeliverTo=" + addressDeliverTo +
               "&addressStreet=" + addressStreet +
               "&addressNumber=" + addressNumber +
               "&addressComplement=" + addressComplement +
               "&addressQuarter=" + addressQuarter +
               "&addressZipCode=" + addressZipCode +
               "&addressCity=" + addressCity +
               "&addressState=" + addressState;


    //loadXMLDoc("order.add.php", openPage, "POST", "pid=" + payment + "&freight=" + freight);
    loadXMLDoc("order.add.php", openPage, "POST", send);
}

function openOrderDetails() {
    var eOrders = document.getElementById("orders");
    var orderId = eOrders.options[eOrders.selectedIndex].value;
    goTo("order.details.php?id=" + orderId);
}

/* -------------------------------------------------------------------------- */
/* Util Functions */
/* -------------------------------------------------------------------------- */

function getScrollXY() {
    var scrOfX = 0, scrOfY = 0;
    if( typeof( window.pageYOffset ) == 'number' ) {
        //Netscape compliant
        scrOfY = window.pageYOffset;
        scrOfX = window.pageXOffset;
    } else if( document.body && ( document.body.scrollLeft || document.body.scrollTop ) ) {
        //DOM compliant
        scrOfY = document.body.scrollTop;
        scrOfX = document.body.scrollLeft;
    } else if( document.documentElement && ( document.documentElement.scrollLeft || document.documentElement.scrollTop ) ) {
        //IE6 standards compliant mode
        scrOfY = document.documentElement.scrollTop;
        scrOfX = document.documentElement.scrollLeft;
    }
    return [ scrOfX, scrOfY ];
}

function getElementsByClassName(classname, node) {
    if(!node) node = document.getElementsByTagName("body")[0];
    var a = [];
    var re = new RegExp('\\b' + classname + '\\b');
    var els = node.getElementsByTagName("*");
    for(var i=0,j=els.length; i<j; i++) {
        if(re.test(els[i].className)) {
            a.push(els[i]);
        }
    }
    return a;
}

/* -------------------------------------------------------------------------- */
/* Navigation Functions */
/* -------------------------------------------------------------------------- */

function updateLinks(obj) {
    var lnk = obj.getElementsByTagName("a");
    for (i = 0; i < lnk.length; i++) {
        if (lnk[i].target != '' || lnk[i].href.indexOf("javascript") == 0) {
            lnk[i].onclick = function() {
                lnkClicked = this;
                return true;
            };
            continue;
        }


        lnk[i].href = "javascript:goTo('" + lnk[i].href + "')";
        lnk[i].onfocus = function() {
            eFocus = this;
        };
    }
}

function goTo(url) {
    sPage = url.substring(url.lastIndexOf('/') + 1);
    sHash = sPage;
    sSearch = "";
    var iSearchPos = url.lastIndexOf('?');
    if (iSearchPos > -1) {
        sPage = url.substring(url.lastIndexOf('/') + 1,iSearchPos);
        sSearch = url.substring(iSearchPos + 1);
    }
    hashListener.setHash(sHash);
    try {
        eFocus.blur();
    }
    catch(e) { }
}


function loadXMLDoc(url,processReqChange,sendMethod,sendContent) {
    req = false;
    if (!req) {
        // branch for native XMLHttpRequest object
        if(window.XMLHttpRequest && !(window.ActiveXObject)) {
            try {
                req = new XMLHttpRequest();
            } catch(e) {
                req = false;
            }
        // branch for IE/Windows ActiveX version
        } else if(window.ActiveXObject) {
            try {
                req = new ActiveXObject("Msxml2.XMLHTTP");
            } catch(e) {
                try {
                    req = new ActiveXObject("Microsoft.XMLHTTP");
                } catch(e) {
                    req = false;
                }
            }
        }
    }
    if(req) {
        req.onreadystatechange = processReqChange;
        req.open(sendMethod, url, true);
        req.setRequestHeader("Content-Type", "application/x-www-form-urlencoded; charset=iso-8859-1");
        req.send(sendContent);
    }
}

function openPage() {
    // only if req shows "loaded"
    if (req.readyState == 4) {
        divLoading.style.display = "none";
        // only if "OK"
        if (req.status == 200) {
            objContent = document.getElementById("dvContent");
            objContent.innerHTML = req.responseText;
            updateLinks(objContent);
            if (document.getElementById("frmLogin") != undefined) {
                document.getElementById("userMail").focus();
                document.getElementById("userMail").select();
            }
            else if (document.getElementById("frmUserAccount") != undefined && document.getElementById("userName") != undefined) {
                document.getElementById("userName").focus();
                document.getElementById("userName").select();
            }
            else if (document.getElementById("fromName") != undefined) {
                document.getElementById("fromName").focus();
                document.getElementById("fromName").select();
            }
            window.scrollTo(0,0);
        }
        else {
            alert("There was a problem retrieving the XML data:\n" +
                req.statusText);
        }
    }
}

function __hashChanged() {
    divLoading.style.display = "block";
    divLoading.style.top = (getScrollXY()[1] + 8) + "px";

    var hashPage = window.location.hash.replace('#','');
    if (hashPage != '') {
        hashPage += window.location.search;
    }
    else {
        hashPage = sPage;
    }

    loadXMLDoc(hashPage,openPage,"GET",sSearch);

    var _class = document.all ? "className" : "class";

    document.getElementById("lnkMenu02A").parentNode.setAttribute(_class,"homeLink");
    document.getElementById("lnkMenu02B").parentNode.setAttribute(_class,"");
    document.getElementById("lnkMenu02C").parentNode.setAttribute(_class,"");
    document.getElementById("lnkMenu02D").parentNode.setAttribute(_class,"");
    document.getElementById("lnkMenu02E").parentNode.setAttribute(_class,"");
    document.getElementById("lnkMenu02F").parentNode.setAttribute(_class,"");
   /* document.getElementById("lnkMenu02G").parentNode.setAttribute(_class,"");*/

    var lnk = "";

    if (hashPage.indexOf("home.php") > -1) {
        lnk="lnkMenu02A";
    }
    else if (hashPage.indexOf("list.publisher.php") > -1) {
        lnk="lnkMenu02B";
    }
    else if (hashPage.indexOf("list.universe.php") > -1) {
        lnk="lnkMenu02C";
    }
    else if (hashPage.indexOf("list.author.php") > -1) {
        lnk="lnkMenu02D";
    }
    else if (hashPage.indexOf("list.illustrator.php") > -1) {
        lnk="lnkMenu02E";
    }
    else if (hashPage.indexOf("list.comic.php?isn=1") > -1) {
        lnk="lnkMenu02F";
    }
   /* else if (hashPage.indexOf("list.comic.php?isnp=1") > -1) {
        lnk="lnkMenu02G";
    }*/

    if (lnk != "") {
        document.getElementById(lnk).parentNode.setAttribute(_class,"selLink");
    }
}


function main() {
    updateLinks(document);
    divLoading = document.getElementById("dvLoading");

    __hashChanged();

    hashListener.init();

    hashListener.onHashChanged = __hashChanged;
}

onscroll = function() {
    divLoading.style.top = (getScrollXY()[1] + 8) + "px";
}


onload = main;

/* -------------------------------------------------------------------------- */
/* String Prototype Functions */
/* -------------------------------------------------------------------------- */

String.prototype.trim = function() {
    return this.replace(/^\s*|\s*$/, "");
}

String.prototype.lpad = function(pSize, pCharPad) {
    var str = this;
    var dif = pSize - str.length;
    var ch = String(pCharPad).charAt(0);
    for (; dif>0; dif--) str = ch + str;
    return (str);
}

String.prototype.urlEncode = function () {
    return escape(this).replace(/\+/g, '%2B').replace(/\"/g,'%22').replace(/\'/g, '%27').replace(/\//g,'%2F');
}

/* -------------------------------------------------------------------------- */
/* Form Functions */
/* -------------------------------------------------------------------------- */

function isFormValid(eForm) {
    var send = "";

    for (i = 0; i < eForm.elements.length; i++) {
        var elemen = eForm.elements[i];

        var eValue = elemen.value;
        if (eValue == undefined) {
            eValue = elemen.options[elemen.selectedIndex].value;
        }

        send += "&" + elemen.name + "=" + eValue.urlEncode();

        switch (elemen.accept) {
            case "text":
                if (elemen.value.trim() == '') {
                    alert(elemen.title);
                    elemen.focus();
                    return false;
                }
                break;
            case "number":
                if (elemen.value.trim() == '' || isNaN(elemen.value.trim())) {
                    alert(elemen.title);
                    elemen.focus();
                    return false;
                }
                break;
         //   case "date":
          //      if (elemen.value.trim() == '') {
            //        alert(elemen.title);
            //        elemen.focus();
             //       return false;
             //   }
             //   break;
            case "mail":
                if (elemen.value.trim() == '') {
                    alert(elemen.title);
                    elemen.focus();
                    return false;
                }
                if (!checkMail(elemen)) {
                    alert(elemen.title);
                    elemen.focus();
                    elemen.select();
                    return false;
                }
                break;
           // case "cpf":
              //  if (elemen.value.trim() == '') {
                //    alert(elemen.title);
                 //   elemen.focus();
                  //  return false;
             //   }

                if (!isValidCPF(elemen.value.trim())) {
                    alert("O CPF informado é inválido.");
                    elemen.select();
                    elemen.focus();
                    return false;
                }

                break;
            case "zipcode":
                if (elemen.value.trim() == '' || elemen.value.trim().length != 8) {
                    alert(elemen.title);
                    elemen.focus();
                    return false;
                }
                break;
        }
    }
    return send;
}

function IsDate(day, month, year) {
    var date = new Date();
    var blnRet = false;
    var blnDay;
    var blnMonth;
    var blnYear;

    date.setFullYear(year, month -1, day);

    blnDay   = (date.getDate()  == day);
    blnMonth = (date.getMonth() == month -1);
    blnYear  = (date.getYear()  == year);

    if (blnDay && blnMonth && blnYear)
        blnRet = true;

    return blnRet;
}


function isNumberKey(evt) {
    var charCode = (evt.which) ? evt.which : event.keyCode;
    if (charCode > 31 && (charCode < 48 || charCode > 57)) {
        return false;
    }
    return true;
}

function formatDouble(obj) {
    v = obj.value.replace(/[.]/g, "");
    v = Number(v);
    v = v.toString().lpad(3, "0");
    reg = /(\d)(\d{2})$/;
    v = v.replace(reg, "$1.$2");
    obj.value = v;
}

function formatDate(obj) {
    v = obj.value.replace(/[\/]/g, "");
    if (v.length > 8) {
        pos = v.length - 8;
        v = v.substr(pos);
    }
    v = Number(v);
    v = v.toString().lpad(8, "0");
    reg = /(\d{2})(\d{2})(\d{4})$/;
    v = v.replace(reg, "$1/$2/$3");
    obj.value = v;
}

function formatHour(obj) {
    v = obj.value.replace(/[:]/g, "");
    if (v.length > 4) {
        pos = v.length - 4;
        v = v.substr(pos);
    }
    v = Number(v);
    v = v.toString().lpad(4, "0");
    reg = /(\d{2})(\d{2})$/;
    v = v.replace(reg, "$1:$2");
    obj.value = v;
}

function isValidCPF(cpf){
    var i = 0;

    if (cpf.length != 11 || cpf == "00000000000" || cpf == "11111111111" ||
        cpf == "22222222222" || cpf == "33333333333" || cpf == "44444444444" ||
        cpf == "55555555555" || cpf == "66666666666" || cpf == "77777777777" ||
        cpf == "88888888888" || cpf == "99999999999") {

        return false;
    }

    soma = 0;
    for (i = 0; i < 9; i++) {
        soma += parseInt(cpf.charAt(i)) * (10 - i);
    }
    resto = 11 - (soma % 11);
    if (resto == 10 || resto == 11) {
        resto = 0;
    }
    if (resto != parseInt(cpf.charAt(9))) {
        return false;
    }
    soma = 0;
    for (i = 0; i < 10; i ++) {
        soma += parseInt(cpf.charAt(i)) * (11 - i);
    }
    resto = 11 - (soma % 11);
    if (resto == 10 || resto == 11) {
        resto = 0;
    }
    if (resto != parseInt(cpf.charAt(10))){
        return false;
    }
    return true;
}

function checkMail(mail){
    var er = new RegExp(/^[A-Za-z0-9_\-\.]+@[A-Za-z0-9_\-\.]{2,}\.[A-Za-z0-9]{2,}(\.[A-Za-z0-9])?/);
    if (typeof(mail) == "string") {
        if (er.test(mail)) {
            return true;
        }
    }
    else if (typeof(mail) == "object") {
        if (er.test(mail.value)) {
            return true;
        }
    }
    return false;
}
