/*
 Copyright 2011, Henk Verouden.
 This is not open source.
*/
function DataCon(c){this.file=c.file;this.options=c;this.afterLoad=!1;this.binds=[];return this}DataCon.prototype.bind=function(c){this.binds.push(c)};DataCon.prototype.refresh=function(){this.load(this.lastLoadParams)};DataCon.prototype.load=function(c){this.callServer("load",c)};DataCon.prototype.save=function(){for(var c=this,b=[],a=0;a<c.binds.length;a++)c.binds[a].getChanged&&c.binds[a].getChanged(b);c.callServer("save",b,function(){c.refresh()})};
DataCon.prototype.callServer=function(c,b,a){var d=this,f={ct:c,data:b};if(c=="load"){for(var e=0;e<d.binds.length;e++)d.binds[e].beforeLoad&&d.binds[e].beforeLoad();d.lastLoadParams=b}else if(d.lastLoadParams)f.ld=d.lastLoadParams;$.ajax({url:d.file,dataType:"json",type:"post",data:f,success:function(b){for(var e=0;e<d.binds.length;e++)d.binds[e].callback&&d.binds[e].callback(c,b);a&&a();c=="load"&&d.afterLoad&&d.afterLoad(b)},error:function(b){a&&a();alert("Error: "+b.responseText)}})};
function DataTab(c,b){var a=this;b||(b={});a.options=b;a.rd=b.rd;a.$parentDiv=$(c).empty().addClass("hvwDataTab");a.$tabHead=$("<table class='hvwDefault'>");a.$tabBody=$("<table class='hvwDefault'>");var d=$("<div class='hvwHeaderTabDiv'>").append(a.$tabHead),f=$("<div class='hvwBodyTabDiv'>").append(a.$tabBody);a.$parentDiv.append(d).append(f);a.columns=[];a.dataNav=null;a.$domCols=$("<colgroup>");a.$tabBody.append(a.$domCols);a.$domHead=$("<thead>");a.$tabHead.append(a.$domHead);a.$domHeadTr=$("<tr>");
a.$domHead.append(a.$domHeadTr);a.$domBody=$("<tbody>");a.$tabBody.append(a.$domBody);setupInputEvents(a.$domBody,function(b){b.addClass("updated").closest("tr").addClass("updated");a.dataNav&&a.dataNav.highLightSave()});a.$domBody.delegate("a[name=del]","click",function(){$(this).toggleClass("down").closest("tr").toggleClass("deleted");a.dataNav&&a.dataNav.highLightSave()}).delegate("a[name=btn]","click",function(){var b=a.getColumn($(this).closest("td").attr("name"));b.options.data.onClick(this,
b,$(this).closest("tr"))}).resize(function(){var b=null,c=null,d=a.$tabHead.find("tr:first td"),f,i;a.$tabBody.find("tr:first td").each(function(a){b=$(d[a]);c=$(this);c.is(":visible")&&(f=b.find("div"),i={width:c.find("div").width(),paddingRight:0},f.css(i))});b&&(f=b.find("div"),f.css("paddingRight",$.getScrollbarWidth()))});return a}DataTab.prototype.removeRows=function(){this.$domBody.empty()};DataTab.prototype.Column=function(){this.name="";this.options={};return this};
DataTab.prototype.getColumn=function(c){for(var b in this.columns)if(this.columns[b].name==c)return this.columns[b]};
DataTab.prototype.addColumn=function(c){var b=this,a=new b.Column;b.columns.push(a);a.options=c;a.name=c.name;a.hidden=c.hidden;c="";a.hidden&&(c="hidden ");a.options.title.className&&(c+=a.options.title.className);b.$domCols.append("<col name='"+a.name+"'>");b.$domHeadTr.append(c=$("<td name='"+a.name+"'"+(c==""?"":"class='"+c+"'")+"><div>"+a.options.title.label+"</div></td>"));b.$domHeadTr.css("cursor","col-resize");c.draggable({axis:"x",helper:"clone",revert:!0,revertDuration:0,start:function(){var a=
$(this).index();b.$parentDiv.find("tr").each(function(){$(this).find("td:eq("+a+")").addClass("colDrag")})},stop:function(){b.$parentDiv.find(".colDrag").removeClass("colDrag")}});c.droppable({over:function(a,c){if(!b.busyDragging){b.busyDragging=!0;var e=c.draggable.index(),g=$(this).index(),h=b.columns[e];e>=g?(b.columns.splice(g,0,h),b.columns.splice(e+1,1)):(b.columns.splice(g+1,0,h),b.columns.splice(e,1));b.$parentDiv.find("tr").each(function(a,b){var c=$(b),d=c.find("td.colDrag"),c=c.find("td").eq(g);
e>=g?d.insertBefore(c):d.insertAfter(c)});b.busyDragging=!1;b.$domBody.resize()}}});return a};DataTab.prototype.beforeLoad=function(){this.$domBody.html("...")};DataTab.prototype.callback=function(c,b){c=="load"&&this.removeRows();if(b!=null){var a,d;a=this.rd?b[this.rd]:b;if(!(typeof a=="undefined"||(d=a.length)==0)&&c=="load"){for(row=0;row<d;row++)this.addRow(a[row]),row==0&&this.$domBody.resize();this.$domBody.resize()}}};
DataTab.prototype.addRow=function(c){var b=this,a,d="",f=$("<tr>");f.data("serverData",c);for(var e=0;e<b.columns.length;e++){a=b.columns[e];d="";switch(a.options.data.fieldType){case "txt":d="<div class='txt'></div>";break;case "iTxt":d="<input type='text'>";break;case "free":a.options.data.create&&(txtField=a.options.data.create());break;case "iCB":d="<input type='checkbox'>";break;case "sort":c||b.$domBody.addClass("sortChanged");d="<input type='hidden' name='sort'><img src='hvwTools/dt/img/sort.png'>";
b.$domBody.sortable({axis:"y",option:"tr",cancel:"td[name!=sort]",stop:function(a,c){c.item.addClass("updated");b.$domBody.addClass("sortChanged");b.dataNav&&b.dataNav.highLightSave()}});break;case "del":d="<a class='navBtn' name='del'><img src='hvwTools/dt/img/delete.png'></a>";break;case "iMemo":d="<input type='hidden'>";case "btn":d+="<a class='navBtn "+(a.options.data.classNames?a.options.data.classNames:"")+"' name='btn'><img src='"+a.options.data.img+"'></a>"}a=$("<td name='"+a.name+"' "+(a.hidden?
"class='hidden'":"")+"><div>"+d+"</div>");f.append(a)}c&&b.fillFields(f,c);b.$domBody.append(f);if(b.options&&b.options.onNewRecord)b.options.onNewRecord(f,c);return f};
DataTab.prototype.fillFields=function(c,b){for(var a,d=0;d<this.columns.length;d++)if(a=this.columns[d],typeof b[a.name]!="undefined")switch(a.options.data.fieldType){case "iTxt":case "iMemo":c.find("td:eq("+d+") input").val(b[a.name]);break;case "free":a.options.data.fill&&a.options.data.fill(c.find("td:eq("+d+")"),b);break;case "txt":c.find("td:eq("+d+")").html("<div class='txt'>"+b[a.name]+"</div>");case "iCB":b[a.name]==1?c.find("td:eq("+d+") input").attr("checked","checked"):c.find("td:eq("+
d+") input").removeAttr("checked")}};
DataTab.prototype.getChanged=function(c){var b=this;b.dataNav&&b.dataNav.disableSave();if(b.$domBody.hasClass("sortChanged")){var a=0;b.$domBody.find("tr").each(function(){$(this).addClass("updated").find("input[name=sort]").val(a++).addClass("updated")})}b.$domBody.find("tr.updated, tr.deleted").each(function(){var a=$(this),f=a.data("serverData"),e={},g=!1,h;if(f&&typeof f.id!="undefined")e.id=f.id;if(a.hasClass("deleted")){if(typeof e.id!="undefined")e.deleted=1,g=!0}else a.find(".updated").each(function(){$this=
$(this);var a=$this.closest("td").attr("name");$col=b.getColumn(a);if($col.options.data.beforeSave)h!=a&&($col.options.data.beforeSave(e,$this.closest("td")),h=a);else{$this.attr("type");var c;c=$this.attr("type")=="checkbox"?$this.is(":checked")?1:0:$this.val();e[a]=c}g=g||!(a=="sort"&&typeof e.id=="undefined")});g&&c.push(e)})};
function DataNav(c,b,a,d){this.$domObject=$(c).addClass("hvwDataNav");this.$refreshBtn=$("<a class='navBtn center disabled'><img src='hvwTools/dt/img/refresh.png'><br>"+aLang.dnBtnRefresh+"</a>");this.$domObject.append(this.$refreshBtn);this.$domObject.append(" ");if(!d)this.$addBtn=$("<a class='navBtn center disabled'><img src='hvwTools/dt/img/add.png'><br>"+aLang.dnBtnAdd+"</a>"),this.$domObject.append(this.$addBtn),this.$domObject.append(" ");this.$saveBtn=$("<a class='navBtn center disabled'><img src='hvwTools/dt/img/save.png'><br>"+
aLang.dnBtnSave+"</a>");this.$domObject.append(this.$saveBtn);this.bind(b,a);return this}
DataNav.prototype.bind=function(c,b){var a=this;a.$refreshBtn.unbind("click");a.$addBtn&&a.$addBtn.unbind("click");c&&(a.$refreshBtn.bind("click",function(){c.refresh();a.disableSave()}).removeClass("disabled"),a.$saveBtn.bind("click",function(){a.$saveBtn.hasClass("disabled")||c.save()}));if(b)a.$addBtn&&a.$addBtn.bind("click",function(){var a=b.addRow();$(a.parent()).scrollTop(a.position().top+a.height());a.find("input[type=text]:first").focus()}).removeClass("disabled"),b.dataNav=a};
DataNav.prototype.highLightSave=function(){this.$saveBtn.removeClass("disabled").addClass("highLight")};DataNav.prototype.disableSave=function(){this.$saveBtn.addClass("disabled").removeClass("highLight")};function setupInputEvents(c,b){c.delegate("input","keydown",function(a){a=a.keyCode;(a>47||a==32||a==32||a==46||a==8)&&b($(this))}).delegate("input, select","change",function(){b($(this))})};
