/*  Shared JavaScript framework, version 1.0
 *  (c) 2008 Thomas F Abrahamsson
 *--------------------------------------------------------------------------*/

function xxx() {
    alert(1);
}

function stjs_loadAndFadeIn() {
    alert(1);
}
function stjs_CachedloadContentAJAX(targ, url, auto) {
  if (auto == "1")
    return new Ajax.PeriodicalUpdater(targ, url, {
      parameters: { 
      encoding: 'UTF-8',
      evalScripts: true,
      method: 'post',
      frequency:3,
      decay:2
      }
    });
 else
    return new Ajax.Updater(targ, url, {
      parameters: { 
      encoding: 'UTF-8',
      evalScripts: true,
      method: 'post'
      }
    });
}

function stjs_loadContentAJAX(targ, url, winID) {
    var node = $(targ);
    if (node) {
	Effect.Appear(targ);
	node.replace("<span align=center id='"+targ+"'><img width=16 height=16 src=/img/loading.gif></span>");
	if (winID!="") {
	    if (url.indexOf('?')==-1)
		url=url+"?winID="+winID;
	    else
		url=url+"&winID="+winID;
	}
	new Ajax.Updater(targ, url, {
		parameters: { 
		    encoding: 'UTF-8',
			evalScripts: true,
			method: 'post' 
			}
	});
    } else alert('Internal Error: stjs_loadContentAJAX('+targ+')');
}



var zInd=10;
var ofX=0;

function stjs_openWindow(where, title, url) {
  stjs_openWindowOffset(where,title,url,0);
}

function stjs_openWindowOffset(where, title, url, yOffset) {
    var winID = "_Win"+Math.random()*999999;
    var newIDAjaxT = "_ajx."+winID;
    var winH = "<div style='display:none' id='"+winID+"' class='window'><h1 id='WiHa"+winID+"'><span onclick='$(\""+winID+"\").remove();' class=wclose style='float:right'></span>" + title + "</h1><div class='windowinner'><div style='display:none' name="+newIDAjaxT+" id="+newIDAjaxT+"></div></div></div>";
    zInd++;
    $(where).insert({ after: winH });
    $(winID).setStyle( { 'zIndex': zInd, top:Math.floor(document.viewport.getHeight()/2-100+ofX+yOffset)+"px", left:Math.floor(document.viewport.getWidth()/2-220+ofX)+"px" });
    ofX+=5;
    new Draggable(winID, {handle: "WiHa"+winID, zindex:zInd} );
    Effect.Appear($(winID), {duration:0.5});
    stjs_loadContentAJAX(newIDAjaxT, url, winID);
}

// rPar = "Status|Message|FormID|WindowID"
function stjs_savedForm(originalRequest) {
    var rTxt = originalRequest.responseText;
    var rPar = rTxt.split("|"); // {OK,FAIL}|Message|FormID|RemoveArea
    //    alert(rTxt);
    if (rPar[0] == "OK") {
	if (rPar[1] != "") { alert("MSG:" + rPar[1]); }
	if (rPar[3] == "singlepager") 
	    {
		if ($("chkicon")) $("chkicon").src="/img/icons/check.png";
		$('singlepagerinfofield').update("<b>OK - Sparat!</b>");
		Effect.Appear($('singlepagerrow'));
		new Effect.Pulsate('singlepagerinfofield');
		$(rPar[2]).enable();
	    }
	else
	    if (rPar[3] != "") { 
		new Effect.Fade(rPar[3], {duration:0.3, afterFinish: function (obj) { $(rPar[3]).remove(); }});
	    }
    }
    else {
	if (rPar[3] == "singlepager") {
	    if ($("chkicon")) $("chkicon").src="/img/icons/database-error.png";
	    $('singlepagerinfofield').update("Fel - Kunde inte spara!"+rPar[0]);
	    Effect.Appear($('singlepagerrow'));
	}
	else
	    {
		// Fail
		alert("Failed.\n" + rPar[0] + "\n" + rPar[1]);
		//new Effect.Appear(rPar[2]+"_SaveButton");
		//alert("enabling form " + rPar[2]);
		//new Effect.Appear("SaveButton");
	    }
	$(rPar[2]).enable();
    }
}

//
// Validateform can check that all required fields are filled out, and if not, remind the user and cancel the save
// Otherwise, the form is serialized and saved, using the FORM action 
// to open saveform.php
//nw55
function stjs_saveForm(vformID, vwinID, vtable, refreshJSFnc) {

    // Checks
    // Noone else edited the form while I did?
    // All fields needed are filled out?
    var probFound = false;
    var form = $(vformID);
    var allInp = form.getInputs();
    for (var index = 0, len = allInp.length; index < len; ++index) {
	var iid = (allInp[index]).id;
	if (iid.length>3) {
	    if (iid.indexOf('|')!=-1) { // ok?
		var iid_split=iid.split("|"); 
		if (iid_split.length ==5) { // ok!
		    var err="";
		    var iid_form=iid_split[0];
		    var iid_name=iid_split[1];
		    var iid_type=iid_split[2];
		    var iid_mand=iid_split[3];
		    var iid_desc=iid_split[4];
		    var iid_value=$F(iid);
		    if (!(iid_value)) iid_value = "";

		    if ((iid_mand=="1") && (iid_value.length==0)) {
			err = iid_desc+" must not be empty!";
		    }

		    /*
		      if ((iid_type=="int")) //(iid_value.length==0)) {
		      {
		      err = iid_desc+" is not a number!";
		      }
		    */

		    if ($("warning_"+iid_form+iid_name)) { 
			$("warning_"+iid_form+iid_name).remove();
			$(iid).setStyle({ borderColor:'' });
		    }

		    // Highlight to users
		    if (err!="") {
			probFound = true;
			new Insertion.Before(iid, "<p id=warning_"+iid_form+iid_name+" class=warning>"+err+"</p>");
			new Effect.Appear("warning_"+iid_form+iid_name);
			new Effect.Highlight(iid);
			$(iid).setStyle({ borderColor:'#F00' });
		    }
		}
	    }
	}
    } // end loop

    //

    // Post...
    if (probFound == false)
	{
	    if ($("chkicon")) $("chkicon").src="/img/loading.gif";

	    //	    if (vwinID=="singleform") alert(1); else alert("2"+vwinID);
	    //	    alert(1); //parameters:{formID:vformID,winID:vwinID,table:vtable},

	    $(vformID).request({
		    encoding:'UTF-8',
			method:'POST',
			parameters:{formID:vformID,winID:vwinID,table:vtable},
			onComplete:stjs_savedForm
			});
	    $(vformID).disable();
	    setTimeout(refreshJSFnc, 500);
	}
    else
	{
	}
}

function stjs_closeForm(winID) {
    new Effect.Fade(winID, {duration:0.3, afterFinish: function (obj) { $(winID).remove(); }});
}

function stjs_closeFormDelete(winID) {
    new Effect.Fade(winID, {duration:0.3, afterFinish: function (obj) { $(winID).remove(); }});
}

function stjs_numbersonly(fld, e, dec)
{
    var key;
    var keychar;
    if (window.event)
	key = window.event.keyCode; else if (e) key = e.which; else return true; 
    keychar = String.fromCharCode(key);
    if ((key==null) || (key==0) || (key==8) || (key==9) || (key==13) || (key==27) ) return true;
    else if ((("-0123456789").indexOf(keychar) > -1)) return true;
    else if ( (dec && (keychar == ".")) || (dec && (keychar == ",")))
	{   fld.form.elements[dec].focus();  return false;   }else return false;
}


function E(url) {
    stjs_openWindow('editFormDIV', '<img align=top border=0 src=/img/icons/edit.png> Visa / Redigera', url);
}

function D(tab,kv,kn,itn,winid) {
    var r=confirm("Raderar vald "+itn+"!\nÄr du säker på detta?");
    if (r==true) {

	var url = '/delete.php?tab='+tab+'&kv='+kv+'&kn='+kn+'&itn='+encodeURIComponent(itn);

	new Ajax.Request(url, {
		method: 'get',
		    onSuccess: function(transport) {
		    var notice = $('notice');
		    if (transport.responseText=='OK') {
			stjs_closeFormDelete(winid);
		    }
		    else {
			new Effect.Shake(winID);
			alert("Kunde inte radera "+itn+"!\n"+transport.responseText);
		    }
		}
	});
      
    }
}


////////////////////////////////////////////////////////////////////////////////////////

/*  Scal - prototype calendar/date picker
 *   - Jamie Grove
 *   - Ian Tyndall
 *
 *  Scal is freely distributable under the terms of an MIT-style license.
 *  For details, see the Scal web site: http://scal.fieldguidetoprogrammers.com
 *
 *--------------------------------------------------------------------------*/
Object.extend(Date.prototype, {
	monthnames: ['January','February','March','April','May','June','July','August','September','October','November','December'],
	    daynames: ['Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday'],
	    succ: function(){
	    var sd = new Date(this.getFullYear(),this.getMonth(),this.getDate()+1);
	    sd.setHours(this.getHours(),this.getMinutes(),this.getSeconds(),this.getMilliseconds());
	    return sd;
	},
	    firstofmonth: function(){
	    return new Date(this.getFullYear(),this.getMonth(),1);
	},
	    lastofmonth: function(){
	    return new Date(this.getFullYear(),this.getMonth()+1,0);
	},
	    formatPadding: true,
	    format: function(f){
	    if (!this.valueOf()) { return '&nbsp;'; }
	    var d = this;
	    var formats = {
		'yyyy' : d.getFullYear(),
		'mmmm': this.monthnames[d.getMonth()],
		'mmm':  this.monthnames[d.getMonth()].substr(0, 3),
		'mm':   this.formatPadding ? ((d.getMonth()).succ()).toPaddedString(2) : (d.getMonth()).succ(),
		'dddd': this.daynames[d.getDay()],
		'ddd':  this.daynames[d.getDay()].substr(0, 3),
		'dd':   d.getDate().toPaddedString(2),
		'hh':   h = d.getHours() % 12 ? h : 12,
		'nn':   d.getMinutes(),
		'ss':   d.getSeconds(),
		'a/p':  d.getHours() < 12 ? 'a' : 'p'
	    };
	    return f.gsub(/(yyyy|mmmm|mmm|mm|dddd|ddd|dd|hh|nn|ss|a\/p)/i,
			  function(match) { return formats[match[0].toLowerCase()]; });
	}
    });

var scal = {};
scal = Class.create();
scal.prototype = {
    initialize: function(element,update) {
        this.element = $(element);
        var type = Try.these(
			     function(){ if(!Object.isUndefined(Effect)) { return 'Effect'; }},
			     function(){ return 'Element'; }
			     );  
        var currentYear = 
        this.options = Object.extend({
		oncalchange: Prototype.emptyFunction,
		daypadding: false,
		titleformat: 'mmmm yyyy',
		updateformat: 'yyyy-mm-dd',
		closebutton: 'X',
		prevbutton: '&laquo;',
		nextbutton: '&raquo;',
		yearnext: '&raquo;&raquo;',
		yearprev: '&laquo;&laquo;',
		//openeffect: type == 'Effect' ? Effect.Appear : Element.show,
		//closeeffect: type == 'Effect' ? Effect.Fade : Element.hide,
		openeffect: Element.show,
		closeeffect: Element.hide,
		onclose: Prototype.emptyFunction,
		onopen: Prototype.emptyFunction,
		exactweeks: false,
		dayheadlength: 2,
		weekdaystart: 0,
		planner: false,
		tabular: false
	    }, arguments[2] || { });   
        this.table = false;
        this.thead = false;
        this.startdate = this._setStartDate(arguments[2]);
        if(this.options.planner) { this.planner = this._setupPlanner(this.options.planner); }
        if(this.options.tabular) { 
            this.table = new Element('table',{'class': 'cal_table',border: 0,cellspacing: 0,cellpadding: 0});
            this.thead = new Element('thead');
            this.table.insert(this.thead);
            this.element.insert(this.table);
        }
        this.updateelement = update;
        this._setCurrentDate(this.startdate); 
        this.initDate = new Date(this.currentdate);
        this.controls = this._buildControls();
        this.title.setAttribute('title', this.initDate.format(this.options.titleformat));
        this._updateTitles();
        this[this.table ? 'thead' : 'element'].insert(this.controls);
        this.cal_wrapper = this._buildHead();
        this.cells = [];
        this._buildCal();
    },
    /*------------------------------- INTERNAL -------------------------------*/    
    _setStartDate: function() {
	var args = arguments[0];
        var startday = new Date();
        this.options.month = args && args.month && Object.isNumber(args.month) ? args.month - 1 : startday.getMonth();
        this.options.year = args && args.year && Object.isNumber(args.year) ? args.year : startday.getFullYear();
        this.options.day = args && args.day && Object.isNumber(args.day) ? args.day : (this.options.month != startday.getMonth()) ? 1 : startday.getDate();
        startday.setHours(0,0,0,0);
        startday.setDate(this.options.day);
        startday.setMonth(this.options.month);
        startday.setFullYear(this.options.year);
        return startday;
    },
    _emptyCells: function() {
        if(this.cells.size() > 0) { 
            this.cells.invoke('stopObserving'); 
            this.cells.invoke('remove');
            this.cells = [];
        }
    },
    _buildCal: function() {
        this._emptyCells();
        if(!(Object.isUndefined(this.cal_weeks_wrapper) || this.table)) { this.cal_weeks_wrapper.remove(); }
        this.cal_weeks_wrapper = this._buildWrapper();
        if(this.table) {
            this.table.select('tbody tr.weekbox:not(.weekboxname)').invoke('remove');
            this.table.select('tbody.cal_wrapper').invoke('remove');
            this.cal_weeks_wrapper.each(function(row){
		    this.cal_wrapper.insert(row);
		}.bind(this));
        } else {
            this.cal_wrapper.insert(this.cal_weeks_wrapper);
        }
        this[this.table ? 'table' : 'element'].insert(this.cal_wrapper);
    },
    _click: function(event,cellIndex) {
        this.element.select('.dayselected').invoke('removeClassName', 'dayselected');
        (event.target.hasClassName('daybox') ? event.target : event.target.up()).addClassName('dayselected');
        this._setCurrentDate(this.dateRange[cellIndex]);
        this._updateExternal();
    },
    _updateExternal: function(){	
        if (Object.isFunction(this.updateelement)){
            this.updateelement(this.currentdate);
        } else {	
            var updateElement = $(this.updateelement);
            updateElement[updateElement.tagName == 'INPUT' ? 'setValue' : 'update'](this.currentdate.format(this.options.updateformat));
        }            
    },    
    _buildHead: function() {
        var cal_wrapper = new Element(this.table ? 'tbody' : 'div',{'class':'cal_wrapper'});
        var weekbox = new Element(this.table ? 'tr' : 'div',{'class':'weekbox weekboxname'});
        Date.prototype.daynames.sortBy(function(s,i){
		i-=this.options.weekdaystart;
		if(i<0){i+=7;}
		return i;
	    }.bind(this)).each(function(day,i) {
		    var cell = new Element(this.table ? 'td' : 'div',{'class':'cal_day_name_'+ i});
		    cell.addClassName('daybox').addClassName('dayboxname').update(day.substr(0,this.options.dayheadlength));
		    if(i == 6) { cell.addClassName('endweek'); }
		    weekbox.insert(cell);
		}.bind(this));
        return cal_wrapper.insert(weekbox);
    },
    _buildWrapper: function() {
        var firstdaycal = new Date(this.firstofmonth.getFullYear(),this.firstofmonth.getMonth(),this.firstofmonth.getDate());
        var lastdaycal = new Date(this.lastofmonth.getFullYear(),this.lastofmonth.getMonth(),this.lastofmonth.getDate());
        firstdaycal.setDate(firstdaycal.getDate() - firstdaycal.getDay() + this.options.weekdaystart);
        var dateRange = $A($R(firstdaycal,lastdaycal));
        var cal_weeks_wrapper = this.table ? [] : new Element('div',{'class': 'calweekswrapper'});
        var wk;
        var row;
        var lastday;
        this.dateRange = [];
        this.indicators = []; // holds values to determine if continued checking for custom classes is needed
        var buildWeek = function(day) {
            row.insert(this._buildDay(wk, day));
            lastday = day;
        }.bind(this);       
        dateRange.eachSlice(7, function(slice,i) {
		wk = i;
		row = new Element(this.table ? 'tr' : 'div',{'class':'cal_week_' + wk}).addClassName('weekbox');
		while(slice.length < 7) { 
		    slice.push(slice.last().succ());
		}
		slice.map(buildWeek);	
		cal_weeks_wrapper[this.table ? 'push' : 'insert'](row);
	    }.bind(this));
        if(!this.options.exactweeks) {
            var toFinish = 42 - this.cells.size(); 
            var wkstoFinish = Math.ceil(toFinish / 7);
            if(wkstoFinish > 0) { toFinish = toFinish / wkstoFinish; }
            $R(1,wkstoFinish).each(function(w){
		    wk += 1;
		    row = new Element(this.table ? 'tr' : 'div',{'class':'cal_week_' + wk}).addClassName('weekbox'); 
		    $R(1,toFinish).each(function(i) {
			    var d = lastday.succ();
			    row.insert(this._buildDay(wk, d));
			    cal_weeks_wrapper[this.table ? 'push' : 'insert'](row);
			    lastday = d;
			}.bind(this));
		}.bind(this));
        }	
        return cal_weeks_wrapper;
    },
    _compareDates: function(date1,date2,type){
        return (this.indicators.indexOf(type) >= 0) ? false : Object.isUndefined(['getMonth','getDate','getFullYear'].find(function(n){ return date1[n]() != date2[n](); }));
    },
    _buildDay: function(week,day){
        this.dateRange.push(day);
        var cellid = 'cal_day_' + week + '_' + day.getDay();
        var cell = new Element(this.table ? 'td' : 'div',{'class':cellid});
        var celldate = new Element('div',{'class':cellid+'_date'}).addClassName('dayboxdate').update(this.options.daypadding ? ((day.getDate()).toPaddedString(2)) : day.getDate());
        var cellvalue = new Element('div',{'class':cellid+'_value'}).addClassName('dayboxvalue');
        if(this.options.planner) { this._updatePlanner(day,cellvalue); }
        cell.insert(celldate).insert(cellvalue).addClassName('daybox').addClassName('daybox'+ day.format('dddd').toLowerCase());
        // if we are on the currently selected date, set the class to dayselected (i.e. highlight it).
        if(this._compareDates(day,this.currentdate,'dayselected')) {
            cell.addClassName('dayselected');
            this.indicators.push('dayselected');
        }
        if(this._compareDates(day,new Date(),'today')) {
            cell.addClassName('today');
            this.indicators.push('today');
        }
        if(day.getDay() == 6) { cell.addClassName('endweek'); }
        // if we are outside the current month set the day style to 'deactivated'
        var cs = day.getMonth() != this.currentdate.getMonth() ? ['dayoutmonth','dayinmonth'] : ['dayinmonth','dayoutmonth'];
        cell.addClassName(cs[0]);
        if(cell.hasClassName(cs[1])) { cell.removeClassName(cs[1]); }
        this.cells.push(cell);
        return cell.observe('click', this._click.bindAsEventListener(this, this.cells.size() - 1));
    },
    _updateTitles: function() {
        var yr = this.currentdate.getFullYear();
        var mnth = this.currentdate.getMonth();
        var titles = {
            calprevmonth: Date.prototype.monthnames[(mnth - 1) == -1 ? 11 : mnth - 1],
            calprevyear: yr - 1,
            calnextyear: yr + 1,
            calnextmonth: Date.prototype.monthnames[(mnth + 1) == 12 ? 0 : mnth + 1]
        };
        this.controls.select('.calcontrol').each(function(ctrl) {
		var title = titles[ctrl.className.split(' ')[0]];
		if(!Object.isUndefined(title)) { ctrl.setAttribute('title',title); }
	    });
    },
    _buildControls: function() {
        var hParts = [
{p: 'calclose', u: this.options.closebutton, f:  this.toggleCalendar.bindAsEventListener(this)},
{p: 'calprevmonth', u: this.options.prevbutton, f: this._switchCal.bindAsEventListener(this,'monthdown')},
{p: 'calprevyear', u: this.options.yearprev, f: this._switchCal.bindAsEventListener(this,'yeardown')},
{p: 'calnextmonth', u: this.options.nextbutton, f: this._switchCal.bindAsEventListener(this,'monthup')},
{p: 'calnextyear', u: this.options.yearnext, f: this._switchCal.bindAsEventListener(this,'yearup')},
{p: 'caltitle', u: this.currentdate.format(this.options.titleformat), f: this._switchCal.bindAsEventListener(this,'init')}
		      ];
        if(this.table) { hParts = [hParts[1],hParts[2],hParts[5],hParts[3],hParts[4],hParts[0]]; }
        var cal_header = new Element(this.table ? 'tr' : 'div',{'class':'calheader'});
        hParts.each(function(part) {
		var el = new Element(this.table ? 'td' : 'div',{'class': part.p});
		if(part.p == 'caltitle') {
		    this.title = el;
		    if(this.table) { el.writeAttribute({colspan: 2}); }
		    el.update(part.u).observe('click',part.f);
		} else {
		    el.addClassName('calcontrol');
		    el[typeof(part.u) == 'object' ? 'insert' : 'update'](part.u).observe('click',part.f);
		}
		cal_header.insert(el);
	    }.bind(this));
        return cal_header;
    },
    _switchCal: function(){
        if(arguments[1]) {
            var event = arguments[0];
            var direction = arguments[1];
            event.date = this.currentdate;
        } else {
            var direction = arguments[0];
        }			
        var params = {f: 'setTime', p: this.initDate.getTime()};
        if(direction != 'init') {
            var d = this.currentdate[direction.include('month') ? 'getMonth' : 'getFullYear']();
            params = {f: direction.include('month') ? 'setMonth' : 'setYear', p: direction.include('up') ? d + 1 : d - 1};
        }
        this.currentdate[params.f](params.p);
        if(arguments[1]) { this.options.oncalchange(event); }
        this._update();
    }, 
    _update: function() {
        this._setCurrentDate(arguments[0] ? arguments[0] : this.currentdate);
        this.title.update(this.currentdate.format(this.options.titleformat));
        this._buildCal();
        this._updateTitles();
    },
    _setCurrentDate: function(date){
        this.currentdate = new Date(date.getFullYear(),date.getMonth(),date.getDate());
        this.firstofmonth = this.currentdate.firstofmonth();
        this.lastofmonth = this.currentdate.lastofmonth();
    },    
    _getCellIndexByDate: function(d) {
        var findDate = d.getTime();
        var cellIndex = 0;
        this.dateRange.each(function(dt,i) {
		if(dt.getTime() == findDate) {
		    cellIndex = i;
		    throw $break;
		}
	    });
        return cellIndex;
    },
    /*------------------------------- PUBLIC -------------------------------*/        
    destroy: function(){
        this._emptyCells();
        if(this.table) { 
            this.table.remove();
        } else {
            this.cal_weeks_wrapper.remove();
        }
	this.controls.descendants().invoke('stopObserving');
        [this.cal_wrapper,this.controls].invoke('remove');
    },
    setCurrentDate: function(direction){
        this[(direction instanceof Date) ? '_update' : '_switchCal'](direction);
        if(!arguments[1]) { this._updateExternal(); }
        return this.currentdate; 
    },
    toggleCalendar: function(){
        this.options[this.element.visible() ? 'closeeffect' : 'openeffect'](this.element, {duration: 0.5});
    },
    getElementByDate: function(d) {
        return this.cells[this._getCellIndexByDate(d)];
    },
    getElementsByWeek: function(week) {
        return this.element.select('.weekbox:nth-of-type(' + (week + 1) + ') .daybox:not(.dayboxname)');
    },
    getSelectedElement: function() {
        return this.element.select('.dayselected')[0];
    },
    getTodaysElement: function() {
        return this.element.select('.today')[0];
    },
    getDateByElement: function(element) {
        return this.dateRange[this.cells.indexOf(element)];
    },
    /*------------------------------- PLUG-IN PLACEHOLDERS -------------------------------*/            
    _setupPlanner: Prototype.emptyFunction,
    _updatePlanner: Prototype.emptyFunction,
    /*------------------------------- DEPRECATED -------------------------------*/            
    openCalendar: function(){ 
        if(!this.isOpen()){ this.toggleCalendar(); }
    },
    closeCalendar: function(){ 
        if(this.isOpen()){ this.toggleCalendar(); }
    },
    isOpen: function(){ 
        return this.element.visible();
    }
};

////////////////////////////////////////////////////////////////////////////////////////

var calendar = null;
function showCalendar(element, finput)            
{
    
    if (calendar) {
	calendar.closeCalendar();
        calendar = null;
	$(element).update();
    }
    else
	{
	    calendar = new scal(element, finput, {closebutton:'x',updateformat:'yyyy-mm-dd'});
	    
	    /*	    calendar = new scal(element, finput, 
		    {
		    updateformat: 'yyyy-mm-dd', 
		    closebutton: 'x', 
		    }); 
	    */

	    //    calendar.setCurrentDate(isNaN(date) ? new Date() : new Date($F(input));
	    //    calendar.setCurrentDate(new Date());
	    calendar.openCalendar();
	    //Effect.Grow(element);
	}
    
};


function showCalendarWithTime(element, finput)            
{
    
    if (calendar) {
	calendar.closeCalendar();
        calendar = null;
	$(element).update();
    }
    else
	{
	    calendar = new scal(element, finput, 
{
 closebutton:'x',
 updateformat:'yyyy-mm-dd',
 weekdaystart: 1
});
	    
	    /*	    calendar = new scal(element, finput, 
		    {
		    updateformat: 'yyyy-mm-dd', 
		    closebutton: 'x', 
		    }); 
	    */

	    //    calendar.setCurrentDate(isNaN(date) ? new Date() : new Date($F(input));
	    //    calendar.setCurrentDate(new Date());
	    calendar.openCalendar();
	    //Effect.Grow(element);
	}
    
};


//////////////////////////////////////////////////////////////////

//Javascript name: My Date Time Picker
//Date created: 16-Nov-2003 23:19
//Scripter: TengYong Ng
//Website: http://www.rainforestnet.com
//Copyright (c) 2003 TengYong Ng
//FileName: DateTimePicker.js
//Version: 0.8
//Contact: contact@rainforestnet.com
// Note: Permission given to use this script in ANY kind of applications if
//       header lines are left unchanged.

//Global variables
var winCal;
var dtToday=new Date();
var Cal;
var docCal;
var MonthName=["Januari", "Februari", "Mars", "April", "Maj", "Juni","Juli", 
	"Augusti", "September", "Oktober", "November", "December"];
var WeekDayName=["Son", "Man", "Tis","Ons","Tor","Fre","Lor"];	
var exDateTime;//Existing Date and Time

//Configurable parameters
var cnTop="200";//top coordinate of calendar window.
var cnLeft="500";//left coordinate of calendar window
var WindowTitle ="DateTime Picker";//Date Time Picker title.
var WeekChar=2;//number of character for week day. if 2 then Mo,Tu,We. if 3 then Mon,Tue,Wed.
var CellWidth=20;//Width of day cell.
var DateSeparator="-";//Date Separator, you can change it to "/" if you want.
var TimeMode=24;//default TimeMode value. 12 or 24

var ShowLongMonth=true;//Show long month name in Calendar header. example: "January".
var ShowMonthYear=true;//Show Month and Year in Calendar header.
var MonthYearColor="#cc0033";//Font Color of Month and Year in Calendar header.
var WeekHeadColor="#0099CC";//Background Color in Week header.
var SundayColor="#6699FF";//Background color of Sunday.
var SaturdayColor="#CCCCFF";//Background color of Saturday.
var WeekDayColor="white";//Background color of weekdays.
var FontColor="blue";//color of font in Calendar day cell.
var TodayColor="#FFFF33";//Background color of today.
var SelDateColor="#FFFF99";//Backgrond color of selected date in textbox.
var YrSelColor="#cc0033";//color of font of Year selector.
var ThemeBg="";//Background image of Calendar window.
//end Configurable parameters
//end Global variable

function NewCal(pCtrl,pFormat,pShowTime,pTimeMode)
{
	Cal=new Calendar(dtToday);
	if ((pShowTime!=null) && (pShowTime))
	{
		Cal.ShowTime=true;
		if ((pTimeMode!=null) &&((pTimeMode=='12')||(pTimeMode=='24')))
		{
			TimeMode=pTimeMode;
		}		
	}	
	if (pCtrl!=null)
		Cal.Ctrl=pCtrl;
	if (pFormat!=null)
		Cal.Format=pFormat.toUpperCase();
	
	exDateTime=document.getElementById(pCtrl).value;
	if (exDateTime!="")//Parse Date String
	{
		var Sp1;//Index of Date Separator 1
		var Sp2;//Index of Date Separator 2 
		var tSp1;//Index of Time Separator 1
		var tSp1;//Index of Time Separator 2
		var strMonth;
		var strDate;
		var strYear="";
		var intMonth;
		var YearPattern;
		var strHour;
		var strMinute;
		var strSecond;
		//parse month
		Sp1=exDateTime.indexOf(DateSeparator,0)
		Sp2=exDateTime.indexOf(DateSeparator,(parseInt(Sp1)+1));
		
		if ((Cal.Format.toUpperCase()=="DDMMYYYY") || (Cal.Format.toUpperCase()=="DDMMMYYYY"))
		{
			strMonth=exDateTime.substring(Sp1+1,Sp2);
			strDate=exDateTime.substring(0,Sp1);
		}
		if ((Cal.Format.toUpperCase()=="YYYYMMDD"))
		{
		    strYear=exDateTime.slice(0,Sp1);
		    strMonth=exDateTime.substring(Sp1+1,Sp2);
		    strDate=exDateTime.substring(Sp2+1,Sp2+3);
		}
		else if ((Cal.Format.toUpperCase()=="MMDDYYYY") || (Cal.Format.toUpperCase()=="MMMDDYYYY"))
		{
			strMonth=exDateTime.substring(0,Sp1);
			strDate=exDateTime.substring(Sp1+1,Sp2);
		}
		if (isNaN(strMonth))
			intMonth=Cal.GetMonthIndex(strMonth);
		else
			intMonth=parseInt(strMonth,10)-1;	
		if ((parseInt(intMonth,10)>=0) && (parseInt(intMonth,10)<12))
			Cal.Month=intMonth;
		//end parse month
		//parse Date
		if ((parseInt(strDate,10)<=Cal.GetMonDays()) && (parseInt(strDate,10)>=1))
			Cal.Date=strDate;
		//end parse Date
		//parse year
		if (strYear == "")
		    strYear=exDateTime.substring(Sp2+1,Sp2+5);
		YearPattern=/^\d{4}$/;
		if (YearPattern.test(strYear))
			Cal.Year=parseInt(strYear,10);
		//end parse year
		//parse time
		if (Cal.ShowTime==true)
		{
			tSp1=exDateTime.indexOf(":",0)
			tSp2=exDateTime.indexOf(":",(parseInt(tSp1)+1));
			strHour=exDateTime.substring(tSp1,(tSp1)-2);
			Cal.SetHour(strHour);
			strMinute=exDateTime.substring(tSp1+1,tSp2);
			Cal.SetMinute(strMinute);
			strSecond=exDateTime.substring(tSp2+1,tSp2+3);
			Cal.SetSecond(strSecond);
		}	
	}
	winCal=window.open("","DateTimePicker","toolbar=0,status=0,menubar=0,fullscreen=no,width=320,height=240,resizable=0,top="+cnTop+",left="+cnLeft);
	docCal=winCal.document;
	RenderCal();
}

function RenderCal()
{
	var vCalHeader;
	var vCalData;
	var vCalTime;
	var i;
	var j;
	var SelectStr;
	var vDayCount=0;
	var vFirstDay;

	docCal.open();
	docCal.writeln("<html><head><title>"+WindowTitle+"</title>");
	docCal.writeln("<script>var winMain=window.opener;</script>");
	docCal.writeln("</head><body background='"+ThemeBg+"' link="+FontColor+" vlink="+FontColor+"><form name='Calendar'>");

	vCalHeader="<table border=1 cellpadding=1 cellspacing=1 width='100%' align=\"center\" valign=\"top\">\n";
	//Month Selector
	vCalHeader+="<tr>\n<td colspan='7'><table border=0 width='100%' cellpadding=0 cellspacing=0><tr><td align='left'>\n";
	vCalHeader+="<select name=\"MonthSelector\" onChange=\"javascript:winMain.Cal.SwitchMth(this.selectedIndex);winMain.RenderCal();\">\n";
	for (i=0;i<12;i++)
	{
		if (i==Cal.Month)
			SelectStr="Selected";
		else
			SelectStr="";	
		vCalHeader+="<option "+SelectStr+" value >"+MonthName[i]+"\n";
	}
	vCalHeader+="</select></td>";
	//Year selector
	vCalHeader+="\n<td align='right'><a href=\"javascript:winMain.Cal.DecYear();winMain.RenderCal()\"><b><font color=\""+YrSelColor+"\"><</font></b></a><font face=\"Verdana\" color=\""+YrSelColor+"\" size=2><b> "+Cal.Year+" </b></font><a href=\"javascript:winMain.Cal.IncYear();winMain.RenderCal()\"><b><font color=\""+YrSelColor+"\">></font></b></a></td></tr></table></td>\n";	
	vCalHeader+="</tr>";
	//Calendar header shows Month and Year
	if (ShowMonthYear)
		vCalHeader+="<tr><td colspan='7'><font face='Verdana' size='2' align='center' color='"+MonthYearColor+"'><b>"+Cal.GetMonthName(ShowLongMonth)+" "+Cal.Year+"</b></font></td></tr>\n";
	//Week day header
	vCalHeader+="<tr bgcolor="+WeekHeadColor+">";
	for (i=0;i<7;i++)
	{
		vCalHeader+="<td align='center'><font face='Verdana' size='2'>"+WeekDayName[i].substr(0,WeekChar)+"</font></td>";
	}
	vCalHeader+="</tr>";	
	docCal.write(vCalHeader);
	
	//Calendar detail
	CalDate=new Date(Cal.Year,Cal.Month);
	CalDate.setDate(1);
	vFirstDay=CalDate.getDay();
	vCalData="<tr>";
	for (i=0;i<vFirstDay;i++)
	{
		vCalData=vCalData+GenCell();
		vDayCount=vDayCount+1;
	}
	for (j=1;j<=Cal.GetMonDays();j++)
	{
		var strCell;
		vDayCount=vDayCount+1;
		if ((j==dtToday.getDate())&&(Cal.Month==dtToday.getMonth())&&(Cal.Year==dtToday.getFullYear()))
			strCell=GenCell(j,true,TodayColor);//Highlight today's date
		else
		{
			if (j==Cal.Date)
			{
				strCell=GenCell(j,true,SelDateColor);
			}
			else
			{	 
				if (vDayCount%7==0)
					strCell=GenCell(j,false,SaturdayColor);
				else if ((vDayCount+6)%7==0)
					strCell=GenCell(j,false,SundayColor);
				else
					strCell=GenCell(j,null,WeekDayColor);
			}		
		}						
		vCalData=vCalData+strCell;

		if((vDayCount%7==0)&&(j<Cal.GetMonDays()))
		{
			vCalData=vCalData+"</tr>\n<tr>";
		}
	}
	docCal.writeln(vCalData);	
	//Time picker
	if (Cal.ShowTime)
	{
		var showHour;
		showHour=Cal.getShowHour();		
		vCalTime="<tr>\n<td colspan='7' align='center'>";
		vCalTime+="<input type='text' name='hour' maxlength=2 size=1 style=\"WIDTH: 22px\" value="+showHour+" onchange=\"javascript:winMain.Cal.SetHour(this.value)\">";
		vCalTime+=" : ";
		vCalTime+="<input type='text' name='minute' maxlength=2 size=1 style=\"WIDTH: 22px\" value="+Cal.Minutes+" onchange=\"javascript:winMain.Cal.SetMinute(this.value)\">";
		vCalTime+=" : ";
		vCalTime+="<input type='text' name='second' maxlength=2 size=1 style=\"WIDTH: 22px\" value="+Cal.Seconds+" onchange=\"javascript:winMain.Cal.SetSecond(this.value)\">";
		if (TimeMode==12)
		{
			var SelectAm =(parseInt(Cal.Hours,10)<12)? "Selected":"";
			var SelectPm =(parseInt(Cal.Hours,10)>=12)? "Selected":"";

			vCalTime+="<select name=\"ampm\" onchange=\"javascript:winMain.Cal.SetAmPm(this.options[this.selectedIndex].value);\">";
			vCalTime+="<option "+SelectAm+" value=\"AM\">AM</option>";
			vCalTime+="<option "+SelectPm+" value=\"PM\">PM<option>";
			vCalTime+="</select>";
		}	
		vCalTime+="\n</td>\n</tr>";
		docCal.write(vCalTime);
	}	
	//end time picker
	docCal.writeln("\n</table>");
	docCal.writeln("</form></body></html>");
	docCal.close();
}

function GenCell(pValue,pHighLight,pColor)//Generate table cell with value
{
	var PValue;
	var PCellStr;
	var vColor;
	var vHLstr1;//HighLight string
	var vHlstr2;
	var vTimeStr;
	
	if (pValue==null)
		PValue="";
	else
		PValue=pValue;
	
	if (pColor!=null)
		vColor="bgcolor=\""+pColor+"\"";
	else
		vColor="";	
	if ((pHighLight!=null)&&(pHighLight))
		{vHLstr1="color='red'><b>";vHLstr2="</b>";}
	else
		{vHLstr1=">";vHLstr2="";}	
	
	if (Cal.ShowTime)
	{
		vTimeStr="winMain.document.getElementById('"+Cal.Ctrl+"').value+=' '+"+"winMain.Cal.getShowHour()"+"+':'+"+"winMain.Cal.Minutes"+"+':'+"+"winMain.Cal.Seconds";
		if (TimeMode==12)
			vTimeStr+="+' '+winMain.Cal.AMorPM";
	}	
	else
		vTimeStr="";		
	PCellStr="<td "+vColor+" width="+CellWidth+" align='center'><font face='verdana' size='2'"+vHLstr1+"<a href=\"javascript:winMain.document.getElementById('"+Cal.Ctrl+"').value='"+Cal.FormatDate(PValue)+"';"+vTimeStr+";window.close();\">"+PValue+"</a>"+vHLstr2+"</font></td>";
	return PCellStr;
}

function Calendar(pDate,pCtrl)
{
	//Properties
	this.Date=pDate.getDate();//selected date
	this.Month=pDate.getMonth();//selected month number
	this.Year=pDate.getFullYear();//selected year in 4 digits
	this.Hours=pDate.getHours();	
	
	if (pDate.getMinutes()<10)
		this.Minutes="0"+pDate.getMinutes();
	else
		this.Minutes=pDate.getMinutes();
	
	if (pDate.getSeconds()<10)
		this.Seconds="0"+pDate.getSeconds();
	else		
		this.Seconds=pDate.getSeconds();
		
	this.MyWindow=winCal;
	this.Ctrl=pCtrl;
	this.Format="ddMMyyyy";
	this.Separator=DateSeparator;
	this.ShowTime=false;
	if (pDate.getHours()<12)
		this.AMorPM="AM";
	else
		this.AMorPM="PM";	
}

function GetMonthIndex(shortMonthName)
{
    if (shortMonthName == undefined) return 0;
    //    alert(shortMonthName);

	for (i=0;i<12;i++)
	{
		if (MonthName[i].substring(0,3).toUpperCase()==shortMonthName.toUpperCase())
		{	return i;}
	}
}
Calendar.prototype.GetMonthIndex=GetMonthIndex;

function IncYear()
{	Cal.Year++;}
Calendar.prototype.IncYear=IncYear;

function DecYear()
{	Cal.Year--;}
Calendar.prototype.DecYear=DecYear;
	
function SwitchMth(intMth)
{	Cal.Month=intMth;}
Calendar.prototype.SwitchMth=SwitchMth;

function SetHour(intHour)
{	
	var MaxHour;
	var MinHour;
	if (TimeMode==24)
	{	MaxHour=23;MinHour=0}
	else if (TimeMode==12)
	{	MaxHour=12;MinHour=1}
	else
		alert("TimeMode can only be 12 or 24");		
	var HourExp=new RegExp("^\\d\\d$");
	if (HourExp.test(intHour) && (parseInt(intHour,10)<=MaxHour) && (parseInt(intHour,10)>=MinHour))
	{	
		if ((TimeMode==12) && (Cal.AMorPM=="PM"))
		{
			if (parseInt(intHour,10)==12)
				Cal.Hours=12;
			else	
				Cal.Hours=parseInt(intHour,10)+12;
		}	
		else if ((TimeMode==12) && (Cal.AMorPM=="AM"))
		{
			if (intHour==12)
				intHour-=12;
			Cal.Hours=parseInt(intHour,10);
		}
		else if (TimeMode==24)
			Cal.Hours=parseInt(intHour,10);	
	}
}
Calendar.prototype.SetHour=SetHour;

function SetMinute(intMin)
{
	var MinExp=new RegExp("^\\d\\d$");
	if (MinExp.test(intMin) && (intMin<60))
		Cal.Minutes=intMin;
}
Calendar.prototype.SetMinute=SetMinute;

function SetSecond(intSec)
{	
	var SecExp=new RegExp("^\\d\\d$");
	if (SecExp.test(intSec) && (intSec<60))
		Cal.Seconds=intSec;
}
Calendar.prototype.SetSecond=SetSecond;

function SetAmPm(pvalue)
{
	this.AMorPM=pvalue;
	if (pvalue=="PM")
	{
		this.Hours=(parseInt(this.Hours,10))+12;
		if (this.Hours==24)
			this.Hours=12;
	}	
	else if (pvalue=="AM")
		this.Hours-=12;	
}
Calendar.prototype.SetAmPm=SetAmPm;

function getShowHour()
{
	var finalHour;
    if (TimeMode==12)
    {
    	if (parseInt(this.Hours,10)==0)
		{
			this.AMorPM="AM";
			finalHour=parseInt(this.Hours,10)+12;	
		}
		else if (parseInt(this.Hours,10)==12)
		{
			this.AMorPM="PM";
			finalHour=12;
		}		
		else if (this.Hours>12)
		{
			this.AMorPM="PM";
			if ((this.Hours-12)<10)
				finalHour="0"+((parseInt(this.Hours,10))-12);
			else
				finalHour=parseInt(this.Hours,10)-12;	
		}
		else
		{
			this.AMorPM="AM";
			if (this.Hours<10)
				finalHour="0"+parseInt(this.Hours,10);
			else
				finalHour=this.Hours;	
		}
	}
	else if (TimeMode==24)
	{
		if (this.Hours<10)
			finalHour="0"+parseInt(this.Hours,10);
		else	
			finalHour=this.Hours;
	}	
	return finalHour;	
}				
Calendar.prototype.getShowHour=getShowHour;		

function GetMonthName(IsLong)
{
	var Month=MonthName[this.Month];
	if (IsLong)
		return Month;
	else
		return Month.substr(0,3);
}
Calendar.prototype.GetMonthName=GetMonthName;

function GetMonDays()//Get number of days in a month
{
	var DaysInMonth=[31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
	if (this.IsLeapYear())
	{
		DaysInMonth[1]=29;
	}	
	return DaysInMonth[this.Month];	
}
Calendar.prototype.GetMonDays=GetMonDays;

function IsLeapYear()
{
	if ((this.Year%4)==0)
	{
		if ((this.Year%100==0) && (this.Year%400)!=0)
		{
			return false;
		}
		else
		{
			return true;
		}
	}
	else
	{
		return false;
	}
}
Calendar.prototype.IsLeapYear=IsLeapYear;

function FormatDate(pDate)
{
	if (this.Format.toUpperCase()=="DDMMYYYY")
		return (pDate+DateSeparator+(this.Month+1)+DateSeparator+this.Year);
	else if (this.Format.toUpperCase()=="DDMMMYYYY")
		return (pDate+DateSeparator+this.GetMonthName(false)+DateSeparator+this.Year);
	else if (this.Format.toUpperCase()=="MMDDYYYY")
		return ((this.Month+1)+DateSeparator+pDate+DateSeparator+this.Year);
	else if (this.Format.toUpperCase()=="MMMDDYYYY")
		return (this.GetMonthName(false)+DateSeparator+pDate+DateSeparator+this.Year);			
	else if (this.Format.toUpperCase()=="YYYYMMDD")
		return (this.Year+DateSeparator+(this.Month+1)+DateSeparator+pDate);			
}

Calendar.prototype.FormatDate=FormatDate;	


function Set_Cookie( name, value, expires, path, domain, secure )
{
// set time, it's in milliseconds
var today = new Date();
today.setTime( today.getTime() );

if ( expires )
{
expires = expires * 1000 * 60 * 60 * 24;
}
var expires_date = new Date( today.getTime() + (expires) );

document.cookie = name + "=" +escape( value ) +
( ( expires ) ? ";expires=" + expires_date.toGMTString() : "" ) +
( ( path ) ? ";path=" + path : "" ) +
( ( domain ) ? ";domain=" + domain : "" ) +
( ( secure ) ? ";secure" : "" );
}


// this fixes an issue with the old method, ambiguous values
// with this test document.cookie.indexOf( name + "=" );
function Get_Cookie( check_name ) {
	// first we'll split this cookie up into name/value pairs
	// note: document.cookie only returns name=value, not the other components
	var a_all_cookies = document.cookie.split( ';' );
	var a_temp_cookie = '';
	var cookie_name = '';
	var cookie_value = '';
	var b_cookie_found = false; // set boolean t/f default f

	for ( i = 0; i < a_all_cookies.length; i++ )
	{
		// now we'll split apart each name=value pair
		a_temp_cookie = a_all_cookies[i].split( '=' );

		// and trim left/right whitespace while we're at it
		cookie_name = a_temp_cookie[0].replace(/^\s+|\s+$/g, '');

		// if the extracted name matches passed check_name
		if ( cookie_name == check_name )
		{
			b_cookie_found = true;
			// we need to handle case where cookie has no value but exists (no = sign, that is):
			if ( a_temp_cookie.length > 1 )
			{
				cookie_value = unescape( a_temp_cookie[1].replace(/^\s+|\s+$/g, '') );
			}
			// note that in cases where cookie is initialized but no value, null is returned
			return cookie_value;
			break;
		}
		a_temp_cookie = null;
		cookie_name = '';
	}
	if ( !b_cookie_found )
	{
		return null;
	}
}
