// -----------------------------------------------------------------------------------
//	Form Validation v1.1
//	by MrkEw NET
//  using Prototype Framework www.prototypejs.org
// -----------------------------------------------------------------------------------

var FormValidation = {
    rClass:"",
    vClassPrefix:"",
    errorsMsg:"",
    rc:null,
    setup:function(rClass, vClassPrefix, errorsMsg) {
        this.rClass=rClass;
        this.vClassPrefix=vClassPrefix;
        this.errorsMsg=errorsMsg;
        this.rc=new RegExp(rClass, "g");
    },
    validate:function(formId){
        var form = $(formId);
        if (form==null)
            return;

        var validEl = new Array();
        var validType = new Array();
        var req = new Array();
        var elName = new Array(), label = new Array();
        var elType = new Array("input", "textarea");
        var t = new String();

        for (var j=0; j<elType.length; j++) {

            var col = form.getElementsByTagName(elType[j]);
            for (var i=0; i<col.length; i++) {

                var rv=new RegExp(this.vClassPrefix+"_([a-z_]+)", "g");

                if (col[i].className.match(rv)!=null) {
                    validEl[ validEl.length ] = col[i];
                    var t = new String(col[i].className.match(rv));
                    validType [ validType.length ] = t.substr(t.indexOf("_")+1);
                    req[ req.length] = col[i].className.match(this.rc)!=null;
                }
            }

        }

        col = form.getElementsByTagName("label");
        for (var i=0; i<col.length; i++) {
            for (var j=0; j<validEl.length; j++) {
                if (col[i].htmlFor==validEl[j].id) {
                    elName[j] = col[i].innerHTML.replace(/:/g, "");
                    label[j] = col[i];
                }
            }
        }

        var error = new Array();
        var elArr = new Array();
        var elChecked = new Object();;
        for (var i=0; i<validEl.length; i++) {

            if (validEl[i].disabled)
                continue;

            var v = validEl[i].value;

            if (validType[i]=="empty" && v=="")
                error[ error.length ] = this.makeError("empty", elName[i],validEl[i],label[i]);

            else if (validType[i]=="numeric" && this.vNumeric(v,i,req[i]))
                error[ error.length ] = this.makeError("numeric", elName[i],validEl[i],label[i]);

            else if (validType[i]=="integer" && this.vInteger(v,i,req[i]))
                error[ error.length ] = this.makeError("integer", elName[i],validEl[i]);

            else if (validType[i]=="date" && this.vDate(v,i,req[i]))
                error[ error.length ] = this.makeError("date", elName[i],validEl[i],label[i]);

            else if (validType[i]=="email" && this.vEmail(v,i,req[i]))
                error[ error.length ] = this.makeError("email", elName[i],validEl[i],label[i]);

            else if (validType[i]=="empty_array") {
                elArr[elArr.length]=validEl[i];
            }
            else if (validType[i]=="checked") {
                if (elChecked[validEl[i].name]==null) {
                    elChecked[validEl[i].name] = new Array();
                    elChecked[validEl[i].name+"_label"] = new Array();
                }
                elChecked[validEl[i].name].push(validEl[i]);
                elChecked[validEl[i].name+"_label"].push(elName[i]);


            }

        }

        if (elArr.length>0) {
            var er=false;
            for (var i=0;i<elArr.length;i++) {
                if (elArr[i].checked) {
                    er=true;
                    break;
                }
            }
            if (!er)
                error[ error.length ] = this.makeError("empty_array","",null,null);

        }

        for (var key in elChecked) {
            if (key.indexOf("label")==-1) {
                var er=false;
                for (var i=0; i<elChecked[key].length; i++) {
                    if (elChecked[key][i].checked) {
                        er=true;
                        break;
                    }
                }

                if (!er)
                    error[ error.length ] = this.makeError("checked","",null,null,elChecked[key+"_label"].toString(", "));
            }
        }

        if (error.length>0) {
            var col=form.getElementsByTagName("button");
            for (var i=0; i<col.length;i++)
                col[i].blur();
        }

        return error;
    },
    vNumeric:function(v, i, req) {
        return ((req && v=="") || (v!="" && v.match(/^[\-]*\d+(\.\d+)*$/)==null));
    },
    vInteger:function(v, i, req) {
        return ((req && v=="") || (v!="" && v.match(/^[\-]*\d+$/)==null));
    },
    vEmail:function(v, i, req) {
        return ((req || v!="") && !v.match(/^[-_\.a-zA-Z0-9]+@[-a-zA-Z0-9.]+\.[a-zA-Z]{2,4}$/g));
    },
    vDate:function(v, i, req) {
        return ((req || v!="") && Calendar.encode(v)==null);
    },
    makeError:function(key, field, el, lbl, suffixText) {
        return {item:field,error:this.errorsMsg[key],elem:el,label:lbl,suffix:suffixText};
    }
};

var ValidateForm = Class.create();
ValidateForm.prototype = {
    formClass:"validate",
    initialize: function() {
        var fc=new RegExp(this.formClass, "g");
        var f=$$("body")[0].getElementsByTagName("form");

        for (i=0;i<f.length;i++) {
            if (f[i].className.match(fc)!=null)
                Event.observe(f[i], "submit", (function(event) { this.validate(event); }).bind(this) );
        }
    },
    validate: function(event) {
        var f=Event.element(event);
        $$("#"+f.id+" label").each(function(node){node.removeClassName("red")});
        var error = FormValidation.validate(f.id);
        if (error.length>0) {
            Array.from(error).each(function(er){ if (er.label!=null) $(er.label).addClassName("red"); });
            event.stop();
            var p = new ErrorPopUp(FormValidation.errorsMsg, error);
            return false;
        }
        return true;
    }
};

// -----------------------------------------------------------------------------------

var PopUp = Class.create();
PopUp.prototype = {
    message:null,
    content:null,
    hasOverlay:true,
    initialize:function(messages, content){
        this.message=messages;
        this.setContent(content);
    },
    setMessages:function(message){
        this.message = message;
    },
    open:function() {

        this.removeNode();

        // creates structure
        var objBody = $$("body")[0];

        if (this.hasOverlay) {
            objBody.appendChild(Builder.node("div",{id:"ppoverlay"}));
            $("ppoverlay").setStyle({display:"none"});
        }

        var innerEl = (this.message["mainText"]!=null) ? new Array(Builder.node("p", this.message["mainText"]), this.content) : this.content;
        objBody.appendChild( Builder.node("div",{id:"popup"}, [
            Builder.node("h3", this.message["title"]),
            Builder.node("div", innerEl),
            Builder.node("div", {id:"close"}, [
                Builder.node("a", {id:"popupclose",href:"#", title:this.message["closeTitle"]}, this.message["closeTitle"])
            ])
        ]));

        if (this.message["popClass"])
            $("popup").addClassName(this.message["popClass"]);

        $("popup").setStyle({display:"none"});

        $$("select", "object", "embed").each(function(node){ node.style.visibility = "hidden" });

        var pageSize = this.getPageSize();
        if (this.hasOverlay) {
            $("ppoverlay").setStyle({width:pageSize[0]+"px",height:pageSize[1]+"px" });
            new Effect.Appear("ppoverlay", { duration: 0.2, from: 0.0, to: 0.3, queue:"end" });
        }

        var pos = this.getPosition(pageSize);
        $("popup").setStyle({ top: pos[1] + "px", left: pos[0] + "px" });

        new Effect.Appear("popup", { duration: 0.05, queue:"end"  });

        $("popupclose").observe("click", (function(event) { event.stop(); this.close();} ).bind(this) );

        /* this.interval = self.setInterval((this.center).bind(this), 1000);*/
        setTimeout((this.center).bind(this), 100);
    },
    getPosition:function(pageSize) {
        var pageScr = document.viewport.getScrollOffsets();
        return [parseInt(pageScr[0] + pageSize[0]/2 - $("popup").getWidth()/2), parseInt(pageScr[1] + (document.viewport.getHeight() / 10))];
    },
    setContent:function(c) {
        this.content=Builder.node("div", [c]);
    },
    setContentText:function(t) {
        this.content=Builder.node("div", t);
    },
    close:function() {
        //self.clearInterval(this.interval);
        $$("select", "object", "embed").each(function(node){ node.style.visibility = "visible" });
        this.removeNode();
    },
    removeNode:function() {
        var p=$("popup"), ov=$("ppoverlay");
        if (p!=null)
            p.parentNode.removeChild(p);
        if (ov!=null && this.hasOverlay)
            ov.parentNode.removeChild(ov);
    },
    center:function() {
        var pageSize = this.getPageSize();
        var pageScr = document.viewport.getScrollOffsets();
        new Effect.Move($("popup"), {x:(parseInt(pageScr[0] + pageSize[0]/2 - $("popup").getWidth()/2)), y: (pageScr[1] + (document.viewport.getHeight() / 10)), mode:"absolute",queue:"end",duration:0.2 });
    },
    getPageSize: function() {

         var xScroll, yScroll;

        if (window.innerHeight && window.scrollMaxY) {
            xScroll = window.innerWidth + window.scrollMaxX;
            yScroll = window.innerHeight + window.scrollMaxY;
        } else if (document.body.scrollHeight > document.body.offsetHeight){
            xScroll = document.body.scrollWidth;
            yScroll = document.body.scrollHeight;
        } else {
            xScroll = document.body.offsetWidth;
            yScroll = document.body.offsetHeight;
        }

        var windowWidth, windowHeight;

        if (self.innerHeight) {
            if(document.documentElement.clientWidth){
                windowWidth = document.documentElement.clientWidth;
            } else {
                windowWidth = self.innerWidth;
            }
            windowHeight = self.innerHeight;
        } else if (document.documentElement && document.documentElement.clientHeight) {
            windowWidth = document.documentElement.clientWidth;
            windowHeight = document.documentElement.clientHeight;
        } else if (document.body) {
            windowWidth = document.body.clientWidth;
            windowHeight = document.body.clientHeight;
        }

        // for small pages with total height less then height of the viewport
        if(yScroll < windowHeight){
            pageHeight = windowHeight;
        } else {
            pageHeight = yScroll;
        }

        // for small pages with total width less then width of the viewport
        if(xScroll < windowWidth){
            pageWidth = xScroll;
        } else {
            pageWidth = windowWidth;
        }

        return [pageWidth,pageHeight];
    },
    highlite:function(el) {
        if (el.inp==null)
            return;
        $(el.inp).setStyle({"backgroundColor": (!el.inp.hl ? "yellow" : "white")});
        el.inp.hl=!el.inp.hl;
    }
};

var ErrorPopUp = function(messages, content){
    this.message=messages;
    this.setContent(content);
    this.open();
};
ErrorPopUp.prototype = new PopUp;
ErrorPopUp.prototype.constructor=ErrorPopUp;
ErrorPopUp.prototype.setContent=function(error) {
    this.content=Builder.node("ul");
    this.content.className="errors";
    for(var i=0; i<error.length; i++) {
        var li=Builder.node("li");
        li.className="error";
        if (error[i]["item"]!="") {
            li.appendChild( Builder.node("b", error[i]["item"]) );
        }

        li.appendChild(Builder._text(" "+error[i]["error"]));
        if (error[i]["suffix"]!=null && error[i]["suffix"]!="")
            li.appendChild(Builder._text(" "+error[i]["suffix"]));

        this.content.appendChild(li);

        if (error[i]["elem"]!=null) {
            li.inp = error[i]["elem"];
            li.inp.hl = false;
            $(li).observe("mouseover", (function(event) { this.highlite(Event.element(event)); }).bind(this) );
            $(li).observe("mouseout", (function(event) { this.highlite(Event.element(event)); }).bind(this) );
        }
    }
};

var InfoPopUp = function(messages, item, itemID){
    this.message=messages;
    this.itemID=itemID;
    this.setContent(item);
    this.open();
};
InfoPopUp.prototype = new PopUp;
InfoPopUp.prototype.constructor=InfoPopUp;
InfoPopUp.prototype.setContent=function(item) {
    this.content=Builder.node("ul", {className:"info"});
    for(var i=0; i<item.length; i++) {
        var li = Builder.node("b",item[i]["item"]);
        this.content.appendChild( Builder.node("li", li));
        li.inp=$(this.itemID+item[i]["nr"]);
        if (li.inp!=null) {
            li.inp.hl = false;
            $(li).observe("mouseover", (function(event) { this.highlite(Event.element(event)); }).bind(this) );
            $(li).observe("mouseout", (function(event) { this.highlite(Event.element(event)); }).bind(this) );
        }
    }
};

var NoticePopUp = function(messages, content){
    this.hasOverlay=false;
    this.message=messages;
    this.setContent(content);
    this.open();
};
NoticePopUp.prototype = new PopUp;
NoticePopUp.prototype.constructor=NoticePopUp;
NoticePopUp.prototype.getPosition=function(pageSize) {
    var pageScr = document.viewport.getScrollOffsets();
    return [parseInt(pageScr[0] + pageSize[0]/2 - $("popup").getWidth()/2),pageScr[1] + pageSize[1]/2 - $("popup").getHeight()]; //parseInt(pageScr[1] + 5)];
};
NoticePopUp.prototype.setContent=function(item) {
    this.content=Builder.node("ul", {className:"notice"});
    for(var i=0; i<item.length; i++)
        this.content.appendChild( Builder.node("li", item[i]) );
};
NoticePopUp.prototype.open=function() {
    PopUp.prototype.open.call(this);
    var NP = this;
    self.setTimeout(function() { new Effect.Fade("popup", { afterFinish: function() { PopUp.prototype.close.call(NP); } } )}, 3000);
};

AjaxInfoPopUp = function(messages, contentURI) {
    var pp = this;
    pp.message=messages;
    new Ajax.Request(contentURI, {
        onSuccess: function(res)  {
            if (res.responseText=="")
                return;
            var c = Builder.node("div");
            c.innerHTML = res.responseText;
            pp.setContent(c);
            pp.open();
        }
    });
}
AjaxInfoPopUp.prototype = new PopUp;
AjaxInfoPopUp.prototype.constructor=AjaxInfoPopUp;


