/**
 *Form functions
 *
 *AUthor Sven Mandera
 */

function loadDiv(form,params,target){
    req.open('get', "http://"+location.host+"/com.hme.web.new-war/"+form+"?"+params,false);
    req.send(null);
    var user= req.responseText;
    if (user != null){
        $(target).innerHTML = user;
    }
}
function userLogin(userName,password){
       req = createXMLHttpRequest();
    req.open('get', "http://"+location.host+"/com.hme.web.new-war/RequestProvider?action=loginUser&username="+userName+"&password="+password,false);
    req.send(null);
    var loggedIn= req.responseText;
    return (loggedIn =='true');
}


function openSicherungDialog(bookingId,vid){

   req = createXMLHttpRequest();
    req.open('get', "http://"+location.host+"/com.hme.web.new-war/sicherungsschein.jsp?bookingId="+bookingId+"&vid="+vid,false);
    req.send(null);
    var loginForm= req.responseText;
    openDialog('loginDiv', loginForm, 500, 125, null,false);
}

function openLoginDialog(button){
    
   req = createXMLHttpRequest();
    req.open('get', "http://"+location.host+"/com.hme.web.new-war/loginForm.jsp",false);
    req.send(null);
    var loginForm= req.responseText;
    openDialog('loginDiv', loginForm, 400, 250, button,true);
}

function openPasswortDialog(button){

   req = createXMLHttpRequest();
    req.open('get', "http://"+location.host+"/com.hme.web.new-war/changePasswort.jsp",false);
    req.send(null);
    var loginForm= req.responseText;
    openDialog('loginPasswordDiv', loginForm, 400, 330, button,true);
}
function changeLoginPassword(){
    req = createXMLHttpRequest();
    req.open('get', "http://"+location.host+"/com.hme.web.new-war/RequestProvider?action=loginUserChangePassword&oldPasswort="+document.getElementById("customerOldPasswort").value+"&newPasswort="+document.getElementById("customerNewPasswort").value,false);
    req.send(null);
    var login= req.responseText;
    if (login == 'changed'){
     
        if (document.getElementById('loginPasswordDiv')){
            document.getElementById('loginPasswordDiv').style.display='none';
        }
    }
    else {
        $('loginPasswordDiv').innerHTML = login;
    }
}
function checkLoginForm(){
 
 req = createXMLHttpRequest();
    req.open('get', "http://"+location.host+"/com.hme.web.new-war/RequestProvider?action=loginUser&customerNumber="+document.getElementById("customerNumber").value+"&customerPasswort="+document.getElementById("customerPasswort").value,false);
    req.send(null);
    var login= req.responseText;
    if (login == 'loginok'){
        syncRequest('navigationDiv', "http://"+location.host+"/com.hme.web.new-war/indexNavigation.jsp");
        if (document.getElementById('customerid')){
            getDataCustomer(true);
        }
        if (document.getElementById('loginDiv')){
            document.getElementById('loginDiv').style.display='none';
        }
    }
    else {
        $('loginDiv').innerHTML = login;
    }
}

function showBilling(id){
    
    window.open("http://"+document.location.host+"/com.hme.web.new-war/RequestProvider?action=showBilling&bid="+id,"Rechnung");
}
function showPartnerBilling(id){

    window.open("http://"+document.location.host+"/com.hme.web.new-war/RequestProvider?action=showPartnerBilling&id="+id,"Rechnung");
}

function resendBilling(id){
    syncRequest(null, "http://"+document.location.host+"/com.hme.web.new-war/RequestProvider?action=resendBilling&bid="+id);
    alert("ok");
   // window.open("http://"+document.location.host+"/com.hme.web.new-war/RequestProvider?action=resendBilling&bid="+id,"Rechnung");
}
function recreateBilling(id){
    syncRequest(null, "http://"+document.location.host+"/com.hme.web.new-war/RequestProvider?action=recreateBilling&bid="+id);
    alert("ok");
   // window.open("http://"+document.location.host+"/com.hme.web.new-war/RequestProvider?action=resendBilling&bid="+id,"Rechnung");
}



function submitDiv(divId,target,param){
    var div = $(divId);
    var url = "action=submit&target="+target;
    if (param){
        url += "&"+param;
    }
    var elements= div.getElementsByTagName("*");
    for (var i = 0; i < elements.length;i++){
        if (elements[i].name){
             if (elements[i].localName == 'TEXTAREA'){
                 if (CKEDITOR.instances[elements[i].name]){
                     url += "&"+elements[i].name+"="+encodeURI(CKEDITOR.instances[elements[i].name].getData());
                 }

             }
           else if (elements[i].localName == 'INPUT'){
                if (elements[i].type=='checkbox' || elements[i].type=='check'){
                    url += "&"+elements[i].name+"="+elements[i].checked;
                }
                else {
                    url += "&"+elements[i].name+"="+elements[i].value;
                }
            // alert("input");
            }
         else   if (elements[i].localName == 'SELECT'){
                url += "&"+elements[i].name+"="+elements[i].value;
            //alert("select");
            }
        }
    }

    req = createXMLHttpRequest();

    req.open("POST", 'http://'+location.host+'/com.hme.web.new-war/RequestProvider', true);
         req.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded;charset=utf-8;');
 req.setRequestHeader('Content-Length', url.length);
    //req.open('get', "http://"+location.host+"/com.hme.web.new-war/RequestProvider?"+url,false);
    req.send(url);
   
//alert(url);
}

function appendStylePrefix(styleAttribute,element){
    var newName = "_"+styleAttribute;
    var cla = element.className;

    element.className = cla+newName;
}
function openPaymentBox(va){

    $(va).style.display='block';
}
function xmlSoap(functionName,args,callbackfunction,message){
    
    var arg = new Object();
    for (var i=0; i< args.length;i++){
        arg["arg"+i]=args[i];
    }
    
    var xml = "<?xml version= \"1.0\" encoding=\"utf-8\"?>";
    xml += "<root>"+objectToXML(arg)+"</root>";
    return sendXMLRequest(functionName, xml,callbackfunction,message);
 
}
function sendXMLRequest(functionName,xml,callbackfunction,message) { 
    if (message){
        openLoadingScreen(message, true);
    }
    req.open('post', "http://"+location.host+"/com.hme.web.new-war/RequestProvider?action="+functionName+"&xml="+encodeURIComponent(xml),false); 
    if (callbackfunction){
        req.onreadystatechange= callbackfunction;
    }else 
        req.onreadystatechange =null;
    req.send(null); 
    if (!callbackfunction){
        var obj = new Array();
        if ( req.responseXML){
            for (var i = 0; i< req.responseXML.childNodes[0].childNodes.length;i++){
                obj[obj.length] =xmlToObject(req.responseXML.childNodes[0].childNodes[i]);
            }
        }
        return obj;
    }
} 

function xmlToObject(xml){
    var obj = new Object();
    for (var i = 0; i< xml.childNodes.length;i++){
        var type = xml.childNodes[i].getAttribute("type");
        var nodeName = xml.childNodes[i].nodeName.substring(0,1).toLowerCase()+xml.childNodes[i].nodeName.substring(1);
        if (type == 'array'){
            obj[nodeName] = new Array();
            for (var j = 0;j< xml.childNodes[i].childNodes.length;j++){
                obj[nodeName][j]=xmlToObject(xml.childNodes[i].childNodes[j])
            }
        }
        else if (type == 'object'){
            obj[nodeName] = xmlToObject( xml.childNodes[i]);
        }
        else {
            obj[nodeName] =xml.childNodes[i].childNodes[0].nodeValue;
        }
    }
    return obj;
}


function objectToXML(object){
    var xml = "";
    for(var n in object) {
        if (object[n] instanceof Array){
            for (var i =0; i < object[n].length;i++){
                var newObject =object[n][i];
                xml += "<"+n+" type='array'>"+objectToXML(newObject)+"</"+n+">";
            }
        }
        else if (object[n] instanceof Object){
            var newObject = object[n];
          
            xml += "<"+n+" type='object'>"+objectToXML(newObject)+"</"+n+">";
        }
        else {
            xml += "<"+n+" type='value'>"+object[n]+"</"+n+">";
        }
    }
    return xml;
}

function syncSoap(functionName,args){
    var pl = new SOAPClientParameters();
    pl = new SOAPClientParameters();
    for (var i =0; i < args.length;i++){
        pl.add("arg"+i,args[i]);
    }
   
    return SOAPClient.invoke(url, functionName, pl, false, null);
}
function asyncSoap(functionName,args,callback,loading){
    var pl = new SOAPClientParameters();
    pl = new SOAPClientParameters();
    for (var i =0; i < args.length;i++){
        pl.add("arg"+i,args[i]);
    }
    if (loading)
        openLoadingScreen(loading, true);
    SOAPClient.invoke(url, functionName, pl, true, callback);
}
function getLoggedInUser(){
    req = createXMLHttpRequest(); 
    req.open('get', "http://"+location.host+"/com.hme.web.new-war/RequestProvider?type=username",false); 
    req.send(null);
    var user= req.responseText;
    return user;
}
function getLoggedInPassword(){
    req = createXMLHttpRequest(); 
    req.open('get', "http://"+location.host+"/com.hme.web.new-war/RequestProvider?type=password",false); 
    req.send(null);
    var user= req.responseText;
    return user;
}
function getLoggedInOid(){
    req = createXMLHttpRequest(); 
    req.open('get', "http://"+location.host+"/com.hme.web.new-war/RequestProvider?type=oid",false); 
    req.send(null);
    var user= req.responseText;
    return user;
}
function getLoggedInUserData(){
    req = createXMLHttpRequest();
    req.open('get', "http://"+location.host+"/com.hme.web.new-war/RequestProvider?type=postnukedata",false);
    req.send(null);
    return req.responseXML;
}
function getUserData(userName,passWord){
    req = createXMLHttpRequest(); 
    req.open('get', "http://"+location.host+"/com.hme.web.new-war/RequestProvider?type=customerid&name="+userName+"&pass="+passWord,false);
    req.send(null);
    var xml= req.responseXML;
    return xml;
}

function removeStylePrefix(styleAttribute,element){
    var newName = "_"+styleAttribute;
    var cla = element.className;
    if (cla.indexOf(newName) > -1){
        cla = cla.replace(newName,"");
    }
    element.className = cla;
}

function initialiseHistory(){
  
    dhtmlHistory.initialize();
  
    // subscribe to DHTML history change
    // events
    dhtmlHistory.addListener(historyChange);
}

function addHistoryEvent(url,value){

    historyStorage.put(url,value);
   
}

/** Displays messages to the screen. */
function debug(msg, clear) {
    var output = 
    document.getElementById("output");
    if (clear == true)
        output.innerHTML = "<p>" + msg + "</p>";
    else {
        output.innerHTML += 
        "<p>" + msg + "</p>";
    }
}
/** Our callback to receive history change
     events. */
function historyChange(newLocation, 
    historyData) {
    debug("A history change has occurred: "
        + "newLocation="+newLocation
        + ", historyData="+historyData, 
        false);
        
    alert("alarm");
}

function openCalendar(name,showTime,event){
    var calendar = document.getElementById(name);
    if (showTime){
        showChooser(event.src,name, name+'chooserSpan', 2007, 2010, Date.patterns.ISO8601LongPattern, true);
    }
    else {
        showChooser(event.src,name, name+'chooserSpan', 2007, 2010, Date.patterns.ShortDateGermanPattern, true);


    }
}

function longToDateString(value){
    var date = new Date();
  
    date.setTime(parseInt(value));
  
    var tet= (date.getYear()+1900)+"-"+fillZero(date.getMonth()+1)+"-"+fillZero(date.getDate())+" "+fillZero(date.getHours())+":"+fillZero(date.getMinutes())+":00";

    return tet;
}
function fillZero(v){
    if (v <= 9){
        return "0"+v;
    }
    else return v;
}
function parseDefaultDate(date){


    var year = date.substring(0,4);
    var month = date.substring(5,7);
    var day = date.substring(8,10);
   
    var hour = date.substring(11,13);
    var minute = date.substring(14,16);

    if (month.toString().substr(0, 1) == '0'){
        month = month.toString().substr(1, 1);
    }
    if (day.toString().substr(0, 1) == '0'){
        day = day.toString().substr(1, 1);
    }
    if (hour.toString().substr(0, 1) == '0'){
        hour = hour.toString().substr(1, 1);
    }
    if (minute.toString().substr(0, 1) == '0'){
        minute = minute.toString().substr(1, 1);
    }
    
    var newdate = new Date();
    newdate.setYear(parseInt(year));
    newdate.setMonth(parseInt(month)-1, parseInt(day));
    //newdate.setFullYear(parseInt(year), parseInt(month)-1, parseInt(day));
    //newdate.setDate(day);
    newdate.setHours(parseInt(hour), parseInt(minute), 0, 0);
    var millis = newdate.getTime();
 
    return millis;

// return new Date(parseInt(year),parseInt(month)+1,parseInt(day),parseInt(hour),parseInt(minute),0).getTime();
}

var tempDivName;
function openForm(divname,formurl){
    if (formurl.indexOf('?')==-1){
        formurl = formurl + "?divname="+divname;
    }
    else if (formurl.indexOf("?divname="+divname) == -1){
        formurl = formurl + "&divname="+divname;
    }

    sendRequest(divname, formurl);

    
}
function createXMLHttpRequest() { 
    var intreq; 
    if(window.XMLHttpRequest) { 
        try { 
            intreq = new XMLHttpRequest(); 
        } catch(e) { 
            intreq = false; 
        } 
    } else if(window.ActiveXObject) { 
        try { 
            intreq = new ActiveXObject("Microsoft.XMLHTTP"); 
        } catch(e) { 
            intreq = false; 
        } 
    } 
    return intreq; 
} 

var req = createXMLHttpRequest(); 
var tempurl;
function sendRequest(divname,formurl) {
    if (true){
        syncRequest(divname, formurl);
        return;
    }
    tempDivName = divname;
    openLoadingScreen("Lade Formular");
    tempurl = formurl;
    req.open('get', formurl,true); 
    req.onreadystatechange = handleResponse; 
    req.send(null); 
} 
function syncRequest(divname,formurl) {
    req = createXMLHttpRequest(); 
    tempDivName = divname;
    openLoadingScreen("Lade Formular");
    tempurl = formurl;
    req.open('get', formurl,false);

    req.send(null);
    closeLoadingScreen();
    var ele = document.getElementById(tempDivName);

    if (ele){
                ele.innerHTML = req.responseText;
                 //if (document.proxyActive)
                 // replaceLocation();
    }


    // alert(req.responseText);
    tempDivName = null;
    if (tempurl && tempurl.indexOf('booking')>-1){
        setTimeout(initBooking, 100);
    // initBooking();
    }
    else if (!document.proxyActive && tempurl && tempurl.indexOf('veranstaltung') >-1){
        setTimeout(scrollTopUp, 10);
    }

    
}




function scrollTopUp(){
    if ( document.getElementById('formTableClass'))
    document.getElementById('formTableClass').scrollIntoView(20);
}

function handleResponse() { 

    if (req.readyState == 4) {
        if (req.status == 200) {
            var ele = document.getElementById(tempDivName);
            if (ele)
                ele.innerHTML = req.responseText;
            tempDivName = null;
            if (tempurl && tempurl.indexOf('booking')>-1){
                initBooking();
            }
            else if (tempurl && tempurl.indexOf('veranstaltung') >-1){
                scrollTopUp();
            }
            closeLoadingScreen();
        }
    }
}
function FCKHack() {
    for (var i = 0; i < parent.frames.length; ++i ) {
        if ( parent.frames[i].FCK )
            parent.frames[i].FCK.UpdateLinkedField();
    }
}
function setMessageHTML(message,icon,divname){
    var element = document.getElementById(divname+"_message");
    if (message && element){
        var html = "<table width='100%' class='message'>";
        html += "<tr><td><img src='"+icon+"'></td><td>"+message+"</td></tr></table>";
    
        element.innerHTML = html;
    }
    else if (element){
        element.innerHTML = "";
    }
}

function checkInternalTypes(divname){
 
    var element = document.getElementById(divname);
    var elements = getElements(divname);
    for (var i = 0; i< elements.length;i++){
        checkFormField(elements[i],divname);
    }
}

function getAttributeElement(ele,name){
    if (document.all){
        return ele.attributes[name];
    }
    else {
        return ele.getAttribute(name);
    }
}

function checkFormField(ele,divname){
  
    var attribute = getAttributeElement(ele,"internalType");
    if (attribute == 'text'){
        validateTextValue(getAttributeElement(ele,"optional"), ele,divname);
    }
    if (attribute == 'number'){
        validateNumberValue(getAttributeElement(ele,"optional"), ele,divname);
    }
    if (attribute == 'currency'){
        validateCurrencyValue(getAttributeElement(ele,"optional"), ele,divname);
    }
    
}

function updateMessage(divname){
    var valid = getFormValueStatus(divname);
    if (!valid){
        setMessageHTML("Einige Felder enthalten Fehler, bitte zuerst korrigieren", alertPic, divname);
    } 
    else {
        setMessageHTML(null, null, divname);
    }
}

function checkFormValues(divname,action){
    var valid = getFormValueStatus(divname);
    if (!valid){
        setMessageHTML("Einige Felder enthalten Fehler, bitte zuerst korrigieren", alertPic, divname);
    }
    
    else {
        setMessageHTML(null, null, divname);
        action();
    //action();
    // alert("action ="+action)
    }
    return valid;
    
}

function getFormValueStatus(divname){
    if (divname){

        var element = document.getElementById(divname);
        var valid = true;
        var elements = element.getElementsByTagName("input");
        for (var i = 0; i< elements.length;i++){
        
            if (elements[i].getAttribute("valid") != null){
         
                var attribute = elements[i].getAttribute("valid");
                if (attribute =='false'){           
                    valid = false;
                    break;       
                }       
            }
        }
    
        return valid;  
    }
}


function getElements(divname){
    var array = new Array();
    var div = document.getElementById(divname);
    var elements = div.getElementsByTagName("input");
    for (var i = 0; i < elements.length;i++){
        array[array.length] = elements[i];
    }
    elements = div.getElementsByTagName("textarea");
    for (i = 0; i < elements.length;i++){
        array[array.length] = elements[i];
    }
    return array;
}

function clearInputFields(div){
    var elements =getElements(div.id);
    for (var i = 0; i < elements.length;i++){
        elements[i].value = null;
        if (elements[i].type=='checkbox'){
            elements[i].checked = false;
        }
    }

    checkInternalTypes(div.id);
    
}

var alertPic = "hmepage_images/alert_round.png";
var emptyPic = "hmepage_images/empty.png";
function validateTextValue(optional,element,divname){
    var id= element.id+"_img";
    var imgElement = document.getElementById(id);
    if (imgElement){
        imgElement.src = emptyPic;
        imgElement.title = "";
        element.setAttribute("valid", true);
    
        if (!optional || optional == 'false') {
            var value = element.value;
            if (!value || value.length == 0){
                element.setAttribute("valid", false);
                setMessageHTML("Einige benötigte Felder haben keine Daten",alertPic , divname)
                imgElement.src = alertPic;
                imgElement.title="Dieses Feld darf nicht leer sein!";
                return false;
            } 
        }
        if (getFormValueStatus(divname)){
            setMessageHTML(null,null , divname);
        }
    }
    return true;

}
function validateEMailValue(optional,element,divname){
    var id= element.id+"_img";
    var imgElement = document.getElementById(id);
    if (imgElement){
        imgElement.src = emptyPic;
        imgElement.title = "";
        element.setAttribute("valid", true);
    
        if (!optional || optional == 'false') {
        
            if (!value || value.length == 0){
                element.setAttribute("valid", false);
                setMessageHTML("Einige benötigte Felder haben keine Daten",alertPic , divname)
                imgElement.src = alertPic;
                imgElement.title="Dieses Feld darf nicht leer sein!";
                return false;
            } 
        }
        var value = element.value;
        if (value){
            var i1 = value.indexOf("@");
            var i2 = value.indexOf(".");
            
            if (i1 == -1 || i2 == -1){
                element.setAttribute("valid", false);
                setMessageHTML("Es wurde keine gültige EMail Adresse eingegeben.",alertPic , divname)
                imgElement.src = alertPic;
                imgElement.title="Es wurde keine gültige EMail Adresse eingegeben!";
                return false;
            }
            else {
                if (value.indexOf(",")>-1){
                    element.setAttribute("valid", false);
                    setMessageHTML("Bitte nur eine EMail Adresse eingeben, mehrere sind nicht erlaubt!",alertPic , divname)
                    imgElement.src = alertPic;
                    imgElement.title="Es wurde keine gültige EMail Adresse eingegeben!";
                    return false;
                }
            }
        }
        if (getFormValueStatus(divname)){
            setMessageHTML(null,null , divname);
        }
    }
    return true;

}
function validateNumberValue(optional,element,divname){
    var id= element.id+"_img";
    var imgElement = document.getElementById(id);     
    var value = element.value;
 
    if (!IsNumeric(value) || ((!optional || optional == 'false') && value.length == 0)){
        element.setAttribute("valid", false);
        setMessageHTML("Ein oder mehrere Felder sind Fehlerhaft",alertPic , divname);
        imgElement.title =!IsNumeric(value)?"Der Wert darf nur Zahlen enthalten":"Dieses Feld darf nicht leer sein";
        imgElement.src = alertPic;
    }
    else {       
        imgElement.src =emptyPic;
        imgElement.title = "";
        element.setAttribute("valid", true);
        if (getFormValueStatus(divname)){
            setMessageHTML(null,null , divname);
        }
    }
    
}

function IsNumeric(strString)
//  check for valid numeric strings	
{
    var strValidChars = "0123456789.-,";
    var strChar;
    var blnResult = true;

    if (strString.length == 0) return true;

    //  test strString consists of valid characters listed above
    for (i = 0; i < strString.length && blnResult == true; i++)
    {
        strChar = strString.charAt(i);
        if (strValidChars.indexOf(strChar) == -1)
        {
            blnResult = false;
        }
    }
    return blnResult;
}

function validateCurrencyValue(optional,element,divname){
    var id= element.id+"_img";
    var imgElement = document.getElementById(id);     
    var value = element.value;
   
    if (!IsNumeric(value) || ((!optional || optional == 'false') && value.length == 0)){
        element.setAttribute("valid", false);
        setMessageHTML("Einige benötigte Felder haben keine Daten",alertPic , divname);
        imgElement.title =!IsNumeric(value)?"Der Wert darf nur Zahlen enthalten":"Dieses Feld darf nicht leer sein";  
        imgElement.src = alertPic;
    }
    else {       
        imgElement.src = emptyPic;
        imgElement.title ="";
        element.setAttribute("valid", true);
        if (getFormValueStatus(divname)){
            setMessageHTML(null,null , divname);
        }
    }
}

function $(id){
    return document.getElementById(id);
}

function addHistoryMain(){

    // window.historyStorage.init();
    window.dhtmlHistory.create();
    var opened = false;
    var yourListener = function(newLocation, historyData) {
        //alert("newLocation"+newLocation+" hist "+historyData+" "+document.location);
        opened = true;
        if (newLocation && historyData){
            openForm(historyData,newLocation);   
        }
        else if (newLocation){
            openForm('editform',newLocation);   
        }
    }
    window.onload = function(){
        dhtmlHistory.initialize();
        dhtmlHistory.addListener(yourListener);
        if (!opened){
            if (window.location.toString().indexOf("#") > -1){
                var link = window.location.toString().substring(window.location.toString().indexOf("#")+1);
                openForm("editform",link);
            }
       
        }
    }
//dhtmlHistory.add('veranstaltungen.jsp','editform');
}


/*
* Copyright (C) 2004 Baron Schwartz <baron at sequent dot org>
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as published by the
* Free Software Foundation, version 2.1.
*
* This program 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.
*
* $Revision: 1.6 $
*/

// Shows or hides the date chooser on the page
function showChooser(obj, inputId, divId, start, end, format, isTimeChooser) {
    if (document.getElementById) {
        var input = document.getElementById(inputId);
        var div = document.getElementById(divId);
        if (input !== undefined && div !== undefined) {
            if (input.DateChooser === undefined) {
                input.DateChooser = new DateChooser(input, div, start, end, format, isTimeChooser);
            }
            input.DateChooser.setDate(Date.parseDate(input.value, format));
            if (input.DateChooser.isVisible()) {
                input.DateChooser.hide();
            }
            else {
                input.DateChooser.show();
            }
        }
    }
}

// Sets a date on the object attached to 'inputId'
function dateChooserSetDate(inputId, value) {
    var input = document.getElementById(inputId);
    if (input !== undefined && input.DateChooser !== undefined) {
        input.DateChooser.setDate(Date.parseDate(value, input.DateChooser._format));
        if (input.DateChooser.isTimeChooser()) {
            var theForm = input.form;
            var prefix = input.DateChooser._prefix;
            input.DateChooser.setTime(
                parseInt(theForm.elements[prefix + 'hour'].options[
                    theForm.elements[prefix + 'hour'].selectedIndex].value)
                + parseInt(theForm.elements[prefix + 'ampm'].options[
                    theForm.elements[prefix + 'ampm'].selectedIndex].value),
                parseInt(theForm.elements[prefix + 'min'].options[
                    theForm.elements[prefix + 'min'].selectedIndex].value));
        }
        input.value = input.DateChooser.getValue();
        input.DateChooser.hide();
    }
}

// The callback function for when someone changes the pulldown menus on the date
// chooser
function dateChooserDateChange(theForm, prefix) {
    var input = document.getElementById(
        theForm.elements[prefix + 'inputId'].value);
    var newDate = new Date(
        theForm.elements[prefix + 'year'].options[
        theForm.elements[prefix + 'year'].selectedIndex].value,
        theForm.elements[prefix + 'month'].options[
        theForm.elements[prefix + 'month'].selectedIndex].value,
        1);
    // Try to preserve the day of month (watch out for months with 31 days)
    newDate.setDate(Math.max(1, Math.min(newDate.getDaysInMonth(),
        input.DateChooser._date.getDate())));
    input.DateChooser.setDate(newDate);
    if (input.DateChooser.isTimeChooser()) {
        input.DateChooser.setTime(
            parseInt(theForm.elements[prefix + 'hour'].options[
                theForm.elements[prefix + 'hour'].selectedIndex].value)
            + parseInt(theForm.elements[prefix + 'ampm'].options[
                theForm.elements[prefix + 'ampm'].selectedIndex].value),
            parseInt(theForm.elements[prefix + 'min'].options[
                theForm.elements[prefix + 'min'].selectedIndex].value));
    }
    input.DateChooser.show();
}

// Gets the absolute position on the page of the element passed in
function getAbsolutePosition(obj) {
    var result = [0, 0];
    while (obj != null) {
        result[0] += obj.offsetTop;
        result[1] += obj.offsetLeft;
        obj = obj.offsetParent;
    }
    return result;
}

// DateChooser constructor
function DateChooser(input, div, start, end, format, isTimeChooser) {
    this._input = input;
    this._div = div;
    this._start = start;
    this._end = end;
    this._format = format;
    this._date = new Date();
    this._isTimeChooser = isTimeChooser;
    // Choose a random prefix for all pulldown menus
    this._prefix = "";
    var letters = ["a", "b", "c", "d", "e", "f", "h", "i", "j", "k", "l",
    "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z"];
    for (var i = 0; i < 10; ++i) {
        this._prefix += letters[Math.floor(Math.random() * letters.length)];
    }
}

// DateChooser prototype variables
DateChooser.prototype._isVisible = false;

// Returns true if the chooser is currently visible
DateChooser.prototype.isVisible = function() {
    return this._isVisible;
}

// Returns true if the chooser is to allow choosing the time as well as the date
DateChooser.prototype.isTimeChooser = function() {
    return this._isTimeChooser;
}

// Gets the value, as a formatted string, of the date attached to the chooser
DateChooser.prototype.getValue = function() {
    return this._date.dateFormat(this._format);
}

// Hides the chooser
DateChooser.prototype.hide = function() {
    this._div.style.visibility = "hidden";
    this._div.style.display = "none";
    this._div.innerHTML = "";
    this._isVisible = false;
}

// Shows the chooser on the page
DateChooser.prototype.show = function() {
    // calculate the position before making it visible
    var inputPos = getAbsolutePosition(this._input);
    this._div.style.top = (inputPos[0] + this._input.offsetHeight) + "px";
    this._div.style.left = (inputPos[1] + this._input.offsetWidth) + "px";
    this._div.innerHTML = this.createChooserHtml();
    this._div.style.display = "block";
    this._div.style.visibility = "visible";
    this._div.style.position = "absolute";
    this._isVisible = true;
}

// Sets the date to what is in the input box
DateChooser.prototype.initializeDate = function() {
    if (this._input.value != null && this._input.value != "") {
        this._date = Date.parseDate(this._input.value, this._format);
    }
    else {
        this._date = new Date();
    }
}

// Sets the date attached to the chooser
DateChooser.prototype.setDate = function(date) {
    this._date = date ? date : new Date();
}

// Sets the time portion of the date attached to the chooser
DateChooser.prototype.setTime = function(hour, minute) {
    this._date.setHours(hour);
    this._date.setMinutes(minute);
}

// Creates the HTML for the whole chooser
DateChooser.prototype.createChooserHtml = function() {
    var formHtml = "<input type=\"hidden\" name=\""
    + this._prefix + "inputId\" value=\""
    + this._input.getAttribute('id') + "\">"
    + "\r\n  <select name=\"" + this._prefix 
    + "month\" onChange=\"dateChooserDateChange(this.form, '"
    + this._prefix + "');\">";
    for (var monIndex = 0; monIndex <= 11; monIndex++) {
        formHtml += "\r\n    <option value=\"" + monIndex + "\""
        + (monIndex == this._date.getMonth() ? " selected=\"1\"" : "")
        + ">" + Date.monthNames[monIndex] + "</option>";
    }
    formHtml += "\r\n  </select>\r\n  <select name=\""
    + this._prefix + "year\" onChange=\"dateChooserDateChange(this.form, '"
    + this._prefix + "');\">";
    for (var i = this._start; i <= this._end; ++i) {
        formHtml += "\r\n    <option value=\"" + i + "\""
        + (i == this._date.getFullYear() ? " selected=\"1\"" : "")
        + ">" + i + "</option>";
    }
    formHtml += "\r\n  </select>";
    formHtml += this.createCalendarHtml();
    if (this._isTimeChooser) {
        formHtml += this.createTimeChooserHtml();
    }
    return formHtml;
}

// Creates the extra HTML needed for choosing the time
DateChooser.prototype.createTimeChooserHtml = function() {
    // Add hours
    var result = "\r\n  <select name=\"" + this._prefix + "hour\">";
    for (var i = 0; i < 12; ++i) {
        result += "\r\n    <option value=\"" + i + "\""
        + (((this._date.getHours() % 12) == i) ? " selected=\"1\">" : ">")
        + i + "</option>";
    }
    // Add extra entry for 12:00
    result += "\r\n    <option value=\"0\">12</option>";
    result += "\r\n  </select>";
    // Add minutes
    result += "\r\n  <select name=\"" + this._prefix + "min\">";
    for (var i = 0; i < 60; i ++) {
        result += "\r\n    <option value=\"" + i + "\""
        + ((this._date.getMinutes() == i) ? " selected=\"1\">" : ">")
        + String.leftPad(i, 2, '0') + "</option>";
    }
    result += "\r\n  </select>";
    // Add AM/PM
    result += "\r\n  <select name=\"" + this._prefix + "ampm\">";
    result += "\r\n    <option value=\"0\""
    + (this._date.getHours() < 12 ? " selected=\"1\">" : ">")
    + "AM</option>";
    result += "\r\n    <option value=\"12\""
    + (this._date.getHours() >= 12 ? " selected=\"1\">" : ">")
    + "PM</option>";
    result += "\r\n  </select>";
    return result;
}

// Creates the HTML for the actual calendar part of the chooser
DateChooser.prototype.createCalendarHtml = function() {
    var result = "\r\n<table cellspacing=\"0\" class=\"dateChooser\">"
    + "\r\n  <tr><th>S</th><th>M</th><th>T</th>"
    + "<th>W</th><th>T</th><th>F</th><th>S</th></tr>\r\n  <tr>";
    // Fill up the days of the week until we get to the first day of the month
    var firstDay = this._date.getFirstDayOfMonth();
    var lastDay = this._date.getLastDayOfMonth();
    if (firstDay != 0) {
        result += "<td colspan=\"" + firstDay + "\">&nbsp;</td>";
    }
    // Fill in the days of the month
    var i = 0;
    while (i < this._date.getDaysInMonth()) {
        if (((i++ + firstDay) % 7) == 0) {
            result += "</tr>\r\n  <tr>";
        }
        var thisDay = new Date(
            this._date.getFullYear(),
            this._date.getMonth(), i);
        var js = '"dateChooserSetDate(\''
        + this._input.getAttribute('id') + "', '"
        + thisDay.dateFormat(this._format) + '\');"'
        result += "\r\n    <td class=\"dateChooserActive"
        // If the date is the currently chosen date, highlight it
        + (i == this._date.getDate() ? " dateChooserActiveToday" : "")
        + "\" onClick=" + js + ">" + i + "</td>";
    }
    // Fill in any days after the end of the month
    if (lastDay != 6) {
        result += "<td colspan=\"" + (6 - lastDay) + "\">&nbsp;</td>";
    }
    return result + "\r\n  </tr>\r\n</table><!--[if lte IE 6.5]><iframe></iframe><![endif]-->";
}
/*
* Copyright (C) 2004 Baron Schwartz <baron at sequent dot org>
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as published by the
* Free Software Foundation, version 2.1.
*
* This program 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.
*
* $Revision: 1.6 $
*/

Date.parseFunctions = {
    count:0
};
Date.parseRegexes = [];
Date.formatFunctions = {
    count:0
};

Date.prototype.dateFormat = function(format) {
    if (Date.formatFunctions[format] == null) {
        Date.createNewFormat(format);
    }
    var func = Date.formatFunctions[format];
    return this[func]();
}

Date.createNewFormat = function(format) {
    var funcName = "format" + Date.formatFunctions.count++;
    Date.formatFunctions[format] = funcName;
    var code = "Date.prototype." + funcName + " = function(){return ";
    var special = false;
    var ch = '';
    for (var i = 0; i < format.length; ++i) {
        ch = format.charAt(i);
        if (!special && ch == "\\") {
            special = true;
        }
        else if (special) {
            special = false;
            code += "'" + String.escape(ch) + "' + ";
        }
        else {
            code += Date.getFormatCode(ch);
        }
    }
    eval(code.substring(0, code.length - 3) + ";}");
}

Date.getFormatCode = function(character) {
    switch (character) {
        case "d":
            return "String.leftPad(this.getDate(), 2, '0') + ";
        case "D":
            return "Date.dayNames[this.getDay()].substring(0, 3) + ";
        case "j":
            return "this.getDate() + ";
        case "l":
            return "Date.dayNames[this.getDay()] + ";
        case "S":
            return "this.getSuffix() + ";
        case "w":
            return "this.getDay() + ";
        case "z":
            return "this.getDayOfYear() + ";
        case "W":
            return "this.getWeekOfYear() + ";
        case "F":
            return "Date.monthNames[this.getMonth()] + ";
        case "m":
            return "String.leftPad(this.getMonth() + 1, 2, '0') + ";
        case "M":
            return "Date.monthNames[this.getMonth()].substring(0, 3) + ";
        case "n":
            return "(this.getMonth() + 1) + ";
        case "t":
            return "this.getDaysInMonth() + ";
        case "L":
            return "(this.isLeapYear() ? 1 : 0) + ";
        case "Y":
            return "this.getFullYear() + ";
        case "y":
            return "('' + this.getFullYear()).substring(2, 4) + ";
        case "a":
            return "(this.getHours() < 12 ? 'am' : 'pm') + ";
        case "A":
            return "(this.getHours() < 12 ? 'AM' : 'PM') + ";
        case "g":
            return "((this.getHours() %12) ? this.getHours() % 12 : 12) + ";
        case "G":
            return "this.getHours() + ";
        case "h":
            return "String.leftPad((this.getHours() %12) ? this.getHours() % 12 : 12, 2, '0') + ";
        case "H":
            return "String.leftPad(this.getHours(), 2, '0') + ";
        case "i":
            return "String.leftPad(this.getMinutes(), 2, '0') + ";
        case "s":
            return "String.leftPad(this.getSeconds(), 2, '0') + ";
        case "O":
            return "this.getGMTOffset() + ";
        case "T":
            return "this.getTimezone() + ";
        case "Z":
            return "(this.getTimezoneOffset() * -60) + ";
        default:
            return "'" + String.escape(character) + "' + ";
    }
}

Date.parseDate = function(input, format) {
    if (Date.parseFunctions[format] == null) {
        Date.createParser(format);
    }
    var func = Date.parseFunctions[format];
    return Date[func](input);
}

Date.createParser = function(format) {
    var funcName = "parse" + Date.parseFunctions.count++;
    var regexNum = Date.parseRegexes.length;
    var currentGroup = 1;
    Date.parseFunctions[format] = funcName;

    var code = "Date." + funcName + " = function(input){\n"
    + "var y = -1, m = -1, d = -1, h = -1, i = -1, s = -1;\n"
    + "var d = new Date();\n"
    + "y = d.getFullYear();\n"
    + "m = d.getMonth();\n"
    + "d = d.getDate();\n"
    + "var results = input.match(Date.parseRegexes[" + regexNum + "]);\n"
    + "if (results && results.length > 0) {"
    var regex = "";

    var special = false;
    var ch = '';
    for (var i = 0; i < format.length; ++i) {
        ch = format.charAt(i);
        if (!special && ch == "\\") {
            special = true;
        }
        else if (special) {
            special = false;
            regex += String.escape(ch);
        }
        else {
            obj = Date.formatCodeToRegex(ch, currentGroup);
            currentGroup += obj.g;
            regex += obj.s;
            if (obj.g && obj.c) {
                code += obj.c;
            }
        }
    }

    code += "if (y > 0 && m >= 0 && d > 0 && h >= 0 && i >= 0 && s >= 0)\n"
    + "{return new Date(y, m, d, h, i, s);}\n"
    + "else if (y > 0 && m >= 0 && d > 0 && h >= 0 && i >= 0)\n"
    + "{return new Date(y, m, d, h, i);}\n"
    + "else if (y > 0 && m >= 0 && d > 0 && h >= 0)\n"
    + "{return new Date(y, m, d, h);}\n"
    + "else if (y > 0 && m >= 0 && d > 0)\n"
    + "{return new Date(y, m, d);}\n"
    + "else if (y > 0 && m >= 0)\n"
    + "{return new Date(y, m);}\n"
    + "else if (y > 0)\n"
    + "{return new Date(y);}\n"
    + "}return null;}";

    Date.parseRegexes[regexNum] = new RegExp("^" + regex + "$");
    eval(code);
}

Date.formatCodeToRegex = function(character, currentGroup) {
    switch (character) {
        case "D":
            return {
                g:0,
                c:null,
                s:"(?:Sun|Mon|Tue|Wed|Thu|Fri|Sat)"
            };
        case "j":
        case "d":
            return {
                g:1,
                c:"d = parseInt(results[" + currentGroup + "], 10);\n",
                s:"(\\d{1,2})"
            };
        case "l":
            return {
                g:0,
                c:null,
                s:"(?:" + Date.dayNames.join("|") + ")"
            };
        case "S":
            return {
                g:0,
                c:null,
                s:"(?:st|nd|rd|th)"
            };
        case "w":
            return {
                g:0,
                c:null,
                s:"\\d"
            };
        case "z":
            return {
                g:0,
                c:null,
                s:"(?:\\d{1,3})"
            };
        case "W":
            return {
                g:0,
                c:null,
                s:"(?:\\d{2})"
            };
        case "F":
            return {
                g:1,
                c:"m = parseInt(Date.monthNumbers[results[" + currentGroup + "].substring(0, 3)], 10);\n",
                s:"(" + Date.monthNames.join("|") + ")"
            };
        case "M":
            return {
                g:1,
                c:"m = parseInt(Date.monthNumbers[results[" + currentGroup + "]], 10);\n",
                s:"(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)"
            };
        case "n":
        case "m":
            return {
                g:1,
                c:"m = parseInt(results[" + currentGroup + "], 10) - 1;\n",
                s:"(\\d{1,2})"
            };
        case "t":
            return {
                g:0,
                c:null,
                s:"\\d{1,2}"
            };
        case "L":
            return {
                g:0,
                c:null,
                s:"(?:1|0)"
            };
        case "Y":
            return {
                g:1,
                c:"y = parseInt(results[" + currentGroup + "], 10);\n",
                s:"(\\d{4})"
            };
        case "y":
            return {
                g:1,
                c:"var ty = parseInt(results[" + currentGroup + "], 10);\n"
                + "y = ty > Date.y2kYear ? 1900 + ty : 2000 + ty;\n",
                s:"(\\d{1,2})"
            };
        case "a":
            return {
                g:1,
                c:"if (results[" + currentGroup + "] == 'am') {\n"
                + "if (h == 12) { h = 0; }\n"
                + "} else { if (h < 12) { h += 12; }}",
                s:"(am|pm)"
            };
        case "A":
            return {
                g:1,
                c:"if (results[" + currentGroup + "] == 'AM') {\n"
                + "if (h == 12) { h = 0; }\n"
                + "} else { if (h < 12) { h += 12; }}",
                s:"(AM|PM)"
            };
        case "g":
        case "G":
        case "h":
        case "H":
            return {
                g:1,
                c:"h = parseInt(results[" + currentGroup + "], 10);\n",
                s:"(\\d{1,2})"
            };
        case "i":
            return {
                g:1,
                c:"i = parseInt(results[" + currentGroup + "], 10);\n",
                s:"(\\d{2})"
            };
        case "s":
            return {
                g:1,
                c:"s = parseInt(results[" + currentGroup + "], 10);\n",
                s:"(\\d{2})"
            };
        case "O":
            return {
                g:0,
                c:null,
                s:"[+-]\\d{4}"
            };
        case "T":
            return {
                g:0,
                c:null,
                s:"[A-Z]{3}"
            };
        case "Z":
            return {
                g:0,
                c:null,
                s:"[+-]\\d{1,5}"
            };
        default:
            return {
                g:0,
                c:null,
                s:String.escape(character)
            };
    }
}

Date.prototype.getTimezone = function() {
    return this.toString().replace(
        /^.*? ([A-Z]{3}) [0-9]{4}.*$/, "$1").replace(
        /^.*?\(([A-Z])[a-z]+ ([A-Z])[a-z]+ ([A-Z])[a-z]+\)$/, "$1$2$3");
}

Date.prototype.getGMTOffset = function() {
    return (this.getTimezoneOffset() > 0 ? "-" : "+")
    + String.leftPad(Math.floor(this.getTimezoneOffset() / 60), 2, "0")
    + String.leftPad(this.getTimezoneOffset() % 60, 2, "0");
}

Date.prototype.getDayOfYear = function() {
    var num = 0;
    Date.daysInMonth[1] = this.isLeapYear() ? 29 : 28;
    for (var i = 0; i < this.getMonth(); ++i) {
        num += Date.daysInMonth[i];
    }
    return num + this.getDate() - 1;
}

Date.prototype.getWeekOfYear = function() {
    // Skip to Thursday of this week
    var now = this.getDayOfYear() + (4 - this.getDay());
    // Find the first Thursday of the year
    var jan1 = new Date(this.getFullYear(), 0, 1);
    var then = (7 - jan1.getDay() + 4);
    document.write(then);
    return String.leftPad(((now - then) / 7) + 1, 2, "0");
}

Date.prototype.isLeapYear = function() {
    var year = this.getFullYear();
    return ((year & 3) == 0 && (year % 100 || (year % 400 == 0 && year)));
}

Date.prototype.getFirstDayOfMonth = function() {
    var day = (this.getDay() - (this.getDate() - 1)) % 7;
    return (day < 0) ? (day + 7) : day;
}

Date.prototype.getLastDayOfMonth = function() {
    var day = (this.getDay() + (Date.daysInMonth[this.getMonth()] - this.getDate())) % 7;
    return (day < 0) ? (day + 7) : day;
}

Date.prototype.getDaysInMonth = function() {
    Date.daysInMonth[1] = this.isLeapYear() ? 29 : 28;
    return Date.daysInMonth[this.getMonth()];
}

Date.prototype.getSuffix = function() {
    switch (this.getDate()) {
        case 1:
        case 21:
        case 31:
            return "st";
        case 2:
        case 22:
            return "nd";
        case 3:
        case 23:
            return "rd";
        default:
            return "th";
    }
}

String.escape = function(string) {
    return string.replace(/('|\\)/g, "\\$1");
}

String.leftPad = function (val, size, ch) {
    var result = new String(val);
    if (ch == null) {
        ch = " ";
    }
    while (result.length < size) {
        result = ch + result;
    }
    return result;
}

Date.daysInMonth = [31,28,31,30,31,30,31,31,30,31,30,31];
Date.monthNames =
    ["January",
    "February",
    "March",
    "April",
    "May",
    "June",
    "July",
    "August",
    "September",
    "October",
    "November",
    "December"];
Date.dayNames =
    ["Sunday",
    "Monday",
    "Tuesday",
    "Wednesday",
    "Thursday",
    "Friday",
    "Saturday"];
Date.y2kYear = 50;
Date.monthNumbers = {
    Jan:0,
    Feb:1,
    Mar:2,
    Apr:3,
    May:4,
    Jun:5,
    Jul:6,
    Aug:7,
    Sep:8,
    Oct:9,
    Nov:10,
    Dec:11
};
Date.patterns = {
    ISO8601LongPattern:"Y-m-d H:i:s",
    ISO8601ShortPattern:"Y-m-d",
    ShortDatePattern: "n/j/Y",
    ShortDateGermanPattern: "d.m.Y",
    LongDatePattern: "l, F d, Y",
    LongDateGermanPattern: "d.m.Y H:i:s",
    FullDateTimePattern: "l, F d, Y g:i:s A",
    MonthDayPattern: "F d",
    ShortTimePattern: "g:i A",
    LongTimePattern: "g:i:s A",
    SortableDateTimePattern: "Y-m-d\\TH:i:s",
    UniversalSortableDateTimePattern: "Y-m-d H:i:sO",
    YearMonthPattern: "F, Y"
};

