diff --git a/.idea/deployment.xml b/.idea/deployment.xml
new file mode 100644
index 0000000..ce20129
--- /dev/null
+++ b/.idea/deployment.xml
@@ -0,0 +1,4 @@
+
+
+
+
\ No newline at end of file
diff --git a/.idea/desayuno.iml b/.idea/desayuno.iml
new file mode 100644
index 0000000..d6ebd48
--- /dev/null
+++ b/.idea/desayuno.iml
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/misc.xml b/.idea/misc.xml
new file mode 100644
index 0000000..28a804d
--- /dev/null
+++ b/.idea/misc.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/modules.xml b/.idea/modules.xml
new file mode 100644
index 0000000..47d1fcb
--- /dev/null
+++ b/.idea/modules.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/workspace.xml b/.idea/workspace.xml
new file mode 100644
index 0000000..4c8203c
--- /dev/null
+++ b/.idea/workspace.xml
@@ -0,0 +1,434 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ sistema
+ enviar
+ faltantes
+ env
+ comple
+ completos
+ guardad
+ correc
+ datos
+ REPORT
+ desplie
+ correo
+ folio
+ edit
+ pa
+ email
+ ingresa
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1558548895583
+
+
+ 1558548895583
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/nbproject/private/private.properties b/nbproject/private/private.properties
new file mode 100644
index 0000000..45b16ed
--- /dev/null
+++ b/nbproject/private/private.properties
@@ -0,0 +1,9 @@
+copy.src.files=false
+copy.src.on.open=false
+copy.src.target=
+index.file=index.php
+remote.connection=orion-5329d5
+remote.directory=/desayuno
+remote.upload=ON_SAVE
+run.as=REMOTE
+url=http://orion.acatlan.unam.mx/desayuno/
diff --git a/nbproject/project.properties b/nbproject/project.properties
new file mode 100644
index 0000000..76f6f91
--- /dev/null
+++ b/nbproject/project.properties
@@ -0,0 +1,7 @@
+include.path=${php.global.include.path}
+php.version=PHP_56
+source.encoding=UTF-8
+src.dir=.
+tags.asp=false
+tags.short=false
+web.root=.
diff --git a/nbproject/project.xml b/nbproject/project.xml
new file mode 100644
index 0000000..37aa88a
--- /dev/null
+++ b/nbproject/project.xml
@@ -0,0 +1,9 @@
+
+
+ org.netbeans.modules.php.project
+
+
+ o_desayuno
+
+
+
diff --git a/public_html/actualizar.php b/public_html/actualizar.php
new file mode 100644
index 0000000..d6a2e9d
--- /dev/null
+++ b/public_html/actualizar.php
@@ -0,0 +1,30 @@
+
+
+
+
+
+
+
+
+ Aviso de privacidad
+ En cumplimiento a lo establecido por el Reglamento de Transparencia, Acceso a la Información Pública y Protección de Datos Personales para la Universidad Nacional Autónoma de México, con domicilio en Av. Universidad No. Exterior 3000, Colonia Universidad Nacional Autónoma de México C. U., Delegación Coyoacán, CP. 04510, México Distrito Federal, es la única responsable de la protección y tratamiento de tus datos personales.
+ Los datos personales que se solicitarán son nombre completo y correo electrónico, y serán utilizados única y exclusivamente para dar un seguimiento personalizado a las solicitudes de información de sitios "bajo dominio acatlan.unam.mx". Asimismo, informamos que tus datos personales no serán transferidos o tratados por personas distintas a la UNAM.
+ Tus datos personales han sido otorgados voluntariamente y la actualización y autenticidad de los mismos son tu responsabilidad. Si deseas ejercer cualquiera de los derechos de acceso, rectificación, cancelación u oposición, así como revocar el consentimiento para el tratamiento de los mismos, puedes solicitarlo a través del correo electrónico privacidad@apolo.acatlan.unam.mx.
+ Te informamos que en nuestra página web utilizamos cookies y otras tecnologías analíticas, a través de las cuales es posible brindarte un mejor servicio y experiencia al navegar en nuestra página, la información que se obtiene es totalmente anónima y no permite identificarte. Si no quieres que haya cookies actuando en tu interacción con las páginas del portal, puedes deshabilitarlas desde el navegador, considerando que podrán producirse limitaciones en cuanto a la funcionalidad del sitio web.
+ Cualquier modificación a este aviso de privacidad podrás consultarlo en la presente sección.
+
+
+AddPage();
+ //$pdf->Image("images/logo_dsc.png", 5, 5, 0, 0);
+
+ //$pdf->SetFont('Arial','B',12);
+ //$pdf->Cell(0, 0, utf8_decode('Fecha de solicitud:')." ".$fecha, 0, 1, 'R');
+ //$pdf->ln(8);
+ //$pdf->SetFont('Arial','B',12);
+ //$pdf->Cell(0, 0, utf8_decode('Número de solicitud:')." ".$datos['id_registro'], 0, 1, 'R');
+ $pdf->ln(10);
+ $pdf->SetFont('Arial', 'B', 12);
+ $pdf->Cell(0, 0, utf8_decode('Nombre:'), 0, 1, 'L');
+ $pdf->SetFont('Arial', '', 12);
+ $pdf->Cell(0, 0, utf8_decode($datos['nombre_completo']), 0, 1, 'C');
+
+ /*
+ $pdf->ln(10);
+ $pdf->SetFont('Arial', 'B', 12);
+ $pdf->Cell(0, 0, utf8_decode('e-mail:'), 0, 1, 'L');
+ $pdf->SetFont('Arial', '', 12);
+ $pdf->Cell(0, 0, $datos['correo'], 0, 1, 'C');
+ */
+
+ $pdf->ln(10);
+ $pdf->SetFont('Arial', 'B', 12);
+ $pdf->Cell(0, 0, utf8_decode('Generación:'), 0, 1, 'L');
+ $pdf->SetFont('Arial', '', 12);
+ $pdf->Cell(0, 0, $datos['generacion'], 0, 1, 'C');
+
+ $pdf->ln(10);
+ $pdf->SetFont('Arial', 'B', 12);
+ $pdf->Cell(0, 0, utf8_decode('Carrera:'), 0, 1, 'L');
+ $pdf->SetFont('Arial', '', 12);
+ $pdf->Cell(0, 0, $datos['carrera'], 0, 1, 'C');
+
+ $pdf->ln(10);
+ $pdf->SetFont('Arial', 'B', 12);
+ $pdf->Cell(0, 0, utf8_decode('Asignado a mesa:'), 0, 1, 'L');
+ $pdf->SetFont('Arial', '', 12);
+ $pdf->Cell(0, 0, $datos['mesa'], 0, 1, 'C');
+
+ $pdf->ln(10);
+ $pdf->SetFont('Arial', '', 12);
+ $pdf->Cell(0, 0, $datos['sistema'], 0, 1, 'C');
+
+ $pdf->ln(12);
+ $pdf->Cell(0, 0, "", 1, 1, 'L');
+ $pdf->ln(12);
+
+ $pdf->SetFont('Arial','B',40);
+ $pdf->Cell(0, 0, utf8_decode('MAGNO DESAYUNO'), 0, 1, 'L');
+ $pdf->ln(12);
+ $pdf->SetFont('Arial','B',16.5);
+ $pdf->Cell(0, 0, utf8_decode('MULTIDISCIPLINARIO PARA EGRESADOS DE LA'), 0, 1, 'L');
+
+ $pdf->ln(12);
+ $pdf->SetFont('Arial','B',38);
+ $pdf->Cell(0, 0, utf8_decode('FES ACATLÁN UNAM'), 0, 1, 'L');
+
+ $pdf->ln(12);
+ $pdf->SetFont('Arial','B',15);
+ $pdf->Cell(0, 0, utf8_decode('CENTRO DE ESTUDIOS MUNICIPALES'), 0, 1, 'L');
+
+ $pdf->ln(8);
+ $pdf->SetFont('Arial','B',15);
+ $pdf->Cell(0, 0, utf8_decode('Y METROPOLITANOS'), 0, 1, 'L');
+
+ $pdf->ln(8);
+ $pdf->SetFont('Arial','B',15);
+ $pdf->Cell(0, 0, utf8_decode('27 octubre 2018 - 8:15 horas'), 0, 1, 'L');
+
+ $pdf->ln(8);
+ $pdf->SetFont('Arial','B',15);
+ $pdf->Cell(0, 0, utf8_decode('DONATIVO $350.00'), 0, 1, 'L');
+
+
+ $pdf->ln(8);
+ $pdf->SetFont('Arial','',10);
+ $pdf->Cell(0, 0, utf8_decode('CUPO LIMITADO'), 0, 1, 'L');
+
+ $pdf->ln(8);
+ $pdf->SetFont('Arial', '', 12);
+ $pdf->Code39(80, 160, $datos['id_registro'], 1, 13);
+ $pdf->ln(10);
+ }
+
+ /* liberar el conjunto de resultados */
+ mysqli_free_result($resultado);
+}
+mysqli_close($con);
+$pdf->Output();
diff --git a/public_html/comprobante.php b/public_html/comprobante.php
new file mode 100644
index 0000000..7b1e1ba
--- /dev/null
+++ b/public_html/comprobante.php
@@ -0,0 +1,144 @@
+AddPage();
+$pdf->Image("images/logo_dsc.png", 5, 5, 0, 0);
+
+$pdf->SetFont('Arial','B',12);
+$pdf->Cell(0, 0, utf8_decode('Fecha de solicitud:')." ".$fecha, 0, 1, 'R');
+$pdf->ln(8);
+$pdf->SetFont('Arial','B',12);
+$pdf->Cell(0, 0, utf8_decode('Número de solicitud:')." ".$datos['id_solicitud'], 0, 1, 'R');
+
+$pdf->ln(50);
+$pdf->SetFont('Arial','B',20);
+$pdf->Cell(0, 0, utf8_decode('Solicitud préstamo de salas de cómputo'), 0, 1, 'C');
+$pdf->ln(12);
+$pdf->Cell(0, 0, "", 1, 1, 'L');
+$pdf->ln(12);
+
+$pdf->SetFont('Arial','B',12);
+$pdf->Cell(0, 0, utf8_decode('DATOS DEL SOLICITANTE'), 0, 1, 'C');
+$pdf->ln(10);
+$pdf->SetFont('Arial', 'B', 12);
+$pdf->Cell(0, 0, utf8_decode('Adscripción:'), 0, 1, 'L');
+$pdf->SetFont('Arial', '', 12);
+$pdf->Cell(0, 0, $datos['adscripcion'], 0, 1, 'C');
+$pdf->ln(8);
+$pdf->SetFont('Arial', 'B', 12);
+$pdf->Cell(0, 0, utf8_decode('Nombre:'), 0, 1, 'L');
+$pdf->SetFont('Arial', '', 12);
+$pdf->Cell(0, 0, $datos['responsable_nombre'], 0, 1, 'C');
+$pdf->ln(8);
+$pdf->SetFont('Arial', 'B', 12);
+$pdf->Cell(0, 0, utf8_decode('Teléfono:'), 0, 1, 'L');
+$pdf->SetFont('Arial', '', 12);
+$pdf->Cell(0, 0, $datos['responsable_telefono'], 0, 1, 'C');
+$pdf->ln(8);
+$pdf->SetFont('Arial', 'B', 12);
+$pdf->Cell(0, 0, utf8_decode('Correo electrónico:'), 0, 1, 'L');
+$pdf->SetFont('Arial', '', 12);
+$pdf->Cell(0, 0, $datos['responsable_correo'], 0, 1, 'C');
+$pdf->ln(12);
+$pdf->Cell(0, 0, "", 1, 1, 'L');
+$pdf->ln(12);
+
+$pdf->SetFont('Arial','B',12);
+$pdf->Cell(0, 0, utf8_decode('DATOS DEL EVENTO'), 0, 1, 'C');
+$pdf->ln(10);
+$pdf->SetFont('Arial', 'B', 12);
+$pdf->Cell(0, 0, utf8_decode('Nombre del profesor:'), 0, 1, 'L');
+$pdf->SetFont('Arial', '', 12);
+$pdf->Cell(0, 0, $datos['profesor'], 0, 1, 'C');
+$pdf->ln(8);
+$pdf->SetFont('Arial', 'B', 12);
+$pdf->Cell(0, 0, utf8_decode('Tipo de evento:'), 0, 1, 'L');
+$pdf->SetFont('Arial', '', 12);
+$pdf->Cell(0, 0, $datos['evento_tipo'], 0, 1, 'C');
+$pdf->ln(8);
+$pdf->SetFont('Arial', 'B', 12);
+$pdf->Cell(0, 0, utf8_decode('Nombre del evento:'), 0, 1, 'L');
+$pdf->SetFont('Arial', '', 12);
+$pdf->Cell(0, 0, $datos['nombre_evento'], 0, 1, 'C');
+$pdf->ln(8);
+$pdf->SetFont('Arial', 'B', 12);
+$pdf->Cell(0, 0, utf8_decode('No. de asistentes:'), 0, 1, 'L');
+$pdf->SetFont('Arial', '', 12);
+$pdf->Cell(0, 0, $datos['numero_asistentes'], 0, 1, 'C');
+$pdf->ln(8);
+$pdf->SetFont('Arial', 'B', 12);
+$pdf->Cell(0, 0, utf8_decode('Fecha:'), 0, 1, 'L');
+$pdf->SetFont('Arial', '', 12);
+if($tipo_sesion == 0){
+ $pdf->Cell(0, 0, $datos['fecha_inicial'], 0, 1, 'C');
+}else{
+ $pdf->Cell(0, 0, $datos['fecha_inicial']." al ".$datos['fecha_final'], 0, 1, 'C');
+ $pdf->ln(8);
+ $pdf->SetFont('Arial', 'B', 12);
+ $pdf->Cell(0, 0, utf8_decode('Días:'), 0, 1, 'L');
+ $pdf->SetFont('Arial', '', 12);
+ $pdf->Cell(0, 0, utf8_decode($dias), 0, 1, 'C');
+}
+$pdf->ln(8);
+$pdf->SetFont('Arial', 'B', 12);
+$pdf->Cell(0, 0, utf8_decode('Horario:'), 0, 1, 'L');
+$pdf->SetFont('Arial', '', 12);
+$pdf->Cell(0, 0, $datos['hora_inicial']." - ".$datos['hora_final'], 0, 1, 'C');
+$pdf->ln(8);
+$pdf->SetFont('Arial', 'B', 12);
+$pdf->Cell(0, 0, utf8_decode('Software a utilizar:'), 0, 1, 'L');
+$pdf->SetFont('Arial', '', 12);
+$pdf->Cell(0, 0, $datos['software'], 0, 1, 'C');
+$pdf->ln(8);
+$pdf->SetFont('Arial', 'B', 12);
+$pdf->Cell(0, 0, utf8_decode('Objetivo del evento:'), 0, 1, 'L');
+
+$cadena = $datos['objetivo'];
+$num_filas = ceil(strlen($datos['objetivo'])/42);
+$incremento = 0;
+for($j=0;$j<$num_filas;$j++){
+ $fila[$j] = "";
+ for($i=($incremento);$i<=($incremento+41);$i++){
+ $fila[$j] .= $cadena[$i];
+ }
+ $pdf->SetFont('Arial', '', 12);
+ $pdf->Cell(0, 0, $fila[$j], 0, 1, 'C');
+ $pdf->ln(4);
+ $incremento += 42;
+}
+if($tipo_sesion == 0){
+ $saltos_linea_objetivo = 32-4*$num_filas;
+}else{
+ $saltos_linea_objetivo = (24-4*$num_filas);
+}
+$pdf->ln($saltos_linea_objetivo);
+
+$pdf->SetFont('Arial', 'B', 10);
+$pdf->Cell(0, 0, utf8_decode('**Nota: Con este comprobante acepta: haber leído y comprometido a cumplir los lineamientos de uso de'), 0, 1, 'L');
+$pdf->ln(5);
+$pdf->SetFont('Arial', 'B', 10);
+$pdf->Cell(0, 0, utf8_decode('los espacios físicos del Centro de Desarrollo Tecnológico.'), 0, 1, 'L');
+$pdf->ln(5);
+$pdf->SetFont('Arial', 'B', 10);
+$pdf->Cell(0, 0, utf8_decode('No imprimir este documento y esperar su respuesta de solicitud por oficio.'), 0, 1, 'L');
+$pdf->SetFont('Arial', '', 12);
+$pdf->Code39(170, 255, $cuenta, 1, 13); //Código de barras
+$pdf->ln(8);
+$pdf->Cell(0, 0, utf8_decode('Cadena única verificadora:'), 0, 1, 'L');
+$pdf->ln(3);
+$pdf->MultiCell(0, 5, substr(base64_encode($datos['id_solicitud'].$datos['fecha_solicitud'].$datos['responsable_nombre']."Solicitud préstamo de salas de cómputo"), 0, 70));
+$pdf->ln(10);
+mysql_close($con);
+$pdf->Output();
+
+header("location:index.php");
\ No newline at end of file
diff --git a/public_html/descargar_boleto.php b/public_html/descargar_boleto.php
new file mode 100644
index 0000000..0407fd0
--- /dev/null
+++ b/public_html/descargar_boleto.php
@@ -0,0 +1,55 @@
+
+
+0;d--){if(typeof a[d]=="function")a[d]=a[d].prototype;for(var e in a[d])e=="_init"?c.push(a[d][e]):b[e]||(b[e]=a[d][e])}a[0]._init&&c.push(a[0]._init);b._init=function(){for(var a=0;a=0&&this.splice(a,b||1)},remove:function(a){this.removeAt(this.find(a))},insertAt:function(a,b){if(!b&&b!==0)this.push(a);else{var c=this.splice(b,this.length-b);this[b]=a;this.push.apply(this,c)}},find:function(a){for(i=0;i0;)str=this._toHex[a%16]+str,a=Math.floor(a/16);for(;str.length255)b=0;if(c<0||c>255)c=0;if(d<0||d>255)d=0;return[b,c,d]};
+dhtmlx.math.hsvToRgb=function(a,b,c){var d,e,f,h,g,i,j,k;d=Math.floor(a/60)%6;e=a/60-d;f=c*(1-b);h=c*(1-e*b);g=c*(1-(1-e)*b);k=j=i=0;switch(d){case 0:i=c;j=g;k=f;break;case 1:i=h;j=c;k=f;break;case 2:i=f;j=c;k=g;break;case 3:i=f;j=h;k=c;break;case 4:i=g;j=f;k=c;break;case 5:i=c,j=f,k=h}i=Math.floor(i*255);j=Math.floor(j*255);k=Math.floor(k*255);return[i,j,k]};
+dhtmlx.math.rgbToHsv=function(a,b,c){var d,e,f,h,g,i,j,k;d=a/255;e=b/255;f=c/255;h=Math.min(d,e,f);g=Math.max(d,e,f);j=0;i=g==0?0:1-h/g;k=g;g==h?j=0:g==d&&e>=f?j=60*(e-f)/(g-h)+0:g==d&&e")},addSector:function(a,b,c,d,e,f,h){var g=[];g.push(d);g.push(Math.floor(e*h));for(var i=b;i"+this._map.join("\n")+" ";a._htmlmap=b;this._map=[]}};dhtmlx.chart={};
+dhtmlx.chart.scatter={pvt_render_scatter:function(a,b,c,d,e,f){if(!this._settings.xValue)return null;var h=this._getLimits(),g=this._getLimits("h","xValue");e||(this._drawYAxis(a,b,c,d,h.min,h.max),this._drawHXAxis(a,b,c,d,g.min,g.max));for(var h={min:this._settings.yAxis.start,max:this._settings.yAxis.end},g={min:this._settings.xAxis.start,max:this._settings.xAxis.end},i=this._getScatterParams(a,b,c,d,g,h),j=0;jd.max&&(k=b[f.toLowerCase()]);h=i;n-=k){l.fixNum&&(n=parseFloat((new Number(n)).toFixed(l.fixNum)));o.push(Math.floor(u*z)+0.5);y&&(n=Math.round(n*y)/y);var w=d-e+o[o.length-1];this.renderTextAt("middle","left",c,w,h.template(n.toString()),"dhx_axis_item_y dhx_radar");if(b.length<2){this._drawScaleSector(a,
+"arc",c,d,e-o[o.length-1],-Math.PI/2,3*Math.PI/2,n);return}var v=-Math.PI/2,t=v,A;for(r=0;rMath.PI)m=-i;e>Math.PI/2&&(l=-g);if(Math.abs(e+Math.PI/2)=0;m--){var p=
+k+Math.floor(h.cellWidth*m)-0.5,n=b[m].$startY;a.lineTo(p,n)}else a.lineTo(k+Math.floor(h.cellWidth*(length-1))-0.5,j);a.lineTo(k,j);a.fill();for(m=0;m=1;c--)f[c]=(e[c]-b[c]*f[c+1])/d[c];h=[];g=[];i=[];j=[];for(c=0;co&&(u=o/this._series.length-
+4);var z=Math.floor((o-u*this._series.length)/2),x=typeof this._settings.radius!="undefined"?parseInt(this._settings.radius,10):Math.round(u/5),y=!1,s=this._settings.gradient;s&&typeof s!="function"?(y=s,s=!1):s&&(s=a.createLinearGradient(c.x,c.y,d.x,c.y),this._settings.gradient(s));var w=0;l||this._drawLine(a,c.x-0.5,c.y,c.x-0.5,d.y,"#000000",1);for(var v=0;vh&&(t=h);t-=g;t*=i;var A=c.x,B=c.y+z+v*o+(u+1)*e;if(t<0&&this._settings.origin==
+"auto"||this._settings.xAxis&&t===0&&!(this._settings.origin!="auto"&&this._settings.origin>g))this.renderTextAt("middle","right",A+10,B+u/2+z,this._settings.label(b[v]));else{t<0&&this._settings.origin!="auto"&&this._settings.origin>g&&(t=0);l||(t+=q/r);var C=s||this._settings.color.call(this,b[v]);this._settings.border&&this._drawBarHBorder(a,A,B,u,g,x,r,t,C);a.globalAlpha=this._settings.alpha.call(this,b[v]);var D=this._drawBarH(a,c,A,B,u,g,x,r,t,C,s,y);y!=!1&&this._drawBarHGradient(a,A,B,u,g,
+x,r,t,C,y);a.globalAlpha=1;D[3]==B?(this.renderTextAt("middle","left",D[0]-5,D[3]+Math.floor(u/2),this._settings.label(b[v])),f.addRect(b[v].id,[D[0],D[3],D[2],D[3]+u],e)):(this.renderTextAt("middle",!1,D[2]+5,D[1]+Math.floor(u/2),this._settings.label(b[v])),f.addRect(b[v].id,[D[0],B,D[2],D[3]],e))}}},_setBarHPoints:function(a,b,c,d,e,f,h,g,i){var j=0;if(e>f*h)var k=(e-f*h)/e,j=-Math.asin(k)+Math.PI/2;a.moveTo(b,c+g);var l=b+f*h-e-(e?0:g);e0&&a.arc(l,m,e-g,-Math.PI/
+2+j,0,!1);var p=c+d-e-(e?0:g),o=l+e-(e?g:0);a.lineTo(o,p);var n=l;e&&e>0&&a.arc(n,p,e-g,0,Math.PI/2-j,!1);var r=c+d-g;a.lineTo(b,r);i||a.lineTo(b,c+g);return[o,r]},_drawHScales:function(a,b,c,d,e,f,h){var g=this._drawHXAxis(a,b,c,d,e,f);this._drawHYAxis(a,b,c,d,h,g)},_drawHYAxis:function(a,b,c,d,e,f){if(this._settings.yAxis){var h,g=parseInt(f?f:c.x,10)-0.5,i=d.y+0.5,j=c.y;this._drawLine(a,g,i,g,j,this._settings.yAxis.color,1);for(var k=0;kh&&(b+=(this._settings.origin-h)*e,i=b,d-=this._settings.origin-h,d<0&&(d*=-1,a.translate(b,c+f),a.rotate(Math.PI),b=0.5,c=0),b+=0.5);return{value:d,x0:b,y0:c,start:i}},_drawBarH:function(a,b,c,d,e,f,h,g,i,j,k,l){a.save();var m=this._correctBarHParams(a,c,d,i,g,e,f);a.fillStyle=j;a.beginPath();var p=this._setBarHPoints(a,m.x0,m.y0,e,h,g,m.value,this._settings.border?1:0);k&&!l&&a.lineTo(b.x+total_width,
+m.y0+(this._settings.border?1:0));a.fill();a.restore();var o=m.y0,n=m.y0!=d?d:p[1],r=m.y0!=d?m.start-p[0]:m.start,q=m.y0!=d?m.start:p[0];return[r,o,q,n]},_drawBarHBorder:function(a,b,c,d,e,f,h,g,i){a.save();var j=this._correctBarHParams(a,b,c,g,h,d,e);a.beginPath();this._setBorderStyles(a,i);a.globalAlpha=0.9;this._setBarHPoints(a,j.x0,j.y0,d,f,h,j.value,a.lineWidth/2,1);a.stroke();a.restore()},_drawBarHGradient:function(a,b,c,d,e,f,h,g,i,j){a.save();var k=this._correctBarHParams(a,b,c,g,h,d,e),l=
+this._setBarGradient(a,k.x0,k.y0+d,k.x0+h*k.value,k.y0,j,i,"x");a.fillStyle=l.gradient;a.beginPath();var m=this._setBarHPoints(a,k.x0,k.y0+l.offset,d-l.offset*2,f,h,k.value,l.offset);a.fill();a.globalAlpha=1;a.restore()}};
+dhtmlx.chart.stackedBarH={pvt_render_stackedBarH:function(a,b,c,d,e,f){var h,g,i,j,k=d.x-c.x,l=!!this._settings.yAxis,m=this._getStackedLimits(b);h=m.max;g=m.min;var p=Math.floor((d.y-c.y)/b.length);e||this._drawHScales(a,b,c,d,g,h,p);l&&(h=parseFloat(this._settings.xAxis.end),g=parseFloat(this._settings.xAxis.start));var o=this._getRelativeValue(g,h);j=o[0];i=o[1];var n=j?k/j:10;if(!l)var r=10,n=j?(k-r)/j:10;var q=parseInt(this._settings.width,10);q+4>p&&(q=p-4);var u=Math.floor((p-q)/2),z=0,x=!1,
+y=this._settings.gradient;y&&(x=!0);l||this._drawLine(a,c.x-0.5,c.y,c.x-0.5,d.y,"#000000",1);for(var s=0;sh&&(w=h);w-=g;w*=i;var v=c.x,t=c.y+u+s*p;e?v=b[s].$startX:b[s].$startX=v;if(w<0||this._settings.yAxis&&w===0)this.renderTextAt("middle",!0,v+10,t+q/2,this._settings.label(b[s]));else{l||(w+=r/n);var A=this._settings.color.call(this,b[s]);a.globalAlpha=this._settings.alpha.call(this,b[s]);a.fillStyle=this._settings.color.call(this,
+b[s]);a.beginPath();var B=this._setBarHPoints(a,v,t,q,z,n,w,this._settings.border?1:0);y&&!x&&a.lineTo(c.x+k,t+(this._settings.border?1:0));a.fill();if(x!=!1){var C=this._setBarGradient(a,v,t+q,v,t,x,A,"x");a.fillStyle=C.gradient;a.beginPath();B=this._setBarHPoints(a,v,t,q,z,n,w,0);a.fill()}this._settings.border&&this._drawBarHBorder(a,v,t,q,g,z,n,w,A);a.globalAlpha=1;this.renderTextAt("middle",!0,b[s].$startX+(B[0]-b[s].$startX)/2-1,t+(B[1]-t)/2,this._settings.label(b[s]));f.addRect(b[s].id,[b[s].$startX,
+t,B[0],B[1]],e);b[s].$startX=B[0]}}}};
+dhtmlx.chart.stackedBar={pvt_render_stackedBar:function(a,b,c,d,e,f){var h,g,i,j,k=d.y-c.y,l=!!this._settings.yAxis,m=!!this._settings.xAxis,p=this._getStackedLimits(b);h=p.max;g=p.min;var o=Math.floor((d.x-c.x)/b.length);e||this._drawScales(a,b,c,d,g,h,o);l&&(h=parseFloat(this._settings.yAxis.end),g=parseFloat(this._settings.yAxis.start));var n=this._getRelativeValue(g,h);j=n[0];i=n[1];var r=j?k/j:10,q=parseInt(this._settings.width,10);q+4>o&&(q=o-4);var u=Math.floor((o-q)/2),z=this._settings.gradient?
+this._settings.gradient:!1;m||this._drawLine(a,c.x,d.y+0.5,d.x,d.y+0.5,"#000000",1);for(var x=0;x=0;i--)a.globalAlpha=g[i],a.strokeStyle="#d0d0d0",a.beginPath(),this._strokeChartItem(a,b,c+2*h/3,h+i+1,f.type),a.stroke();a.beginPath();a.globalAlpha=0.3;a.fillStyle="#bdbdbd";this._strokeChartItem(a,b,c+2*h/3,h+1,f.type);a.fill()}a.restore();a.lineWidth=f.borderWidth;a.fillStyle=f.color.call(this,d);a.strokeStyle=f.borderColor.call(this,d);a.globalAlpha=f.alpha.call(this,d);a.beginPath();this._strokeChartItem(a,b,c,h+1,f.type);a.fill();a.stroke();a.globalAlpha=1;e&&
+this.renderTextAt(!1,!0,b,c-h-this._settings.labelOffset,this._settings.label.call(this,d))},_strokeChartItem:function(a,b,c,d,e){if(e&&(e=="square"||e=="s"))d*=Math.sqrt(2)/2,a.moveTo(b-d-a.lineWidth/2,c-d),a.lineTo(b+d,c-d),a.lineTo(b+d,c+d),a.lineTo(b-d,c+d),a.lineTo(b-d,c-d);else if(e&&(e=="diamond"||e=="d")){var f=a.lineWidth>1?a.lineWidth*Math.sqrt(2)/4:0;a.moveTo(b,c-d);a.lineTo(b+d,c);a.lineTo(b,c+d);a.lineTo(b-d,c);a.lineTo(b+f,c-d-f)}else e&&(e=="triangle"||e=="t")?(a.moveTo(b,c-d),a.lineTo(b+
+Math.sqrt(3)*d/2,c+d/2),a.lineTo(b-Math.sqrt(3)*d/2,c+d/2),a.lineTo(b,c-d)):a.arc(b,c,d,0,Math.PI*2,!0)},_getYPointOfLineChart:function(a,b,c,d){var e=d.minValue,f=d.maxValue,h=d.unit,g=d.valueFactor,i=this._settings.value(a),j=(parseFloat(i||0)-e)*g;this._settings.yAxis||(j+=d.startValue/h);var k=c.y-Math.floor(h*j);if(j<0)k=c.y;if(i>f)k=b.y;if(ig&&this._drawXAxis(a,b,c,d,o,d.y-r*(this._settings.origin-g));var u=parseInt(this._settings.width,10);this._series&&u*this._series.length+4>o&&(u=parseInt(o/this._series.length-4,10));var z=Math.floor((o-u*this._series.length)/2),x=typeof this._settings.radius!="undefined"?parseInt(this._settings.radius,10):Math.round(u/5),y=!1,s=this._settings.gradient;s&&typeof s!="function"?(y=s,s=!1):s&&(s=a.createLinearGradient(0,d.y,0,c.y),this._settings.gradient(s));m||this._drawLine(a,
+c.x,d.y+0.5,d.x,d.y+0.5,"#000000",1);for(var w=0;wh&&(v=h);v-=g;v*=i;var t=c.x+z+w*o+(u+1)*e,A=d.y+0.5;if(v<0||this._settings.yAxis&&v===0&&!(this._settings.origin!="auto"&&this._settings.origin>g))this.renderTextAt(!0,!0,t+Math.floor(u/2),A,this._settings.label(b[w]));else{!l&&!(this._settings.origin!="auto"&&m)&&(v+=q/r);var B=s||this._settings.color.call(this,b[w]);a.globalAlpha=this._settings.alpha.call(this,b[w]);var C=this._drawBar(a,
+c,t,A,u,g,x,r,v,B,s,y);y&&this._drawBarGradient(a,t,A,u,g,x,r,v,B,y);this._settings.border&&this._drawBarBorder(a,t,A,u,g,x,r,v,B);a.globalAlpha=1;C[0]!=t?this.renderTextAt(!1,!0,t+Math.floor(u/2),C[1],this._settings.label(b[w])):this.renderTextAt(!0,!0,t+Math.floor(u/2),C[3],this._settings.label(b[w]));f.addRect(b[w].id,[t,C[3],C[2],C[1]],e)}}},_correctBarParams:function(a,b,c,d,e,f,h){var g=this._settings.xAxis,i=c;g&&this._settings.origin!="auto"&&this._settings.origin>h&&(c-=(this._settings.origin-
+h)*e,i=c,d-=this._settings.origin-h,d<0&&(d*=-1,a.translate(b+f,c),a.rotate(Math.PI),c=b=0),c-=0.5);return{value:d,x0:parseInt(b,10),y0:parseInt(c,10),start:i}},_drawBar:function(a,b,c,d,e,f,h,g,i,j,k,l){a.save();a.fillStyle=j;var m=this._correctBarParams(a,c,d,i,g,e,f),p=this._setBarPoints(a,m.x0,m.y0,e,h,g,m.value,this._settings.border?1:0);k&&!l&&a.lineTo(m.x0+(this._settings.border?1:0),b.y);a.fill();a.restore();var o=m.x0,n=m.x0!=c?c+p[0]:p[0],r=m.x0!=c?m.start-p[1]:d,q=m.x0!=c?m.start:p[1];
+return[o,r,n,q]},_setBorderStyles:function(a,b){var c,d;d=dhtmlx.math.toRgb(b);c=dhtmlx.math.rgbToHsv(d[0],d[1],d[2]);c[2]/=2;b="rgb("+dhtmlx.math.hsvToRgb(c[0],c[1],c[2])+")";a.strokeStyle=b;if(a.globalAlpha==1)a.globalAlpha=0.9},_drawBarBorder:function(a,b,c,d,e,f,h,g,i){var j;a.save();j=this._correctBarParams(a,b,c,g,h,d,e);this._setBorderStyles(a,i);this._setBarPoints(a,j.x0,j.y0,d,f,h,j.value,a.lineWidth/2,1);a.stroke();a.restore()},_drawBarGradient:function(a,b,c,d,e,f,h,g,i,j){a.save();var k=
+this._correctBarParams(a,b,c,g,h,d,e),l=this._setBarGradient(a,k.x0,k.y0,k.x0+d,k.y0-h*k.value+2,j,i,"y"),m=this._settings.border?1:0;a.fillStyle=l.gradient;this._setBarPoints(a,k.x0+l.offset,k.y0,d-l.offset*2,f,h,k.value,l.offset+m);a.fill();a.restore()},_setBarPoints:function(a,b,c,d,e,f,h,g,i){a.beginPath();var j=0;if(e>f*h){var k=(e-f*h)/e;k<=1&&k>=-1&&(j=-Math.acos(k)+Math.PI/2)}a.moveTo(b+g,c);var l=c-Math.floor(f*h)+e+(e?0:g);e0&&a.arc(m,l,e-g,-Math.PI+
+j,-Math.PI/2,!1);var p=b+d-e-(e?0:g),o=l-e+(e?g:0);a.lineTo(p,o);e&&e>0&&a.arc(p,l,e-g,-Math.PI/2,0-j,!1);var n=b+d-g;a.lineTo(n,c);i||a.lineTo(b+g,c);return[n,o]}};
+dhtmlx.chart.pie={pvt_render_pie:function(a,b,c,d,e,f){this._renderPie(a,b,c,d,1,f)},_renderPie:function(a,b,c,d,e,f){if(b.length){var h=this._getPieParameters(c,d),g=this._settings.radius?this._settings.radius:h.radius;if(!(g<0)){var i=this._getValues(b),j=this._getTotalValue(i),k=this._getRatios(i,j),l=this._settings.x?this._settings.x:h.x,m=this._settings.y?this._settings.y:h.y;e==1&&this._settings.shadow&&this._addShadow(a,l,m,g);m/=e;var p=-Math.PI/2,o=[];a.scale(1,e);if(this._settings.gradient){var n=
+e!=1?l+g/3:l,r=e!=1?m+g/3:m;this._showRadialGradient(a,l,m,g,n,r)}for(var q=0;q=0||d>=0&&e<=Math.PI||Math.abs(d-Math.PI)>0.0030&&d<=Math.PI&&e>=Math.PI){d<=0&&e>=0&&(d=0,h=!1,this._drawSectorLine(a,b,c,f,d,e));if(d<=Math.PI&&e>=Math.PI)e=Math.PI,h=!1,this._drawSectorLine(a,b,c,f,d,e);var g=(this._settings.height||Math.floor(f/4))/this._settings.cant;a.beginPath();a.arc(b,c,f,d,e,!1);a.lineTo(b+f*Math.cos(e),c+f*Math.sin(e)+g);a.arc(b,c+g,f,e,d,!0);a.lineTo(b+f*Math.cos(d),c+f*Math.sin(d));a.fill();
+h&&a.stroke()}},_drawSectorLine:function(a,b,c,d,e,f){a.beginPath();a.arc(b,c,d,e,f,!1);a.stroke()},_addShadow:function(a,b,c,d){a.globalAlpha=0.5;for(var e="#c4c4c4,#c6c6c6,#cacaca,#dcdcdc,#dddddd,#e0e0e0,#eeeeee,#f5f5f5,#f8f8f8".split(","),f=e.length-1;f>-1;f--)a.beginPath(),a.fillStyle=e[f],a.arc(b+1,c+1,d+f,0,Math.PI*2,!0),a.fill();a.globalAlpha=1},_getGrayGradient:function(a){a.addColorStop(0,"#ffffff");a.addColorStop(0.7,"#7a7a7a");a.addColorStop(1,"#000000");return a},_showRadialGradient:function(a,
+b,c,d,e,f){a.beginPath();var h;typeof this._settings.gradient!="function"?(h=a.createRadialGradient(e,f,d/4,b,c,d),h=this._getGrayGradient(h)):h=this._settings.gradient(h);a.fillStyle=h;a.arc(b,c,d,0,Math.PI*2,!0);a.fill();a.globalAlpha=0.7},_drawSectorLabel:function(a,b,c,d,e,f,h,g){var i=this.renderText(0,0,h,0,1);if(i){var j=i.scrollWidth;i.style.width=j+"px";j>a&&(j=a);var k=e-d<0.2?4:8;g&&(k=j/1.8);var l=d+(e-d)/2;c-=(k-8)/2;var m=-k,p=-8,o="right";if(l>=Math.PI/2&&l=Math.PI)m=-j-m+1,o="left";var n=0;!g&&f<1&&l>0&&l=Math.PI/2&&l=Math.PI))q+=j/3;i.style.top=r+"px";i.style.left=q+"px";i.style.width=j+"px";i.style.textAlign=o;i.style.whiteSpace="nowrap"}}};
+dhtmlx.chart.pie3D={pvt_render_pie3D:function(a,b,c,d,e,f){this._renderPie(a,b,c,d,this._settings.cant,f)}};dhtmlx.chart.donut={pvt_render_donut:function(a,b,c,d,e,f){if(b.length){this._renderPie(a,b,c,d,1,f);var h=this._settings,g=this._getPieParameters(c,d),i=h.radius?h.radius:g.radius,j=h.innerRadius&&h.innerRadius")!=
+-1)switch(c=c.split("->"),c[0]){case "html":c=dhtmlx.html.getValue(c[1]).replace(/\"/g,'\\"');break;case "http":c=(new dhtmlx.ajax).sync().get(c[1],{uid:(new Date).valueOf()}).responseText}a[b]=dhtmlx.Template.fromHTML(c)}}};
+dhtmlx.SingleRender={_init:function(){},_toHTML:function(a){return this.type._item_start(a,this.type)+this.type.template(a,this.type)+this.type._item_end},render:function(){if(!this.callEvent||this.callEvent("onBeforeRender",[this.data])){if(this.data)this._dataobj.innerHTML=this._toHTML(this.data);this.callEvent&&this.callEvent("onAfterRender",[])}}};
+dhtmlx.ui.Tooltip=function(a){this.name="Tooltip";this.version="3.0";typeof a=="string"&&(a={template:a});dhtmlx.extend(this,dhtmlx.Settings);dhtmlx.extend(this,dhtmlx.SingleRender);this._parseSettings(a,{type:"default",dy:0,dx:20});this._dataobj=this._obj=document.createElement("DIV");this._obj.className="dhx_tooltip";dhtmlx.html.insertBefore(this._obj,document.body.firstChild)};
+dhtmlx.ui.Tooltip.prototype={show:function(a,b){if(!this._disabled){if(this.data!=a)this.data=a,this.render(a);this._obj.style.top=b.y+this._settings.dy+"px";this._obj.style.left=b.x+this._settings.dx+"px";this._obj.style.display="block"}},hide:function(){this.data=null;this._obj.style.display="none"},disable:function(){this._disabled=!0},enable:function(){this._disabled=!1},types:{"default":dhtmlx.Template.fromHTML("{obj.id}")},template_item_start:dhtmlx.Template.empty,template_item_end:dhtmlx.Template.empty};
+dhtmlx.AutoTooltip={tooltip_setter:function(a){var b=new dhtmlx.ui.Tooltip(a);this.attachEvent("onMouseMove",function(a,d){b.show(this.get(a),dhtmlx.html.pos(d))});this.attachEvent("onMouseOut",function(){b.hide()});this.attachEvent("onMouseMoving",function(){b.hide()});return b}};dhtmlx.ajax=function(a,b,c){if(arguments.length!==0){var d=new dhtmlx.ajax;if(c)d.master=c;d.get(a,null,b)}return!this.getXHR?new dhtmlx.ajax:this};
+dhtmlx.ajax.prototype={getXHR:function(){return dhtmlx._isIE?new ActiveXObject("Microsoft.xmlHTTP"):new XMLHttpRequest},send:function(a,b,c){var d=this.getXHR();typeof c=="function"&&(c=[c]);if(typeof b=="object"){var e=[],f;for(f in b){var h=b[f];if(h===null||h===dhtmlx.undefined)h="";e.push(f+"="+encodeURIComponent(h))}b=e.join("&")}b&&!this.post&&(a=a+(a.indexOf("?")!=-1?"&":"?")+b,b=null);d.open(this.post?"POST":"GET",a,!this._sync);this.post&&d.setRequestHeader("Content-type","application/x-www-form-urlencoded");
+var g=this;d.onreadystatechange=function(){if(!d.readyState||d.readyState==4){if(c&&g)for(var a=0;ab)var c=b,b=a,a=c;return this.getIndexRange(a,b)},getIndexRange:function(a,b){for(var b=Math.min(b||Infinity,this.dataCount()-1),c=dhtmlx.toArray(),d=a||0;d<=b;d++)c.push(this.item(this.order[d]));return c},dataCount:function(){return this.order.length},
+exists:function(a){return!!this.pull[a]},move:function(a,b){if(!(a<0||b<0)){var c=this.idByIndex(a),d=this.item(c);this.order.removeAt(a);this.order.insertAt(c,Math.min(this.order.length,b));this.callEvent("onStoreUpdated",[c,d,"move"])}},scheme:function(a){this._scheme=a},sync:function(a,b,c){typeof b!="function"&&(c=b,b=null);if(dhtmlx.debug_bind)this.debug_sync_master=a;var d=a;if(a.name!="DataStore")a=a.data;var e=dhtmlx.bind(function(d,e,g){if(g!="update"||b)d=null;if(!d)this.order=dhtmlx.toArray([].concat(a.order)),
+this._filter_order=null,this.pull=a.pull,b&&this.silent(b),this._on_sync&&this._on_sync();c?c=!1:this.refresh(d)},this);a.attachEvent("onStoreUpdated",e);this.feed=function(a,b){d.loadNext(b,a)};e()},add:function(a,b){if(this._scheme){var a=a||{},c;for(c in this._scheme)a[c]=a[c]||this._scheme[c];this._scheme&&(this._scheme.$init?this._scheme.$update(a):this._scheme.$update&&this._scheme.$update(a))}var d=this.id(a),e=this.dataCount();if(dhtmlx.isNotDefined(b)||b<0)b=e;b>e&&(b=Math.min(this.order.length,
+b));if(this.callEvent("onBeforeAdd",[d,a,b])===!1)return!1;if(this.exists(d))return null;this.pull[d]=a;this.order.insertAt(d,b);if(this._filter_order){var f=this._filter_order.length;!b&&this.order.length&&(f=0);this._filter_order.insertAt(d,f)}this.callEvent("onafterAdd",[d,b]);this.callEvent("onStoreUpdated",[d,a,"add"]);return d},remove:function(a){if(a instanceof Array)for(var b=0;bb?1:ab?1:ab?1:ac&&(c=a(b)*1)});return c},_split_data_by:function(a){var b=function(a,b){a=dhtmlx.Template.setter(a);return a(b[0])},c=dhtmlx.Template.setter(a.by);
+a.map[c]||(a.map[c]=[c,b]);var d={},e=[];this.data.each(function(a){var b=c(a);d[b]||(e.push({id:b}),d[b]=dhtmlx.toArray());d[b].push(a)});for(var f in a.map){var h=a.map[f][1]||b;typeof h!="function"&&(h=this[h]);for(var g=0;g5?10:5;c=parseInt(g,10)*h;if(c>Math.abs(a))d=a<0?-c:0;else{var i=Math.abs(a),j=Math.floor(this._log10(i)),k=i/Math.pow(10,j);d=Math.ceil(k*10)/10*Math.pow(10,j)-c;for(i>1&&c>0.1&&(d=Math.ceil(d));a<0?d<=a:d>=a;)d-=c;a<0&&(d=-d-2*c)}for(e=d;e1)for(var f=1;fc&&(c=h);gd)d=a[b].$sum;if(a[b].$min0&&(e=0)}return{max:d,min:e}},_setBarGradient:function(a,b,c,d,e,f,h,g){var i,j,k,l,m;f=="light"?(i=g=="x"?a.createLinearGradient(b,c,d,c):a.createLinearGradient(b,c,b,e),i.addColorStop(0,"#FFFFFF"),i.addColorStop(0.9,h),i.addColorStop(1,h),j=2):f=="falling"||f=="rising"?(i=g=="x"?a.createLinearGradient(b,c,d,c):a.createLinearGradient(b,c,b,e),k=dhtmlx.math.toRgb(h),l=dhtmlx.math.rgbToHsv(k[0],k[1],k[2]),l[1]*=0.5,m="rgb("+
+dhtmlx.math.hsvToRgb(l[0],l[1],l[2])+")",f=="falling"?(i.addColorStop(0,m),i.addColorStop(0.7,h),i.addColorStop(1,h)):f=="rising"&&(i.addColorStop(0,h),i.addColorStop(0.3,h),i.addColorStop(1,m)),j=0):(a.globalAlpha=0.37,j=0,i=g=="x"?a.createLinearGradient(b,e,b,c):a.createLinearGradient(b,c,d,c),i.addColorStop(0,"#9d9d9d"),i.addColorStop(0.3,"#e8e8e8"),i.addColorStop(0.45,"#ffffff"),i.addColorStop(0.55,"#ffffff"),i.addColorStop(0.7,"#e8e8e8"),i.addColorStop(1,"#9d9d9d"));return{gradient:i,offset:j}},
+_getPositionByAngle:function(a,b,c,d){a*=-1;b+=Math.cos(a)*d;c-=Math.sin(a)*d;return{x:b,y:c}}};dhtmlx.compat("layout");
diff --git a/public_html/dhtmlxchart/dhtmlxchart_debug.css b/public_html/dhtmlxchart/dhtmlxchart_debug.css
new file mode 100644
index 0000000..d87a4ae
--- /dev/null
+++ b/public_html/dhtmlxchart/dhtmlxchart_debug.css
@@ -0,0 +1,6 @@
+/*
+Copyright DHTMLX LTD. http://www.dhtmlx.com
+You allowed to use this component or parts of it under GPL terms
+To use it on other terms or get Professional edition of the component please contact us at sales@dhtmlx.com
+*/
+/*pure colors*/
/*fonts*/
/*2012 July 31*//* DHX DEPEND FROM FILE 'tooltip.css'*//*style used by tooltip's container*/
.dhx_tooltip{
display:none;
position:absolute;
font-family:Tahoma;
font-size:8pt;
z-index:10000;
background-color:white;
padding:2px 2px 2px 2px;
border:1px solid #A4BED4;
}/* DHX DEPEND FROM FILE 'chart.css'*//*chart container*/
.dhx_chart{
position:relative;
font-family:Tahoma;
font-size:13px;
color:#000000;
overflow:hidden;
}
/*labels*/
.dhx_canvas_text{
position:absolute;
text-align:center;
overflow:hidden;
white-space:nowrap;
}
/*map*/
.dhx_map_img{
width : 100%;
height : 100%;
position : absolute;
top : 0px;
left : 0px;
border:0px;
filter:alpha(opacity=0);
}
/*scales*/
.dhx_axis_item_y{
position:absolute;
height:18px;
line-height:18px;
/*line-height:10px;*/
margin-top:-4px;
text-align:right;
}
.dhx_axis_title_x{
text-align:center;
}
.dhx_axis_title_y{
text-align:center;
font-family:Tahoma;
/*safari*/
-webkit-transform: rotate(-90deg);
/*firefox*/
-moz-transform: rotate(-90deg);
/*opera*/
-o-transform:rotate(-90deg);
/*IE9*/
-ms-transform: rotate(-90deg);
transform: rotate(-90deg);
height:18px;
line-height:18px;
/*padding-left:3px;*/
}
.dhx_ie_filter{
/*IE8*/
filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=3);
zoom:1;
font-family: serif;
}
/*legend block*/
.dhx_chart_legend{
position:absolute;
}
.dhx_chart_legend_item{
height:18px;
line-height:18px;
padding: 2px;
}
.dhx_axis_item_y.dhx_radar{
color:#666666;
font-size:11px;
padding-right:3px;
height:13px;
line-height:13px;
margin-top:0px;
}
.dhx_canvas_text.dhx_axis_radar_title{
margin-top:0px;
padding-top: 0px;
}
.dhx_axis_item_y, .dhx_axis_item_x {
color: #666666;
}
\ No newline at end of file
diff --git a/public_html/dhtmlxchart/dhtmlxchart_debug.js b/public_html/dhtmlxchart/dhtmlxchart_debug.js
new file mode 100644
index 0000000..f9f172e
--- /dev/null
+++ b/public_html/dhtmlxchart/dhtmlxchart_debug.js
@@ -0,0 +1,5949 @@
+/*
+Copyright DHTMLX LTD. http://www.dhtmlx.com
+You allowed to use this component or parts of it under GPL terms
+To use it on other terms or get Professional edition of the component please contact us at sales@dhtmlx.com
+*/
+/*
+2012 July 31
+*/
+
+
+
+/* DHX DEPEND FROM FILE 'assert.js'*/
+
+
+if (!window.dhtmlx)
+ dhtmlx={};
+
+//check some rule, show message as error if rule is not correct
+dhtmlx.assert = function(test, message){
+ if (!test) dhtmlx.error(message);
+};
+dhtmlx.assert_enabled=function(){ return false; };
+
+//register names of event, which can be triggered by the object
+dhtmlx.assert_event = function(obj, evs){
+ if (!obj._event_check){
+ obj._event_check = {};
+ obj._event_check_size = {};
+ }
+
+ for (var a in evs){
+ obj._event_check[a.toLowerCase()]=evs[a];
+ var count=-1; for (var t in evs[a]) count++;
+ obj._event_check_size[a.toLowerCase()]=count;
+ }
+};
+dhtmlx.assert_method_info=function(obj, name, descr, rules){
+ var args = [];
+ for (var i=0; i < rules.length; i++) {
+ args.push(rules[i][0]+" : "+rules[i][1]+"\n "+rules[i][2].describe()+(rules[i][3]?"; optional":""));
+ }
+ return obj.name+"."+name+"\n"+descr+"\n Arguments:\n - "+args.join("\n - ");
+};
+dhtmlx.assert_method = function(obj, config){
+ for (var key in config)
+ dhtmlx.assert_method_process(obj, key, config[key].descr, config[key].args, (config[key].min||99), config[key].skip);
+};
+dhtmlx.assert_method_process = function (obj, name, descr, rules, min, skip){
+ var old = obj[name];
+ if (!skip)
+ obj[name] = function(){
+ if (arguments.length != rules.length && arguments.length < min)
+ dhtmlx.log("warn","Incorrect count of parameters\n"+obj[name].describe()+"\n\nExpecting "+rules.length+" but have only "+arguments.length);
+ else
+ for (var i=0; i= 0) return true;
+ return false;
+ };
+ dhtmlx.assert_rule_dimension.describe=function(){
+ return "{Integer} value must be a positive number";
+ };
+
+ dhtmlx.assert_rule_number=function(check){
+ if (typeof check == "number") return true;
+ return false;
+ };
+ dhtmlx.assert_rule_number.describe=function(){
+ return "{Integer} value must be a number";
+ };
+
+ dhtmlx.assert_rule_function=function(check){
+ if (typeof check == "function") return true;
+ return false;
+ };
+ dhtmlx.assert_rule_function.describe=function(){
+ return "{Function} value must be a custom function";
+ };
+
+ dhtmlx.assert_rule_any=function(check){
+ return true;
+ };
+ dhtmlx.assert_rule_any.describe=function(){
+ return "Any value";
+ };
+
+ dhtmlx.assert_rule_mix=function(a,b){
+ var t = function(check){
+ if (a(check)||b(check)) return true;
+ return false;
+ };
+ t.describe = function(){
+ return a.describe();
+ };
+ return t;
+ };
+
+}
+
+
+/* DHX DEPEND FROM FILE 'dhtmlx.js'*/
+
+
+/*DHX:Depend assert.js*/
+
+/*
+ Common helpers
+*/
+dhtmlx.version="3.0";
+dhtmlx.codebase="./";
+
+//coding helpers
+
+dhtmlx.copy = function(source){
+ var f = dhtmlx.copy._function;
+ f.prototype = source;
+ return new f();
+};
+dhtmlx.copy._function = function(){};
+
+//copies methods and properties from source to the target
+dhtmlx.extend = function(target, source){
+ for (var method in source)
+ target[method] = source[method];
+
+ //applying asserts
+ if (dhtmlx.assert_enabled() && source._assert){
+ target._assert();
+ target._assert=null;
+ }
+
+ dhtmlx.assert(target,"Invalid nesting target");
+ dhtmlx.assert(source,"Invalid nesting source");
+ //if source object has init code - call init against target
+ if (source._init)
+ target._init();
+
+ return target;
+};
+dhtmlx.proto_extend = function(){
+ var origins = arguments;
+ var compilation = origins[0];
+ var construct = [];
+
+ for (var i=origins.length-1; i>0; i--) {
+ if (typeof origins[i]== "function")
+ origins[i]=origins[i].prototype;
+ for (var key in origins[i]){
+ if (key == "_init")
+ construct.push(origins[i][key]);
+ else if (!compilation[key])
+ compilation[key] = origins[i][key];
+ }
+ };
+
+ if (origins[0]._init)
+ construct.push(origins[0]._init);
+
+ compilation._init = function(){
+ for (var i=0; i handler
+ this._handlers = {}; //hash of event handlers, ID => handler
+ this._map = {};
+ },
+ //temporary block event triggering
+ block : function(){
+ this._events._block = true;
+ },
+ //re-enable event triggering
+ unblock : function(){
+ this._events._block = false;
+ },
+ mapEvent:function(map){
+ dhtmlx.extend(this._map, map);
+ },
+ //trigger event
+ callEvent:function(type,params){
+ if (this._events._block) return true;
+
+ type = type.toLowerCase();
+ dhtmlx.assert_event_call(this, type, params);
+
+ var event_stack =this._events[type.toLowerCase()]; //all events for provided name
+ var return_value = true;
+
+ if (dhtmlx.debug) //can slowdown a lot
+ dhtmlx.log("info","["+this.name+"] event:"+type,params);
+
+ if (event_stack)
+ for(var i=0; i=0) this.splice(pos,(len||1));
+ },
+ //find element in collection and remove it
+ remove:function(value){
+ this.removeAt(this.find(value));
+ },
+ //add element to collection at specific position
+ insertAt:function(data,pos){
+ if (!pos && pos!==0) //add to the end by default
+ this.push(data);
+ else {
+ var b = this.splice(pos,(this.length-pos));
+ this[pos] = data;
+ this.push.apply(this,b); //reconstruct array without loosing this pointer
+ }
+ },
+ //return index of element, -1 if it doesn't exists
+ find:function(data){
+ for (i=0; i0){
+ str=this._toHex[number%16]+str;
+ number=Math.floor(number/16);
+ }
+ while (str.length 255)
+ r = 0;
+ if (g < 0 || g > 255)
+ g = 0;
+ if (b < 0 || b > 255)
+ b = 0;
+ return [r,g,b];
+}
+dhtmlx.math.hsvToRgb = function(h, s, v){
+ var hi,f,p,q,t,r,g,b;
+ hi = Math.floor((h/60))%6;
+ f = h/60-hi;
+ p = v*(1-s);
+ q = v*(1-f*s);
+ t = v*(1-(1-f)*s);
+ r = 0;
+ g = 0;
+ b = 0;
+ switch(hi) {
+ case 0:
+ r = v; g = t; b = p;
+ break;
+ case 1:
+ r = q; g = v; b = p;
+ break;
+ case 2:
+ r = p; g = v; b = t;
+ break;
+ case 3:
+ r = p; g = q; b = v;
+ break;
+ case 4:
+ r = t; g = p; b = v;
+ break;
+ case 5:
+ r = v; g = p; b = q;
+ break;
+ }
+ r = Math.floor(r*255);
+ g = Math.floor(g*255);
+ b = Math.floor(b*255);
+ return [r, g, b];
+};
+dhtmlx.math.rgbToHsv = function(r, g, b){
+ var r0,g0,b0,min0,max0,s,h,v;
+ r0 = r/255;
+ g0 = g/255;
+ b0 = b/255;
+ var min0 = Math.min(r0, g0, b0);
+ var max0 = Math.max(r0, g0, b0);
+ h = 0;
+ s = max0==0?0:(1-min0/max0);
+ v = max0;
+ if (max0 == min0) {
+ h = 0;
+ } else if (max0 == r0 && g0>=b0) {
+ h = 60*(g0 - b0)/(max0 - min0)+0;
+ } else if (max0 == r0 && g0 < b0) {
+ h = 60*(g0 - b0)/(max0 - min0)+360;
+ } else if (max0 == g0) {
+ h = 60*(b0 - r0)/(max0-min0)+120;
+ } else if (max0 == b0) {
+ h = 60*(r0 - g0)/(max0 - min0)+240;
+ }
+ return [h, s, v];
+}
+
+
+
+
+/* DHX DEPEND FROM FILE 'ext/chart/presets.js'*/
+
+
+/*chart presents*/
+if(!dhtmlx.presets)
+ dhtmlx.presets = {};
+dhtmlx.presets.chart = {
+ "simple":{
+ item:{
+ borderColor: "#ffffff",
+ color: "#2b7100",
+ shadow: false,
+ borderWidth:2
+ },
+ line:{
+ color:"#8ecf03",
+ width:2
+ }
+ },
+ "plot":{
+ color:"#1293f8",
+ item:{
+ borderColor:"#636363",
+ borderWidth:1,
+ color: "#ffffff",
+ type:"r",
+ shadow: false
+ },
+ line:{
+ color:"#1293f8",
+ width:2
+ }
+ },
+ "diamond":{
+ color:"#b64040",
+ item:{
+ borderColor:"#b64040",
+ color: "#b64040",
+ type:"d",
+ radius:3,
+ shadow:true
+ },
+ line:{
+ color:"#ff9000",
+ width:2
+ }
+ },
+ "point":{
+ color:"#fe5916",
+ disableLines:true,
+ fill:false,
+ disableItems:false,
+ item:{
+ color:"#feb916",
+ borderColor:"#fe5916",
+ radius:2,
+ borderWidth:1,
+ type:"r"
+ },
+ alpha:1
+ },
+ "line":{
+ line:{
+ color:"#3399ff",
+ width:2
+ },
+ item:{
+ color:"#ffffff",
+ borderColor:"#3399ff",
+ radius:2,
+ borderWidth:2,
+ type:"d"
+ },
+ fill:false,
+ disableItems:false,
+ disableLines:false,
+ alpha:1
+ },
+ "area":{
+ fill:"#3399ff",
+ line:{
+ color:"#3399ff",
+ width:1
+ },
+ disableItems:true,
+ alpha: 0.2,
+ disableLines:false
+ },
+ "round":{
+ item:{
+ radius:3,
+ borderColor:"#3f83ff",
+ borderWidth:1,
+ color:"#3f83ff",
+ type:"r",
+ shadow:false,
+ alpha:0.6
+ }
+ },
+ "square":{
+ item:{
+ radius:3,
+ borderColor:"#447900",
+ borderWidth:2,
+ color:"#69ba00",
+ type:"s",
+ shadow:false,
+ alpha:1
+ }
+ },
+ /*bar*/
+ "column":{
+ color:"RAINBOW",
+ gradient:false,
+ width:45,
+ radius:0,
+ alpha:1,
+ border:true
+ },
+ "stick":{
+ width:5,
+ gradient:false,
+ color:"#67b5c9",
+ radius:2,
+ alpha:1,
+ border:false
+ },
+ "alpha":{
+ color:"#b9a8f9",
+ width:70,
+ gradient:"falling",
+ radius:0,
+ alpha:0.5,
+ border:true
+ }
+};
+
+
+
+/* DHX DEPEND FROM FILE 'map.js'*/
+
+
+/*DHX:Depend dhtmlx.js*/
+
+dhtmlx.ui.Map = function(key){
+ this.name = "Map";
+ this._id = "map_"+dhtmlx.uid();
+ this._key = key;
+ this._map = [];
+};
+dhtmlx.ui.Map.prototype = {
+ addRect: function(id,points,userdata) {
+ this._createMapArea(id,"RECT",points,userdata);
+ },
+ addPoly: function(id,points) {
+ this._createMapArea(id,"POLY",points);
+ },
+ _createMapArea:function(id,shape,coords,userdata){
+ var extra_data = "";
+ if(arguments.length==4)
+ extra_data = "userdata='"+userdata+"'";
+ this._map.push(" ");
+ },
+ addSector:function(id,alpha0,alpha1,x,y,R,ky){
+ var points = [];
+ points.push(x);
+ points.push(Math.floor(y*ky));
+ for(var i = alpha0; i < alpha1; i+=Math.PI/18){
+ points.push(Math.floor(x+R*Math.cos(i)));
+ points.push(Math.floor((y+R*Math.sin(i))*ky));
+ }
+ points.push(Math.floor(x+R*Math.cos(alpha1)));
+ points.push(Math.floor((y+R*Math.sin(alpha1))*ky));
+ points.push(x);
+ points.push(Math.floor(y*ky));
+
+ return this.addPoly(id,points);
+ },
+ render:function(obj){
+ var d = dhtmlx.html.create("DIV");
+ d.style.cssText="position:absolute; width:100%; height:100%; top:0px; left:0px;";
+ obj.appendChild(d);
+ var src = dhtmlx._isIE?"":"src='data:image/gif;base64,R0lGODlhEgASAIAAAP///////yH5BAUUAAEALAAAAAASABIAAAIPjI+py+0Po5y02ouz3pwXADs='";
+ d.innerHTML=""+this._map.join("\n")+" ";
+
+ obj._htmlmap = d; //for clearing routine
+
+ this._map = [];
+ }
+};
+
+
+/* DHX DEPEND FROM FILE 'ext/chart/chart_base.js'*/
+
+
+/*DHX:Depend map.js*/
+dhtmlx.chart = {};
+
+
+/* DHX DEPEND FROM FILE 'ext/chart/chart_scatter.js'*/
+
+
+/*DHX:Depend ext/chart/chart_base.js*/
+dhtmlx.chart.scatter = {
+
+ /**
+ * renders a graphic
+ * @param: ctx - canvas object
+ * @param: data - object those need to be displayed
+ * @param: point0 - top left point of a chart
+ * @param: point1 - right bottom point of a chart
+ * @param: sIndex - index of drawing chart
+ * @param: map - map object
+ */
+ pvt_render_scatter:function(ctx, data, point0, point1, sIndex, map){
+ if(!this._settings.xValue)
+ return dhtmlx.log("warning","Undefined propery: xValue");
+ /*max in min values*/
+ var limitsY = this._getLimits();
+ var limitsX = this._getLimits("h","xValue");
+ /*render scale*/
+ if(!sIndex){
+ this._drawYAxis(ctx,data,point0,point1,limitsY.min,limitsY.max);
+ this._drawHXAxis(ctx,data,point0,point1,limitsX.min,limitsX.max);
+ }
+ limitsY = {min:this._settings.yAxis.start,max:this._settings.yAxis.end};
+ limitsX = {min:this._settings.xAxis.start,max:this._settings.xAxis.end};
+ var params = this._getScatterParams(ctx,data,point0,point1,limitsX,limitsY);
+ for(var i=0;i limits.max)
+ pos = point0[axis.toLowerCase()];
+ /*the limit of the minimum value*/
+ if(value < limits.min)
+ pos = point1[axis.toLowerCase()];
+ return pos;
+ },
+ _calcScatterUnit:function(p,min,max,size,axis){
+ var relativeValues = this._getRelativeValue(min,max);
+ axis = (axis||"");
+ p["relValue"+axis] = relativeValues[0];
+ p["valueFactor"+axis] = relativeValues[1];
+ p["unit"+axis] = (p["relValue"+axis]?size/p["relValue"+axis]:10);
+ }
+};
+
+
+
+/* DHX DEPEND FROM FILE 'ext/chart/chart_radar.js'*/
+
+
+/*DHX:Depend ext/chart/chart_base.js*/
+dhtmlx.chart.radar = {
+ pvt_render_radar:function(ctx,data,x,y,sIndex,map){
+ this._renderRadarChart(ctx,data,x,y,sIndex,map);
+
+ },
+ /**
+ * renders a pie chart
+ * @param: ctx - canvas object
+ * @param: data - object those need to be displayed
+ * @param: x - the width of the container
+ * @param: y - the height of the container
+ * @param: ky - value from 0 to 1 that defines an angle of inclination (0=start; i -=step){
+ if(scaleParam.fixNum) i = parseFloat((new Number(i)).toFixed(scaleParam.fixNum));
+ units.push(Math.floor(c*stepHeight)+ 0.5);
+ if(corr){
+ i = Math.round(i*corr)/corr;
+ }
+ var unitY = y-radius+units[units.length-1];
+ this.renderTextAt("middle","left",x,unitY,
+ configY.template(i.toString()),
+ "dhx_axis_item_y dhx_radar"
+ );
+ if(ratios.length<2){
+ this._drawScaleSector(ctx,"arc",x,y,radius-units[units.length-1],-Math.PI/2,3*Math.PI/2,i);
+ return;
+ }
+ var startAlpha = -Math.PI/2;/*possibly need to moved in config*/
+ var alpha0 = startAlpha;
+ var alpha1;
+ for(j=0;j< ratios.length;j++){
+ if(i==end)
+ angles.push(alpha0);
+ alpha1 = startAlpha+ratios[j]-0.0001;
+ this._drawScaleSector(ctx,(config.lineShape||"line"),x,y,radius-units[units.length-1],alpha0,alpha1,i,j,data[i]);
+ alpha0 = alpha1;
+ }
+ c++;
+ }
+ /*renders radius lines and labels*/
+ for(i=0;i< angles.length;i++){
+ p = this._getPositionByAngle(angles[i],x,y,radius);
+ this._drawLine(ctx,x,y,p.x,p.y,(configX?configX.lineColor.call(this,data[i]):"#cfcfcf"),((configX&&configX.lineWidth)?configX.lineWidth.call(this,data[i]):1));
+ this._drawRadarScaleLabel(ctx,x,y,radius,angles[i],(configX?configX.template.call(this,data[i]):" "));
+ }
+
+ },
+ _drawScaleSector:function(ctx,shape,x,y,radius,a1,a2,i,j){
+ var pos1, pos2;
+ if(radius<0)
+ return false;
+ pos1 = this._getPositionByAngle(a1,x,y,radius);
+ pos2 = this._getPositionByAngle(a2,x,y,radius);
+ var configY = this._settings.yAxis;
+ if(configY.bg){
+ ctx.beginPath();
+ ctx.moveTo(x,y);
+ if(shape=="arc")
+ ctx.arc(x,y,radius,a1,a2,false);
+ else{
+ ctx.lineTo(pos1.x,pos1.y);
+ ctx.lineTo(pos2.x,pos2.y);
+ }
+ ctx.fillStyle = configY.bg(i,j);
+ ctx.moveTo(x,y);
+ ctx.fill();
+ ctx.closePath();
+ }
+ if(configY.lines(i,j)){
+ ctx.lineWidth = 1;
+ ctx.beginPath();
+ if(shape=="arc")
+ ctx.arc(x,y,radius,a1,a2,false);
+ else{
+ ctx.moveTo(pos1.x,pos1.y);
+ ctx.lineTo(pos2.x,pos2.y);
+ }
+ ctx.strokeStyle = configY.lineColor(i,j);
+ ctx.stroke();
+ }
+ },
+ _drawRadarScaleLabel:function(ctx,x,y,r,a,text){
+ var t = this.renderText(0,0,text,"dhx_axis_radar_title",1);
+ var width = t.scrollWidth;
+ var height = t.offsetHeight;
+ var delta = 0.001;
+ var pos = this._getPositionByAngle(a,x,y,r+5);
+ var corr_x=0,corr_y=0;
+ if(a<0||a>Math.PI){
+ corr_y = -height;
+ }
+ if(a>Math.PI/2){
+ corr_x = -width;
+ }
+ if(Math.abs(a+Math.PI/2)=0 ;i--){
+ var xi = x0+ Math.floor(params.cellWidth*i) - 0.5;
+ var yi1 = data[i].$startY;
+ ctx.lineTo(xi,yi1);
+ }
+ }
+ else ctx.lineTo(x0+ Math.floor(params.cellWidth*(length-1)) - 0.5,y01);
+ ctx.lineTo(x0,y01);
+ ctx.fill();
+ for(var i=0; i < data.length;i ++){
+ data[i].$startY = y1[i];
+ }
+ }
+ }
+};
+
+
+
+/* DHX DEPEND FROM FILE 'ext/chart/chart_spline.js'*/
+
+
+/*DHX:Depend ext/chart/chart_base.js*/
+dhtmlx.chart.spline = {
+ /**
+ * renders a spline chart
+ * @param: ctx - canvas object
+ * @param: data - object those need to be displayed
+ * @param: width - the width of the container
+ * @param: height - the height of the container
+ * @param: sIndex - index of drawing chart
+ */
+ pvt_render_spline:function(ctx, data, point0, point1, sIndex, map){
+ var areaPos,config,i,items,j,params,radius,sparam,x,x0,x1,x2,y,y1,y2;
+ params = this._calculateParametersOfLineChart(ctx,data,point0,point1,sIndex);
+ config = this._settings;
+
+ /*array of all points*/
+ items = [];
+ /*drawing all items*/
+ if (data.length) {
+
+ /*getting all points*/
+ x0 = (config.offset?point0.x+params.cellWidth*0.5:point0.x);
+ for(i=0; i < data.length;i ++){
+ x = ((!i)?x0:Math.floor(params.cellWidth*i) - 0.5 + x0);
+
+ y = this._getYPointOfLineChart(data[i],point0,point1,params);
+ items.push({x:x,y:y});
+ }
+ sparam = this._getSplineParameters(items);
+
+ for(i =0; i< items.length; i++){
+ x1 = items[i].x;
+ y1 = items[i].y;
+ if(i=1; i--)
+ s[i] = (v[i] - h[i]*s[i+1])/u[i];
+
+ a = []; b = []; c = []; d = [];
+
+ for(i =0; icellWidth) barWidth = cellWidth/this._series.length-4;
+ /*the half of distance between bars*/
+ var barOffset = Math.floor((cellWidth - barWidth*this._series.length)/2);
+ /*the radius of rounding in the top part of each bar*/
+ var radius = (typeof this._settings.radius!="undefined"?parseInt(this._settings.radius,10):Math.round(barWidth/5));
+
+ var inner_gradient = false;
+ var gradient = this._settings.gradient;
+
+ if (gradient&&typeof(gradient) != "function"){
+ inner_gradient = gradient;
+ gradient = false;
+ } else if (gradient){
+ gradient = ctx.createLinearGradient(point0.x,point0.y,point1.x,point0.y);
+ this._settings.gradient(gradient);
+ }
+ var scaleY = 0;
+ /*draws a black line if the horizontal scale isn't defined*/
+ if(!yax){
+ this._drawLine(ctx,point0.x-0.5,point0.y,point0.x-0.5,point1.y,"#000000",1); //hardcoded color!
+ }
+
+
+
+ for(var i=0; i < data.length;i ++){
+
+
+ var value = parseFloat(this._settings.value(data[i]||0));
+ if(value>maxValue) value = maxValue;
+ value -= minValue;
+ value *= valueFactor;
+
+ /*start point (bottom left)*/
+ var x0 = point0.x;
+ var y0 = point0.y+ barOffset + i*cellWidth+(barWidth+1)*sIndex;
+
+ if((value<0&&this._settings.origin=="auto")||(this._settings.xAxis&&value===0&&!(this._settings.origin!="auto"&&this._settings.origin>minValue))){
+ this.renderTextAt("middle", "right", x0+10,y0+barWidth/2+barOffset,this._settings.label(data[i]));
+ continue;
+ }
+ if(value<0&&this._settings.origin!="auto"&&this._settings.origin>minValue){
+ value = 0;
+ }
+
+ /*takes start value into consideration*/
+ if(!yax) value += startValue/unit;
+ var color = gradient||this._settings.color.call(this,data[i]);
+
+ /*drawing the gradient border of a bar*/
+ if(this._settings.border){
+ this._drawBarHBorder(ctx,x0,y0,barWidth,minValue,radius,unit,value,color);
+ }
+
+ /*drawing bar body*/
+ ctx.globalAlpha = this._settings.alpha.call(this,data[i]);
+ var points = this._drawBarH(ctx,point0,x0,y0,barWidth,minValue,radius,unit,value,color,gradient,inner_gradient);
+ if (inner_gradient!=false){
+ this._drawBarHGradient(ctx,x0,y0,barWidth,minValue,radius,unit,value,color,inner_gradient);
+
+ }
+ ctx.globalAlpha = 1;
+
+
+ /*sets a bar label and map area*/
+
+ if(points[3]==y0){
+ this.renderTextAt("middle", "left", points[0]-5,points[3]+Math.floor(barWidth/2),this._settings.label(data[i]));
+ map.addRect(data[i].id,[points[0],points[3],points[2],points[3]+barWidth],sIndex);
+
+ }else{
+ this.renderTextAt("middle", false, points[2]+5,points[1]+Math.floor(barWidth/2),this._settings.label(data[i]));
+ map.addRect(data[i].id,[points[0],y0,points[2],points[3]],sIndex);
+ }
+
+ }
+ },
+ /**
+ * sets points for bar and returns the position of the bottom right point
+ * @param: ctx - canvas object
+ * @param: x0 - the x position of start point
+ * @param: y0 - the y position of start point
+ * @param: barWidth - bar width
+ * @param: radius - the rounding radius of the top
+ * @param: unit - the value defines the correspondence between item value and bar height
+ * @param: value - item value
+ * @param: offset - the offset from expected bar edge (necessary for drawing border)
+ */
+ _setBarHPoints:function(ctx,x0,y0,barWidth,radius,unit,value,offset,skipLeft){
+ /*correction for displaing small values (when rounding radius is bigger than bar height)*/
+ var angle_corr = 0;
+ if(radius>unit*value){
+ var sinA = (radius-unit*value)/radius;
+ angle_corr = -Math.asin(sinA)+Math.PI/2;
+ }
+ /*start*/
+ ctx.moveTo(x0,y0+offset);
+ /*start of left rounding*/
+ var x1 = x0 + unit*value - radius - (radius?0:offset);
+ if(radius0)
+ ctx.arc(x1,y2,radius-offset,-Math.PI/2+angle_corr,0,false);
+ /*start of right rounding*/
+ var y3 = y0 + barWidth - radius - (radius?0:offset);
+ var x3 = x1 + radius - (radius?offset:0);
+ ctx.lineTo(x3,y3);
+ /*right rounding*/
+ var x4 = x1;
+ if (radius&&radius>0)
+ ctx.arc(x4,y3,radius-offset,0,Math.PI/2-angle_corr,false);
+ /*bottom right point*/
+ var y5 = y0 + barWidth-offset;
+ ctx.lineTo(x0,y5);
+ /*line to the start point*/
+ if(!skipLeft){
+ ctx.lineTo(x0,y0+offset);
+ }
+ // ctx.lineTo(x0,0); //IE fix!
+ return [x3,y5];
+ },
+ _drawHScales:function(ctx,data,point0,point1,start,end,cellWidth){
+ var x = this._drawHXAxis(ctx,data,point0,point1,start,end);
+ this._drawHYAxis(ctx,data,point0,point1,cellWidth,x);
+ },
+ _drawHYAxis:function(ctx,data,point0,point1,cellWidth,yAxisX){
+ if (!this._settings.yAxis) return;
+ var unitPos;
+ var x0 = parseInt((yAxisX?yAxisX:point0.x),10)-0.5;
+ var y0 = point1.y+0.5;
+ var y1 = point0.y;
+ this._drawLine(ctx,x0,y0,x0,y1,this._settings.yAxis.color,1);
+
+
+
+ for(var i=0; i < data.length;i ++){
+
+ /*scale labels*/
+ var right = ((this._settings.origin!="auto")&&(this._settings.view=="barH")&&(parseFloat(this._settings.value(data[i]))minValue)){
+ x += (this._settings.origin-minValue)*unit;
+ axisStart = x;
+ value = value-(this._settings.origin-minValue);
+ if(value < 0){
+ value *= (-1);
+ ctx.translate(x,y+barWidth);
+ ctx.rotate(Math.PI);
+ x = 0.5;
+ y = 0;
+ }
+ x += 0.5;
+ }
+
+ return {value:value,x0:x,y0:y,start:axisStart}
+ },
+ _drawBarH:function(ctx,point0,x0,y0,barWidth,minValue,radius,unit,value,color,gradient,inner_gradient){
+ ctx.save();
+ var p = this._correctBarHParams(ctx,x0,y0,value,unit,barWidth,minValue);
+ ctx.fillStyle = color;
+ ctx.beginPath();
+ var points = this._setBarHPoints(ctx,p.x0,p.y0,barWidth,radius,unit,p.value,(this._settings.border?1:0));
+ if (gradient&&!inner_gradient) ctx.lineTo(point0.x+total_width,p.y0+(this._settings.border?1:0)); //fix gradient sphreading
+ ctx.fill();
+ ctx.restore();
+ var y1 = p.y0;
+ var y2 = (p.y0!=y0?y0:points[1]);
+ var x1 = (p.y0!=y0?(p.start-points[0]):p.start);
+ var x2 = (p.y0!=y0?p.start:points[0]);
+
+ return [x1,y1,x2,y2];
+ },
+ _drawBarHBorder:function(ctx,x0,y0,barWidth,minValue,radius,unit,value,color){
+ ctx.save();
+ var p = this._correctBarHParams(ctx,x0,y0,value,unit,barWidth,minValue);
+
+ ctx.beginPath();
+ this._setBorderStyles(ctx,color);
+ ctx.globalAlpha =0.9;
+ this._setBarHPoints(ctx,p.x0,p.y0,barWidth,radius,unit,p.value,ctx.lineWidth/2,1);
+
+ ctx.stroke();
+ ctx.restore();
+ },
+ _drawBarHGradient:function(ctx,x0,y0,barWidth,minValue,radius,unit,value,color,inner_gradient){
+ ctx.save();
+ //y0 -= (dhx.env.isIE?0:0.5);
+ var p = this._correctBarHParams(ctx,x0,y0,value,unit,barWidth,minValue);
+ var gradParam = this._setBarGradient(ctx,p.x0,p.y0+barWidth,p.x0+unit*p.value,p.y0,inner_gradient,color,"x");
+ ctx.fillStyle = gradParam.gradient;
+ ctx.beginPath();
+ var points = this._setBarHPoints(ctx,p.x0,p.y0+gradParam.offset,barWidth-gradParam.offset*2,radius,unit,p.value,gradParam.offset);
+ ctx.fill();
+ ctx.globalAlpha = 1;
+ ctx.restore();
+ }
+};
+
+
+
+/* DHX DEPEND FROM FILE 'ext/chart/chart_stackedbarh.js'*/
+
+
+/*DHX:Depend ext/chart/chart_base.js*/
+/*DHX:Depend ext/chart/chart_barh.js*/
+
+dhtmlx.assert(dhtmlx.chart.barH);
+dhtmlx.chart.stackedBarH = {
+/**
+ * renders a bar chart
+ * @param: ctx - canvas object
+ * @param: data - object those need to be displayed
+ * @param: x - the width of the container
+ * @param: y - the height of the container
+ * @param: sIndex - index of drawing chart
+ * @param: map - map object
+ */
+ pvt_render_stackedBarH:function(ctx, data, point0, point1, sIndex, map){
+ var maxValue,minValue;
+ /*necessary if maxValue - minValue < 0*/
+ var valueFactor;
+ /*maxValue - minValue*/
+ var relValue;
+
+ var total_width = point1.x-point0.x;
+
+ var yax = !!this._settings.yAxis;
+
+ var limits = this._getStackedLimits(data);
+ maxValue = limits.max;
+ minValue = limits.min;
+
+ /*an available width for one bar*/
+ var cellWidth = Math.floor((point1.y-point0.y)/data.length);
+
+ /*draws x and y scales*/
+ if(!sIndex)
+ this._drawHScales(ctx,data,point0, point1,minValue,maxValue,cellWidth);
+
+ /*necessary for automatic scale*/
+ if(yax){
+ maxValue = parseFloat(this._settings.xAxis.end);
+ minValue = parseFloat(this._settings.xAxis.start);
+ }
+
+ /*unit calculation (bar_height = value*unit)*/
+ var relativeValues = this._getRelativeValue(minValue,maxValue);
+ relValue = relativeValues[0];
+ valueFactor = relativeValues[1];
+
+ var unit = (relValue?total_width/relValue:10);
+ if(!yax){
+ /*defines start value for better representation of small values*/
+ var startValue = 10;
+ unit = (relValue?(total_width-startValue)/relValue:10);
+ }
+
+ /*a real bar width */
+ var barWidth = parseInt(this._settings.width,10);
+ if((barWidth+4)>cellWidth) barWidth = cellWidth-4;
+ /*the half of distance between bars*/
+ var barOffset = Math.floor((cellWidth - barWidth)/2);
+ /*the radius of rounding in the top part of each bar*/
+ var radius = 0;
+
+ var inner_gradient = false;
+ var gradient = this._settings.gradient;
+ if (gradient){
+ inner_gradient = true;
+ }
+ /*draws a black line if the horizontal scale isn't defined*/
+ if(!yax){
+ this._drawLine(ctx,point0.x-0.5,point0.y,point0.x-0.5,point1.y,"#000000",1); //hardcoded color!
+ }
+
+ for(var i=0; i < data.length;i ++){
+
+ if(!sIndex)
+ data[i].$startX = point0.x;
+
+ var value = parseFloat(this._settings.value(data[i]||0));
+ if(value>maxValue) value = maxValue;
+ value -= minValue;
+ value *= valueFactor;
+
+ /*start point (bottom left)*/
+ var x0 = point0.x;
+ var y0 = point0.y+ barOffset + i*cellWidth;
+
+ if(!sIndex)
+ data[i].$startX = x0;
+ else
+ x0 = data[i].$startX;
+
+ if(value<0||(this._settings.yAxis&&value===0)){
+ this.renderTextAt("middle", true, x0+10,y0+barWidth/2,this._settings.label(data[i]));
+ continue;
+ }
+
+ /*takes start value into consideration*/
+ if(!yax) value += startValue/unit;
+ var color = this._settings.color.call(this,data[i]);
+
+
+ /*drawing bar body*/
+ ctx.globalAlpha = this._settings.alpha.call(this,data[i]);
+ ctx.fillStyle = this._settings.color.call(this,data[i]);
+ ctx.beginPath();
+ var points = this._setBarHPoints(ctx,x0,y0,barWidth,radius,unit,value,(this._settings.border?1:0));
+ if (gradient&&!inner_gradient) ctx.lineTo(point0.x+total_width,y0+(this._settings.border?1:0)); //fix gradient sphreading
+ ctx.fill();
+
+ if (inner_gradient!=false){
+ var gradParam = this._setBarGradient(ctx,x0,y0+barWidth,x0,y0,inner_gradient,color,"x");
+ ctx.fillStyle = gradParam.gradient;
+ ctx.beginPath();
+ points = this._setBarHPoints(ctx,x0,y0, barWidth,radius,unit,value,0);
+ ctx.fill();
+ }
+ /*drawing the gradient border of a bar*/
+ if(this._settings.border){
+ this._drawBarHBorder(ctx,x0,y0,barWidth,minValue,radius,unit,value,color);
+ }
+
+ ctx.globalAlpha = 1;
+
+ /*sets a bar label*/
+ this.renderTextAt("middle",true,data[i].$startX+(points[0]-data[i].$startX)/2-1, y0+(points[1]-y0)/2, this._settings.label(data[i]));
+ /*defines a map area for a bar*/
+ map.addRect(data[i].id,[data[i].$startX,y0,points[0],points[1]],sIndex);
+ /*the start position for the next series*/
+ data[i].$startX = points[0];
+ }
+ }
+};
+
+
+/* DHX DEPEND FROM FILE 'ext/chart/chart_stackedbar.js'*/
+
+
+/*DHX:Depend ext/chart/chart_base.js*/
+dhtmlx.chart.stackedBar = {
+ /**
+ * renders a bar chart
+ * @param: ctx - canvas object
+ * @param: data - object those need to be displayed
+ * @param: x - the width of the container
+ * @param: y - the height of the container
+ * @param: sIndex - index of drawing chart
+ */
+ pvt_render_stackedBar:function(ctx, data, point0, point1, sIndex, map){
+ var maxValue,minValue;
+ /*necessary if maxValue - minValue < 0*/
+ var valueFactor;
+ /*maxValue - minValue*/
+ var relValue;
+
+ var total_height = point1.y-point0.y;
+
+ var yax = !!this._settings.yAxis;
+ var xax = !!this._settings.xAxis;
+
+ var limits = this._getStackedLimits(data);
+ maxValue = limits.max;
+ minValue = limits.min;
+
+ /*an available width for one bar*/
+ var cellWidth = Math.floor((point1.x-point0.x)/data.length);
+
+ /*draws x and y scales*/
+ if(!sIndex)
+ this._drawScales(ctx,data,point0, point1,minValue,maxValue,cellWidth);
+
+ /*necessary for automatic scale*/
+ if(yax){
+ maxValue = parseFloat(this._settings.yAxis.end);
+ minValue = parseFloat(this._settings.yAxis.start);
+ }
+
+ /*unit calculation (bar_height = value*unit)*/
+ var relativeValues = this._getRelativeValue(minValue,maxValue);
+ relValue = relativeValues[0];
+ valueFactor = relativeValues[1];
+
+ var unit = (relValue?total_height/relValue:10);
+
+ /*a real bar width */
+ var barWidth = parseInt(this._settings.width,10);
+ if(barWidth+4 > cellWidth) barWidth = cellWidth-4;
+ /*the half of distance between bars*/
+ var barOffset = Math.floor((cellWidth - barWidth)/2);
+
+
+ var inner_gradient = (this._settings.gradient?this._settings.gradient:false);
+
+ /*draws a black line if the horizontal scale isn't defined*/
+ if(!xax){
+ //scaleY = y-bottomPadding;
+ this._drawLine(ctx,point0.x,point1.y+0.5,point1.x,point1.y+0.5,"#000000",1); //hardcoded color!
+ }
+
+ for(var i=0; i < data.length;i ++){
+ var value = parseFloat(this._settings.value(data[i]||0));
+
+ if(!value){
+ if(!sIndex||!data[i].$startY)
+ data[i].$startY = point1.y;
+ continue;
+ }
+ /*adjusts the first tab to the scale*/
+ if(!sIndex)
+ value -= minValue;
+
+ value *= valueFactor;
+
+ /*start point (bottom left)*/
+ var x0 = point0.x + barOffset + i*cellWidth;
+ var y0 = point1.y;
+ if(!sIndex)
+ data[i].$startY = y0;
+ else
+ y0 = data[i].$startY;
+
+ /*the max height limit*/
+ if(y0 < (point0.y+1)) continue;
+
+ if(value<0||(this._settings.yAxis&&value===0)){
+ this.renderTextAt(true, true, x0+Math.floor(barWidth/2),y0,this._settings.label(data[i]));
+ continue;
+ }
+
+ var color = this._settings.color.call(this,data[i]);
+
+
+
+ /*drawing bar body*/
+ ctx.globalAlpha = this._settings.alpha.call(this,data[i]);
+ ctx.fillStyle = this._settings.color.call(this,data[i]);
+ ctx.beginPath();
+ var points = this._setStakedBarPoints(ctx,x0-(this._settings.border?0.5:0),y0,barWidth+(this._settings.border?0.5:0),unit,value,0,point0.y);
+ ctx.fill();
+
+ /*gradient*/
+ if (inner_gradient){
+ ctx.save();
+ var gradParam = this._setBarGradient(ctx,x0,y0,x0+barWidth,points[1],inner_gradient,color,"y");
+ ctx.fillStyle = gradParam.gradient;
+ ctx.beginPath();
+ points = this._setStakedBarPoints(ctx,x0+gradParam.offset,y0,barWidth-gradParam.offset*2,unit,value,(this._settings.border?1:0),point0.y);
+ ctx.fill();
+ ctx.restore()
+ }
+ /*drawing the gradient border of a bar*/
+ if(this._settings.border){
+ ctx.save();
+ this._setBorderStyles(ctx,color);
+ ctx.beginPath();
+
+ this._setStakedBarPoints(ctx,x0-0.5,y0,barWidth+1,unit,value,0,point0.y,1);
+ ctx.stroke();
+ ctx.restore();
+ }
+ ctx.globalAlpha = 1;
+
+ /*sets a bar label*/
+ this.renderTextAt(false, true, x0+Math.floor(barWidth/2),(points[1]+(y0-points[1])/2)-7,this._settings.label(data[i]));
+ /*defines a map area for a bar*/
+ map.addRect(data[i].id,[x0,points[1],points[0],(data[i].$startY||y0)],sIndex);
+
+ /*the start position for the next series*/
+ data[i].$startY = (this._settings.border?(points[1]+1):points[1]);
+ }
+ },
+ /**
+ * sets points for bar and returns the position of the bottom right point
+ * @param: ctx - canvas object
+ * @param: x0 - the x position of start point
+ * @param: y0 - the y position of start point
+ * @param: barWidth - bar width
+ * @param: radius - the rounding radius of the top
+ * @param: unit - the value defines the correspondence between item value and bar height
+ * @param: value - item value
+ * @param: offset - the offset from expected bar edge (necessary for drawing border)
+ * @param: minY - the minimum y position for the bars ()
+ */
+ _setStakedBarPoints:function(ctx,x0,y0,barWidth,unit,value,offset,minY,skipBottom){
+ /*start*/
+ ctx.moveTo(x0,y0);
+ /*start of left rounding*/
+ var y1 = y0 - unit*value+offset;
+ /*maximum height limit*/
+ if(y1=0;i--){
+ ctx.globalAlpha = alphas[i];
+ ctx.strokeStyle = "#d0d0d0";
+ ctx.beginPath();
+ this._strokeChartItem(ctx,x0,y0+2*R/3,R+i+1,config.type);
+ ctx.stroke();
+ }
+ ctx.beginPath();
+ ctx.globalAlpha = 0.3;
+ ctx.fillStyle = "#bdbdbd";
+ this._strokeChartItem(ctx,x0,y0+2*R/3,R+1,config.type);
+ ctx.fill();
+ }
+ ctx.restore();
+ ctx.lineWidth = config.borderWidth;
+ ctx.fillStyle = config.color.call(this,obj);
+ ctx.strokeStyle = config.borderColor.call(this,obj);
+ ctx.globalAlpha = config.alpha.call(this,obj);
+ ctx.beginPath();
+ this._strokeChartItem(ctx,x0,y0,R+1,config.type);
+ ctx.fill();
+ ctx.stroke();
+ ctx.globalAlpha = 1;
+ /*item label*/
+ if(label)
+ this.renderTextAt(false, true, x0,y0-R-this._settings.labelOffset,this._settings.label.call(this,obj));
+ },
+ _strokeChartItem:function(ctx,x0,y0,R,type){
+ if(type && (type=="square" || type=="s")){
+ R *= Math.sqrt(2)/2;
+ ctx.moveTo(x0-R-ctx.lineWidth/2,y0-R);
+ ctx.lineTo(x0+R,y0-R);
+ ctx.lineTo(x0+R,y0+R);
+ ctx.lineTo(x0-R,y0+R);
+ ctx.lineTo(x0-R,y0-R);
+ }
+ else if(type && (type=="diamond" || type=="d")){
+ var corr = (ctx.lineWidth>1?ctx.lineWidth*Math.sqrt(2)/4:0);
+ ctx.moveTo(x0,y0-R);
+ ctx.lineTo(x0+R,y0);
+ ctx.lineTo(x0,y0+R);
+ ctx.lineTo(x0-R,y0);
+ ctx.lineTo(x0+corr,y0-R-corr);
+ }
+ else if(type && (type=="triangle" || type=="t")){
+ ctx.moveTo(x0,y0-R);
+ ctx.lineTo(x0+Math.sqrt(3)*R/2,y0+R/2);
+ ctx.lineTo(x0-Math.sqrt(3)*R/2,y0+R/2);
+ ctx.lineTo(x0,y0-R);
+ }
+ else
+ ctx.arc(x0,y0,R,0,Math.PI*2,true);
+ },
+ /**
+ * gets the vertical position of the item
+ * @param: data - data object
+ * @param: y0 - the y position of chart start
+ * @param: y1 - the y position of chart end
+ * @param: params - the object with elements: minValue, maxValue, unit, valueFactor (the value multiple of 10)
+ */
+ _getYPointOfLineChart: function(data,point0,point1,params){
+ var minValue = params.minValue;
+ var maxValue = params.maxValue;
+ var unit = params.unit;
+ var valueFactor = params.valueFactor;
+ /*the real value of an object*/
+ var value = this._settings.value(data);
+ /*a relative value*/
+ var v = (parseFloat(value||0) - minValue)*valueFactor;
+ if(!this._settings.yAxis)
+ v += params.startValue/unit;
+ /*a vertical coordinate*/
+ var y = point1.y - Math.floor(unit*v);
+ /*the limit of the minimum value is the minimum visible value*/
+ if(v<0)
+ y = point1.y;
+ /*the limit of the maximum value*/
+ if(value > maxValue)
+ y = point0.y;
+ /*the limit of the minimum value*/
+ if(value < minValue)
+ y = point1.y;
+ return y;
+ },
+ _calculateParametersOfLineChart: function(ctx,data,point0,point1,sIndex){
+ var params = {};
+
+ /*maxValue - minValue*/
+ var relValue;
+
+ /*available height*/
+ params.totalHeight = point1.y-point0.y;
+
+ /*a space available for a single item*/
+ //params.cellWidth = Math.round((point1.x-point0.x)/((!this._settings.offset&&this._settings.yAxis)?(data.length-1):data.length));
+ params.cellWidth = Math.round((point1.x-point0.x)/((!this._settings.offset)?(data.length-1):data.length));
+
+ /*scales*/
+ var yax = !!this._settings.yAxis;
+
+ var limits = (this._settings.view.indexOf("stacked")!=-1?this._getStackedLimits(data):this._getLimits());
+ params.maxValue = limits.max;
+ params.minValue = limits.min;
+
+ /*draws x and y scales*/
+ if(!sIndex)
+ this._drawScales(ctx,data, point0, point1,params.minValue,params.maxValue,params.cellWidth);
+
+ /*necessary for automatic scale*/
+ if(yax){
+ params.maxValue = parseFloat(this._settings.yAxis.end);
+ params.minValue = parseFloat(this._settings.yAxis.start);
+ }
+
+ /*unit calculation (y_position = value*unit)*/
+ var relativeValues = this._getRelativeValue(params.minValue,params.maxValue);
+ relValue = relativeValues[0];
+ params.valueFactor = relativeValues[1];
+ params.unit = (relValue?params.totalHeight/relValue:10);
+
+ params.startValue = 0;
+ if(!yax){
+ /*defines start value for better representation of small values*/
+ params.startValue = 10;
+ if(params.unit!=params.totalHeight)
+ params.unit = (relValue?(params.totalHeight - params.startValue)/relValue:10);
+ }
+ return params;
+ }
+};
+
+
+
+/* DHX DEPEND FROM FILE 'ext/chart/chart_bar.js'*/
+
+
+/*DHX:Depend ext/chart/chart_base.js*/
+dhtmlx.chart.bar = {
+ /**
+ * renders a bar chart
+ * @param: ctx - canvas object
+ * @param: data - object those need to be displayed
+ * @param: x - the width of the container
+ * @param: y - the height of the container
+ * @param: sIndex - index of drawing chart
+ */
+ pvt_render_bar:function(ctx, data, point0, point1, sIndex, map){
+ var maxValue,minValue;
+ /*necessary if maxValue - minValue < 0*/
+ var valueFactor;
+ /*maxValue - minValue*/
+ var relValue;
+
+ var total_height = point1.y-point0.y;
+
+ var yax = !!this._settings.yAxis;
+ var xax = !!this._settings.xAxis;
+
+ var limits = this._getLimits();
+ maxValue = limits.max;
+ minValue = limits.min;
+
+ /*an available width for one bar*/
+ var cellWidth = Math.floor((point1.x-point0.x)/data.length);
+
+ /*draws x and y scales*/
+ if(!sIndex&&!(this._settings.origin!="auto"&&!yax)){
+ this._drawScales(ctx,data,point0, point1,minValue,maxValue,cellWidth);
+ }
+
+ /*necessary for automatic scale*/
+ if(yax){
+ maxValue = parseFloat(this._settings.yAxis.end);
+ minValue = parseFloat(this._settings.yAxis.start);
+ }
+
+ /*unit calculation (bar_height = value*unit)*/
+ var relativeValues = this._getRelativeValue(minValue,maxValue);
+ relValue = relativeValues[0];
+ valueFactor = relativeValues[1];
+
+ var unit = (relValue?total_height/relValue:relValue);
+ if(!yax&&!(this._settings.origin!="auto"&&xax)){
+ /*defines start value for better representation of small values*/
+ var startValue = 10;
+ unit = (relValue?(total_height-startValue)/relValue:startValue);
+ }
+ /*if yAxis isn't set, but with custom origin */
+ if(!sIndex&&(this._settings.origin!="auto"&&!yax)&&this._settings.origin>minValue){
+ this._drawXAxis(ctx,data,point0,point1,cellWidth,point1.y-unit*(this._settings.origin-minValue));
+ }
+
+ /*a real bar width */
+ var barWidth = parseInt(this._settings.width,10);
+ if(this._series&&(barWidth*this._series.length+4)>cellWidth) barWidth = parseInt(cellWidth/this._series.length-4,10);
+ /*the half of distance between bars*/
+ var barOffset = Math.floor((cellWidth - barWidth*this._series.length)/2);
+ /*the radius of rounding in the top part of each bar*/
+ var radius = (typeof this._settings.radius!="undefined"?parseInt(this._settings.radius,10):Math.round(barWidth/5));
+
+ var inner_gradient = false;
+ var gradient = this._settings.gradient;
+
+ if(gradient && typeof(gradient) != "function"){
+ inner_gradient = gradient;
+ gradient = false;
+ } else if (gradient){
+ gradient = ctx.createLinearGradient(0,point1.y,0,point0.y);
+ this._settings.gradient(gradient);
+ }
+ /*draws a black line if the horizontal scale isn't defined*/
+ if(!xax){
+ this._drawLine(ctx,point0.x,point1.y+0.5,point1.x,point1.y+0.5,"#000000",1); //hardcoded color!
+ }
+
+ for(var i=0; i < data.length;i ++){
+
+ var value = parseFloat(this._settings.value(data[i]||0));
+ if(value>maxValue) value = maxValue;
+ value -= minValue;
+ value *= valueFactor;
+
+ /*start point (bottom left)*/
+ var x0 = point0.x + barOffset + i*cellWidth+(barWidth+1)*sIndex;
+ var y0 = point1.y+0.5;
+
+ if(value<0||(this._settings.yAxis&&value===0&&!(this._settings.origin!="auto"&&this._settings.origin>minValue))){
+ this.renderTextAt(true, true, x0+Math.floor(barWidth/2),y0,this._settings.label(data[i]));
+ continue;
+ }
+
+ /*takes start value into consideration*/
+ if(!yax&&!(this._settings.origin!="auto"&&xax)) value += startValue/unit;
+
+ var color = gradient||this._settings.color.call(this,data[i]);
+
+
+ /*drawing bar body*/
+ ctx.globalAlpha = this._settings.alpha.call(this,data[i]);
+ var points = this._drawBar(ctx,point0,x0,y0,barWidth,minValue,radius,unit,value,color,gradient,inner_gradient);
+ if (inner_gradient){
+ this._drawBarGradient(ctx,x0,y0,barWidth,minValue,radius,unit,value,color,inner_gradient);
+ }
+ /*drawing the gradient border of a bar*/
+ if(this._settings.border)
+ this._drawBarBorder(ctx,x0,y0,barWidth,minValue,radius,unit,value,color);
+
+ ctx.globalAlpha = 1;
+
+ /*sets a bar label*/
+ if(points[0]!=x0)
+ this.renderTextAt(false, true, x0+Math.floor(barWidth/2),points[1],this._settings.label(data[i]));
+ else
+ this.renderTextAt(true, true, x0+Math.floor(barWidth/2),points[3],this._settings.label(data[i]));
+ /*defines a map area for a bar*/
+ map.addRect(data[i].id,[x0,points[3],points[2],points[1]],sIndex);
+ }
+ },
+ _correctBarParams:function(ctx,x,y,value,unit,barWidth,minValue){
+ var xax = this._settings.xAxis;
+ var axisStart = y;
+ if(!!xax&&this._settings.origin!="auto" && (this._settings.origin>minValue)){
+ y -= (this._settings.origin-minValue)*unit;
+ axisStart = y;
+ value = value-(this._settings.origin-minValue);
+ if(value < 0){
+ value *= (-1);
+ ctx.translate(x+barWidth,y);
+ ctx.rotate(Math.PI);
+ x = 0;
+ y = 0;
+ }
+ y -= 0.5;
+ }
+
+ return {value:value,x0:parseInt(x,10),y0:parseInt(y,10),start:axisStart}
+ },
+ _drawBar:function(ctx,point0,x0,y0,barWidth,minValue,radius,unit,value,color,gradient,inner_gradient){
+ ctx.save();
+ ctx.fillStyle = color;
+ var p = this._correctBarParams(ctx,x0,y0,value,unit,barWidth,minValue);
+ var points = this._setBarPoints(ctx,p.x0,p.y0,barWidth,radius,unit,p.value,(this._settings.border?1:0));
+ if (gradient&&!inner_gradient) ctx.lineTo(p.x0+(this._settings.border?1:0),point0.y); //fix gradient sphreading
+ ctx.fill();
+ ctx.restore();
+ var x1 = p.x0;
+ var x2 = (p.x0!=x0?x0+points[0]:points[0]);
+ var y1 = (p.x0!=x0?(p.start-points[1]):y0);
+ var y2 = (p.x0!=x0?p.start:points[1]);
+ return [x1,y1,x2,y2];
+ },
+ _setBorderStyles:function(ctx,color){
+ var hsv,rgb;
+ rgb = dhtmlx.math.toRgb(color);
+ hsv = dhtmlx.math.rgbToHsv(rgb[0],rgb[1],rgb[2]);
+ hsv[2] /= 2;
+ color = "rgb("+dhtmlx.math.hsvToRgb(hsv[0],hsv[1],hsv[2])+")";
+ ctx.strokeStyle = color;
+ if(ctx.globalAlpha==1)
+ ctx.globalAlpha = 0.9;
+ },
+ _drawBarBorder:function(ctx,x0,y0,barWidth,minValue,radius,unit,value,color){
+ var p;
+ ctx.save();
+ p = this._correctBarParams(ctx,x0,y0,value,unit,barWidth,minValue);
+ this._setBorderStyles(ctx,color);
+ this._setBarPoints(ctx,p.x0,p.y0,barWidth,radius,unit,p.value,ctx.lineWidth/2,1);
+ ctx.stroke();
+ /*ctx.fillStyle = color;
+ this._setBarPoints(ctx,p.x0,p.y0,barWidth,radius,unit,p.value,0);
+ ctx.lineTo(p.x0,0);
+ ctx.fill()
+
+
+ ctx.fillStyle = "#000000";
+ ctx.globalAlpha = 0.37;
+
+ this._setBarPoints(ctx,p.x0,p.y0,barWidth,radius,unit,p.value,0);
+ ctx.fill()
+ */
+ ctx.restore();
+ },
+ _drawBarGradient:function(ctx,x0,y0,barWidth,minValue,radius,unit,value,color,inner_gradient){
+ ctx.save();
+ //y0 -= (dhtmlx._isIE?0:0.5);
+ var p = this._correctBarParams(ctx,x0,y0,value,unit,barWidth,minValue);
+ var gradParam = this._setBarGradient(ctx,p.x0,p.y0,p.x0+barWidth,p.y0-unit*p.value+2,inner_gradient,color,"y");
+ var borderOffset = this._settings.border?1:0;
+ ctx.fillStyle = gradParam.gradient;
+ this._setBarPoints(ctx,p.x0+gradParam.offset,p.y0,barWidth-gradParam.offset*2,radius,unit,p.value,gradParam.offset+borderOffset);
+ ctx.fill();
+ ctx.restore();
+ },
+ /**
+ * sets points for bar and returns the position of the bottom right point
+ * @param: ctx - canvas object
+ * @param: x0 - the x position of start point
+ * @param: y0 - the y position of start point
+ * @param: barWidth - bar width
+ * @param: radius - the rounding radius of the top
+ * @param: unit - the value defines the correspondence between item value and bar height
+ * @param: value - item value
+ * @param: offset - the offset from expected bar edge (necessary for drawing border)
+ */
+ _setBarPoints:function(ctx,x0,y0,barWidth,radius,unit,value,offset,skipBottom){
+ /*correction for displaing small values (when rounding radius is bigger than bar height)*/
+ ctx.beginPath();
+ //y0 = 0.5;
+ var angle_corr = 0;
+ if(radius>unit*value){
+ var cosA = (radius-unit*value)/radius;
+ if(cosA<=1&&cosA>=-1)
+ angle_corr = -Math.acos(cosA)+Math.PI/2;
+ }
+ /*start*/
+ ctx.moveTo(x0+offset,y0);
+ /*start of left rounding*/
+ var y1 = y0 - Math.floor(unit*value) + radius + (radius?0:offset);
+ if(radius0)
+ ctx.arc(x2,y1,radius-offset,-Math.PI+angle_corr,-Math.PI/2,false);
+ /*start of right rounding*/
+ var x3 = x0 + barWidth - radius - (radius?0:offset);
+ var y3 = y1 - radius+(radius?offset:0);
+ ctx.lineTo(x3,y3);
+ /*right rounding*/
+ if (radius&&radius>0)
+ ctx.arc(x3,y1,radius-offset,-Math.PI/2,0-angle_corr,false);
+ /*bottom right point*/
+ var x5 = x0 + barWidth-offset;
+ ctx.lineTo(x5,y0);
+ /*line to the start point*/
+ if(!skipBottom){
+ ctx.lineTo(x0+offset,y0);
+ }
+ // ctx.lineTo(x0,0); //IE fix!
+ return [x5,y3];
+ }
+};
+
+
+/* DHX DEPEND FROM FILE 'ext/chart/chart_pie.js'*/
+
+
+/*DHX:Depend ext/chart/chart_base.js*/
+dhtmlx.chart.pie = {
+ pvt_render_pie:function(ctx,data,x,y,sIndex,map){
+ this._renderPie(ctx,data,x,y,1,map);
+
+ },
+ /**
+ * renders a pie chart
+ * @param: ctx - canvas object
+ * @param: data - object those need to be displayed
+ * @param: x - the width of the container
+ * @param: y - the height of the container
+ * @param: ky - value from 0 to 1 that defines an angle of inclination (0=0)||(a1>=0 && a2<=Math.PI)||(Math.abs(a1-Math.PI)>0.003&&a1<=Math.PI && a2>=Math.PI))) return;
+
+ if(a1<=0 && a2>=0){
+ a1 = 0;
+ line = false;
+ this._drawSectorLine(ctx,x0,y0,R,a1,a2);
+ }
+ if(a1<=Math.PI && a2>=Math.PI){
+ a2 = Math.PI;
+ line = false;
+ this._drawSectorLine(ctx,x0,y0,R,a1,a2);
+ }
+ /*the height of 3D pie*/
+ var offset = (this._settings.height||Math.floor(R/4))/this._settings.cant;
+ ctx.beginPath();
+ ctx.arc(x0,y0,R,a1,a2,false);
+ ctx.lineTo(x0+R*Math.cos(a2),y0+R*Math.sin(a2)+offset);
+ ctx.arc(x0,y0+offset,R,a2,a1,true);
+ ctx.lineTo(x0+R*Math.cos(a1),y0+R*Math.sin(a1));
+ ctx.fill();
+ if(line)
+ ctx.stroke();
+ },
+ /**
+ * draws a serctor arc
+ */
+ _drawSectorLine:function(ctx,x0,y0,R,a1,a2){
+ ctx.beginPath();
+ ctx.arc(x0,y0,R,a1,a2,false);
+ ctx.stroke();
+ },
+ /**
+ * adds a shadow to pie
+ * @param: ctx - canvas object
+ * @param: x - the horizontal position of the pie center
+ * @param: y - the vertical position of the pie center
+ * @param: R - pie radius
+ */
+ _addShadow:function(ctx,x,y,R){
+ ctx.globalAlpha = 0.5;
+ var shadows = ["#c4c4c4","#c6c6c6","#cacaca","#dcdcdc","#dddddd","#e0e0e0","#eeeeee","#f5f5f5","#f8f8f8"];
+ for(var i = shadows.length-1;i>-1;i--){
+ ctx.beginPath();
+ ctx.fillStyle = shadows[i];
+ ctx.arc(x+1,y+1,R+i,0,Math.PI*2,true);
+ ctx.fill();
+ }
+ ctx.globalAlpha = 1
+ },
+ /**
+ * returns a gray gradient
+ * @param: gradient - gradient object
+ */
+ _getGrayGradient:function(gradient){
+ gradient.addColorStop(0.0,"#ffffff");
+ gradient.addColorStop(0.7,"#7a7a7a");
+ gradient.addColorStop(1.0,"#000000");
+ return gradient;
+ },
+ /**
+ * adds gray radial gradient
+ * @param: ctx - canvas object
+ * @param: x - the horizontal position of the pie center
+ * @param: y - the vertical position of the pie center
+ * @param: radius - pie radius
+ * @param: x0 - the horizontal position of a gradient center
+ * @param: y0 - the vertical position of a gradient center
+ */
+ _showRadialGradient:function(ctx,x,y,radius,x0,y0){
+ //ctx.globalAlpha = 0.3;
+ ctx.beginPath();
+ var gradient;
+ if(typeof this._settings.gradient!= "function"){
+ gradient = ctx.createRadialGradient(x0,y0,radius/4,x,y,radius);
+ gradient = this._getGrayGradient(gradient);
+ }
+ else gradient = this._settings.gradient(gradient);
+ ctx.fillStyle = gradient;
+ ctx.arc(x,y,radius,0,Math.PI*2,true);
+ ctx.fill();
+ //ctx.globalAlpha = 1;
+ ctx.globalAlpha = 0.7;
+ },
+ /**
+ * returns the calculates pie parameters: center position and radius
+ * @param: ctx - canvas object
+ * @param: x0 - the horizontal position of the pie center
+ * @param: y0 - the vertical position of the pie center
+ * @param: R - pie radius
+ * @param: alpha1 - the angle that defines the 1st edge of a sector
+ * @param: alpha2 - the angle that defines the 2nd edge of a sector
+ * @param: ky - the value that defines an angle of inclination
+ * @param: text - label text
+ * @param: in_width (boolean) - if label needs being displayed inside a pie
+ */
+ _drawSectorLabel:function(x0,y0,R,alpha1,alpha2,ky,text,in_width){
+ var t = this.renderText(0,0,text,0,1);
+ if (!t) return;
+
+ //get existing width of text
+ var labelWidth = t.scrollWidth;
+ t.style.width = labelWidth+"px"; //adjust text label to fit all text
+ if (labelWidth>x0) labelWidth = x0; //the text can't be greater than half of view
+
+ //calculate expected correction based on default font metrics
+ var width = (alpha2-alpha1<0.2?4:8);
+ if (in_width) width = labelWidth/1.8;
+ var alpha = alpha1+(alpha2-alpha1)/2;
+
+ //position and its correction
+ R = R-(width-8)/2;
+ var corr_x = - width;
+ var corr_y = -8;
+ var align = "right";
+
+ //for items in left upper and lower sector
+ if(alpha>=Math.PI/2 && alpha=Math.PI){
+ corr_x = -labelWidth-corr_x+1;/*correction for label width*/
+ align = "left";
+ }
+
+ //calculate position of text
+ //basically get point at center of pie sector
+ var offset = 0;
+
+ if(!in_width&&ky<1&&(alpha>0&&alpha=Math.PI/2 && alpha=Math.PI)){
+ x += labelWidth/3;
+ }
+
+
+ //we need to set position of text manually, based on above calculations
+ t.style.top = y+"px";
+ t.style.left = x+"px";
+ t.style.width = labelWidth+"px";
+ t.style.textAlign = align;
+ t.style.whiteSpace = "nowrap";
+ }
+};
+
+dhtmlx.chart.pie3D = {
+ pvt_render_pie3D:function(ctx,data,x,y,sIndex,map){
+ this._renderPie(ctx,data,x,y,this._settings.cant,map);
+ }
+};
+dhtmlx.chart.donut = {
+ pvt_render_donut:function(ctx,data,point0,point1,sIndex,map){
+ if(!data.length)
+ return;
+ this._renderPie(ctx,data,point0,point1,1,map);
+ var config = this._settings;
+ var coord = this._getPieParameters(point0,point1);
+ var pieRadius = (config.radius?config.radius:coord.radius);
+ var innerRadius = ((config.innerRadius&&(config.innerRadius value
+ // {obj.attr} => named attribute or value of sub-tag in case of xml
+ // {obj.attr?some:other} conditional output
+ // {-obj => sub-template
+ str=(str||"").toString();
+ str=str.replace(/[\r\n]+/g,"\\n");
+ str=str.replace(/\{obj\.([^}?]+)\?([^:]*):([^}]*)\}/g,"\"+(obj.$1?\"$2\":\"$3\")+\"");
+ str=str.replace(/\{common\.([^}\(]*)\}/g,"\"+common.$1+\"");
+ str=str.replace(/\{common\.([^\}\(]*)\(\)\}/g,"\"+(common.$1?common.$1(obj):\"\")+\"");
+ str=str.replace(/\{obj\.([^}]*)\}/g,"\"+obj.$1+\"");
+ str=str.replace(/#([a-z0-9_]+)#/gi,"\"+obj.$1+\"");
+ str=str.replace(/\{obj\}/g,"\"+obj+\"");
+ str=str.replace(/\{-obj/g,"{obj");
+ str=str.replace(/\{-common/g,"{common");
+ str="return \""+str+"\";";
+ return this._cache[str]= Function("obj","common",str);
+ }
+};
+
+dhtmlx.Type={
+ /*
+ adds new template-type
+ obj - object to which template will be added
+ data - properties of template
+ */
+ add:function(obj, data){
+ //auto switch to prototype, if name of class was provided
+ if (!obj.types && obj.prototype.types)
+ obj = obj.prototype;
+ //if (typeof data == "string")
+ // data = { template:data };
+
+ if (dhtmlx.assert_enabled())
+ this.assert_event(data);
+
+ var name = data.name||"default";
+
+ //predefined templates - autoprocessing
+ this._template(data);
+ this._template(data,"edit");
+ this._template(data,"loading");
+
+ obj.types[name]=dhtmlx.extend(dhtmlx.extend({},(obj.types[name]||this._default)),data);
+ return name;
+ },
+ //default template value - basically empty box with 5px margin
+ _default:{
+ css:"default",
+ template:function(){ return ""; },
+ template_edit:function(){ return ""; },
+ template_loading:function(){ return "..."; },
+ width:150,
+ height:80,
+ margin:5,
+ padding:0
+ },
+ //template creation helper
+ _template:function(obj,name){
+ name = "template"+(name?("_"+name):"");
+ var data = obj[name];
+ //if template is a string - check is it plain string or reference to external content
+ if (data && (typeof data == "string")){
+ if (data.indexOf("->")!=-1){
+ data = data.split("->");
+ switch(data[0]){
+ case "html": //load from some container on the page
+ data = dhtmlx.html.getValue(data[1]).replace(/\"/g,"\\\"");
+ break;
+ case "http": //load from external file
+ data = new dhtmlx.ajax().sync().get(data[1],{uid:(new Date()).valueOf()}).responseText;
+ break;
+ default:
+ //do nothing, will use template as is
+ break;
+ }
+ }
+ obj[name] = dhtmlx.Template.fromHTML(data);
+ }
+ }
+};
+
+
+
+/* DHX DEPEND FROM FILE 'single_render.js'*/
+
+
+/*
+ REnders single item.
+ Can be used for elements without datastore, or with complex custom rendering logic
+
+ @export
+ render
+*/
+
+/*DHX:Depend template.js*/
+
+dhtmlx.SingleRender={
+ _init:function(){
+ },
+ //convert item to the HTML text
+ _toHTML:function(obj){
+ /*
+ this one doesn't support per-item-$template
+ it has not sense, because we have only single item per object
+ */
+ return this.type._item_start(obj,this.type)+this.type.template(obj,this.type)+this.type._item_end;
+ },
+ //render self, by templating data object
+ render:function(){
+ if (!this.callEvent || this.callEvent("onBeforeRender",[this.data])){
+ if (this.data)
+ this._dataobj.innerHTML = this._toHTML(this.data);
+ if (this.callEvent) this.callEvent("onAfterRender",[]);
+ }
+ }
+};
+
+
+/* DHX DEPEND FROM FILE 'tooltip.js'*/
+
+
+/*
+ UI: Tooltip
+
+ @export
+ show
+ hide
+*/
+
+/*DHX:Depend tooltip.css*/
+/*DHX:Depend template.js*/
+/*DHX:Depend single_render.js*/
+
+dhtmlx.ui.Tooltip=function(container){
+ this.name = "Tooltip";
+ this.version = "3.0";
+
+ if (dhtmlx.assert_enabled()) this._assert();
+
+ if (typeof container == "string"){
+ container = { template:container };
+ }
+
+ dhtmlx.extend(this, dhtmlx.Settings);
+ dhtmlx.extend(this, dhtmlx.SingleRender);
+ this._parseSettings(container,{
+ type:"default",
+ dy:0,
+ dx:20
+ });
+
+ //create container for future tooltip
+ this._dataobj = this._obj = document.createElement("DIV");
+ this._obj.className="dhx_tooltip";
+ dhtmlx.html.insertBefore(this._obj,document.body.firstChild);
+};
+dhtmlx.ui.Tooltip.prototype = {
+ //show tooptip
+ //pos - object, pos.x - left, pox.y - top
+ show:function(data,pos){
+ if (this._disabled) return;
+ //render sefl only if new data was provided
+ if (this.data!=data){
+ this.data=data;
+ this.render(data);
+ }
+ //show at specified position
+ this._obj.style.top = pos.y+this._settings.dy+"px";
+ this._obj.style.left = pos.x+this._settings.dx+"px";
+ this._obj.style.display="block";
+ },
+ //hide tooltip
+ hide:function(){
+ this.data=null; //nulify, to be sure that on next show it will be fresh-rendered
+ this._obj.style.display="none";
+ },
+ disable:function(){
+ this._disabled = true;
+ },
+ enable:function(){
+ this._disabled = false;
+ },
+ types:{
+ "default":dhtmlx.Template.fromHTML("{obj.id}")
+ },
+ template_item_start:dhtmlx.Template.empty,
+ template_item_end:dhtmlx.Template.empty
+};
+
+
+
+/* DHX DEPEND FROM FILE 'autotooltip.js'*/
+
+
+/*
+ Behavior: AutoTooltip - links tooltip to data driven item
+*/
+
+/*DHX:Depend tooltip.js*/
+
+dhtmlx.AutoTooltip = {
+ tooltip_setter:function(value){
+ var t = new dhtmlx.ui.Tooltip(value);
+ this.attachEvent("onMouseMove",function(id,e){ //show tooltip on mousemove
+ t.show(this.get(id),dhtmlx.html.pos(e));
+ });
+ this.attachEvent("onMouseOut",function(id,e){ //hide tooltip on mouseout
+ t.hide();
+ });
+ this.attachEvent("onMouseMoving",function(id,e){ //hide tooltip just after moving start
+ t.hide();
+ });
+ return t;
+ }
+};
+
+
+/* DHX DEPEND FROM FILE 'load.js'*/
+
+
+/*
+ ajax operations
+
+ can be used for direct loading as
+ dhtmlx.ajax(ulr, callback)
+ or
+ dhtmlx.ajax().item(url)
+ dhtmlx.ajax().post(url)
+
+*/
+
+/*DHX:Depend dhtmlx.js*/
+
+dhtmlx.ajax = function(url,call,master){
+ //if parameters was provided - made fast call
+ if (arguments.length!==0){
+ var http_request = new dhtmlx.ajax();
+ if (master) http_request.master=master;
+ http_request.get(url,null,call);
+ }
+ if (!this.getXHR) return new dhtmlx.ajax(); //allow to create new instance without direct new declaration
+
+ return this;
+};
+dhtmlx.ajax.prototype={
+ //creates xmlHTTP object
+ getXHR:function(){
+ if (dhtmlx._isIE)
+ return new ActiveXObject("Microsoft.xmlHTTP");
+ else
+ return new XMLHttpRequest();
+ },
+ /*
+ send data to the server
+ params - hash of properties which will be added to the url
+ call - callback, can be an array of functions
+ */
+ send:function(url,params,call){
+ var x=this.getXHR();
+ if (typeof call == "function")
+ call = [call];
+ //add extra params to the url
+ if (typeof params == "object"){
+ var t=[];
+ for (var a in params){
+ var value = params[a];
+ if (value === null || value === dhtmlx.undefined)
+ value = "";
+ t.push(a+"="+encodeURIComponent(value));// utf-8 escaping
+ }
+ params=t.join("&");
+ }
+ if (params && !this.post){
+ url=url+(url.indexOf("?")!=-1 ? "&" : "?")+params;
+ params=null;
+ }
+
+ x.open(this.post?"POST":"GET",url,!this._sync);
+ if (this.post)
+ x.setRequestHeader('Content-type','application/x-www-form-urlencoded');
+
+ //async mode, define loading callback
+ //if (!this._sync){
+ var self=this;
+ x.onreadystatechange= function(){
+ if (!x.readyState || x.readyState == 4){
+ dhtmlx.log_full_time("data_loading"); //log rendering time
+ if (call && self)
+ for (var i=0; i < call.length; i++) //there can be multiple callbacks
+ if (call[i])
+ call[i].call((self.master||self),x.responseText,x.responseXML,x);
+ self.master=null;
+ call=self=null; //anti-leak
+ }
+ };
+ //}
+
+ x.send(params||null);
+ return x; //return XHR, which can be used in case of sync. mode
+ },
+ //GET request
+ get:function(url,params,call){
+ this.post=false;
+ return this.send(url,params,call);
+ },
+ //POST request
+ post:function(url,params,call){
+ this.post=true;
+ return this.send(url,params,call);
+ },
+ sync:function(){
+ this._sync = true;
+ return this;
+ }
+};
+
+
+dhtmlx.AtomDataLoader={
+ _init:function(config){
+ //prepare data store
+ this.data = {};
+ if (config){
+ this._settings.datatype = config.datatype||"json";
+ this._after_init.push(this._load_when_ready);
+ }
+ },
+ _load_when_ready:function(){
+ this._ready_for_data = true;
+
+ if (this._settings.url)
+ this.url_setter(this._settings.url);
+ if (this._settings.data)
+ this.data_setter(this._settings.data);
+ },
+ url_setter:function(value){
+ if (!this._ready_for_data) return value;
+ this.load(value, this._settings.datatype);
+ return value;
+ },
+ data_setter:function(value){
+ if (!this._ready_for_data) return value;
+ this.parse(value, this._settings.datatype);
+ return true;
+ },
+ //loads data from external URL
+ load:function(url,call){
+ this.callEvent("onXLS",[]);
+ if (typeof call == "string"){ //second parameter can be a loading type or callback
+ this.data.driver = dhtmlx.DataDriver[call];
+ call = arguments[2];
+ }
+ else
+ this.data.driver = dhtmlx.DataDriver["xml"];
+ //load data by async ajax call
+ dhtmlx.ajax(url,[this._onLoad,call],this);
+ },
+ //loads data from object
+ parse:function(data,type){
+ this.callEvent("onXLS",[]);
+ this.data.driver = dhtmlx.DataDriver[type||"xml"];
+ this._onLoad(data,null);
+ },
+ //default after loading callback
+ _onLoad:function(text,xml,loader){
+ var driver = this.data.driver;
+ var top = driver.getRecords(driver.toObject(text,xml))[0];
+ this.data=(driver?driver.getDetails(top):text);
+ this.callEvent("onXLE",[]);
+ },
+ _check_data_feed:function(data){
+ if (!this._settings.dataFeed || this._ignore_feed || !data) return true;
+ var url = this._settings.dataFeed;
+ if (typeof url == "function")
+ return url.call(this, (data.id||data), data);
+ url = url+(url.indexOf("?")==-1?"?":"&")+"action=get&id="+encodeURIComponent(data.id||data);
+ this.callEvent("onXLS",[]);
+ dhtmlx.ajax(url, function(text,xml){
+ this._ignore_feed=true;
+ this.setValues(dhtmlx.DataDriver.json.toObject(text)[0]);
+ this._ignore_feed=false;
+ this.callEvent("onXLE",[]);
+ }, this);
+ return false;
+ }
+};
+
+/*
+ Abstraction layer for different data types
+*/
+
+dhtmlx.DataDriver={};
+dhtmlx.DataDriver.json={
+ //convert json string to json object if necessary
+ toObject:function(data){
+ if (!data) data="[]";
+ if (typeof data == "string"){
+ eval ("dhtmlx.temp="+data);
+ return dhtmlx.temp;
+ }
+ return data;
+ },
+ //get array of records
+ getRecords:function(data){
+ if (data && !(data instanceof Array))
+ return [data];
+ return data;
+ },
+ //get hash of properties for single record
+ getDetails:function(data){
+ return data;
+ },
+ //get count of data and position at which new data need to be inserted
+ getInfo:function(data){
+ return {
+ _size:(data.total_count||0),
+ _from:(data.pos||0),
+ _key:(data.dhx_security)
+ };
+ }
+};
+
+dhtmlx.DataDriver.json_ext={
+ //convert json string to json object if necessary
+ toObject:function(data){
+ if (!data) data="[]";
+ if (typeof data == "string"){
+ var temp;
+ eval ("temp="+data);
+ dhtmlx.temp = [];
+ var header = temp.header;
+ for (var i = 0; i < temp.data.length; i++) {
+ var item = {};
+ for (var j = 0; j < header.length; j++) {
+ if (typeof(temp.data[i][j]) != "undefined")
+ item[header[j]] = temp.data[i][j];
+ }
+ dhtmlx.temp.push(item);
+ }
+ return dhtmlx.temp;
+ }
+ return data;
+ },
+ //get array of records
+ getRecords:function(data){
+ if (data && !(data instanceof Array))
+ return [data];
+ return data;
+ },
+ //get hash of properties for single record
+ getDetails:function(data){
+ return data;
+ },
+ //get count of data and position at which new data need to be inserted
+ getInfo:function(data){
+ return {
+ _size:(data.total_count||0),
+ _from:(data.pos||0)
+ };
+ }
+};
+
+dhtmlx.DataDriver.html={
+ /*
+ incoming data can be
+ - collection of nodes
+ - ID of parent container
+ - HTML text
+ */
+ toObject:function(data){
+ if (typeof data == "string"){
+ var t=null;
+ if (data.indexOf("<")==-1) //if no tags inside - probably its an ID
+ t = dhtmlx.toNode(data);
+ if (!t){
+ t=document.createElement("DIV");
+ t.innerHTML = data;
+ }
+
+ return t.getElementsByTagName(this.tag);
+ }
+ return data;
+ },
+ //get array of records
+ getRecords:function(data){
+ if (data.tagName)
+ return data.childNodes;
+ return data;
+ },
+ //get hash of properties for single record
+ getDetails:function(data){
+ return dhtmlx.DataDriver.xml.tagToObject(data);
+ },
+ //dyn loading is not supported by HTML data source
+ getInfo:function(data){
+ return {
+ _size:0,
+ _from:0
+ };
+ },
+ tag: "LI"
+};
+
+dhtmlx.DataDriver.jsarray={
+ //eval jsarray string to jsarray object if necessary
+ toObject:function(data){
+ if (typeof data == "string"){
+ eval ("dhtmlx.temp="+data);
+ return dhtmlx.temp;
+ }
+ return data;
+ },
+ //get array of records
+ getRecords:function(data){
+ return data;
+ },
+ //get hash of properties for single record, in case of array they will have names as "data{index}"
+ getDetails:function(data){
+ var result = {};
+ for (var i=0; i < data.length; i++)
+ result["data"+i]=data[i];
+
+ return result;
+ },
+ //dyn loading is not supported by js-array data source
+ getInfo:function(data){
+ return {
+ _size:0,
+ _from:0
+ };
+ }
+};
+
+dhtmlx.DataDriver.csv={
+ //incoming data always a string
+ toObject:function(data){
+ return data;
+ },
+ //get array of records
+ getRecords:function(data){
+ return data.split(this.row);
+ },
+ //get hash of properties for single record, data named as "data{index}"
+ getDetails:function(data){
+ data = this.stringToArray(data);
+ var result = {};
+ for (var i=0; i < data.length; i++)
+ result["data"+i]=data[i];
+
+ return result;
+ },
+ //dyn loading is not supported by csv data source
+ getInfo:function(data){
+ return {
+ _size:0,
+ _from:0
+ };
+ },
+ //split string in array, takes string surrounding quotes in account
+ stringToArray:function(data){
+ data = data.split(this.cell);
+ for (var i=0; i < data.length; i++)
+ data[i] = data[i].replace(/^[ \t\n\r]*(\"|)/g,"").replace(/(\"|)[ \t\n\r]*$/g,"");
+ return data;
+ },
+ row:"\n", //default row separator
+ cell:"," //default cell separator
+};
+
+dhtmlx.DataDriver.xml={
+ //convert xml string to xml object if necessary
+ toObject:function(text,xml){
+ if (xml && (xml=this.checkResponse(text,xml))) //checkResponse - fix incorrect content type and extra whitespaces errors
+ return xml;
+ if (typeof text == "string"){
+ return this.fromString(text);
+ }
+ return text;
+ },
+ //get array of records
+ getRecords:function(data){
+ return this.xpath(data,this.records);
+ },
+ records:"/*/item",
+ //get hash of properties for single record
+ getDetails:function(data){
+ return this.tagToObject(data,{});
+ },
+ //get count of data and position at which new data_loading need to be inserted
+ getInfo:function(data){
+ return {
+ _size:(data.documentElement.getAttribute("total_count")||0),
+ _from:(data.documentElement.getAttribute("pos")||0),
+ _key:(data.documentElement.getAttribute("dhx_security"))
+ };
+ },
+ //xpath helper
+ xpath:function(xml,path){
+ if (window.XPathResult){ //FF, KHTML, Opera
+ var node=xml;
+ if(xml.nodeName.indexOf("document")==-1)
+ xml=xml.ownerDocument;
+ var res = [];
+ var col = xml.evaluate(path, node, null, XPathResult.ANY_TYPE, null);
+ var temp = col.iterateNext();
+ while (temp){
+ res.push(temp);
+ temp = col.iterateNext();
+ }
+ return res;
+ }
+ else {
+ var test = true;
+ try {
+ if (typeof(xml.selectNodes)=="undefined")
+ test = false;
+ } catch(e){ /*IE7 and below can't operate with xml object*/ }
+ //IE
+ if (test)
+ return xml.selectNodes(path);
+ else {
+ //Google hate us, there is no interface to do XPath
+ //use naive approach
+ var name = path.split("/").pop();
+ return xml.getElementsByTagName(name);
+ }
+ }
+ },
+ //convert xml tag to js object, all subtags and attributes are mapped to the properties of result object
+ tagToObject:function(tag,z){
+ z=z||{};
+ var flag=false;
+
+ //map attributes
+ var a=tag.attributes;
+ if(a && a.length){
+ for (var i=0; ito){ //can be in case of backward shift-selection
+ var a=to; to=from; from=a;
+ }
+
+ return this.getIndexRange(from,to);
+ },
+ //converts range of indexes to array of all IDs between them
+ getIndexRange:function(from,to){
+ to=Math.min((to||Infinity),this.dataCount()-1);
+
+ var ret=dhtmlx.toArray(); //result of method is rich-array
+ for (var i=(from||0); i <= to; i++)
+ ret.push(this.item(this.order[i]));
+ return ret;
+ },
+ //returns total count of elements
+ dataCount:function(){
+ return this.order.length;
+ },
+ //returns truy if item with such ID exists
+ exists:function(id){
+ return !!(this.pull[id]);
+ },
+ //nextmethod is not visible on component level, check DataMove.move
+ //moves item from source index to the target index
+ move:function(sindex,tindex){
+ if (sindex<0 || tindex<0){
+ dhtmlx.error("DataStore::move","Incorrect indexes");
+ return;
+ }
+
+ var id = this.idByIndex(sindex);
+ var obj = this.item(id);
+
+ this.order.removeAt(sindex); //remove at old position
+ //if (sindex data_size){
+ dhtmlx.log("Warning","DataStore:add","Index of out of bounds");
+ index = Math.min(this.order.length,index);
+ }
+ if (this.callEvent("onBeforeAdd", [id, obj, index]) === false) return false;
+
+ if (this.exists(id)) return dhtmlx.error("Not unique ID");
+
+ this.pull[id]=obj;
+ this.order.insertAt(id,index);
+ if (this._filter_order){ //adding during filtering
+ //we can't know the location of new item in full dataset, making suggestion
+ //put at end by default
+ var original_index = this._filter_order.length;
+ //put at start only if adding to the start and some data exists
+ if (!index && this.order.length)
+ original_index = 0;
+
+ this._filter_order.insertAt(id,original_index);
+ }
+ this.callEvent("onafterAdd",[id,index]);
+ //repaint signal
+ this.callEvent("onStoreUpdated",[id,obj,"add"]);
+ return id;
+ },
+
+ //removes element from datastore
+ remove:function(id){
+ //id can be an array of IDs - result of getSelect, for example
+ if (id instanceof Array){
+ for (var i=0; i < id.length; i++)
+ this.remove(id[i]);
+ return;
+ }
+ if (this.callEvent("onBeforeDelete",[id]) === false) return false;
+ if (!this.exists(id)) return dhtmlx.error("Not existing ID",id);
+ var obj = this.item(id); //save for later event
+ //clear from collections
+ this.order.remove(id);
+ if (this._filter_order)
+ this._filter_order.remove(id);
+
+ delete this.pull[id];
+ this.callEvent("onafterdelete",[id]);
+ //repaint signal
+ this.callEvent("onStoreUpdated",[id,obj,"delete"]);
+ },
+ //deletes all records in datastore
+ clearAll:function(){
+ //instead of deleting one by one - just reset inner collections
+ this.pull = {};
+ this.order = dhtmlx.toArray();
+ this.feed = null;
+ this._filter_order = null;
+ this.callEvent("onClearAll",[]);
+ this.refresh();
+ },
+ //converts id to index
+ idByIndex:function(index){
+ if (index>=this.order.length || index<0)
+ dhtmlx.log("Warning","DataStore::idByIndex Incorrect index");
+
+ return this.order[index];
+ },
+ //converts index to id
+ indexById:function(id){
+ var res = this.order.find(id); //slower than idByIndex
+
+ //if (!this.pull[id])
+ // dhtmlx.log("Warning","DataStore::indexById Non-existing ID: "+ id);
+
+ return res;
+ },
+ //returns ID of next element
+ next:function(id,step){
+ return this.order[this.indexById(id)+(step||1)];
+ },
+ //returns ID of first element
+ first:function(){
+ return this.order[0];
+ },
+ //returns ID of last element
+ last:function(){
+ return this.order[this.order.length-1];
+ },
+ //returns ID of previous element
+ previous:function(id,step){
+ return this.order[this.indexById(id)-(step||1)];
+ },
+ /*
+ sort data in collection
+ by - settings of sorting
+
+ or
+
+ by - sorting function
+ dir - "asc" or "desc"
+
+ or
+
+ by - property
+ dir - "asc" or "desc"
+ as - type of sortings
+
+ Sorting function will accept 2 parameters and must return 1,0,-1, based on desired order
+ */
+ sort:function(by, dir, as){
+ var sort = by;
+ if (typeof by == "function")
+ sort = {as:by, dir:dir};
+ else if (typeof by == "string")
+ sort = {by:by, dir:dir, as:as};
+
+
+ var parameters = [sort.by, sort.dir, sort.as];
+ if (!this.callEvent("onbeforesort",parameters)) return;
+
+ if (this.order.length){
+ var sorter = dhtmlx.sort.create(sort);
+ //get array of IDs
+ var neworder = this.getRange(this.first(), this.last());
+ neworder.sort(sorter);
+ this.order = neworder.map(function(obj){ return this.id(obj); },this);
+ }
+
+ //repaint self
+ this.refresh();
+
+ this.callEvent("onaftersort",parameters);
+ },
+ /*
+ Filter datasource
+
+ text - property, by which filter
+ value - filter mask
+
+ or
+
+ text - filter method
+
+ Filter method will receive data object and must return true or false
+ */
+ filter:function(text,value){
+ if (!this.callEvent("onBeforeFilter", [text, value])) return;
+
+ //remove previous filtering , if any
+ if (this._filter_order){
+ this.order = this._filter_order;
+ delete this._filter_order;
+ }
+
+ if (!this.order.length) return;
+
+ //if text not define -just unfilter previous state and exit
+ if (text){
+ var filter = text;
+ value = value||"";
+ if (typeof text == "string"){
+ text = dhtmlx.Template.fromHTML(text);
+ value = value.toString().toLowerCase();
+ filter = function(obj,value){ //default filter - string start from, case in-sensitive
+ return text(obj).toLowerCase().indexOf(value)!=-1;
+ };
+ }
+
+
+ var neworder = dhtmlx.toArray();
+ for (var i=0; i < this.order.length; i++){
+ var id = this.order[i];
+ if (filter(this.item(id),value))
+ neworder.push(id);
+ }
+ //set new order of items, store original
+ this._filter_order = this.order;
+ this.order = neworder;
+ }
+ //repaint self
+ this.refresh();
+
+ this.callEvent("onAfterFilter", []);
+ },
+ /*
+ Iterate through collection
+ */
+ each:function(method,master){
+ for (var i=0; ib?1:(ab?1:(ab?1:(a max) max = property(obj)*1;
+ });
+ return max;
+ },
+ _split_data_by:function(stats){
+ var any=function(property, data){
+ property = dhtmlx.Template.setter(property);
+ return property(data[0]);
+ };
+ var key = dhtmlx.Template.setter(stats.by);
+ if (!stats.map[key])
+ stats.map[key] = [key, any];
+
+ var groups = {};
+ var labels = [];
+ this.data.each(function(data){
+ var current = key(data);
+ if (!groups[current]){
+ labels.push({id:current});
+ groups[current] = dhtmlx.toArray();
+ }
+ groups[current].push(data);
+ });
+ for (var prop in stats.map){
+ var functor = (stats.map[prop][1]||any);
+ if (typeof functor != "function")
+ functor = this[functor];
+
+ for (var i=0; i < labels.length; i++) {
+ labels[i][prop]=functor.call(this, stats.map[prop][0], groups[labels[i].id]);
+ }
+ }
+// if (this._settings.sort)
+// labels.sortBy(stats.sort);
+
+ this._not_grouped_data = this.data;
+ this.data = new dhtmlx.DataStore();
+ this.data.provideApi(this,true);
+ this._init_group_data_event(this.data, this);
+ this.parse(labels,"json");
+ },
+ group:function(config,mode){
+ this.ungroup(false);
+ this._split_data_by(config);
+ if (mode!==false)
+ this.render();
+ },
+ ungroup:function(mode){
+ if (this._not_grouped_data){
+ this.data = this._not_grouped_data;
+ this.data.provideApi(this, true);
+ }
+ if (mode!==false)
+ this.render();
+ },
+ group_setter:function(config){
+ dhtmlx.assert(typeof config == "object", "Incorrect group value");
+ dhtmlx.assert(config.by,"group.by is mandatory");
+ dhtmlx.assert(config.map,"group.map is mandatory");
+ return config;
+ },
+ //need to be moved to more appropriate object
+ sort_setter:function(config){
+ if (typeof config != "object")
+ config = { by:config };
+
+ this._mergeSettings(config,{
+ as:"string",
+ dir:"asc"
+ });
+ return config;
+ }
+};
+
+
+/* DHX DEPEND FROM FILE 'key.js'*/
+
+
+/*
+ Behavior:KeyEvents - hears keyboard
+*/
+dhtmlx.KeyEvents = {
+ _init:function(){
+ //attach handler to the main container
+ dhtmlx.event(this._obj,"keypress",this._onKeyPress,this);
+ },
+ //called on each key press , when focus is inside of related component
+ _onKeyPress:function(e){
+ e=e||event;
+ var code = e.which||e.keyCode; //FIXME better solution is required
+ this.callEvent((this._edit_id?"onEditKeyPress":"onKeyPress"),[code,e.ctrlKey,e.shiftKey,e]);
+ }
+};
+
+
+/* DHX DEPEND FROM FILE 'mouse.js'*/
+
+
+/*
+ Behavior:MouseEvents - provides inner evnets for mouse actions
+*/
+dhtmlx.MouseEvents={
+ _init: function(){
+ //attach dom events if related collection is defined
+ if (this.on_click){
+ dhtmlx.event(this._obj,"click",this._onClick,this);
+ dhtmlx.event(this._obj,"contextmenu",this._onContext,this);
+ }
+ if (this.on_dblclick)
+ dhtmlx.event(this._obj,"dblclick",this._onDblClick,this);
+ if (this.on_mouse_move){
+ dhtmlx.event(this._obj,"mousemove",this._onMouse,this);
+ dhtmlx.event(this._obj,(dhtmlx._isIE?"mouseleave":"mouseout"),this._onMouse,this);
+ }
+
+ },
+ //inner onclick object handler
+ _onClick: function(e) {
+ return this._mouseEvent(e,this.on_click,"ItemClick");
+ },
+ //inner ondblclick object handler
+ _onDblClick: function(e) {
+ return this._mouseEvent(e,this.on_dblclick,"ItemDblClick");
+ },
+ //process oncontextmenu events
+ _onContext: function(e) {
+ var id = dhtmlx.html.locate(e, this._id);
+ if (id && !this.callEvent("onBeforeContextMenu", [id,e]))
+ return dhtmlx.html.preventEvent(e);
+ },
+ /*
+ event throttler - ignore events which occurs too fast
+ during mouse moving there are a lot of event firing - we need no so much
+ also, mouseout can fire when moving inside the same html container - we need to ignore such fake calls
+ */
+ _onMouse:function(e){
+ if (dhtmlx._isIE) //make a copy of event, will be used in timed call
+ e = document.createEventObject(event);
+
+ if (this._mouse_move_timer) //clear old event timer
+ window.clearTimeout(this._mouse_move_timer);
+
+ //this event just inform about moving operation, we don't care about details
+ this.callEvent("onMouseMoving",[e]);
+ //set new event timer
+ this._mouse_move_timer = window.setTimeout(dhtmlx.bind(function(){
+ //called only when we have at least 100ms after previous event
+ if (e.type == "mousemove")
+ this._onMouseMove(e);
+ else
+ this._onMouseOut(e);
+ },this),500);
+ },
+ //inner mousemove object handler
+ _onMouseMove: function(e) {
+ if (!this._mouseEvent(e,this.on_mouse_move,"MouseMove"))
+ this.callEvent("onMouseOut",[e||event]);
+ },
+ //inner mouseout object handler
+ _onMouseOut: function(e) {
+ this.callEvent("onMouseOut",[e||event]);
+ },
+ //common logic for click and dbl-click processing
+ _mouseEvent:function(e,hash,name){
+ e=e||event;
+ var trg=e.target||e.srcElement;
+ var css = "";
+ var id = null;
+ var found = false;
+ //loop through all parents
+ while (trg && trg.parentNode){
+ if (!found && trg.getAttribute){ //if element with ID mark is not detected yet
+ id = trg.getAttribute(this._id); //check id of current one
+ if (id){
+ if (trg.getAttribute("userdata"))
+ this.callEvent("onLocateData",[id,trg]);
+ if (!this.callEvent("on"+name,[id,e,trg])) return; //it will be triggered only for first detected ID, in case of nested elements
+ found = true; //set found flag
+ }
+ }
+ css=trg.className;
+ if (css){ //check if pre-defined reaction for element's css name exists
+ css = css.split(" ");
+ css = css[0]||css[1]; //FIXME:bad solution, workaround css classes which are starting from whitespace
+ if (hash[css])
+ return hash[css].call(this,e,id,trg);
+ }
+ trg=trg.parentNode;
+ }
+ return found; //returns true if item was located and event was triggered
+ }
+};
+
+
+/* DHX DEPEND FROM FILE 'config.js'*/
+
+
+/*
+ Behavior:Settings
+
+ @export
+ customize
+ config
+*/
+
+/*DHX:Depend template.js*/
+/*DHX:Depend dhtmlx.js*/
+
+dhtmlx.Settings={
+ _init:function(){
+ /*
+ property can be accessed as this.config.some
+ in same time for inner call it have sense to use _settings
+ because it will be minified in final version
+ */
+ this._settings = this.config= {};
+ },
+ define:function(property, value){
+ if (typeof property == "object")
+ return this._parseSeetingColl(property);
+ return this._define(property, value);
+ },
+ _define:function(property,value){
+ dhtmlx.assert_settings.call(this,property,value);
+
+ //method with name {prop}_setter will be used as property setter
+ //setter is optional
+ var setter = this[property+"_setter"];
+ return this._settings[property]=setter?setter.call(this,value):value;
+ },
+ //process configuration object
+ _parseSeetingColl:function(coll){
+ if (coll){
+ for (var a in coll) //for each setting
+ this._define(a,coll[a]); //set value through config
+ }
+ },
+ //helper for object initialization
+ _parseSettings:function(obj,initial){
+ //initial - set of default values
+ var settings = dhtmlx.extend({},initial);
+ //code below will copy all properties over default one
+ if (typeof obj == "object" && !obj.tagName)
+ dhtmlx.extend(settings,obj);
+ //call config for each setting
+ this._parseSeetingColl(settings);
+ },
+ _mergeSettings:function(config, defaults){
+ for (var key in defaults)
+ switch(typeof config[key]){
+ case "object":
+ config[key] = this._mergeSettings((config[key]||{}), defaults[key]);
+ break;
+ case "undefined":
+ config[key] = defaults[key];
+ break;
+ default: //do nothing
+ break;
+ }
+ return config;
+ },
+ //helper for html container init
+ _parseContainer:function(obj,name,fallback){
+ /*
+ parameter can be a config object, in such case real container will be obj.container
+ or it can be html object or ID of html object
+ */
+ if (typeof obj == "object" && !obj.tagName)
+ obj=obj.container;
+ this._obj = dhtmlx.toNode(obj);
+ if (!this._obj && fallback)
+ this._obj = fallback(obj);
+
+ dhtmlx.assert(this._obj, "Incorrect html container");
+
+ this._obj.className+=" "+name;
+ this._obj.onselectstart=function(){return false;}; //block selection by default
+ this._dataobj = this._obj;//separate reference for rendering modules
+ },
+ //apply template-type
+ _set_type:function(name){
+ //parameter can be a hash of settings
+ if (typeof name == "object")
+ return this.type_setter(name);
+
+ dhtmlx.assert(this.types, "RenderStack :: Types are not defined");
+ dhtmlx.assert(this.types[name],"RenderStack :: Inccorect type name",name);
+ //or parameter can be a name of existing template-type
+ this.type=dhtmlx.extend({},this.types[name]);
+ this.customize(); //init configs
+ },
+ customize:function(obj){
+ //apply new properties
+ if (obj) dhtmlx.extend(this.type,obj);
+
+ //init tempaltes for item start and item end
+ this.type._item_start = dhtmlx.Template.fromHTML(this.template_item_start(this.type));
+ this.type._item_end = this.template_item_end(this.type);
+
+ //repaint self
+ this.render();
+ },
+ //config.type - creates new template-type, based on configuration object
+ type_setter:function(value){
+ this._set_type(typeof value == "object"?dhtmlx.Type.add(this,value):value);
+ return value;
+ },
+ //config.template - creates new template-type with defined template string
+ template_setter:function(value){
+ return this.type_setter({template:value});
+ },
+ //config.css - css name for top level container
+ css_setter:function(value){
+ this._obj.className += " "+value;
+ return value;
+ }
+};
+
+
+/* DHX DEPEND FROM FILE 'compatibility.js'*/
+
+
+/*
+ Collection of compatibility hacks
+*/
+
+/*DHX:Depend dhtmlx.js*/
+
+dhtmlx.compat=function(name, obj){
+ //check if name hash present, and applies it when necessary
+ if (dhtmlx.compat[name])
+ dhtmlx.compat[name](obj);
+};
+
+
+(function(){
+ if (!window.dhtmlxError){
+ //dhtmlxcommon is not included
+
+ //create fake error tracker for connectors
+ var dummy = function(){};
+ window.dhtmlxError={ catchError:dummy, throwError:dummy };
+ //helpers instead of ones from dhtmlxcommon
+ window.convertStringToBoolean=function(value){
+ return !!value;
+ };
+ window.dhtmlxEventable = function(node){
+ dhtmlx.extend(node,dhtmlx.EventSystem);
+ };
+ //imitate ajax layer of dhtmlxcommon
+ var loader = {
+ getXMLTopNode:function(name){
+
+ },
+ doXPath:function(path){
+ return dhtmlx.DataDriver.xml.xpath(this.xml,path);
+ },
+ xmlDoc:{
+ responseXML:true
+ }
+ };
+ //wrap ajax methods of dataprocessor
+ dhtmlx.compat.dataProcessor=function(obj){
+ //FIXME
+ //this is pretty ugly solution - we replace whole method , so changes in dataprocessor need to be reflected here
+
+ var sendData = "_sendData";
+ var in_progress = "_in_progress";
+ var tMode = "_tMode";
+ var waitMode = "_waitMode";
+
+ obj[sendData]=function(a1,rowId){
+ if (!a1) return; //nothing to send
+ if (rowId)
+ this[in_progress][rowId]=(new Date()).valueOf();
+
+ if (!this.callEvent("onBeforeDataSending",rowId?[rowId,this.getState(rowId)]:[])) return false;
+
+ var a2 = this;
+ var a3=this.serverProcessor;
+ if (this[tMode]!="POST")
+ //use dhtmlx.ajax instead of old ajax layer
+ dhtmlx.ajax().get(a3+((a3.indexOf("?")!=-1)?"&":"?")+this.serialize(a1,rowId),"",function(t,x,xml){
+ loader.xml = dhtmlx.DataDriver.xml.checkResponse(t,x);
+ a2.afterUpdate(a2, null, null, null, loader);
+ });
+ else
+ dhtmlx.ajax().post(a3,this.serialize(a1,rowId),function(t,x,xml){
+ loader.xml = dhtmlx.DataDriver.xml.checkResponse(t,x);
+ a2.afterUpdate(a2, null, null, null, loader);
+ });
+
+ this[waitMode]++;
+ };
+ };
+ }
+
+})();
+
+
+/* DHX DEPEND FROM FILE 'compatibility_layout.js'*/
+
+
+/*DHX:Depend dhtmlx.js*/
+/*DHX:Depend compatibility.js*/
+
+if (!dhtmlx.attaches)
+ dhtmlx.attaches = {};
+
+dhtmlx.attaches.attachAbstract=function(name, conf){
+ var obj = document.createElement("DIV");
+ obj.id = "CustomObject_"+dhtmlx.uid();
+ obj.style.width = "100%";
+ obj.style.height = "100%";
+ obj.cmp = "grid";
+ document.body.appendChild(obj);
+ this.attachObject(obj.id);
+
+ conf.container = obj.id;
+
+ var that = this.vs[this.av];
+ that.grid = new window[name](conf);
+
+ that.gridId = obj.id;
+ that.gridObj = obj;
+
+
+ that.grid.setSizes = function(){
+ if (this.resize) this.resize();
+ else this.render();
+ };
+
+ var method_name="_viewRestore";
+ return this.vs[this[method_name]()].grid;
+};
+dhtmlx.attaches.attachDataView = function(conf){
+ return this.attachAbstract("dhtmlXDataView",conf);
+};
+dhtmlx.attaches.attachChart = function(conf){
+ return this.attachAbstract("dhtmlXChart",conf);
+};
+
+dhtmlx.compat.layout = function(){};
+
+
+
+/* DHX DEPEND FROM FILE 'compatibility_grid.js'*/
+
+
+/*
+ Compatibility hack for loading data from the grid.
+ Provides new type of datasource - dhtmlxgrid
+
+*/
+
+/*DHX:Depend load.js*/
+
+dhtmlx.DataDriver.dhtmlxgrid={
+ _grid_getter:"_get_cell_value",
+ toObject:function(data){
+ this._grid = data;
+ return data;
+ },
+ getRecords:function(data){
+ return data.rowsBuffer;
+ },
+ getDetails:function(data){
+ var result = {};
+ for (var i=0; i < this._grid.getColumnsNum(); i++)
+ result["data"+i]=this._grid[this._grid_getter](data,i);
+
+ return result;
+ },
+ getInfo:function(data){
+ return {
+ _size:0,
+ _from:0
+ };
+ }
+};
+
+
+/* DHX DEPEND FROM FILE 'canvas.js'*/
+
+
+/*DHX:Depend thirdparty\excanvas*/
+/*DHX:Depend dhtmlx.js*/
+
+dhtmlx.Canvas = {
+ _init:function(){
+ this._canvas_labels = [];
+ },
+ _prepareCanvas:function(container){
+ //canvas has the same size as master object
+ this._canvas = dhtmlx.html.create("canvas",{ width:container.offsetWidth, height:container.offsetHeight });
+ container.appendChild(this._canvas);
+ //use excanvas in IE
+ if (!this._canvas.getContext){
+ if (dhtmlx._isIE){
+ dhtmlx.require("thirdparty/excanvas/excanvas.js"); //sync loading
+ G_vmlCanvasManager.init_(document);
+ G_vmlCanvasManager.initElement(this._canvas);
+ } else //some other not supported browser
+ dhtmlx.error("Canvas is not supported in the current browser");
+ }
+ return this._canvas;
+ },
+ getCanvas:function(context){
+ return (this._canvas||this._prepareCanvas(this._obj)).getContext(context||"2d");
+ },
+ _resizeCanvas:function(){
+ if (this._canvas){
+ this._canvas.setAttribute("width", this._canvas.parentNode.offsetWidth);
+ this._canvas.setAttribute("height", this._canvas.parentNode.offsetHeight);
+ }
+ },
+ renderText:function(x,y,text,css,w){
+ if (!text) return; //ignore empty text
+
+ var t = dhtmlx.html.create("DIV",{
+ "class":"dhx_canvas_text"+(css?(" "+css):""),
+ "style":"left:"+x+"px; top:"+y+"px;"
+ },text);
+ this._obj.appendChild(t);
+ this._canvas_labels.push(t); //destructor?
+ if (w)
+ t.style.width = w+"px";
+ return t;
+ },
+ renderTextAt:function(valign,align, x,y,t,c,w){
+ var text=this.renderText.call(this,x,y,t,c,w);
+ if (text){
+ if (valign){
+ if(valign == "middle")
+ text.style.top = parseInt(y-text.offsetHeight/2,10) + "px";
+ else
+ text.style.top = y-text.offsetHeight + "px";
+ }
+ if (align){
+ if(align == "left")
+ text.style.left = x-text.offsetWidth + "px";
+ else
+ text.style.left = parseInt(x-text.offsetWidth/2,10) + "px";
+ }
+ }
+ return text;
+ },
+ clearCanvas:function(){
+ for(var i=0; i < this._canvas_labels.length;i++)
+ this._obj.removeChild(this._canvas_labels[i]);
+ this._canvas_labels = [];
+ if (this._obj._htmlmap){
+ this._obj._htmlmap.parentNode.removeChild(this._obj._htmlmap);
+ this._obj._htmlmap = null;
+ }
+ //FF breaks, when we are using clear canvas and call clearRect without parameters
+ this.getCanvas().clearRect(0,0,this._canvas.offsetWidth, this._canvas.offsetHeight);
+ }
+};
+
+
+/* DHX INITIAL FILE 'G:\dhtmlx.out\Standard\dhtmlxCore/sources//chart.js'*/
+
+
+/*DHX:Depend chart.css*/
+/*DHX:Depend canvas.js*/
+/*DHX:Depend load.js*/
+
+/*DHX:Depend compatibility_grid.js*/
+/*DHX:Depend compatibility_layout.js*/
+
+/*DHX:Depend config.js*/
+/*DHX:Depend destructor.js*/
+/*DHX:Depend mouse.js*/
+/*DHX:Depend key.js*/
+/*DHX:Depend group.js*/
+/*DHX:Depend autotooltip.js*/
+
+/*DHX:Depend ext/chart/chart_base.js*/
+/*DHX:Depend ext/chart/chart_pie.js*/ //+pie3d
+/*DHX:Depend ext/chart/chart_bar.js*/
+/*DHX:Depend ext/chart/chart_line.js*/
+/*DHX:Depend ext/chart/chart_barh.js*/
+/*DHX:Depend ext/chart/chart_stackedbar.js*/
+/*DHX:Depend ext/chart/chart_stackedbarh.js*/
+/*DHX:Depend ext/chart/chart_spline.js*/
+/*DHX:Depend ext/chart/chart_area.js*/ //+stackedArea
+/*DHX:Depend ext/chart/chart_radar.js*/
+/*DHX:Depend ext/chart/chart_scatter.js*/
+/*DHX:Depend ext/chart/presets.js*/
+/*DHX:Depend math.js*/
+/*DHX:Depend destructor.js*/
+/*DHX:Depend dhtmlx.js*/
+
+
+dhtmlXChart = function(container){
+ this.name = "Chart";
+ this.version = "3.0";
+
+ if (dhtmlx.assert_enabled()) this._assert();
+
+ dhtmlx.extend(this, dhtmlx.Settings);
+
+ this._parseContainer(container,"dhx_chart");
+
+ dhtmlx.extend(this, dhtmlx.AtomDataLoader);
+ dhtmlx.extend(this, dhtmlx.DataLoader);
+ this.data.provideApi(this,true);
+
+ dhtmlx.extend(this, dhtmlx.EventSystem);
+ dhtmlx.extend(this, dhtmlx.MouseEvents);
+ dhtmlx.extend(this, dhtmlx.Destruction);
+ dhtmlx.extend(this, dhtmlx.Canvas);
+ dhtmlx.extend(this, dhtmlx.Group);
+ dhtmlx.extend(this, dhtmlx.AutoTooltip);
+
+ for (var key in dhtmlx.chart)
+ dhtmlx.extend(this, dhtmlx.chart[key]);
+
+
+ if(container.preset){
+ this.definePreset(container);
+ }
+ this._parseSettings(container,this.defaults);
+ this._series = [this._settings];
+ this.data.attachEvent("onStoreUpdated",dhtmlx.bind(function(){
+ this.render();
+ },this));
+ this.attachEvent("onLocateData", this._switchSerie);
+};
+dhtmlXChart.prototype={
+ _id:"dhx_area_id",
+ on_click:{
+ },
+ on_dblclick:{
+ },
+ on_mouse_move:{
+ },
+ bind:function(){
+ dhx.BaseBind.legacyBind.apply(this, arguments);
+ },
+ sync:function(){
+ dhx.BaseBind.legacySync.apply(this, arguments);
+ },
+ resize:function(){
+ this._resizeCanvas();
+ this.render();
+ },
+ view_setter:function( val){
+ if (!dhtmlx.chart[val])
+ dhtmlx.error("Chart type extension is not loaded: "+val);
+ //if you will need to add more such settings - move them ( and this one ) in a separate methods
+
+ if (typeof this._settings.offset == "undefined"){
+ this._settings.offset = !(val == "area" || val == "stackedArea");
+ }
+
+ if(val=="radar"&&!this._settings.yAxis)
+ this.define("yAxis",{});
+ if(val=="scatter"){
+ if(!this._settings.yAxis)
+ this.define("yAxis",{});
+ if(!this._settings.xAxis)
+ this.define("xAxis",{});
+ }
+
+ return val;
+ },
+ render:function(){
+ if (!this.callEvent("onBeforeRender",[this.data]))
+ return;
+
+ this.clearCanvas();
+ if(this._settings.legend){
+ this._drawLegend(this.getCanvas(),
+ this.data.getRange(),
+ this._obj.offsetWidth
+ );
+ }
+ var bounds = this._getChartBounds(this._obj.offsetWidth,this._obj.offsetHeight);
+ var map = new dhtmlx.ui.Map(this._id);
+
+ var temp = this._settings;
+ for(var i=0; i < this._series.length;i++){
+ this._settings = this._series[i];
+ this["pvt_render_"+this._settings.view](
+ this.getCanvas(),
+ this.data.getRange(),
+ bounds.start,
+ bounds.end,
+ i,
+ map
+ );
+ }
+ map.render(this._obj);
+ this._settings = temp;
+ },
+ value_setter:dhtmlx.Template.obj_setter,
+ xValue_setter:dhtmlx.Template.obj_setter,
+ yValue_setter:function(config){
+ this.define("value",config);
+ },
+ alpha_setter:dhtmlx.Template.obj_setter,
+ label_setter:dhtmlx.Template.obj_setter,
+ lineColor_setter:dhtmlx.Template.obj_setter,
+ pieInnerText_setter:dhtmlx.Template.obj_setter,
+ gradient_setter:function(config){
+ if((typeof(config)!="function")&&config&&(config === true))
+ config = "light";
+ return config;
+ },
+ colormap:{
+ "RAINBOW":function(obj){
+ var pos = Math.floor(this.indexById(obj.id)/this.dataCount()*1536);
+ if (pos==1536) pos-=1;
+ return this._rainbow[Math.floor(pos/256)](pos%256);
+ }
+ },
+ color_setter:function(value){
+ return this.colormap[value]||dhtmlx.Template.obj_setter( value);
+ },
+ fill_setter:function(value){
+ return ((!value||value==0)?false:dhtmlx.Template.obj_setter( value));
+ },
+ definePreset:function(obj){
+ this.define("preset",obj.preset);
+ delete obj.preset;
+ },
+ preset_setter:function(value){
+ var a, b, preset;
+ this.defaults = dhtmlx.extend({},this.defaults);
+ if(typeof dhtmlx.presets.chart[value]=="object"){
+
+ preset = dhtmlx.presets.chart[value];
+ for(a in preset){
+
+ if(typeof preset[a]=="object"){
+ if(!this.defaults[a]||typeof this.defaults[a]!="object"){
+ this.defaults[a] = dhtmlx.extend({},preset[a]);
+ }
+ else{
+ this.defaults[a] = dhtmlx.extend({},this.defaults[a]);
+ for(b in preset[a]){
+ this.defaults[a][b] = preset[a][b];
+ }
+ }
+ }else{
+ this.defaults[a] = preset[a];
+ }
+ }
+ return value;
+ }
+ return false;
+ },
+ legend_setter:function( config){
+ if(!config){
+ if(this.legendObj){
+ this.legendObj.innerHTML = "";
+ this.legendObj = null;
+ }
+ return false;
+ }
+ if(typeof(config)!="object") //allow to use template string instead of object
+ config={template:config};
+
+ this._mergeSettings(config,{
+ width:150,
+ height:18,
+ layout:"y",
+ align:"left",
+ valign:"bottom",
+ template:"",
+ marker:{
+ type:"square",
+ width:15,
+ height:15,
+ radius:3
+ },
+ margin: 4,
+ padding: 3
+ });
+
+ config.template = dhtmlx.Template.setter(config.template);
+ return config;
+ },
+ defaults:{
+ color:"RAINBOW",
+ alpha:"1",
+ label:false,
+ value:"{obj.value}",
+ padding:{},
+ view:"pie",
+ lineColor:"#ffffff",
+ cant:0.5,
+ width: 30,
+ labelWidth:100,
+ line:{
+ width:2,
+ color:"#1293f8"
+ },
+ item:{
+ radius:3,
+ borderColor:"#636363",
+ borderWidth:1,
+ color: "#ffffff",
+ alpha:1,
+ type:"r",
+ shadow:false
+ },
+ shadow:true,
+ gradient:false,
+ border:true,
+ labelOffset: 20,
+ origin:"auto"
+ },
+ item_setter:function( config){
+ if(typeof(config)!="object")
+ config={color:config, borderColor:config};
+ this._mergeSettings(config,dhtmlx.extend({},this.defaults.item));
+ config.alpha = dhtmlx.Template.setter(config.alpha);
+ config.borderColor = dhtmlx.Template.setter(config.borderColor);
+ config.color = dhtmlx.Template.setter(config.color);
+ config.radius = dhtmlx.Template.setter(config.radius);
+ return config;
+ },
+ line_setter:function( config){
+ if(typeof(config)!="object")
+ config={color:config};
+ dhtmlx.extend(this.defaults.line,config);
+ config = dhtmlx.extend({},this.defaults.line);
+ config.color = dhtmlx.Template.setter(config.color);
+ return config;
+ },
+ padding_setter:function( config){
+ if(typeof(config)!="object")
+ config={left:config, right:config, top:config, bottom:config};
+ this._mergeSettings(config,{
+ left:50,
+ right:20,
+ top:35,
+ bottom:40
+ });
+ return config;
+ },
+ xAxis_setter:function( config){
+ if(!config) return false;
+ if(typeof(config)!="object")
+ config={ template:config };
+
+ this._mergeSettings(config,{
+ title:"",
+ color:"#000000",
+ lineColor:"#cfcfcf",
+ template:"{obj}",
+ lines:true
+ });
+ var templates = ["lineColor","template","lines"];
+ this._converToTemplate(templates,config);
+ this._settings.configXAxis = dhtmlx.extend({},config);
+ return config;
+ },
+ yAxis_setter:function( config){
+ this._mergeSettings(config,{
+ title:"",
+ color:"#000000",
+ lineColor:"#cfcfcf",
+ template:"{obj}",
+ lines:true,
+ bg:"#ffffff"
+ });
+ var templates = ["lineColor","template","lines","bg"];
+ this._converToTemplate(templates,config);
+ this._settings.configYAxis = dhtmlx.extend({},config);
+ return config;
+ },
+ _converToTemplate:function(arr,config){
+ for(var i=0;i< arr.length;i++){
+ config[arr[i]] = dhtmlx.Template.setter(config[arr[i]]);
+ }
+ },
+ _drawScales:function(ctx,data,point0,point1,start,end,cellWidth){
+ var y = this._drawYAxis(ctx,data,point0,point1,start,end);
+ this._drawXAxis(ctx,data,point0,point1,cellWidth,y);
+ return y;
+ },
+ _drawXAxis:function(ctx,data,point0,point1,cellWidth,y){
+ if (!this._settings.xAxis) return;
+
+ var x0 = point0.x-0.5;
+ var y0 = parseInt((y?y:point1.y),10)+0.5;
+ var x1 = point1.x;
+ var unit_pos;
+ var center = true;
+
+ this._drawLine(ctx,x0,y0,x1,y0,this._settings.xAxis.color,1);
+ for(var i=0; i < data.length;i ++){
+ if(this._settings.offset === true)
+ unit_pos = x0+cellWidth/2+i*cellWidth;
+ else{
+ unit_pos = (i==data.length-1)?point1.x:x0+i*cellWidth;
+ center = !!i;
+ }
+ unit_pos = parseInt(unit_pos,10)-0.5;
+ /*scale labels*/
+ var top = ((this._settings.origin!="auto")&&(this._settings.view=="bar")&&(parseFloat(this._settings.value(data[i]))5?10:5);
+ step = parseInt(stepVal,10)*calculStep;
+
+ if(step>Math.abs(nmin))
+ start = (nmin<0?-step:0);
+ else{
+ var absNmin = Math.abs(nmin);
+ var powerStart = Math.floor(this._log10(absNmin));
+ var nminVal = absNmin/Math.pow(10,powerStart);
+ start = Math.ceil(nminVal*10)/10*Math.pow(10,powerStart)-step;
+ if(absNmin>1&&step>0.1){
+ start = Math.ceil(start);
+ }
+ while(nmin<0?start<=nmin:start>=nmin)
+ start -= step;
+ if(nmin<0) start =-start-2*step;
+
+ }
+ end = start;
+ while(end1)
+ for(var i=1; i < this._series.length;i++){
+ var maxI = this.max(this._series[i][value||"value"]);
+ var minI = this.min(this._series[i][value||"value"]);
+ if (maxI > maxValue) maxValue = maxI;
+ if (minI < minValue) minValue = minI;
+ }
+ }
+ return {max:maxValue,min:minValue};
+ },
+ _log10:function(n){
+ var method_name="log";
+ return Math.floor((Math[method_name](n)/Math.LN10));
+ },
+ _drawXAxisLabel:function(x,y,obj,center,top){
+ if (!this._settings.xAxis) return;
+ var elem = this.renderTextAt(top, center, x,y-(top?2:0),this._settings.xAxis.template(obj));
+ if (elem)
+ elem.className += " dhx_axis_item_x";
+ },
+ _drawXAxisLine:function(ctx,x,y1,y2,obj){
+ if (!this._settings.xAxis||!this._settings.xAxis.lines) return;
+ this._drawLine(ctx,x,y1,x,y2,this._settings.xAxis.lineColor.call(this,obj),1);
+ },
+ _drawLine:function(ctx,x1,y1,x2,y2,color,width){
+ ctx.strokeStyle = color;
+ ctx.lineWidth = width;
+ ctx.beginPath();
+ ctx.moveTo(x1,y1);
+ ctx.lineTo(x2,y2);
+ ctx.stroke();
+ ctx.lineWidth = 1;
+ },
+ _getRelativeValue:function(minValue,maxValue){
+ var relValue, origRelValue;
+ var valueFactor = 1;
+ if(maxValue != minValue){
+ origRelValue = maxValue - minValue;
+ if(Math.abs(relValue) < 1){
+ while(Math.abs(relValue)<1){
+ valueFactor *= 10;
+ origRelValue = relValue* valueFactor;
+ }
+
+ }
+ relValue = origRelValue;
+ }
+ else relValue = minValue;
+ return [relValue,valueFactor];
+ },
+ _rainbow : [
+ function(pos){ return "#FF"+dhtmlx.math.toHex(pos/2,2)+"00";},
+ function(pos){ return "#FF"+dhtmlx.math.toHex(pos/2+128,2)+"00";},
+ function(pos){ return "#"+dhtmlx.math.toHex(255-pos,2)+"FF00";},
+ function(pos){ return "#00FF"+dhtmlx.math.toHex(pos,2);},
+ function(pos){ return "#00"+dhtmlx.math.toHex(255-pos,2)+"FF";},
+ function(pos){ return "#"+dhtmlx.math.toHex(pos,2)+"00FF";}
+ ],
+ /**
+ * adds series to the chart (value and color properties)
+ * @param: obj - obj with configuration properties
+ */
+ addSeries:function(obj){
+ var temp = this._settings; this._settings = dhtmlx.extend({},temp);
+ this._parseSettings(obj,{});
+ this._series.push(this._settings);
+ this._settings = temp;
+ },
+ /*switch global settings to serit in question*/
+ _switchSerie:function(id, tag){
+ var tip;
+ this._active_serie = tag.getAttribute("userdata");
+ if (!this._series[this._active_serie]) return;
+ for (var i=0; i < this._series.length; i++) {
+ tip = this._series[i].tooltip;
+ if (tip)
+ tip.disable();
+ }
+ tip = this._series[this._active_serie].tooltip;
+ if (tip)
+ tip.enable();
+ },
+ /**
+ * renders legend block
+ * @param: ctx - canvas object
+ * @param: data - object those need to be displayed
+ * @param: width - the width of the container
+ * @param: height - the height of the container
+ */
+ _drawLegend:function(ctx,data,width){
+ var i,legend,legendContainer,legendHeight,legendItems,legendWidth, style, x=0,y=0;
+ /*legend config*/
+ legend = this._settings.legend;
+
+ style = (this._settings.legend.layout!="x"?"width:"+legend.width+"px":"");
+ /*creation of legend container*/
+ if(this.legendObj)
+ this.legendObj.innerHTML = "";
+ legendContainer = dhtmlx.html.create("DIV",{
+ "class":"dhx_chart_legend",
+ "style":"left:"+x+"px; top:"+y+"px;"+style
+ },"");
+ if(legend.padding){
+ legendContainer.style.padding = legend.padding+"px";
+ }
+ this.legendObj = legendContainer;
+ this._obj.appendChild(legendContainer);
+ /*rendering legend text items*/
+ legendItems = [];
+ if(!legend.values)
+ for(i = 0; i < data.length; i++){
+ legendItems.push(this._drawLegendText(legendContainer,legend.template(data[i])));
+ }
+ else
+ for(i = 0; i < legend.values.length; i++){
+ legendItems.push(this._drawLegendText(legendContainer,legend.values[i].text));
+ }
+ legendWidth = legendContainer.offsetWidth;
+ legendHeight = legendContainer.offsetHeight;
+ /*this._settings.legend.width = legendWidth;
+ this._settings.legend.height = legendHeight;*/
+
+ /*setting legend position*/
+ if(legendWidth maxValue) maxValue = data[i].$sum ;
+ if (data[i].$min < minValue) minValue = data[i].$min ;
+ }
+ if(minValue>0) minValue =0;
+ }
+ return {max:maxValue,min:minValue};
+ },
+ /*adds colors to the gradient object*/
+ _setBarGradient:function(ctx,x1,y1,x2,y2,type,color,axis){
+ var gradient,offset,rgb,hsv,color0;
+ if(type == "light"){
+ if(axis == "x")
+ gradient = ctx.createLinearGradient(x1,y1,x2,y1);
+ else
+ gradient = ctx.createLinearGradient(x1,y1,x1,y2);
+ gradient.addColorStop(0,"#FFFFFF");
+ gradient.addColorStop(0.9,color);
+ gradient.addColorStop(1,color);
+ offset = 2;
+ }
+ else if(type == "falling"||type == "rising"){
+ if(axis == "x")
+ gradient = ctx.createLinearGradient(x1,y1,x2,y1);
+ else
+ gradient = ctx.createLinearGradient(x1,y1,x1,y2);
+ rgb = dhtmlx.math.toRgb(color);
+ hsv = dhtmlx.math.rgbToHsv(rgb[0],rgb[1],rgb[2]);
+ hsv[1] *= 1/2;
+ color0 = "rgb("+dhtmlx.math.hsvToRgb(hsv[0],hsv[1],hsv[2])+")";
+ if(type == "falling"){
+ gradient.addColorStop(0,color0);
+ gradient.addColorStop(0.7,color);
+ gradient.addColorStop(1,color);
+ }
+ else if(type == "rising"){
+ gradient.addColorStop(0,color);
+ gradient.addColorStop(0.3,color);
+ gradient.addColorStop(1,color0);
+ }
+ offset = 0;
+ }
+ else{
+ ctx.globalAlpha = 0.37;
+ offset = 0;
+ if(axis == "x")
+ gradient = ctx.createLinearGradient(x1,y2,x1,y1);
+ else
+ gradient = ctx.createLinearGradient(x1,y1,x2,y1);
+ /*gradient.addColorStop(0,"#9d9d9d");
+ gradient.addColorStop(0.4,"#FFFFFF");
+ gradient.addColorStop(0.6,"#FFFFFF");
+ gradient.addColorStop(1,"#9d9d9d");*/
+ gradient.addColorStop(0,"#9d9d9d");
+ gradient.addColorStop(0.3,"#e8e8e8");
+ gradient.addColorStop(0.45,"#ffffff");
+ gradient.addColorStop(0.55,"#ffffff");
+ gradient.addColorStop(0.7,"#e8e8e8");
+ gradient.addColorStop(1,"#9d9d9d");
+ }
+ return {gradient:gradient,offset:offset};
+ },
+ /**
+ * returns the x and y position
+ * @param: a - angle
+ * @param: x - start x position
+ * @param: y - start y position
+ * @param: r - destination to the point
+ */
+ _getPositionByAngle:function(a,x,y,r){
+ a *= (-1);
+ x = x+Math.cos(a)*r;
+ y = y-Math.sin(a)*r;
+ return {x:x,y:y};
+ }
+};
+
+dhtmlx.compat("layout");
diff --git a/public_html/dhtmlxchart/thirdparty/excanvas/AUTHORS b/public_html/dhtmlxchart/thirdparty/excanvas/AUTHORS
new file mode 100644
index 0000000..f3348aa
--- /dev/null
+++ b/public_html/dhtmlxchart/thirdparty/excanvas/AUTHORS
@@ -0,0 +1,10 @@
+ExplorerCanvas
+
+Google Open Source:
+
+
+
+Developers:
+ Emil A Eklund
+ Erik Arvidsson
+ Glen Murphy
\ No newline at end of file
diff --git a/public_html/dhtmlxchart/thirdparty/excanvas/COPYING b/public_html/dhtmlxchart/thirdparty/excanvas/COPYING
new file mode 100644
index 0000000..d645695
--- /dev/null
+++ b/public_html/dhtmlxchart/thirdparty/excanvas/COPYING
@@ -0,0 +1,202 @@
+
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+ APPENDIX: How to apply the Apache License to your work.
+
+ To apply the Apache License to your work, attach the following
+ boilerplate notice, with the fields enclosed by brackets "[]"
+ replaced with your own identifying information. (Don't include
+ the brackets!) The text should be enclosed in the appropriate
+ comment syntax for the file format. We also recommend that a
+ file or class name and description of purpose be included on the
+ same "printed page" as the copyright notice for easier
+ identification within third-party archives.
+
+ Copyright [yyyy] [name of copyright owner]
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
diff --git a/public_html/dhtmlxchart/thirdparty/excanvas/README b/public_html/dhtmlxchart/thirdparty/excanvas/README
new file mode 100644
index 0000000..9e8268b
--- /dev/null
+++ b/public_html/dhtmlxchart/thirdparty/excanvas/README
@@ -0,0 +1,22 @@
+ExplorerCanvas
+Copyright 2006 Google Inc.
+
+-------------------------------------------------------------------------------
+DESCRIPTION
+
+Firefox, Safari and Opera 9 support the canvas tag to allow 2D command-based
+drawing operations. ExplorerCanvas brings the same functionality to Internet
+Explorer; web developers only need to include a single script tag in their
+existing canvas webpages to enable this support.
+
+
+-------------------------------------------------------------------------------
+INSTALLATION
+
+Include the ExplorerCanvas tag in the same directory as your HTML files, and
+add the following code to your page, preferably in the tag.
+
+
+
+If you run into trouble, please look at the included example code to see how
+to best implement this
\ No newline at end of file
diff --git a/public_html/dhtmlxchart/thirdparty/excanvas/excanvas.js b/public_html/dhtmlxchart/thirdparty/excanvas/excanvas.js
new file mode 100644
index 0000000..3fe46d3
--- /dev/null
+++ b/public_html/dhtmlxchart/thirdparty/excanvas/excanvas.js
@@ -0,0 +1,927 @@
+// Copyright 2006 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+
+// Known Issues:
+//
+// * Patterns are not implemented.
+// * Radial gradient are not implemented. The VML version of these look very
+// different from the canvas one.
+// * Clipping paths are not implemented.
+// * Coordsize. The width and height attribute have higher priority than the
+// width and height style values which isn't correct.
+// * Painting mode isn't implemented.
+// * Canvas width/height should is using content-box by default. IE in
+// Quirks mode will draw the canvas using border-box. Either change your
+// doctype to HTML5
+// (http://www.whatwg.org/specs/web-apps/current-work/#the-doctype)
+// or use Box Sizing Behavior from WebFX
+// (http://webfx.eae.net/dhtml/boxsizing/boxsizing.html)
+// * Non uniform scaling does not correctly scale strokes.
+// * Optimize. There is always room for speed improvements.
+
+// Only add this code if we do not already have a canvas implementation
+if (!document.createElement('canvas').getContext) {
+
+(function() {
+
+ // alias some functions to make (compiled) code shorter
+ var m = Math;
+ var mr = m.round;
+ var ms = m.sin;
+ var mc = m.cos;
+ var abs = m.abs;
+ var sqrt = m.sqrt;
+
+ // this is used for sub pixel precision
+ var Z = 10;
+ var Z2 = Z / 2;
+
+ /**
+ * This funtion is assigned to the elements as element.getContext().
+ * @this {HTMLElement}
+ * @return {CanvasRenderingContext2D_}
+ */
+ function getContext() {
+ return this.context_ ||
+ (this.context_ = new CanvasRenderingContext2D_(this));
+ }
+
+ var slice = Array.prototype.slice;
+
+ /**
+ * Binds a function to an object. The returned function will always use the
+ * passed in {@code obj} as {@code this}.
+ *
+ * Example:
+ *
+ * g = bind(f, obj, a, b)
+ * g(c, d) // will do f.call(obj, a, b, c, d)
+ *
+ * @param {Function} f The function to bind the object to
+ * @param {Object} obj The object that should act as this when the function
+ * is called
+ * @param {*} var_args Rest arguments that will be used as the initial
+ * arguments when the function is called
+ * @return {Function} A new function that has bound this
+ */
+ function bind(f, obj, var_args) {
+ var a = slice.call(arguments, 2);
+ return function() {
+ return f.apply(obj, a.concat(slice.call(arguments)));
+ };
+ }
+
+ var G_vmlCanvasManager_ = {
+ init: function(opt_doc) {
+ if (/MSIE/.test(navigator.userAgent) && !window.opera) {
+ var doc = opt_doc || document;
+ // Create a dummy element so that IE will allow canvas elements to be
+ // recognized.
+ doc.createElement('canvas');
+ doc.attachEvent('onreadystatechange', bind(this.init_, this, doc));
+ }
+ },
+
+ init_: function(doc) {
+ // create xmlns
+ if (!doc.namespaces['g_vml_']) {
+ doc.namespaces.add('g_vml_', 'urn:schemas-microsoft-com:vml',
+ '#default#VML');
+
+ }
+ if (!doc.namespaces['g_o_']) {
+ doc.namespaces.add('g_o_', 'urn:schemas-microsoft-com:office:office',
+ '#default#VML');
+ }
+
+ // Setup default CSS. Only add one style sheet per document
+ if (!doc.styleSheets['ex_canvas_']) {
+ var ss = doc.createStyleSheet();
+ ss.owningElement.id = 'ex_canvas_';
+ ss.cssText = 'canvas{display:inline-block;overflow:hidden;' +
+ // default size is 300x150 in Gecko and Opera
+ 'text-align:left;width:300px;height:150px}' +
+ 'g_vml_\\:*{behavior:url(#default#VML)}' +
+ 'g_o_\\:*{behavior:url(#default#VML)}';
+
+ }
+
+ // find all canvas elements
+ var els = doc.getElementsByTagName('canvas');
+ for (var i = 0; i < els.length; i++) {
+ this.initElement(els[i]);
+ }
+ },
+
+ /**
+ * Public initializes a canvas element so that it can be used as canvas
+ * element from now on. This is called automatically before the page is
+ * loaded but if you are creating elements using createElement you need to
+ * make sure this is called on the element.
+ * @param {HTMLElement} el The canvas element to initialize.
+ * @return {HTMLElement} the element that was created.
+ */
+ initElement: function(el) {
+ if (!el.getContext) {
+
+ el.getContext = getContext;
+
+ // Remove fallback content. There is no way to hide text nodes so we
+ // just remove all childNodes. We could hide all elements and remove
+ // text nodes but who really cares about the fallback content.
+ el.innerHTML = '';
+
+ // do not use inline function because that will leak memory
+ el.attachEvent('onpropertychange', onPropertyChange);
+ el.attachEvent('onresize', onResize);
+
+ var attrs = el.attributes;
+ if (attrs.width && attrs.width.specified) {
+ // TODO: use runtimeStyle and coordsize
+ // el.getContext().setWidth_(attrs.width.nodeValue);
+ el.style.width = attrs.width.nodeValue + 'px';
+ } else {
+ el.width = el.clientWidth;
+ }
+ if (attrs.height && attrs.height.specified) {
+ // TODO: use runtimeStyle and coordsize
+ // el.getContext().setHeight_(attrs.height.nodeValue);
+ el.style.height = attrs.height.nodeValue + 'px';
+ } else {
+ el.height = el.clientHeight;
+ }
+ //el.getContext().setCoordsize_()
+ }
+ return el;
+ }
+ };
+
+ function onPropertyChange(e) {
+ var el = e.srcElement;
+
+ switch (e.propertyName) {
+ case 'width':
+ el.style.width = el.attributes.width.nodeValue + 'px';
+ el.getContext().clearRect();
+ break;
+ case 'height':
+ el.style.height = el.attributes.height.nodeValue + 'px';
+ el.getContext().clearRect();
+ break;
+ }
+ }
+
+ function onResize(e) {
+ var el = e.srcElement;
+ if (el.firstChild) {
+ el.firstChild.style.width = el.clientWidth + 'px';
+ el.firstChild.style.height = el.clientHeight + 'px';
+ }
+ }
+
+ G_vmlCanvasManager_.init();
+
+ // precompute "00" to "FF"
+ var dec2hex = [];
+ for (var i = 0; i < 16; i++) {
+ for (var j = 0; j < 16; j++) {
+ dec2hex[i * 16 + j] = i.toString(16) + j.toString(16);
+ }
+ }
+
+ function createMatrixIdentity() {
+ return [
+ [1, 0, 0],
+ [0, 1, 0],
+ [0, 0, 1]
+ ];
+ }
+
+ function matrixMultiply(m1, m2) {
+ var result = createMatrixIdentity();
+
+ for (var x = 0; x < 3; x++) {
+ for (var y = 0; y < 3; y++) {
+ var sum = 0;
+
+ for (var z = 0; z < 3; z++) {
+ sum += m1[x][z] * m2[z][y];
+ }
+
+ result[x][y] = sum;
+ }
+ }
+ return result;
+ }
+
+ function copyState(o1, o2) {
+ o2.fillStyle = o1.fillStyle;
+ o2.lineCap = o1.lineCap;
+ o2.lineJoin = o1.lineJoin;
+ o2.lineWidth = o1.lineWidth;
+ o2.miterLimit = o1.miterLimit;
+ o2.shadowBlur = o1.shadowBlur;
+ o2.shadowColor = o1.shadowColor;
+ o2.shadowOffsetX = o1.shadowOffsetX;
+ o2.shadowOffsetY = o1.shadowOffsetY;
+ o2.strokeStyle = o1.strokeStyle;
+ o2.globalAlpha = o1.globalAlpha;
+ o2.arcScaleX_ = o1.arcScaleX_;
+ o2.arcScaleY_ = o1.arcScaleY_;
+ o2.lineScale_ = o1.lineScale_;
+ }
+
+ function processStyle(styleString) {
+ var str, alpha = 1;
+
+ styleString = String(styleString);
+ if (styleString.substring(0, 3) == 'rgb') {
+ var start = styleString.indexOf('(', 3);
+ var end = styleString.indexOf(')', start + 1);
+ var guts = styleString.substring(start + 1, end).split(',');
+
+ str = '#';
+ for (var i = 0; i < 3; i++) {
+ str += dec2hex[Number(guts[i])];
+ }
+
+ if (guts.length == 4 && styleString.substr(3, 1) == 'a') {
+ alpha = guts[3];
+ }
+ } else {
+ str = styleString;
+ }
+
+ return {color: str, alpha: alpha};
+ }
+
+ function processLineCap(lineCap) {
+ switch (lineCap) {
+ case 'butt':
+ return 'flat';
+ case 'round':
+ return 'round';
+ case 'square':
+ default:
+ return 'square';
+ }
+ }
+
+ /**
+ * This class implements CanvasRenderingContext2D interface as described by
+ * the WHATWG.
+ * @param {HTMLElement} surfaceElement The element that the 2D context should
+ * be associated with
+ */
+ function CanvasRenderingContext2D_(surfaceElement) {
+ this.m_ = createMatrixIdentity();
+
+ this.mStack_ = [];
+ this.aStack_ = [];
+ this.currentPath_ = [];
+
+ // Canvas context properties
+ this.strokeStyle = '#000';
+ this.fillStyle = '#000';
+
+ this.lineWidth = 1;
+ this.lineJoin = 'miter';
+ this.lineCap = 'butt';
+ this.miterLimit = Z * 1;
+ this.globalAlpha = 1;
+ this.canvas = surfaceElement;
+
+ var el = surfaceElement.ownerDocument.createElement('div');
+ el.style.width = surfaceElement.clientWidth + 'px';
+ el.style.height = surfaceElement.clientHeight + 'px';
+ el.style.overflow = 'hidden';
+ el.style.position = 'absolute';
+ surfaceElement.appendChild(el);
+
+ this.element_ = el;
+ this.arcScaleX_ = 1;
+ this.arcScaleY_ = 1;
+ this.lineScale_ = 1;
+ }
+
+ var contextPrototype = CanvasRenderingContext2D_.prototype;
+ contextPrototype.clearRect = function() {
+ this.element_.innerHTML = '';
+ };
+
+ contextPrototype.beginPath = function() {
+ // TODO: Branch current matrix so that save/restore has no effect
+ // as per safari docs.
+ this.currentPath_ = [];
+ };
+
+ contextPrototype.moveTo = function(aX, aY) {
+ var p = this.getCoords_(aX, aY);
+ this.currentPath_.push({type: 'moveTo', x: p.x, y: p.y});
+ this.currentX_ = p.x;
+ this.currentY_ = p.y;
+ };
+
+ contextPrototype.lineTo = function(aX, aY) {
+ var p = this.getCoords_(aX, aY);
+ this.currentPath_.push({type: 'lineTo', x: p.x, y: p.y});
+
+ this.currentX_ = p.x;
+ this.currentY_ = p.y;
+ };
+
+ contextPrototype.bezierCurveTo = function(aCP1x, aCP1y,
+ aCP2x, aCP2y,
+ aX, aY) {
+ var p = this.getCoords_(aX, aY);
+ var cp1 = this.getCoords_(aCP1x, aCP1y);
+ var cp2 = this.getCoords_(aCP2x, aCP2y);
+ bezierCurveTo(this, cp1, cp2, p);
+ };
+
+ // Helper function that takes the already fixed cordinates.
+ function bezierCurveTo(self, cp1, cp2, p) {
+ self.currentPath_.push({
+ type: 'bezierCurveTo',
+ cp1x: cp1.x,
+ cp1y: cp1.y,
+ cp2x: cp2.x,
+ cp2y: cp2.y,
+ x: p.x,
+ y: p.y
+ });
+ self.currentX_ = p.x;
+ self.currentY_ = p.y;
+ }
+
+ contextPrototype.quadraticCurveTo = function(aCPx, aCPy, aX, aY) {
+ // the following is lifted almost directly from
+ // http://developer.mozilla.org/en/docs/Canvas_tutorial:Drawing_shapes
+
+ var cp = this.getCoords_(aCPx, aCPy);
+ var p = this.getCoords_(aX, aY);
+
+ var cp1 = {
+ x: this.currentX_ + 2.0 / 3.0 * (cp.x - this.currentX_),
+ y: this.currentY_ + 2.0 / 3.0 * (cp.y - this.currentY_)
+ };
+ var cp2 = {
+ x: cp1.x + (p.x - this.currentX_) / 3.0,
+ y: cp1.y + (p.y - this.currentY_) / 3.0
+ };
+
+ bezierCurveTo(this, cp1, cp2, p);
+ };
+
+ contextPrototype.arc = function(aX, aY, aRadius,
+ aStartAngle, aEndAngle, aClockwise) {
+ aRadius *= Z;
+ var arcType = aClockwise ? 'at' : 'wa';
+
+ var xStart = aX + mc(aStartAngle) * aRadius - Z2;
+ var yStart = aY + ms(aStartAngle) * aRadius - Z2;
+
+ var xEnd = aX + mc(aEndAngle) * aRadius - Z2;
+ var yEnd = aY + ms(aEndAngle) * aRadius - Z2;
+
+ // IE won't render arches drawn counter clockwise if xStart == xEnd.
+ if (xStart == xEnd && !aClockwise) {
+ xStart += 0.125; // Offset xStart by 1/80 of a pixel. Use something
+ // that can be represented in binary
+ }
+
+ var p = this.getCoords_(aX, aY);
+ var pStart = this.getCoords_(xStart, yStart);
+ var pEnd = this.getCoords_(xEnd, yEnd);
+
+ this.currentPath_.push({type: arcType,
+ x: p.x,
+ y: p.y,
+ radius: aRadius,
+ xStart: pStart.x,
+ yStart: pStart.y,
+ xEnd: pEnd.x,
+ yEnd: pEnd.y});
+
+ };
+
+ contextPrototype.rect = function(aX, aY, aWidth, aHeight) {
+ this.moveTo(aX, aY);
+ this.lineTo(aX + aWidth, aY);
+ this.lineTo(aX + aWidth, aY + aHeight);
+ this.lineTo(aX, aY + aHeight);
+ this.closePath();
+ };
+
+ contextPrototype.strokeRect = function(aX, aY, aWidth, aHeight) {
+ var oldPath = this.currentPath_;
+ this.beginPath();
+
+ this.moveTo(aX, aY);
+ this.lineTo(aX + aWidth, aY);
+ this.lineTo(aX + aWidth, aY + aHeight);
+ this.lineTo(aX, aY + aHeight);
+ this.closePath();
+ this.stroke();
+
+ this.currentPath_ = oldPath;
+ };
+
+ contextPrototype.fillRect = function(aX, aY, aWidth, aHeight) {
+ var oldPath = this.currentPath_;
+ this.beginPath();
+
+ this.moveTo(aX, aY);
+ this.lineTo(aX + aWidth, aY);
+ this.lineTo(aX + aWidth, aY + aHeight);
+ this.lineTo(aX, aY + aHeight);
+ this.closePath();
+ this.fill();
+
+ this.currentPath_ = oldPath;
+ };
+
+ contextPrototype.createLinearGradient = function(aX0, aY0, aX1, aY1) {
+ var gradient = new CanvasGradient_('gradient');
+ gradient.x0_ = aX0;
+ gradient.y0_ = aY0;
+ gradient.x1_ = aX1;
+ gradient.y1_ = aY1;
+ return gradient;
+ };
+
+ contextPrototype.createRadialGradient = function(aX0, aY0, aR0,
+ aX1, aY1, aR1) {
+ var gradient = new CanvasGradient_('gradientradial');
+ gradient.x0_ = aX0;
+ gradient.y0_ = aY0;
+ gradient.r0_ = aR0;
+ gradient.x1_ = aX1;
+ gradient.y1_ = aY1;
+ gradient.r1_ = aR1;
+ return gradient;
+ };
+
+ contextPrototype.drawImage = function(image, var_args) {
+ var dx, dy, dw, dh, sx, sy, sw, sh;
+
+ // to find the original width we overide the width and height
+ var oldRuntimeWidth = image.runtimeStyle.width;
+ var oldRuntimeHeight = image.runtimeStyle.height;
+ image.runtimeStyle.width = 'auto';
+ image.runtimeStyle.height = 'auto';
+
+ // get the original size
+ var w = image.width;
+ var h = image.height;
+
+ // and remove overides
+ image.runtimeStyle.width = oldRuntimeWidth;
+ image.runtimeStyle.height = oldRuntimeHeight;
+
+ if (arguments.length == 3) {
+ dx = arguments[1];
+ dy = arguments[2];
+ sx = sy = 0;
+ sw = dw = w;
+ sh = dh = h;
+ } else if (arguments.length == 5) {
+ dx = arguments[1];
+ dy = arguments[2];
+ dw = arguments[3];
+ dh = arguments[4];
+ sx = sy = 0;
+ sw = w;
+ sh = h;
+ } else if (arguments.length == 9) {
+ sx = arguments[1];
+ sy = arguments[2];
+ sw = arguments[3];
+ sh = arguments[4];
+ dx = arguments[5];
+ dy = arguments[6];
+ dw = arguments[7];
+ dh = arguments[8];
+ } else {
+ throw Error('Invalid number of arguments');
+ }
+
+ var d = this.getCoords_(dx, dy);
+
+ var w2 = sw / 2;
+ var h2 = sh / 2;
+
+ var vmlStr = [];
+
+ var W = 10;
+ var H = 10;
+
+ // For some reason that I've now forgotten, using divs didn't work
+ vmlStr.push(' ' ,
+ ' ',
+ ' ');
+
+ this.element_.insertAdjacentHTML('BeforeEnd',
+ vmlStr.join(''));
+ };
+
+ contextPrototype.stroke = function(aFill) {
+ var lineStr = [];
+ var lineOpen = false;
+ var a = processStyle(aFill ? this.fillStyle : this.strokeStyle);
+ var color = a.color;
+ var opacity = a.alpha * this.globalAlpha;
+
+ var W = 10;
+ var H = 10;
+
+ lineStr.push('');
+
+ if (!aFill) {
+ var lineWidth = this.lineScale_ * this.lineWidth;
+
+ // VML cannot correctly render a line if the width is less than 1px.
+ // In that case, we dilute the color to make the line look thinner.
+ if (lineWidth < 1) {
+ opacity *= lineWidth;
+ }
+
+ lineStr.push(
+ ' '
+ );
+ } else if (typeof this.fillStyle == 'object') {
+ var fillStyle = this.fillStyle;
+ var angle = 0;
+ var focus = {x: 0, y: 0};
+
+ // additional offset
+ var shift = 0;
+ // scale factor for offset
+ var expansion = 1;
+
+ if (fillStyle.type_ == 'gradient') {
+ var x0 = fillStyle.x0_ / this.arcScaleX_;
+ var y0 = fillStyle.y0_ / this.arcScaleY_;
+ var x1 = fillStyle.x1_ / this.arcScaleX_;
+ var y1 = fillStyle.y1_ / this.arcScaleY_;
+ var p0 = this.getCoords_(x0, y0);
+ var p1 = this.getCoords_(x1, y1);
+ var dx = p1.x - p0.x;
+ var dy = p1.y - p0.y;
+ angle = Math.atan2(dx, dy) * 180 / Math.PI;
+
+ // The angle should be a non-negative number.
+ if (angle < 0) {
+ angle += 360;
+ }
+
+ // Very small angles produce an unexpected result because they are
+ // converted to a scientific notation string.
+ if (angle < 1e-6) {
+ angle = 0;
+ }
+ } else {
+ var p0 = this.getCoords_(fillStyle.x0_, fillStyle.y0_);
+ var width = max.x - min.x;
+ var height = max.y - min.y;
+ focus = {
+ x: (p0.x - min.x) / width,
+ y: (p0.y - min.y) / height
+ };
+
+ width /= this.arcScaleX_ * Z;
+ height /= this.arcScaleY_ * Z;
+ var dimension = m.max(width, height);
+ shift = 2 * fillStyle.r0_ / dimension;
+ expansion = 2 * fillStyle.r1_ / dimension - shift;
+ }
+
+ // We need to sort the color stops in ascending order by offset,
+ // otherwise IE won't interpret it correctly.
+ var stops = fillStyle.colors_;
+ stops.sort(function(cs1, cs2) {
+ return cs1.offset - cs2.offset;
+ });
+
+ var length = stops.length;
+ var color1 = stops[0].color;
+ var color2 = stops[length - 1].color;
+ var opacity1 = stops[0].alpha * this.globalAlpha;
+ var opacity2 = stops[length - 1].alpha * this.globalAlpha;
+
+ var colors = [];
+ for (var i = 0; i < length; i++) {
+ var stop = stops[i];
+ colors.push(stop.offset * expansion + shift + ' ' + stop.color);
+ }
+
+ // When colors attribute is used, the meanings of opacity and o:opacity2
+ // are reversed.
+ lineStr.push(' ');
+ } else {
+ lineStr.push(' ');
+ }
+
+ lineStr.push(' ');
+
+ this.element_.insertAdjacentHTML('beforeEnd', lineStr.join(''));
+ };
+
+ contextPrototype.fill = function() {
+ this.stroke(true);
+ }
+
+ contextPrototype.closePath = function() {
+ this.currentPath_.push({type: 'close'});
+ };
+
+ /**
+ * @private
+ */
+ contextPrototype.getCoords_ = function(aX, aY) {
+ var m = this.m_;
+ return {
+ x: Z * (aX * m[0][0] + aY * m[1][0] + m[2][0]) - Z2,
+ y: Z * (aX * m[0][1] + aY * m[1][1] + m[2][1]) - Z2
+ }
+ };
+
+ contextPrototype.save = function() {
+ var o = {};
+ copyState(this, o);
+ this.aStack_.push(o);
+ this.mStack_.push(this.m_);
+ this.m_ = matrixMultiply(createMatrixIdentity(), this.m_);
+ };
+
+ contextPrototype.restore = function() {
+ copyState(this.aStack_.pop(), this);
+ this.m_ = this.mStack_.pop();
+ };
+
+ function matrixIsFinite(m) {
+ for (var j = 0; j < 3; j++) {
+ for (var k = 0; k < 2; k++) {
+ if (!isFinite(m[j][k]) || isNaN(m[j][k])) {
+ return false;
+ }
+ }
+ }
+ return true;
+ }
+
+ function setM(ctx, m, updateLineScale) {
+ if (!matrixIsFinite(m)) {
+ return;
+ }
+ ctx.m_ = m;
+
+ if (updateLineScale) {
+ // Get the line scale.
+ // Determinant of this.m_ means how much the area is enlarged by the
+ // transformation. So its square root can be used as a scale factor
+ // for width.
+ var det = m[0][0] * m[1][1] - m[0][1] * m[1][0];
+ ctx.lineScale_ = sqrt(abs(det));
+ }
+ }
+
+ contextPrototype.translate = function(aX, aY) {
+ var m1 = [
+ [1, 0, 0],
+ [0, 1, 0],
+ [aX, aY, 1]
+ ];
+
+ setM(this, matrixMultiply(m1, this.m_), false);
+ };
+
+ contextPrototype.rotate = function(aRot) {
+ var c = mc(aRot);
+ var s = ms(aRot);
+
+ var m1 = [
+ [c, s, 0],
+ [-s, c, 0],
+ [0, 0, 1]
+ ];
+
+ setM(this, matrixMultiply(m1, this.m_), false);
+ };
+
+ contextPrototype.scale = function(aX, aY) {
+ this.arcScaleX_ *= aX;
+ this.arcScaleY_ *= aY;
+ var m1 = [
+ [aX, 0, 0],
+ [0, aY, 0],
+ [0, 0, 1]
+ ];
+
+ setM(this, matrixMultiply(m1, this.m_), true);
+ };
+
+ contextPrototype.transform = function(m11, m12, m21, m22, dx, dy) {
+ var m1 = [
+ [m11, m12, 0],
+ [m21, m22, 0],
+ [dx, dy, 1]
+ ];
+
+ setM(this, matrixMultiply(m1, this.m_), true);
+ };
+
+ contextPrototype.setTransform = function(m11, m12, m21, m22, dx, dy) {
+ var m = [
+ [m11, m12, 0],
+ [m21, m22, 0],
+ [dx, dy, 1]
+ ];
+
+ setM(this, m, true);
+ };
+
+ /******** STUBS ********/
+ contextPrototype.clip = function() {
+ // TODO: Implement
+ };
+
+ contextPrototype.arcTo = function() {
+ // TODO: Implement
+ };
+
+ contextPrototype.createPattern = function() {
+ return new CanvasPattern_;
+ };
+
+ // Gradient / Pattern Stubs
+ function CanvasGradient_(aType) {
+ this.type_ = aType;
+ this.x0_ = 0;
+ this.y0_ = 0;
+ this.r0_ = 0;
+ this.x1_ = 0;
+ this.y1_ = 0;
+ this.r1_ = 0;
+ this.colors_ = [];
+ }
+
+ CanvasGradient_.prototype.addColorStop = function(aOffset, aColor) {
+ aColor = processStyle(aColor);
+ this.colors_.push({offset: aOffset,
+ color: aColor.color,
+ alpha: aColor.alpha});
+ };
+
+ function CanvasPattern_() {}
+
+ // set up externs
+ G_vmlCanvasManager = G_vmlCanvasManager_;
+ CanvasRenderingContext2D = CanvasRenderingContext2D_;
+ CanvasGradient = CanvasGradient_;
+ CanvasPattern = CanvasPattern_;
+
+})();
+
+} // if
+
+if (dhtmlx && dhtmlx._modules)
+ dhtmlx._modules["thirdparty/excanvas/excanvas.js"] = true;
\ No newline at end of file
diff --git a/public_html/editar.php b/public_html/editar.php
new file mode 100644
index 0000000..7064444
--- /dev/null
+++ b/public_html/editar.php
@@ -0,0 +1,102 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ div {
+ margin-bottom: 40px;
+}
+.tsc_ribbon_wrap > div:last-of-type {
+ margin-bottom: 0;
+}
+.tsc_ribbon_wrap:before, .tsc_ribbon_wrap:after {
+ content: "";
+ display: table;
+}
+.tsc_ribbon_wrap:after {
+ clear: both;
+}
+.tsc_ribbon_wrap {
+}
+.tsc_ribbon_wrap .ribbon-wrap {
+ color: #FFFFFF;
+ position: absolute;
+ text-align: center;
+ z-index: 0;
+}
+.tsc_ribbon_wrap .ribbon-wrap > span {
+ display: block;
+ height: 100%;
+ position: relative;
+}
+.tsc_ribbon_wrap .ribbon-wrap > span:before, .tsc_ribbon_wrap .ribbon-wrap > span:after {
+ content: "";
+ position: absolute;
+ z-index: -1;
+}
+.tsc_ribbon_wrap .ribbon-wrap:before, .tsc_ribbon_wrap .ribbon-wrap:after {
+ content: "";
+ position: absolute;
+ z-index: -2;
+}
+.tsc_ribbon_wrap.edge {
+ position: relative;
+}
+.tsc_ribbon_wrap .left-edge.point {
+ border-radius: 5px 0 0 0;
+ box-shadow: 0 1px 2px rgba(0, 0, 0, 0.5);
+ height: 40px;
+ left: -5px;
+ line-height: 40px;
+ top: 20px;
+ width: 120px;
+}
+.tsc_ribbon_wrap.ie8 .left-edge.point {
+ box-shadow: 0 1px 2px rgba(0, 0, 0, 0.5);
+ left: 0;
+}
+.tsc_ribbon_wrap .left-edge.point > span {
+ border-radius: 5px 0 0 0;
+}
+.tsc_ribbon_wrap.ie .left-edge.point > span {
+}
+.tsc_ribbon_wrap .left-edge.point:before {
+ border-color: transparent;
+ border-radius: 5px 5px 5px 5px;
+ border-style: solid;
+ border-width: 5px;
+ bottom: -5px;
+ left: 0;
+ transform: rotate(-45deg);
+}
+.tsc_ribbon_wrap .left-edge.point:after {
+ box-shadow: 1px 1px 2px rgba(0, 0, 0, 0.5);
+ height: 28px;
+ margin-top: -14px;
+ right: -14px;
+ top: 50%;
+ transform: rotate(45deg);
+ transform-origin: center center 0;
+ width: 28px;
+}
+.tsc_ribbon_wrap.ie8 .left-edge.point:before, .tsc_ribbon_wrap.ie8 .left-edge.point:after {
+ border-radius: 0 0 0 0;
+ display: none;
+}
+.tsc_ribbon_wrap .right-edge.point {
+ border-radius: 0 5px 0 0;
+ box-shadow: 0 1px 2px rgba(0, 0, 0, 0.5);
+ height: 40px;
+ line-height: 40px;
+ right: -5px;
+ top: 20px;
+ width: 120px;
+}
+.tsc_ribbon_wrap.ie8 .right-edge.point {
+ box-shadow: 0 1px 2px rgba(0, 0, 0, 0.5);
+ right: 0;
+}
+.tsc_ribbon_wrap .right-edge.point > span {
+ border-radius: 0 5px 0 0;
+}
+.tsc_ribbon_wrap.ie .right-edge.point > span {
+}
+.tsc_ribbon_wrap .right-edge.point:before {
+ border-color: transparent;
+ border-radius: 5px 5px 5px 5px;
+ border-style: solid;
+ border-width: 4px;
+ bottom: -5px;
+ right: 0;
+ transform: rotate(45deg);
+}
+.tsc_ribbon_wrap .right-edge.point:after {
+ box-shadow: 1px 1px 2px rgba(0, 0, 0, 0.5);
+ height: 28px;
+ left: -14px;
+ margin-top: -14px;
+ top: 50%;
+ transform: rotate(45deg);
+ transform-origin: center center 0;
+ width: 28px;
+}
+.tsc_ribbon_wrap.ie8 .right-edge.point:before, .tsc_ribbon_wrap.ie8 .right-edge.point:after {
+ border-radius: 0 0 0 0;
+ display: none;
+}
+.tsc_ribbon_wrap .left-edge.fork {
+ border-radius: 5px 0 0 0;
+ box-shadow: 0 1px 2px rgba(0, 0, 0, 0.3);
+ height: 40px;
+ left: -5px;
+ line-height: 40px;
+ top: 20px;
+ width: 120px;
+}
+.tsc_ribbon_wrap.ie8 .left-edge.fork {
+ border-radius: 0 0 0 0;
+ box-shadow: none !important;
+ left: 0;
+}
+.tsc_ribbon_wrap .left-edge.fork > span {
+ border-radius: 5px 0 0 0;
+}
+.tsc_ribbon_wrap .left-edge.fork > span:before {
+ border-color: transparent;
+ border-radius: 5px 5px 5px 5px;
+ border-style: solid;
+ border-width: 5px;
+ bottom: -5px;
+ left: 0;
+ transform: rotate(-45deg);
+}
+.tsc_ribbon_wrap.ie8 .left-edge.fork > span:before {
+ display: none;
+}
+.tsc_ribbon_wrap .left-edge.fork > span:after {
+ border-style: solid;
+ border-width: 20px;
+ right: -20px;
+ top: 0;
+}
+.tsc_ribbon_wrap .left-edge.fork:before {
+ background: none repeat scroll 0 0 #666666;
+ bottom: 5px;
+ box-shadow: 25px 8px 4px rgba(0, 0, 0, 0.5);
+ height: 20px;
+ right: 22px;
+ transform: rotate(-22deg) skew(18deg, 28deg);
+ width: 80px;
+}
+.tsc_ribbon_wrap .left-edge.fork:after {
+ background: none repeat scroll 0 0 #666666;
+ box-shadow: 20px -5px 4px rgba(0, 0, 0, 0.5);
+ height: 20px;
+ right: 22px;
+ top: 5px;
+ transform: rotate(32deg) skew(-18deg, -28deg);
+ width: 80px;
+}
+.tsc_ribbon_wrap.ie8 .left-edge.fork:before, .tsc_ribbon_wrap.ie8 .left-edge.fork:after {
+ display: none;
+}
+.tsc_ribbon_wrap .right-edge.fork {
+ border-radius: 0 5px 0 0;
+ box-shadow: 0 1px 2px rgba(0, 0, 0, 0.3);
+ height: 40px;
+ line-height: 40px;
+ right: -5px;
+ top: 20px;
+ width: 120px;
+}
+.tsc_ribbon_wrap.ie8 .right-edge.fork {
+ border-radius: 0 0 0 0;
+ box-shadow: none !important;
+ right: 0;
+}
+.tsc_ribbon_wrap .right-edge.fork > span {
+ border-radius: 0 5px 0 0;
+}
+.tsc_ribbon_wrap .right-edge.fork > span:before {
+ border-color: transparent;
+ border-radius: 5px 5px 5px 5px;
+ border-style: solid;
+ border-width: 5px;
+ bottom: -5px;
+ right: 0;
+ transform: rotate(45deg);
+}
+.tsc_ribbon_wrap.ie8 .right-edge.fork > span:before {
+ display: none;
+}
+.tsc_ribbon_wrap .right-edge.fork > span:after {
+ border-style: solid;
+ border-width: 20px;
+ left: -20px;
+ top: 0;
+}
+.tsc_ribbon_wrap .right-edge.fork:before {
+ background: none repeat scroll 0 0 #666666;
+ bottom: 5px;
+ box-shadow: -25px 8px 4px rgba(0, 0, 0, 0.5);
+ height: 20px;
+ left: 22px;
+ transform: rotate(22deg) skew(-18deg, -28deg);
+ width: 80px;
+}
+.tsc_ribbon_wrap .right-edge.fork:after {
+ background: none repeat scroll 0 0 #666666;
+ box-shadow: -20px -5px 4px rgba(0, 0, 0, 0.5);
+ height: 20px;
+ left: 22px;
+ top: 5px;
+ transform: rotate(-32deg) skew(18deg, 28deg);
+ width: 80px;
+}
+.tsc_ribbon_wrap.ie8 .right-edge.fork:before, .tsc_ribbon_wrap.ie8 .right-edge.fork:after {
+ display: none;
+}
+.tsc_ribbon_wrap.ie8 .lblue, .tsc_ribbon_wrap .lblue > span, .tsc_ribbon_wrap .lblue.left-corner > span:before, .tsc_ribbon_wrap .lblue.left-corner > span:after, .tsc_ribbon_wrap .lblue.right-corner > span, .tsc_ribbon_wrap .lblue.right-corner > span:before, .tsc_ribbon_wrap .lblue.right-corner > span:after {
+ background-color: #42A5D4;
+ background-image: -moz-linear-gradient(center top , #42A5D4, #24769D);
+}
+.tsc_ribbon_wrap .lblue.left-corner:before {
+ border-bottom-color: #174C66;
+ border-left-color: #174C66;
+}
+.tsc_ribbon_wrap .lblue.left-corner:after {
+ border-right-color: #174C66;
+ border-top-color: #174C66;
+}
+.tsc_ribbon_wrap .lblue.right-corner:before {
+ border-left-color: #174C66;
+ border-top-color: #174C66;
+}
+.tsc_ribbon_wrap .lblue.right-corner:after {
+ border-bottom-color: #174C66;
+ border-right-color: #174C66;
+}
+.tsc_ribbon_wrap .lblue.left-edge.point:after, .tsc_ribbon_wrap .lblue.right-edge.point:after {
+ background-color: #42A5D4;
+ background-image: linear-gradient(-45deg, #42A5D4, #24769D);
+}
+.tsc_ribbon_wrap .lblue.left-edge:before {
+ border-left-color: #174C66;
+ border-top-color: #174C66;
+}
+.tsc_ribbon_wrap .lblue.right-edge:before {
+ border-right-color: #174C66;
+ border-top-color: #174C66;
+}
+.tsc_ribbon_wrap .lblue.left-edge.fork > span {
+ background-color: #42A5D4;
+ background-image: -moz-linear-gradient(left center , #42A5D4 0px, #42A5D4 5px, #24769D 15%, #24769D 65%, #42A5D4 100%);
+}
+.tsc_ribbon_wrap.ie8 .lblue.left-edge.fork > span {
+}
+.tsc_ribbon_wrap .lblue.left-edge.fork > span:after {
+ border-color: #42A5D4 transparent #42A5D4 #42A5D4;
+}
+.tsc_ribbon_wrap .lblue.left-edge.fork > span:before {
+ border-left-color: #174C66;
+ border-top-color: #174C66;
+}
+.tsc_ribbon_wrap .lblue.right-edge.fork > span {
+ background-color: #42A5D4;
+ background-image: -moz-linear-gradient(right center , #42A5D4 0px, #42A5D4 5px, #24769D 15%, #24769D 65%, #42A5D4 100%);
+}
+.tsc_ribbon_wrap.ie8 .lblue.right-edge.fork > span {
+}
+.tsc_ribbon_wrap .lblue.right-edge.fork > span:after {
+ border-color: #42A5D4 #42A5D4 #42A5D4 transparent;
+}
+.tsc_ribbon_wrap .lblue.right-edge.fork > span:before {
+ border-right-color: #174C66;
+ border-top-color: #174C66;
+}
+.tsc_ribbon_wrap.ie8 .lred, .tsc_ribbon_wrap .lred > span, .tsc_ribbon_wrap .lred.left-corner > span:before, .tsc_ribbon_wrap .lred.left-corner > span:after, .tsc_ribbon_wrap .lred.right-corner > span, .tsc_ribbon_wrap .lred.right-corner > span:before, .tsc_ribbon_wrap .lred.right-corner > span:after {
+ background-color: #F80000;
+ background-image: -moz-linear-gradient(center top , #F80000, #A30000);
+}
+.tsc_ribbon_wrap .lred.left-corner:before {
+ border-bottom-color: #5F0000;
+ border-left-color: #5F0000;
+}
+.tsc_ribbon_wrap .lred.left-corner:after {
+ border-right-color: #5F0000;
+ border-top-color: #5F0000;
+}
+.tsc_ribbon_wrap .lred.right-corner:before {
+ border-left-color: #5F0000;
+ border-top-color: #5F0000;
+}
+.tsc_ribbon_wrap .lred.right-corner:after {
+ border-bottom-color: #5F0000;
+ border-right-color: #5F0000;
+}
+.tsc_ribbon_wrap .lred.left-edge.point:after, .tsc_ribbon_wrap .lred.right-edge.point:after {
+ background-color: #F80000;
+ background-image: linear-gradient(-45deg, #F80000, #A30000);
+}
+.tsc_ribbon_wrap .lred.left-edge:before {
+ border-left-color: #5F0000;
+ border-top-color: #5F0000;
+}
+.tsc_ribbon_wrap .lred.right-edge:before {
+ border-right-color: #5F0000;
+ border-top-color: #5F0000;
+}
+.tsc_ribbon_wrap .lred.left-edge.fork > span {
+ background-color: #F80000;
+ background-image: -moz-linear-gradient(left center , #F80000 0px, #F80000 5px, #A30000 15%, #A30000 65%, #F80000 100%);
+}
+.tsc_ribbon_wrap.ie8 .lred.left-edge.fork > span {
+}
+.tsc_ribbon_wrap .lred.left-edge.fork > span:after {
+ border-color: #F80000 transparent #F80000 #F80000;
+}
+.tsc_ribbon_wrap .lred.left-edge.fork > span:before {
+ border-left-color: #5F0000;
+ border-top-color: #5F0000;
+}
+.tsc_ribbon_wrap .lred.right-edge.fork > span {
+ background-color: #F80000;
+ background-image: -moz-linear-gradient(right center , #F80000 0px, #F80000 5px, #A30000 15%, #A30000 65%, #F80000 100%);
+}
+.tsc_ribbon_wrap.ie8 .lred.right-edge.fork > span {
+}
+.tsc_ribbon_wrap .lred.right-edge.fork > span:after {
+ border-color: #F80000 #F80000 #F80000 transparent;
+}
+.tsc_ribbon_wrap .lred.right-edge.fork > span:before {
+ border-right-color: #5F0000;
+ border-top-color: #5F0000;
+}
+.tsc_ribbon_hang {
+ margin-bottom: 60px;
+}
+.tsc_ribbon_hang:last-child {
+ margin-bottom: 0;
+}
+.tsc_ribbon_hang > div {
+ display: inline-block;
+ margin: 0 40px 40px 0;
+}
+.tsc_ribbon_hang > div:last-of-type {
+ margin-right: 0;
+}
+.tsc_ribbon_hang .ribbon-bookmark {
+ border-radius: 3px 3px 0 0;
+ box-shadow: 0 2px 2px rgba(0, 0, 0, 0.5);
+ color: #FFFFFF;
+ margin: 20px auto;
+ position: relative;
+ text-align: center;
+ z-index: 0;
+}
+.tsc_ribbon_hang.ie8 .ribbon-bookmark {
+ box-shadow: none;
+}
+.tsc_ribbon_hang .ribbon-bookmark > span {
+ border-radius: 3px 3px 0 0;
+ display: block;
+ position: relative;
+}
+.tsc_ribbon_hang .ribbon-bookmark.small > span {
+ height: 82px;
+ line-height: 82px;
+ width: 50px;
+}
+.tsc_ribbon_hang .ribbon-bookmark.medium > span {
+ height: 124px;
+ line-height: 124px;
+ width: 80px;
+}
+.tsc_ribbon_hang .ribbon-bookmark.large > span {
+ height: 166px;
+ line-height: 166px;
+ width: 120px;
+}
+.tsc_ribbon_hang .ribbon-bookmark > span:before, .tsc_ribbon_hang.ie8 .ribbon-bookmark .fork {
+ border-style: solid;
+ content: "";
+ left: 0;
+ position: absolute;
+ top: 100%;
+ z-index: -1;
+}
+.tsc_ribbon_hang.ie8 .ribbon-bookmark > span:before {
+ display: none;
+}
+.tsc_ribbon_hang .small > span:before, .tsc_ribbon_hang.ie8 .small .fork {
+ border-width: 25px;
+ margin-top: -25px;
+}
+.tsc_ribbon_hang .medium > span:before, .tsc_ribbon_hang.ie8 .medium .fork {
+ border-width: 40px;
+ margin-top: -40px;
+}
+.tsc_ribbon_hang .large > span:before, .tsc_ribbon_hang.ie8 .large .fork {
+ border-width: 60px;
+ margin-top: -60px;
+}
+.tsc_ribbon_hang .ribbon-bookmark:before {
+ background: none repeat scroll 0 0 #666666;
+ box-shadow: 0 6px 2px rgba(0, 0, 0, 0.5), -1px -1px 2px rgba(0, 0, 0, 0.5);
+ content: "";
+ left: 1px;
+ position: absolute;
+ transform: skew(-20deg, -38deg) rotate(-20deg);
+ transform-origin: 0 0 0;
+ z-index: -2;
+}
+.tsc_ribbon_hang .ribbon-bookmark:after {
+ background: none repeat scroll 0 0 #666666;
+ box-shadow: 0 7px 2px rgba(0, 0, 0, 0.5), 1px -1px 2px rgba(0, 0, 0, 0.5);
+ content: "";
+ position: absolute;
+ right: 1px;
+ transform: skew(20deg, 38deg) rotate(20deg);
+ transform-origin: right 0 0;
+ z-index: -2;
+}
+.tsc_ribbon_hang.ie8 .ribbon-bookmark:before, .tsc_ribbon_hang.ie8 .ribbon-bookmark:after {
+ display: none;
+}
+.tsc_ribbon_hang .ribbon-bookmark.small:before, .tsc_ribbon_hang .ribbon-bookmark.small:after {
+ bottom: -35px;
+ height: 35px;
+ width: 25px;
+}
+.tsc_ribbon_hang .ribbon-bookmark.medium:before, .tsc_ribbon_hang .ribbon-bookmark.medium:after {
+ bottom: -55px;
+ height: 55px;
+ width: 40px;
+}
+.tsc_ribbon_hang .ribbon-bookmark.large:before, .tsc_ribbon_hang .ribbon-bookmark.large:after {
+ bottom: -85px;
+ height: 85px;
+ width: 60px;
+}
+.tsc_ribbon_hang .ribbon-bookmark.small:before {
+ box-shadow: 0 3px 2px rgba(0, 0, 0, 0.5), -1px -1px 2px rgba(0, 0, 0, 0.5);
+}
+.tsc_ribbon_hang .ribbon-bookmark.small:after {
+ box-shadow: 0 5px 2px rgba(0, 0, 0, 0.5), 1px -1px 2px rgba(0, 0, 0, 0.5);
+}
+.tsc_ribbon_hang .ie8 .ribbon-bookmark.small {
+ box-shadow: none;
+}
+.tsc_ribbon_hang .lblue {
+ background: none repeat scroll 0 0 #42A5D4;
+}
+.tsc_ribbon_hang .lblue > span {
+ background-color: #42A5D4;
+ background-image: -moz-linear-gradient(center top , #42A5D4, #24769D);
+}
+.tsc_ribbon_hang .lblue > span:before, .tsc_ribbon_hang.ie8 .lblue .fork {
+ border-color: #24769D #24769D transparent;
+}
+.tsc_ribbon_hang .lred {
+ background: none repeat scroll 0 0 #F80000;
+}
+.tsc_ribbon_hang .lred > span {
+ background-color: #F80000;
+ background-image: -moz-linear-gradient(center top , #F80000, #A30000);
+}
+.tsc_ribbon_hang .lred > span:before, .tsc_ribbon_hang.ie8 .lred .fork {
+ border-color: #A30000 #A30000 transparent;
+}
+.tsc_ribbon_hang .lgreen {
+ background: none repeat scroll 0 0 #80B73D;
+}
+.tsc_ribbon_hang .lgreen > span {
+ background-color: #80B73D;
+ background-image: -moz-linear-gradient(center top , #80B73D, #547728);
+}
+.tsc_ribbon_hang .lgreen > span:before, .tsc_ribbon_hang.ie8 .lgreen .fork {
+ border-color: #547728 #547728 transparent;
+}
+.tsc_ribbon_hang .lyellow {
+ background: none repeat scroll 0 0 #FFC037;
+}
+.tsc_ribbon_hang .lyellow > span {
+ background-color: #FFC037;
+ background-image: -moz-linear-gradient(center top , #FFC037, #E19A00);
+}
+.tsc_ribbon_hang .lyellow > span:before, .tsc_ribbon_hang.ie8 .lyellow .fork {
+ border-color: #E19A00 #E19A00 transparent;
+}
+.tsc_ribbon_banner {
+ margin: 30px 0;
+ position: relative;
+ z-index: 0;
+}
+.tsc_ribbon_banner > div {
+ margin-bottom: 40px;
+}
+.tsc_ribbon_banner > div:last-of-type {
+ margin-bottom: 0;
+}
+.tsc_ribbon_banner .ribbon-banner {
+ color: #FFFFFF;
+ height: 40px;
+ line-height: 40px;
+ margin: 0 auto;
+ position: relative;
+ text-align: center;
+ width: 320px;
+}
+.tsc_ribbon_banner .ribbon-banner > span {
+ display: block;
+ height: 100%;
+ position: relative;
+}
+.tsc_ribbon_banner .ribbon-banner > span:before, .tsc_ribbon_banner .ribbon-banner > span:after {
+ border-color: transparent;
+ border-style: solid;
+ border-width: 14px;
+ content: "";
+ position: absolute;
+ z-index: -1;
+}
+.tsc_ribbon_banner.ie8 .ribbon-banner > span:before, .ie8 .ribbon-banner > span:after {
+ display: none;
+}
+.tsc_ribbon_banner .ribbon-banner > span:before {
+ left: -14px;
+}
+.tsc_ribbon_banner .ribbon-banner > span:after {
+ right: -14px;
+}
+.tsc_ribbon_banner .ribbon-banner:before {
+ border-style: solid;
+ border-width: 20px 25px 20px 20px;
+ content: "";
+ left: -31px;
+ position: absolute;
+ z-index: -2;
+}
+.tsc_ribbon_banner .ribbon-banner:after {
+ border-style: solid;
+ border-width: 20px 20px 20px 25px;
+ content: "";
+ position: absolute;
+ right: -31px;
+ z-index: -2;
+}
+.tsc_ribbon_banner .fold-down > span {
+ box-shadow: 0 1px 2px rgba(0, 0, 0, 0.5);
+}
+.tsc_ribbon_banner .fold-down > span:before, .tsc_ribbon_banner .fold-down > span:after {
+ bottom: -14px;
+}
+.tsc_ribbon_banner .fold-down:before {
+ top: 14px;
+}
+.tsc_ribbon_banner .fold-down:after {
+ top: 14px;
+}
+.tsc_ribbon_banner .fold-straight > span {
+ box-shadow: 0 0 2px rgba(0, 0, 0, 0.5), -1px 0 1px rgba(0, 0, 0, 0.1), 1px 0 1px rgba(0, 0, 0, 0.1);
+}
+.tsc_ribbon_banner .fold-straight > span:before, .tsc_ribbon_banner .fold-straight > span:after {
+ display: none;
+}
+.tsc_ribbon_banner .fold-straight:before {
+ border-width: 18px 23px 18px 18px;
+ top: 2px;
+}
+.tsc_ribbon_banner .fold-straight:after {
+ border-width: 18px 18px 18px 23px;
+ top: 2px;
+}
+.tsc_ribbon_banner .curve.fold-up {
+ border-radius: 0 0 50% 50%;
+}
+.tsc_ribbon_banner .curve > span {
+ box-shadow: none;
+}
+.tsc_ribbon_banner .curve.fold-up > span:after {
+ border: 0 none;
+ border-radius: 0 0 50% 50%;
+ height: 100%;
+ left: 0;
+ top: -40px;
+ width: 100%;
+}
+.tsc_ribbon_banner .curve.fold-up > span:before {
+ background-image: -moz-linear-gradient(left center , rgba(0, 0, 0, 0.35) 0%, rgba(0, 0, 0, 0.35) 100%), -moz-linear-gradient(right center , rgba(0, 0, 0, 0.35) 0%, rgba(0, 0, 0, 0.35) 100%);
+ background-position: left top, right top;
+ background-repeat: no-repeat, no-repeat;
+ background-size: 10px 40px, 10px 40px;
+ border: 0 none;
+ border-radius: 50% 50% 50% 50%;
+ height: 100%;
+ left: 0;
+ top: -40px;
+ width: 100%;
+}
+.tsc_ribbon_banner.ie .curve.fold-up > span:before {
+ display: none;
+}
+.tsc_ribbon_banner.ie .curve.fold-up > span .before {
+ border-left: 10px solid rgba(0, 0, 0, 0.35);
+ border-radius: 10px 10px 10px 10px;
+ border-right: 10px solid rgba(0, 0, 0, 0.35);
+ height: 100%;
+ left: 0;
+ position: absolute;
+ right: 0;
+ top: -27px;
+ z-index: -1;
+}
+.tsc_ribbon_banner .curve.fold-up:before {
+ left: -34px;
+ top: -27px;
+}
+.tsc_ribbon_banner.ie8 .curve.fold-up:before {
+ left: -31px;
+ top: -14px;
+}
+.tsc_ribbon_banner .curve.fold-up:after {
+ right: -34px;
+ top: -27px;
+}
+.tsc_ribbon_banner.ie8 .curve.fold-up:after {
+ right: -31px;
+ top: -14px;
+}
+.tsc_ribbon_banner .lblue, .tsc_ribbon_banner.ie8 .lblue > span {
+ background-color: #42A5D4;
+ background-image: -moz-linear-gradient(center top , #42A5D4, #24769D);
+}
+.tsc_ribbon_banner .lblue > span:before {
+ border-right-color: #174C66;
+}
+.tsc_ribbon_banner .lblue > span:after {
+ border-left-color: #174C66;
+}
+.tsc_ribbon_banner .lblue:before {
+ border-color: #24769D #24769D #24769D transparent;
+}
+.tsc_ribbon_banner .lblue:after {
+ border-color: #24769D transparent #24769D #24769D;
+}
+.tsc_ribbon_banner .lblue.curve.fold-up > span:after {
+ box-shadow: 0 19px 0 #42A5D4;
+}
+.tsc_ribbon_banner .lred, .tsc_ribbon_banner.ie8 .lred > span {
+ background-color: #F80000;
+ background-image: -moz-linear-gradient(center top , #F80000, #A30000);
+}
+.tsc_ribbon_banner .lred > span:before {
+ border-right-color: #5F0000;
+}
+.tsc_ribbon_banner .lred > span:after {
+ border-left-color: #5F0000;
+}
+.tsc_ribbon_banner .lred:before {
+ border-color: #A30000 #A30000 #A30000 transparent;
+}
+.tsc_ribbon_banner .lred:after {
+ border-color: #A30000 transparent #A30000 #A30000;
+}
+.tsc_ribbon_banner .lred.curve.fold-up > span:after {
+ box-shadow: 0 19px 0 #F80000;
+}
+.tsc_ribbon_banner .lgreen, .tsc_ribbon_banner.ie8 .lgreen > span {
+ background-color: #80B73D;
+ background-image: -moz-linear-gradient(center top , #80B73D, #547728);
+}
+.tsc_ribbon_banner .lgreen > span:before {
+ border-right-color: #304417;
+}
+.tsc_ribbon_banner .lgreen > span:after {
+ border-left-color: #304417;
+}
+.tsc_ribbon_banner .lgreen:before {
+ border-color: #547728 #547728 #547728 transparent;
+}
+.tsc_ribbon_banner .lgreen:after {
+ border-color: #547728 transparent #547728 #547728;
+}
+.tsc_ribbon_banner .lgreen.curve.fold-up > span:after {
+ box-shadow: 0 19px 0 #80B73D;
+}
+.tsc_ribbon_banner .lyellow, .tsc_ribbon_banner.ie8 .lyellow > span {
+ background-color: #FFC037;
+ background-image: -moz-linear-gradient(center top , #FFC037, #E19A00);
+}
+.tsc_ribbon_banner .lyellow > span:before {
+ border-right-color: #9D6C00;
+}
+.tsc_ribbon_banner .lyellow > span:after {
+ border-left-color: #9D6C00;
+}
+.tsc_ribbon_banner .lyellow:before {
+ border-color: #E19A00 #E19A00 #E19A00 transparent;
+}
+.tsc_ribbon_banner .lyellow:after {
+ border-color: #E19A00 transparent #E19A00 #E19A00;
+}
+.tsc_ribbon_banner .lyellow.curve.fold-up > span:after {
+ box-shadow: 0 19px 0 #FFC037;
+}
\ No newline at end of file
diff --git a/public_html/estilos/abel.css b/public_html/estilos/abel.css
new file mode 100644
index 0000000..d18cfe4
--- /dev/null
+++ b/public_html/estilos/abel.css
@@ -0,0 +1,41 @@
+/*
+ Created on : 22/08/2014, 05:01:00 PM
+ Author : Abel
+*/
+
+table.listados{
+ width: 100%;
+}
+table.listados th{
+ background: #2F5BB7;
+ color: white;
+ padding-top: 5px;
+ padding-bottom: 5px;
+}
+div.izquierda{
+ float: left;
+ width: 50%;
+}
+div.derecha{
+ float: right;
+ width: 50%;
+}
+ul.carreras li{
+ text-align: left;
+ margin: 0px;
+ margin-top: 15px;
+ padding: 0px;
+ font-size: 13px;
+}
+div.parteDerecha{
+ align:center;
+ width: 35%;
+ background: white;
+ float: right;
+ /* padding-top: 130px; */
+ padding-left: 3%;
+ padding-right: 2%
+}
+p.azul{
+ background: #E5EBFD;
+}
diff --git a/public_html/estilos/acatlan.css b/public_html/estilos/acatlan.css
new file mode 100644
index 0000000..bed578e
--- /dev/null
+++ b/public_html/estilos/acatlan.css
@@ -0,0 +1,1215 @@
+.handcursor{
+cursor:hand;
+cursor:pointer;
+}
+
+.mensaje
+{
+ text-align: center;
+ padding-bottom: 10px;
+ margin: auto;
+ padding-top: 10px;
+ margin-top: 50px;
+ margin-bottom: 100px;
+ width: 500px;
+ border-style: solid;
+ border-radius: 5px;
+ border-width: 1px;
+ text-shadow: 0 1px rgba(0,0,0,4);
+ background-image: -moz-linear-gradient(rgba(255,255,255,.3), rgba(255,255,255,0));
+ background-image: -webkit-linear-gradient(rgba(255,255,255,.3), rgba(255,255,255,0));
+ background-image: -o-linear-gradient(rgba(255,255,255,.3), rgba(255,255,255,0));
+ background-image: -ms-linear-gradient(rgba(255,255,255,.3), rgba(255,255,255,0));
+ background-image: linear-gradient(rgba(255,255,255,.3), rgba(255,255,255,0));
+ -moz-box-shadow: 0 2px 0 rgba(0,0,0,.3);
+ -webkit-box-shadow: 0 2px 0 rgba(0,0,0,.3);
+ box-shadow: 0 2px 0 rgba(0,0,0,.3);
+ clear: both;
+
+}
+#user
+{
+ /*background: url("../images/user.ico") no-repeat scroll 0 50% transparent ;*/
+ height: 100%;
+ position: absolute;
+ right: 55px;
+ top: 0;
+ width: 155px;
+
+}
+
+.enlaceboton { font-family: verdana, arial, sans-serif;
+ font-size: 10pt;
+ font-weight: bold;
+ padding: 4px;
+ color: #666666;
+ text-decoration: none;
+}
+.enlaceboton:link,
+.enlaceboton:visited {
+ border-top: 1px solid #cccccc;
+ border-bottom: 2px solid #666666;
+ border-left: 1px solid #cccccc;
+ border-right: 2px solid #666666;
+}
+.enlaceboton:hover {
+ border-bottom: 1px solid #cccccc;
+
+ border-top: 2px solid #666666;
+ border-right: 1px solid #cccccc;
+ border-left: 2px solid #666666;
+}
+
+
+
+
+.programa{
+
+width:49.9%;
+margin:20px auto 80px;
+
+
+}
+
+.programa-contenido{
+border:1px solid;
+border-color: black;
+
+
+}
+
+#ampliar img{
+-webkit-transform:scale(1); /*Webkit: Scale down image to 0.8x original size*/
+-moz-transform:scale(1); /*Mozilla scale version*/
+-o-transform:scale(1); /*Opera scale version*/
+-webkit-transition-duration: 0.5s; /*Webkit: Animation duration*/
+-moz-transition-duration: 0.5s; /*Mozilla duration version*/
+-o-transition-duration: 0.5s; /*Opera duration version*/
+
+}
+/* al pasar el cursor por encima SE AMPLIA*/
+#ampliar img:hover{
+-webkit-transform:scale(2); /*Webkit:Modificamos tamaño a escala*/
+-moz-transform:scale(2); /*Mozilla:Modificamos tamaño a escala*/
+-o-transform:scale(2); /*Opera:Modificamos tamaño a escala*/
+-webkit-transition-duration: 0.5s; /*Webkit:Duración de la animación*/
+-moz-transition-duration: 0.5s; /*Mozilla:Duración de la animació*/
+-o-transition-duration: 0.5s; /*Opera:Duración de la animació*/
+}
+
+
+
+.contenido
+{
+ width:300%;
+ height: 300%;
+ top:10%;
+ left: 10%;
+ position:relative;
+
+ }
+
+
+
+
+/* Congratulation message */
+.MsgSent {
+ Display: none;
+ padding: 10px;
+ margin: 40px auto;
+ width: 400px;
+ text-align: center;
+ border: 1px solid green;
+ background-color: white;
+}
+
+.MsgSent h1 {
+ /* background: url(../images/MsgSent.gif) no-repeat 0 0; */
+ padding-left: 20px;
+ height: 85px;
+ line-height: 85px;
+}
+
+
+
+.derechos {
+
+ text-align: center;
+ width: 100%;
+}
+.administrado {
+
+
+ margin-top: 9px;
+ text-align: center;
+ width: 100%;
+ color: rgb(255, 255, 255);
+}
+
+
+.pie-derechos {
+ background-color: rgb(27, 61, 112);
+ color: rgb(255, 255, 255);
+ padding: 30px;
+}
+
+
+
+
+.navegadores
+{
+
+ display:none;
+ text-align: center;
+ font-weight: bolder;
+ border-style: dashed;
+ border-color: red;
+ width: 520px;
+ margin-left: auto;
+ margin-right: auto;
+
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+/*INVISIBLES*/
+h1 span,h2 span,#buscar-p label,.division span{
+display:none;
+}
+/*AUXILIARES*/
+.division{
+height:1px;
+clear:both;
+}
+
+#contenido
+{
+ background-color: #fff;
+ background-image: url("../images/bg-feat.jpg");
+ background-position: right top;
+ background-repeat: no-repeat;
+ height: auto;
+
+}
+
+.page
+{
+ width:960px;
+ background-color: #fff;
+ margin: 10px auto ;
+}
+
+.pregunta {
+ font-family: Arial, Helvetica, sans-serif;
+ font-size: 12px;
+ font-style: normal;
+ font-weight: bold;
+ color: #003366;
+ text-decoration: none;
+ border: thin outset #FFFFFF;
+}
+/*ESTRUCTURAS PRINCIPALES*/
+body{
+ background: #E9E9E9;
+ font: 12px/150% Verdana,"DejaVu Sans","Bitstream Vera Sans",sans-serif;
+line-height:150%;
+margin-left: 30px;
+/*background: url(../images/fondo.gif) repeat-x;*/
+color: #333;
+
+}
+
+#cabeza{
+position:relative;
+}
+
+#cabecera{
+position:relative;
+height:115px;
+background-color: #1B3D70;
+}
+#imagen-cab{
+position:absolute;
+top:0;
+right:0;
+width:560px;
+height:103px;
+}
+
+.logo-derecha{
+ position: absolute;
+ left: 0px;
+ margin: 15px;
+}
+.logo-izquierda{
+ max-width: 100%;
+ right: 0px;
+ position: absolute;
+ margin: 15px;
+ top: 11px;
+}
+
+
+
+#busqueda{
+position:relative;
+background-color:rgb(187, 136, 0) !important;
+font:11px Verdana,"DejaVu Sans","Bitstream Vera Sans",sans-serif;
+overflow:hidden;
+}
+#pie-barra{
+position:relative;
+height:59px;
+background:url(pie2.png) repeat-x;
+color:#B5D7FF;
+border-bottom:2px solid #cfcfcf;
+}
+#pie-barra-sombras,.instancia-tit{
+position:relative;
+}
+.instancia-tit{
+ background-color: rgb(27, 61, 112);
+}
+#pie-inf{
+color:#333;
+font:90% Verdana,"DejaVu Sans","Bitstream Vera Sans",sans-serif;
+margin:10px 0;
+padding:1px 1em;
+background:#d9e7ea url(fondopie.gif) repeat-x;
+border:1px solid #d4d8db;
+text-align:center;
+}
+#vertical-nav .col-trip,#vertical-nav-alt .col-trip{
+padding:0;
+margin:0 1.5em;
+position:relative; /*JQUERY FIX*/
+}
+#vertical-nav{
+width:25%;
+float:left;
+}
+#vertical-nav-alt{
+float:right;
+width:25%;
+}
+#contenido-a{
+width:80.7%;
+font:15px Verdana,"DejaVu Sans","Bitstream Vera Sans",sans-serif;
+float:center;
+text-align:justify;
+}
+#contenido-b{
+width:74.7%;
+float:right;
+text-align:justify;
+}
+.menu-shooter{
+color:#373E4D;
+padding:.35em .35em .35em 26px;
+font-size:105%;
+cursor:pointer;
+background-repeat:no-repeat;
+background-position:5px 50%;
+background-image:url(bullet.png);
+}
+.menu-shooter:hover{
+background-color:#eee;
+}
+.menu-shooter-active,.menu-shooter-active:hover{
+background-color:#D9DCE0;
+color:#000;
+}
+#acatlan-logo {
+ background: url("../images/acatlan.png") no-repeat scroll 0 50% transparent;
+ height: 100%;
+ position: absolute;
+ right: 15px;
+ top: 0;
+ width: 143px;
+}
+#barra-relleno{
+color:#FFFFFF;
+font-size:91.6%;
+position:relative;
+}
+.relleno-barra-relleno{
+background:#262E3E url(noticia-back.png) repeat-x scroll 0 0;
+border-bottom:2px solid #CFCFCF;
+padding:0.3em 1em 0.5em;
+}
+#logo-tit{
+background:#262E3E url(noticia-back.png) repeat-x scroll 0 -2em;
+border-bottom:2px solid #cfcfcf;
+margin-top:-2px;
+position:relative;
+}
+#logo-tit .sombra-izq,#logo-tit .sombra-der{
+top:2px;
+}
+.bread{
+font-size:90%;
+border-bottom:1px solid #ddd;
+text-align:left;
+}
+.bread-relleno{
+border:none;
+font-size:100%;
+color:#fff;
+text-align:right;
+}
+.col-trip{
+padding:0 1.5em;
+}
+.col-in{
+
+padding:0 .8em;
+}
+.col-bi{
+float:left;
+width:49.9%;
+}
+.col-tri{
+float:left;
+width:33.3%;
+}
+.col-dtri{
+float:left;
+width:66.6%;
+}
+.col-aurea{
+float:left;
+width:38.2%;
+}
+.controles{
+font-weight:bold;
+margin:0;
+padding:1em;
+text-align:center;
+font-size:110%;
+}
+#menu-oferta{
+background-image:url(icon-oferta16.png);
+}
+#menu-vida{
+background-image:url(icon-vida16.png);
+}
+#menu-nuestro{
+background-image:url(icon-nuestro16.png);
+}
+#menu-medios{
+background-image:url(icon-medios16.png);
+}
+#menu-servicios{
+background-image:url(icon-servicios16.png);
+}
+#menu-investigacion{
+background-image:url(icon-investigacion16.png);
+}
+#texto-pie{
+position:absolute;
+top:50%;
+right:.5%;
+margin:-.7em 0;
+}
+#texto-pie-portada{
+position:absolute;
+top:50%;
+left:.5%;
+margin:-.7em 0;
+}
+.contacto-box{
+border-top:1px solid #D1D6DE;
+border-bottom:1px solid #D1D6DE;
+font-size:100%;
+padding-right: 10px;
+margin-left: 5px;
+color:#566073;
+text-align: right;
+}
+
+
+.login-box{
+
+font-size:100%;
+padding-right: 10px;
+margin-left: 5px;
+color:#566073;
+text-align: right;
+}
+
+
+
+.acceso
+{
+margin: 10px;
+ margin-left: 600px;
+ -moz-border-radius: 11px 11px 11px 11px;
+ width: 340px;
+ height: 30px;
+ background-image: url("../images/negro-trans.png");
+ text-align:center;
+ font-size: 10px;
+ background-repeat: repeat;
+ color: white;
+
+}
+
+
+
+.info-box{
+
+ width: 600px;
+ height: 100px;
+border:2px solid #FAB22E;
+margin:1em 0;
+font-size:90%;
+margin-right: auto;
+ margin-left: auto;
+
+}
+.menu-info{
+font-size:115%;
+}
+.nice-menu-hori{
+text-align:center;
+font-size:105%;
+font-weight:bold;
+padding:1em 0;
+}
+
+
+.menu-in{
+background:#e9e9e9;
+text-align:left;
+border:1px solid #999;
+}
+.info-box .noti-cata{
+margin-bottom:.5em;
+border-bottom:1px dashed #c5cfd8;
+}
+.acordeon{
+position:relative;
+width:100%;
+}
+/*TITULOS*/
+#cabecera h1{
+position:absolute;
+top:0;
+left:0;
+margin:0;
+padding:0;
+width:420px;
+height:103px;
+background:url(titulo.gif) no-repeat;
+}
+#instancia{
+font:215% Arial,A030,"Nimbus Sans L",FreeSans,"Liberation Sans",sans-serif;
+font-weight:normal;
+color:#fff;
+margin:0;
+padding:.3em .8em .4em .8em;
+}
+#logo-tit h2{
+background:url(logo-noticias.png) no-repeat 50% 0;
+margin:0;
+color:#fff;
+height:75px;
+}
+
+h2 {
+
+ height:5px;
+ text-align: center;
+}
+
+h3{
+font:170% Arial,A030,"Nimbus Sans L",FreeSans,"Liberation Sans",sans-serif;
+margin:0;
+color:#000;
+
+font-weight:normal;
+text-shadow:2px 2px 2px #cfcfcf;
+}
+#vertical-nav h3,#vertical-nav-alt h3{
+background:transparent url(menu-tit-back.png) repeat-x 0 100%;
+font:105% Verdana,"DejaVu Sans","Bitstream Vera Sans",sans-serif;
+color:#000;
+font-weight:bold;
+padding:0.3em;
+margin:.5em 0 0 0;
+border-bottom:1px solid #DEE1E6;
+text-shadow:2px 2px 2px #ccc;
+}
+h4,h5,h6{
+font-family:Arial,A030,"Nimbus Sans L",FreeSans,"Liberation Sans",sans-serif;
+margin:1em 0;
+text-align:left;
+padding:0 0 .1em 0;
+line-height:115%;
+}
+h4{
+font-size:145%;
+}
+h5{
+font-size:130%;
+}
+h6{
+ font-family:Arial,A030,"Nimbus Sans L",FreeSans,"Liberation Sans",sans-serif;
+ width: 700px;
+ font-size: 130%;
+ line-height:55%;
+ background-color: #E5EBFD;
+ background-position: -136px -33px;
+ border-color: #A0B1DE;
+ border-radius: 3px 3px 3px 3px;
+ border-style: solid;
+ border-width: 1px;
+ padding: 8px 8px 8px 8px;
+}
+h6.desarrollador{
+font-family:Arial,A030,"Nimbus Sans L",FreeSans,"Liberation Sans",sans-serif;
+text-align: center;
+width: 40%;
+font-size: 15px;
+line-height:20px;
+background-color: #E5EBFD;
+border-color: #A0B1DE;
+border-radius: 3px 3px 3px 3px;
+border-style: solid;
+border-width: 1px;
+padding: 6px 0px 6px 0px;
+}
+.tit-nice,.tit-cool{
+border-bottom:1px solid #ccc;
+}
+.tit-cool{
+padding:.2em 0;
+margin:.5em 0;
+text-shadow:none;
+}
+.tit-color{
+padding:.2em 0;
+margin:1em 0 2em 0;
+}
+.tit-color span{
+background:#B04141;
+color:#fff;
+font-weight:normal;
+padding:.2em .4em;
+font-size:130%;
+border:2px solid #8C3333;
+-moz-border-radius:9px;
+-webkit-border-radius:9px;
+border-radius:9px;
+-moz-box-shadow:2px 2px 2px rgba(0,0,0,.5);
+-webkit-box-shadow:2px 2px 2px rgba(0,0,0,.5);
+box-shadow:2px 2px 2px rgba(0,0,0,.5);
+}
+
+
+.tab-resultados{
+border-style: groove;
+border-width: 1px;
+border-color: #669;
+font-size:120%;
+margin:1em 0 0 0;
+padding:.6em .5em .55em .5em;
+color: #039;
+text-shadow:0 0 5px #ccc;
+
+-moz-border-radius-topleft:7px;
+-moz-border-radius-topright:7px;
+-webkit-border-top-left-radius:7px;
+-webkit-border-top-right-radius:7px;
+border-top-left-radius:7px;
+}
+
+
+.tab-header{
+border:none;
+font-size:128%;
+margin:1em 0 0 0;
+padding:.6em .5em .55em .5em;
+background-color: #34637F;
+/*background:#333;*/
+/*background: url("../images/bt.png") repeat-x scroll 0 10% transparent;*/
+color:#fff;
+text-shadow:0 0 5px #ccc;
+-moz-border-radius-topleft:7px;
+-moz-border-radius-topright:7px;
+-webkit-border-top-left-radius:7px;
+-webkit-border-top-right-radius:7px;
+border-top-left-radius:7px;
+}
+.info-box h3{
+font-size:125%;
+text-align:center;
+background:#FBE888;
+text-shadow:none;
+font-weight:bold;
+padding:.3em 0;
+border-bottom:1px solid #FAB22E;
+-moz-border-radius-topleft:5px;
+-moz-border-radius-topright:5px;
+-webkit-border-top-left-radius:5px;
+-webkit-border-top-right-radius:5px;
+border-top-left-radius:5px;
+border-top-right-radius:5px;
+color:#4D360E;
+}
+.noti-cata h3{
+font:110% Verdana, "DejaVu Sans", "Bitstream Vera Sans", sans-serif;
+font-weight:bold;
+line-height:normal;
+margin:0.3em 0;
+padding:0;
+border:none;
+background:none;
+text-align:left;
+}
+/*LISTAS*/
+ul,ol{
+margin:1.4em 0 1.4em 3em;
+padding:0;
+}
+li{
+margin:1em 0;
+padding:0;
+}
+#vertical-nav ul,#vertical-nav-alt ul{
+list-style-type:none;
+margin:0;
+padding:0 0 .4em 0;
+background:transparent url(menu-back.gif) repeat-x;
+border-top:1px solid #CBCDD1;
+}
+#vertical-nav li,#vertical-nav-alt li{
+padding:0;
+margin:0;
+border-bottom:1px solid #ddd;
+}
+#vertical-nav .menu-subt,#vertcial-nav-alt .menu-subt{
+background:#eee;
+}
+.menu-mediario{
+font-weight:bold;
+}
+.menu-linea{
+line-height:2.1em;
+list-style-type:none;
+margin:1em 0;
+padding:0;
+text-align:center;
+}
+.menu-linea li{
+display:inline;
+}
+.menu-in ul{
+list-style-type:none;
+margin:0;
+}
+.menu-in li{
+border-top:2px solid #fff;
+margin:0;
+padding:.3em 1em;
+}
+.menu-in .in-icon{
+background-color:#fff;
+font-weight:bold;
+text-align:center;
+}
+.tabulado ul, .tabulado ol{
+margin:1em 0 1em 1em;
+}
+.rsx-page-num-list{
+display:inline;
+
+}
+.rsx-page-num-list li{
+display:inline;
+}
+table li{
+text-align:left;
+}
+.indice li{
+margin:0;
+}
+.menu-in ul{
+list-style-type:none;
+margin:0;
+}
+.menu-in li{
+margin:0;
+border-top:2px solid #fff;
+padding:.3em 1em;
+}
+.menu-in .in-icon{
+text-align:center;
+background:#fff;
+font-weight:bold;
+}
+.convo-chico{
+list-style-image:url(icon-ok16.png);
+}
+/*TEXTO*/
+.arroba{
+vertical-align:middle;
+margin:0 .1em;
+}
+
+
+#busqueda p{
+ margin: 0px;
+ padding: 1rem;
+ color: rgb(255, 255, 255);
+}
+#pie-inf p{
+margin:0;
+padding:.2em;
+}
+#legal{
+border-bottom:1px solid #d4d8db;
+}
+#administrado{
+color:#1B5799;
+}
+p{
+margin:1.5em 0;
+}
+.info-box p{
+margin:.9em 0;
+}
+blockquote{
+margin:1em 3.5em;
+padding:0;
+}
+q,cite,blockquote{
+color:#6C4406;
+font-style:italic;
+}
+q:before,cite:before,q:after,cite:after{
+content:'"';
+}
+.ipie{
+color:#6C4406;
+font-size:95%;
+text-align:center;
+}
+.epie{
+font-size:80%;
+margin-top:4em;
+text-align:right;
+}
+.nota{
+color:#933;
+}
+.bread-in{
+font-weight:bold;
+}
+.unlinked{
+font-weight:normal;
+}
+.tit-cool span{
+background-color:#333;
+color:#fff;
+padding:.2em .5em;
+-moz-border-radius-topleft:7px;
+-moz-border-radius-topright:7px;
+-webkit-border-top-left-radius:7px;
+-webkit-border-top-right-radius:7px;
+border-top-left-radius:7px;
+}
+#texto-pie a,#texto-pie-portada a{
+margin:0 .5em;
+}
+#barra-relleno p{
+margin:0;
+}
+.invita-sugerencia{
+text-align:right;
+color:#2f4e91;
+}
+.invita-sugerencia span{
+cursor:pointer;
+}
+.file-down{
+font-size:90%;
+}
+.opcion-icon{
+font-size:130%;
+}
+.convoca-info{
+font-size:115%;
+font-weight:bold;
+text-align:left;
+}
+.menu-in-tit{
+font-weight:bold;
+text-align:center;
+padding:.3em 0;
+margin:0;
+text-transform:uppercase;
+background:#ddd;
+}
+.pform{
+margin:1em 0;
+}
+.info-box .noti-cata p{
+line-height:135%;
+margin:.75em 0;
+}
+.info-box .noti-cata h3 span{
+font-weight:normal;
+}
+.footnote{
+font-size:90%;
+font-style:italic;
+}
+/*VÃNCULOS*/
+h1 a{
+display:block;
+width:100%;
+height:100%;
+}
+#busqueda a{
+text-decoration:none;
+padding:.6em .4em .8em .4em;
+border:none;
+text-shadow:1px 1px 1px #B39217;
+}
+#busqueda a:link{
+color:#fff;
+}
+#busqueda a:visited{
+color:#fff;
+}
+/*#busqueda a:hover{
+background:#fff url(../images/barra-amarilla-hover.png) repeat-x 0 50%;
+text-shadow:1px 1px 1px #aaa;
+}*/
+#pie-barra a{
+text-decoration:none;
+}
+#pie-barra a:link,#pie-barra a:visited,#pie-barra a:hover{
+color:#B5D7FF;
+}
+a:link,.ui-widget .ui-widget-content a:link{
+color:#2f4e91;
+}
+a:visited,.ui-widget .ui-widget-content a:visited{
+color:#213664;
+}
+a:hover,.ui-widget .ui-widget-content a:hover{
+color:#B34040;
+}
+#vertical-nav a,#vertical-nav-alt a,.bread a{
+text-decoration:none;
+}
+#vertical-nav a,#vertical-nav-alt a{
+display:block;
+padding:.3em;
+}
+#vertical-nav a:hover,#vertical-nav-alt a:hover{
+background-color:#eee;
+color:#2f4e91;
+}
+#vertical-nav li:first-child a:hover,#vertical-nav-alt li:first-child a:hover{
+background:#eee url(entry-back.gif) repeat-x;
+}
+.bread-relleno a:link{
+color:#B0CFFF;;
+}
+.bread-relleno a:visited{
+color:#B0CFFF;
+}
+.bread-relleno a:hover{
+color:#FFBB52;
+}
+.menu-linea a{
+text-decoration:none;
+background:#585D75;
+border-bottom:2px solid #3A3D4D;
+border-right:2px solid #3A3D4D;
+padding:0.3em 0.5em;
+-moz-box-shadow:2px 2px 2px #999;
+-webkit-box-shadow:2px 2px 2px #999;
+box-shadow:2px 2px 2px #999;
+-moz-border-radius:5px;
+-webkit-border-radius:5px;
+border-radius:5px;
+}
+.menu-linea a:link,.menu-linea a:visited{
+color:#fff;
+}
+.menu-linea a:hover{
+background:#CED0D7;
+color:#3C4152;
+}
+.opcion-icon a:link,.opcion-icon a:visited{
+text-decoration:none;
+padding:.3em .6em .3em 0;
+background:#3D4A66;
+color:#fff;
+border-bottom:2px solid #ccc;
+border-right:2px solid #ccc;
+}
+.opcion-icon a:hover{
+color:#fff;
+background:#B34040;
+border-bottom:2px solid #ccc;
+border-right:2px solid #ccc;
+}
+.nice-menu-hori a{
+text-decoration:none;
+}
+.menu-in a{
+text-decoration:none;
+}
+/*FORMULARIO*/
+#buscar-p{
+position:absolute;
+top:0;
+right:1em;
+font:12px Verdana,"DejaVu Sans","Bitstream Vera Sans",sans-serif;
+margin:0;
+line-height:1em;
+}
+.inp-buscar-p{
+font:12px Verdana,"DejaVu Sans","Bitstream Vera Sans",sans-serif;
+background-color:#fff;
+border:1px solid #BCCDF0;
+padding:.2em;
+margin:0 1px;
+width:14em;
+}
+.congoogle{
+background-image:url(google_custom.gif);
+background-repeat:no-repeat;
+background-position:0 50%;
+}
+.btn-buscar-p{
+margin:0 0 0 .5em;
+padding-top:0;
+padding-bottom:0;
+font:12px Verdana,"DejaVu Sans","Bitstream Vera Sans",sans-serif;
+}
+input,button,textarea{
+font:100% Verdana,"DejaVu Sans","Bitstream Vera Sans",sans-serif;
+}
+
+legend{
+font-weight:bold;
+font-size:107%;
+}
+fieldset{
+border:1px solid #cfcfcf;
+margin:1em 0;
+padding:0 1em;
+}
+#sug_texto{
+width:95%;
+}
+/*TABLAS*/
+
+caption{
+text-align:center;
+font-weight:bold;
+font-size:110%;
+}
+
+
+/*MAQUETADO*/
+.recuadro{
+margin:1em 0;
+padding:0 1em;
+border:1px dashed #aaa;
+}
+.izq{
+float:left;
+margin:1.5em 1em 0.5em 0;
+}
+.der{
+float:right;
+margin:1.5em 0 0.5em 1em;
+}
+hr{
+background-color:#ccc;
+color:#ccc;
+height:1px;
+margin:auto;
+text-align:center;
+width:75%;
+}
+.centro{
+display:block;
+margin:1em auto;
+text-align:center;
+}
+.big_square{
+overflow:auto;
+}
+/*IMAGENES*/
+/*#cabecera a img{
+border:none;
+margin:0;
+padding:0;
+}*/
+.img-text{
+vertical-align:middle;
+padding:0 .5em;
+}
+.img-pestana{
+vertical-align:middle;
+padding:0 .5em 0 0;
+}
+a img{
+border:none;
+}
+.foto{
+background-color:#fff;
+border-color:#aaa;
+border-style:ridge groove groove ridge;
+border-width:2px;
+padding:5px;
+-moz-box-shadow:0 0 4px rgba(0,0,0,.3);
+-webkit-box-shadow:0 0 4px rgba(0,0,0,.3);
+box-shadow:0 0 4px rgba(0,0,0,.3);
+}
+.info-box .noti-cata .der{
+margin-top:0;
+}
+/*JQUERY FIX*/
+.ui-datepicker table,.ui-datepicker tr,.ui-datepicker th,.ui-datepicker td{
+background:none;
+}
+
+.sombra-izq{
+position:absolute;
+width:13px;
+height:100%;
+top:0;
+left:-13px;
+background:transparent url(../images/sombra-i.png) repeat-y;
+}
+.sombra-der{
+position:absolute;
+width:13px;
+height:100%;
+top:0;
+right:-13px;
+background:transparent url(../images/sombra-d.png) repeat-y;
+}
+
+
+
+.sombra-izq{
+position:absolute;
+width:13px;
+height:100%;
+top:0;
+left:-13px;
+background:transparent url(../images/sombra-i.png) repeat-y;
+}
+.sombra-der{
+position:absolute;
+width:13px;
+height:100%;
+top:0;
+right:-13px;
+background:transparent url(../images/sombra-d.png) repeat-y;
+}
+
+.datos_monitor {
+ font-family: Tahoma;
+ border-collapse: collapse;
+ font-size: 100%;
+ line-height: 1.1;
+ margin-bottom: 3em;
+ margin-top: 20px;
+ border: 1px solid #A4BED4;
+
+
+}
+
+.datos_monitor tr:hover, td.start:hover, td.end:hover {
+ background: none repeat scroll 0 0 #FBF7BD;
+}
+
+.datos_monitor th {
+ padding: 0.3em 0.5em;
+ border: 1px solid #A4BED4;
+ text-align: left;
+}
+.datos_monitor td {
+ padding: 0.3em 0.5em;
+ border: 1px solid #A4BED4;
+ text-align: left;
+}
+
+.datos_monitor th {
+ font-weight: bold;
+ padding-left: 15px;
+ text-align: left;
+}
+.datos_monitor th.name {
+ width: 12em;
+}
+.datos_monitor th.location {
+ width: 12em;
+}
+.datos_monitor th.color {
+ width: 10em;
+}
+.datos_monitor thead th {
+ background: none repeat scroll 0 0 #C6CEDA;
+ border-color: #FFFFFF #FFFFFF #888888;
+ border-style: solid;
+ border-width: 1px 1px 2px;
+ padding-left: 0.5em;
+}
+.datos_monitor tbody th.start {
+ padding-left: 26px;
+}
+.datos_monitor tbody th.end {
+ padding-left: 26px;
+}
+
+.datos_encuesta
+{
+margin-left:150px;
+width:400px;
+margin-bottom:10px;
+margin-top:20px;
+border-style: solid;
+border-width: 1px;
+border-color: #A4BED4;
+font-weight: bold;
+ border-radius: 3px;
+ background-image: -moz-linear-gradient(rgba(255,255,255,.3), rgba(255,255,255,0));
+ background-image: -webkit-linear-gradient(rgba(255,255,255,.3), rgba(255,255,255,0));
+ background-image: -o-linear-gradient(rgba(255,255,255,.3), rgba(255,255,255,0));
+ background-image: -ms-linear-gradient(rgba(255,255,255,.3), rgba(255,255,255,0));
+ background-image: linear-gradient(rgba(255,255,255,.3), rgba(255,255,255,0));
+ -moz-box-shadow: 0 2px 0 rgba(0,0,0,.3);
+ -webkit-box-shadow: 0 2px 0 rgba(0,0,0,.3);
+ box-shadow: 0 2px 0 rgba(0,0,0,.3);
+}
+
+.cierre
+{
+ position: absolute;
+ left: 950px;
+
+}
\ No newline at end of file
diff --git a/public_html/estilos/barra.css b/public_html/estilos/barra.css
new file mode 100644
index 0000000..ca1e0e1
--- /dev/null
+++ b/public_html/estilos/barra.css
@@ -0,0 +1,79 @@
+#loadingProgressG{
+width:128px;
+height:10px;
+overflow:hidden;
+background-color:#A6B3AE;
+-webkit-border-radius:5px;
+-moz-border-radius:5px;
+-o-border-radius:5px;
+-ms-border-radius:5px;
+border-radius:5px;
+}
+
+.loadingProgressG{
+background-color:#FAFAFA;
+margin-top:0;
+margin-left:-128px;
+-webkit-animation-name:bounce_loadingProgressG;
+-webkit-animation-duration:1.7s;
+-webkit-animation-iteration-count:infinite;
+-webkit-animation-timing-function:linear;
+-moz-animation-name:bounce_loadingProgressG;
+-moz-animation-duration:1.7s;
+-moz-animation-iteration-count:infinite;
+-moz-animation-timing-function:linear;
+-o-animation-name:bounce_loadingProgressG;
+-o-animation-duration:1.7s;
+-o-animation-iteration-count:infinite;
+-o-animation-timing-function:linear;
+-ms-animation-name:bounce_loadingProgressG;
+-ms-animation-duration:1.7s;
+-ms-animation-iteration-count:infinite;
+-ms-animation-timing-function:linear;
+width:128px;
+height:10px;
+}
+
+@-webkit-keyframes bounce_loadingProgressG{
+0%{
+margin-left:-128px;
+}
+
+100%{
+margin-left:128px;
+}
+
+}
+
+@-moz-keyframes bounce_loadingProgressG{
+0%{
+margin-left:-128px;
+}
+
+100%{
+margin-left:128px;
+}
+
+}
+
+@-o-keyframes bounce_loadingProgressG{
+0%{
+margin-left:-128px;
+}
+
+100%{
+margin-left:128px;
+}
+
+}
+
+@-ms-keyframesbounce_loadingProgressG{
+0%{
+left:-128px;
+}
+
+100%{
+left:128px;
+}
+
+}
\ No newline at end of file
diff --git a/public_html/estilos/botones.css b/public_html/estilos/botones.css
new file mode 100644
index 0000000..9492b5f
--- /dev/null
+++ b/public_html/estilos/botones.css
@@ -0,0 +1,47 @@
+.button {
+ background: -moz-linear-gradient(center top , #F5F5F5, #F1F1F1) repeat scroll 0 0 #F1F1F1;
+ border: 1px solid rgba(0, 0, 0, 0.1);
+ border-radius: 2px 2px 2px 2px;
+ color: #666666;
+ font-family: Arial,sans-serif;
+ font-size: 12px;
+ font-weight: bold;
+ margin: 0 3px;
+ padding: 7px 12px;
+ text-decoration: none;
+ text-transform: uppercase;
+ transition: border-color 0.218s ease 0s;
+ margin-bottom: 10px;
+}
+
+.button.blue {
+ background: -moz-linear-gradient(center top , #4D90FE, #4787ED) repeat scroll 0 0 #4787ED;
+ border-color: #427EDE;
+ box-shadow: 0 1px 1px rgba(0, 0, 0, 0.1);
+ color: #FFFFFF;
+}
+.button.blue:hover {
+ background: -moz-linear-gradient(center top , #4D90FE, #357AE8) repeat scroll 0 0 #357AE8;
+ border-color: #2F5BB7;
+}
+.button.blue:active {
+ background: none repeat scroll 0 0 #4D90FE;
+}
+
+
+:optional.button.red {
+ background: -moz-linear-gradient(center top , #DD4B39, #D14836) repeat scroll 0 0 #D14836;
+ border: 1px solid transparent;
+ box-shadow: 0 1px 1px rgba(0, 0, 0, 0.1);
+ color: #FFFFFF;
+ text-shadow: 0 1px rgba(0, 0, 0, 0.1);
+}
+.button.red:hover {
+ background: -moz-linear-gradient(center top , #DD4B39, #C53727) repeat scroll 0 0 #C53727;
+ border-bottom: 1px solid #AF301F;
+ border-color: #B0281A #B0281A #AF301F;
+}
+.button.red:active {
+ box-shadow: 0 1px 2px rgba(0, 0, 0, 0.3) inset;
+}
+
diff --git a/public_html/estilos/cuestionario.css b/public_html/estilos/cuestionario.css
new file mode 100644
index 0000000..8b06a16
--- /dev/null
+++ b/public_html/estilos/cuestionario.css
@@ -0,0 +1,221 @@
+
+
+
+
+body{
+ color: #000000;
+ /*font-family: Helvetica,Verdana,Tahoma;
+ font-size: 13px; */
+ background: none repeat scroll 0 0 #E9E9E9;
+ font: 12px/150% Verdana,"DejaVu Sans","Bitstream Vera Sans",sans-serif;
+
+ }
+ #liga
+ {
+ margin-left: 20px;
+ font-size: 15px;
+ font-style: bold;
+
+ }
+ #escudo
+ {
+ width: 100px;
+ margin-left: 50px;
+ margin-top: 10px;
+
+ }
+
+ .alinear
+{
+ margin-left: 50px;
+}
+ .tipo3 {
+ width:800px;
+ height:80px;
+ border: 1px solid activecaption;
+ margin-left: 50px;
+}
+
+ .tipo4 {
+ width:40px;
+ border: 1px solid activecaption;
+ margin-left: 50px;
+}
+
+.nota_mostrada
+ {
+ background-color: #E5EBFD;
+ background-position: -136px -33px;
+ border-color: #A0B1DE;
+
+ width:800px;
+ border-radius: 3px 3px 3px 3px;
+ border-style: solid;
+ border-width: 1px;
+ margin: auto;
+ margin-bottom: 10px;
+ margin-top: 10px;
+ padding: 8px 8px 8px 34px;
+ }
+
+ h3{
+ color: #000000;
+ font: 100% Arial,A030,"Nimbus Sans L",FreeSans,"Liberation Sans",sans-serif;
+ margin: 0;
+ font-weight:bold;
+ padding-left: 30px;
+ padding-right: 30px;
+ padding-top: 10px;
+ margin-bottom: 10px;
+
+}
+
+ h2{
+ color: #000000;
+
+ line-height: normal;
+ font: Arial,A030,"Nimbus Sans L",FreeSans,"Liberation Sans",sans-serif;
+ font-size: 140%;
+ margin: 0;
+ font-weight:bold;
+ padding-left: 30px;
+ padding-right: 30px;
+ padding-top: 10px;
+ text-shadow: 2px 2px 2px #CFCFCF;
+}
+
+
+
+#page {
+ background-color: #FFFFFF;
+ border: 1px solid #496077;
+ margin: auto;
+ /*margin-left: 200px;*/
+ width: 960px;
+}
+
+#titulo
+{
+
+ font: 100% Arial,A030,"Nimbus Sans L",FreeSans,"Liberation Sans",sans-serif;
+ font-size: 20px;
+ color: #4787ED ;
+ margin-top: 20px;
+ padding-left: 200px;
+ padding-right: 50px;
+ padding-bottom: 10px;
+
+
+}
+
+.respuesta_dependiente
+{
+ width: 400px;
+ margin-left: 50px;
+
+
+
+}
+
+
+#cuestionario
+{
+ padding-left: 20px;
+ padding-right: 20px;
+}
+
+
+
+
+.requerido {
+ color: red;
+ padding-left: 10px;
+ margin-left: 60px;
+ width: 300px;
+ border-style:solid;
+ border-width: 1px;
+ margin-bottom: 10px;
+}
+
+.numeric
+{
+ width: 30px;
+}
+
+.error{
+ width: 180px;
+ margin-bottom: 1px;
+ margin-left: 80px;
+ margin-top: 10px;
+ background:#890000;
+ padding:5px 10px;
+ font-size:12px;
+ color:#fff;
+ text-shadow:#500 0 1px 0;
+ text-align:left;
+ white-space:nowrap;
+ border:1px solid #500;
+ -moz-border-radius:3px;
+ -webkit-border-radius:3px;
+ border-radius:3px;
+ -moz-box-shadow:0 0 5px #700;
+ -webkit-box-shadow:0 0 5px #700;
+ box-shadow:0 0 5px #700;
+ }
+
+
+
+
+ .avance_con {
+
+ text-shadow: 0.1em 0.1em 0.05em #333;
+ color:whitesmoke;
+ background-color: #333C4D;
+ border-style: solid;
+ border-width: 1px;
+ border-color: #333C4D;
+ padding-left: 20px;
+ padding-right: 20px;
+ padding-top: 2px;
+ padding-bottom: 2px;
+ border-bottom-color: #E1B715;
+ border-bottom-width: 3px;
+
+
+}
+ .avance_sin
+ {
+ color:black;
+ border-style: solid;
+ border-width: 1px;
+ border-color: #333C4D;
+ padding-left: 20px;
+ padding-right: 20px;
+ padding-top: 2px;
+ padding-bottom: 2px;
+
+ }
+
+ #mostrar_avance
+
+ {
+ margin-left: 50px;
+ width: 900px;
+ margin-bottom: 10px;
+ }
+
+ .marco
+ {
+ background-color:#fff;
+border-color:#aaa;
+border-style:ridge groove groove ridge;
+border-width:3px;
+padding:5px;
+-moz-box-shadow:0 0 4px rgba(0,0,0,.3);
+-webkit-box-shadow:0 0 4px rgba(0,0,0,.3);
+box-shadow:0 0 6px rgba(0,0,0,.6);
+
+ }
+
+
+
\ No newline at end of file
diff --git a/public_html/estilos/datatables.css b/public_html/estilos/datatables.css
new file mode 100644
index 0000000..2c57969
--- /dev/null
+++ b/public_html/estilos/datatables.css
@@ -0,0 +1,462 @@
+/*
+ * This combined file was created by the DataTables downloader builder:
+ * https://datatables.net/download
+ *
+ * To rebuild or modify this file with the latest versions of the included
+ * software please visit:
+ * https://datatables.net/download/#dt/dt-1.10.18
+ *
+ * Included libraries:
+ * DataTables 1.10.18
+ */
+
+/*
+ * Table styles
+ */
+table.dataTable {
+ width: 100%;
+ margin: 0 auto;
+ clear: both;
+ border-collapse: separate;
+ border-spacing: 0;
+ /*
+ * Header and footer styles
+ */
+ /*
+ * Body styles
+ */
+}
+table.dataTable thead th,
+table.dataTable tfoot th {
+ font-weight: bold;
+}
+table.dataTable thead th,
+table.dataTable thead td {
+ padding: 10px 18px;
+ border-bottom: 1px solid #111;
+}
+table.dataTable thead th:active,
+table.dataTable thead td:active {
+ outline: none;
+}
+table.dataTable tfoot th,
+table.dataTable tfoot td {
+ padding: 10px 18px 6px 18px;
+ border-top: 1px solid #111;
+}
+table.dataTable thead .sorting,
+table.dataTable thead .sorting_asc,
+table.dataTable thead .sorting_desc,
+table.dataTable thead .sorting_asc_disabled,
+table.dataTable thead .sorting_desc_disabled {
+ cursor: pointer;
+ *cursor: hand;
+ background-repeat: no-repeat;
+ background-position: center right;
+}
+table.dataTable thead .sorting {
+ /*background-image: url("DataTables-1.10.18/images/sort_both.png");*/
+}
+table.dataTable thead .sorting_asc {
+ /*background-image: url("DataTables-1.10.18/images/sort_asc.png");*/
+}
+table.dataTable thead .sorting_desc {
+ background-image: url("DataTables-1.10.18/images/sort_desc.png");
+}
+table.dataTable thead .sorting_asc_disabled {
+ background-image: url("DataTables-1.10.18/images/sort_asc_disabled.png");
+}
+table.dataTable thead .sorting_desc_disabled {
+ background-image: url("DataTables-1.10.18/images/sort_desc_disabled.png");
+}
+table.dataTable tbody tr {
+ background-color: #ffffff;
+}
+table.dataTable tbody tr.selected {
+ background-color: #B0BED9;
+}
+table.dataTable tbody th,
+table.dataTable tbody td {
+ padding: 8px 10px;
+}
+table.dataTable.row-border tbody th, table.dataTable.row-border tbody td, table.dataTable.display tbody th, table.dataTable.display tbody td {
+ border-top: 1px solid #ddd;
+}
+table.dataTable.row-border tbody tr:first-child th,
+table.dataTable.row-border tbody tr:first-child td, table.dataTable.display tbody tr:first-child th,
+table.dataTable.display tbody tr:first-child td {
+ border-top: none;
+}
+table.dataTable.cell-border tbody th, table.dataTable.cell-border tbody td {
+ border-top: 1px solid #ddd;
+ border-right: 1px solid #ddd;
+}
+table.dataTable.cell-border tbody tr th:first-child,
+table.dataTable.cell-border tbody tr td:first-child {
+ border-left: 1px solid #ddd;
+}
+table.dataTable.cell-border tbody tr:first-child th,
+table.dataTable.cell-border tbody tr:first-child td {
+ border-top: none;
+}
+table.dataTable.stripe tbody tr.odd, table.dataTable.display tbody tr.odd {
+ background-color: #f9f9f9;
+}
+table.dataTable.stripe tbody tr.odd.selected, table.dataTable.display tbody tr.odd.selected {
+ background-color: #acbad4;
+}
+table.dataTable.hover tbody tr:hover, table.dataTable.display tbody tr:hover {
+ background-color: #f6f6f6;
+}
+table.dataTable.hover tbody tr:hover.selected, table.dataTable.display tbody tr:hover.selected {
+ background-color: #aab7d1;
+}
+table.dataTable.order-column tbody tr > .sorting_1,
+table.dataTable.order-column tbody tr > .sorting_2,
+table.dataTable.order-column tbody tr > .sorting_3, table.dataTable.display tbody tr > .sorting_1,
+table.dataTable.display tbody tr > .sorting_2,
+table.dataTable.display tbody tr > .sorting_3 {
+ background-color: #fafafa;
+}
+table.dataTable.order-column tbody tr.selected > .sorting_1,
+table.dataTable.order-column tbody tr.selected > .sorting_2,
+table.dataTable.order-column tbody tr.selected > .sorting_3, table.dataTable.display tbody tr.selected > .sorting_1,
+table.dataTable.display tbody tr.selected > .sorting_2,
+table.dataTable.display tbody tr.selected > .sorting_3 {
+ background-color: #acbad5;
+}
+table.dataTable.display tbody tr.odd > .sorting_1, table.dataTable.order-column.stripe tbody tr.odd > .sorting_1 {
+ background-color: #f1f1f1;
+}
+table.dataTable.display tbody tr.odd > .sorting_2, table.dataTable.order-column.stripe tbody tr.odd > .sorting_2 {
+ background-color: #f3f3f3;
+}
+table.dataTable.display tbody tr.odd > .sorting_3, table.dataTable.order-column.stripe tbody tr.odd > .sorting_3 {
+ background-color: whitesmoke;
+}
+table.dataTable.display tbody tr.odd.selected > .sorting_1, table.dataTable.order-column.stripe tbody tr.odd.selected > .sorting_1 {
+ background-color: #a6b4cd;
+}
+table.dataTable.display tbody tr.odd.selected > .sorting_2, table.dataTable.order-column.stripe tbody tr.odd.selected > .sorting_2 {
+ background-color: #a8b5cf;
+}
+table.dataTable.display tbody tr.odd.selected > .sorting_3, table.dataTable.order-column.stripe tbody tr.odd.selected > .sorting_3 {
+ background-color: #a9b7d1;
+}
+table.dataTable.display tbody tr.even > .sorting_1, table.dataTable.order-column.stripe tbody tr.even > .sorting_1 {
+ background-color: #fafafa;
+}
+table.dataTable.display tbody tr.even > .sorting_2, table.dataTable.order-column.stripe tbody tr.even > .sorting_2 {
+ background-color: #fcfcfc;
+}
+table.dataTable.display tbody tr.even > .sorting_3, table.dataTable.order-column.stripe tbody tr.even > .sorting_3 {
+ background-color: #fefefe;
+}
+table.dataTable.display tbody tr.even.selected > .sorting_1, table.dataTable.order-column.stripe tbody tr.even.selected > .sorting_1 {
+ background-color: #acbad5;
+}
+table.dataTable.display tbody tr.even.selected > .sorting_2, table.dataTable.order-column.stripe tbody tr.even.selected > .sorting_2 {
+ background-color: #aebcd6;
+}
+table.dataTable.display tbody tr.even.selected > .sorting_3, table.dataTable.order-column.stripe tbody tr.even.selected > .sorting_3 {
+ background-color: #afbdd8;
+}
+table.dataTable.display tbody tr:hover > .sorting_1, table.dataTable.order-column.hover tbody tr:hover > .sorting_1 {
+ background-color: #eaeaea;
+}
+table.dataTable.display tbody tr:hover > .sorting_2, table.dataTable.order-column.hover tbody tr:hover > .sorting_2 {
+ background-color: #ececec;
+}
+table.dataTable.display tbody tr:hover > .sorting_3, table.dataTable.order-column.hover tbody tr:hover > .sorting_3 {
+ background-color: #efefef;
+}
+table.dataTable.display tbody tr:hover.selected > .sorting_1, table.dataTable.order-column.hover tbody tr:hover.selected > .sorting_1 {
+ background-color: #a2aec7;
+}
+table.dataTable.display tbody tr:hover.selected > .sorting_2, table.dataTable.order-column.hover tbody tr:hover.selected > .sorting_2 {
+ background-color: #a3b0c9;
+}
+table.dataTable.display tbody tr:hover.selected > .sorting_3, table.dataTable.order-column.hover tbody tr:hover.selected > .sorting_3 {
+ background-color: #a5b2cb;
+}
+table.dataTable.no-footer {
+ border-bottom: 1px solid #111;
+}
+table.dataTable.nowrap th, table.dataTable.nowrap td {
+ white-space: nowrap;
+}
+table.dataTable.compact thead th,
+table.dataTable.compact thead td {
+ padding: 4px 17px 4px 4px;
+}
+table.dataTable.compact tfoot th,
+table.dataTable.compact tfoot td {
+ padding: 4px;
+}
+table.dataTable.compact tbody th,
+table.dataTable.compact tbody td {
+ padding: 4px;
+}
+table.dataTable th.dt-left,
+table.dataTable td.dt-left {
+ text-align: left;
+}
+table.dataTable th.dt-center,
+table.dataTable td.dt-center,
+table.dataTable td.dataTables_empty {
+ text-align: center;
+}
+table.dataTable th.dt-right,
+table.dataTable td.dt-right {
+ text-align: right;
+}
+table.dataTable th.dt-justify,
+table.dataTable td.dt-justify {
+ text-align: justify;
+}
+table.dataTable th.dt-nowrap,
+table.dataTable td.dt-nowrap {
+ white-space: nowrap;
+}
+table.dataTable thead th.dt-head-left,
+table.dataTable thead td.dt-head-left,
+table.dataTable tfoot th.dt-head-left,
+table.dataTable tfoot td.dt-head-left {
+ text-align: left;
+}
+table.dataTable thead th.dt-head-center,
+table.dataTable thead td.dt-head-center,
+table.dataTable tfoot th.dt-head-center,
+table.dataTable tfoot td.dt-head-center {
+ text-align: center;
+}
+table.dataTable thead th.dt-head-right,
+table.dataTable thead td.dt-head-right,
+table.dataTable tfoot th.dt-head-right,
+table.dataTable tfoot td.dt-head-right {
+ text-align: right;
+}
+table.dataTable thead th.dt-head-justify,
+table.dataTable thead td.dt-head-justify,
+table.dataTable tfoot th.dt-head-justify,
+table.dataTable tfoot td.dt-head-justify {
+ text-align: justify;
+}
+table.dataTable thead th.dt-head-nowrap,
+table.dataTable thead td.dt-head-nowrap,
+table.dataTable tfoot th.dt-head-nowrap,
+table.dataTable tfoot td.dt-head-nowrap {
+ white-space: nowrap;
+}
+table.dataTable tbody th.dt-body-left,
+table.dataTable tbody td.dt-body-left {
+ text-align: left;
+}
+table.dataTable tbody th.dt-body-center,
+table.dataTable tbody td.dt-body-center {
+ text-align: center;
+}
+table.dataTable tbody th.dt-body-right,
+table.dataTable tbody td.dt-body-right {
+ text-align: right;
+}
+table.dataTable tbody th.dt-body-justify,
+table.dataTable tbody td.dt-body-justify {
+ text-align: justify;
+}
+table.dataTable tbody th.dt-body-nowrap,
+table.dataTable tbody td.dt-body-nowrap {
+ white-space: nowrap;
+}
+
+table.dataTable,
+table.dataTable th,
+table.dataTable td {
+ box-sizing: content-box;
+}
+
+/*
+ * Control feature layout
+ */
+.dataTables_wrapper {
+ position: relative;
+ clear: both;
+ *zoom: 1;
+ zoom: 1;
+}
+.dataTables_wrapper .dataTables_length {
+ float: left;
+}
+.dataTables_wrapper .dataTables_filter {
+ float: right;
+ text-align: right;
+}
+.dataTables_wrapper .dataTables_filter input {
+ margin-left: 0.5em;
+}
+.dataTables_wrapper .dataTables_info {
+ clear: both;
+ float: left;
+ padding-top: 0.755em;
+}
+.dataTables_wrapper .dataTables_paginate {
+ float: right;
+ text-align: right;
+ padding-top: 0.25em;
+}
+.dataTables_wrapper .dataTables_paginate .paginate_button {
+ box-sizing: border-box;
+ display: inline-block;
+ min-width: 1.5em;
+ padding: 0.5em 1em;
+ margin-left: 2px;
+ text-align: center;
+ text-decoration: none !important;
+ cursor: pointer;
+ *cursor: hand;
+ color: #333 !important;
+ border: 1px solid transparent;
+ border-radius: 2px;
+}
+.dataTables_wrapper .dataTables_paginate .paginate_button.current, .dataTables_wrapper .dataTables_paginate .paginate_button.current:hover {
+ color: #333 !important;
+ border: 1px solid #979797;
+ background-color: white;
+ background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, white), color-stop(100%, #dcdcdc));
+ /* Chrome,Safari4+ */
+ background: -webkit-linear-gradient(top, white 0%, #dcdcdc 100%);
+ /* Chrome10+,Safari5.1+ */
+ background: -moz-linear-gradient(top, white 0%, #dcdcdc 100%);
+ /* FF3.6+ */
+ background: -ms-linear-gradient(top, white 0%, #dcdcdc 100%);
+ /* IE10+ */
+ background: -o-linear-gradient(top, white 0%, #dcdcdc 100%);
+ /* Opera 11.10+ */
+ background: linear-gradient(to bottom, white 0%, #dcdcdc 100%);
+ /* W3C */
+}
+.dataTables_wrapper .dataTables_paginate .paginate_button.disabled, .dataTables_wrapper .dataTables_paginate .paginate_button.disabled:hover, .dataTables_wrapper .dataTables_paginate .paginate_button.disabled:active {
+ cursor: default;
+ color: #666 !important;
+ border: 1px solid transparent;
+ background: transparent;
+ box-shadow: none;
+}
+.dataTables_wrapper .dataTables_paginate .paginate_button:hover {
+ color: white !important;
+ border: 1px solid #111;
+ background-color: #585858;
+ background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #585858), color-stop(100%, #111));
+ /* Chrome,Safari4+ */
+ background: -webkit-linear-gradient(top, #585858 0%, #111 100%);
+ /* Chrome10+,Safari5.1+ */
+ background: -moz-linear-gradient(top, #585858 0%, #111 100%);
+ /* FF3.6+ */
+ background: -ms-linear-gradient(top, #585858 0%, #111 100%);
+ /* IE10+ */
+ background: -o-linear-gradient(top, #585858 0%, #111 100%);
+ /* Opera 11.10+ */
+ background: linear-gradient(to bottom, #585858 0%, #111 100%);
+ /* W3C */
+}
+.dataTables_wrapper .dataTables_paginate .paginate_button:active {
+ outline: none;
+ background-color: #2b2b2b;
+ background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #2b2b2b), color-stop(100%, #0c0c0c));
+ /* Chrome,Safari4+ */
+ background: -webkit-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%);
+ /* Chrome10+,Safari5.1+ */
+ background: -moz-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%);
+ /* FF3.6+ */
+ background: -ms-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%);
+ /* IE10+ */
+ background: -o-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%);
+ /* Opera 11.10+ */
+ background: linear-gradient(to bottom, #2b2b2b 0%, #0c0c0c 100%);
+ /* W3C */
+ box-shadow: inset 0 0 3px #111;
+}
+.dataTables_wrapper .dataTables_paginate .ellipsis {
+ padding: 0 1em;
+}
+.dataTables_wrapper .dataTables_processing {
+ position: absolute;
+ top: 50%;
+ left: 50%;
+ width: 100%;
+ height: 40px;
+ margin-left: -50%;
+ margin-top: -25px;
+ padding-top: 20px;
+ text-align: center;
+ font-size: 1.2em;
+ background-color: white;
+ background: -webkit-gradient(linear, left top, right top, color-stop(0%, rgba(255, 255, 255, 0)), color-stop(25%, rgba(255, 255, 255, 0.9)), color-stop(75%, rgba(255, 255, 255, 0.9)), color-stop(100%, rgba(255, 255, 255, 0)));
+ background: -webkit-linear-gradient(left, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.9) 25%, rgba(255, 255, 255, 0.9) 75%, rgba(255, 255, 255, 0) 100%);
+ background: -moz-linear-gradient(left, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.9) 25%, rgba(255, 255, 255, 0.9) 75%, rgba(255, 255, 255, 0) 100%);
+ background: -ms-linear-gradient(left, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.9) 25%, rgba(255, 255, 255, 0.9) 75%, rgba(255, 255, 255, 0) 100%);
+ background: -o-linear-gradient(left, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.9) 25%, rgba(255, 255, 255, 0.9) 75%, rgba(255, 255, 255, 0) 100%);
+ background: linear-gradient(to right, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.9) 25%, rgba(255, 255, 255, 0.9) 75%, rgba(255, 255, 255, 0) 100%);
+}
+.dataTables_wrapper .dataTables_length,
+.dataTables_wrapper .dataTables_filter,
+.dataTables_wrapper .dataTables_info,
+.dataTables_wrapper .dataTables_processing,
+.dataTables_wrapper .dataTables_paginate {
+ color: #333;
+}
+.dataTables_wrapper .dataTables_scroll {
+ clear: both;
+}
+.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody {
+ *margin-top: -1px;
+ -webkit-overflow-scrolling: touch;
+}
+.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody > table > thead > tr > th, .dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody > table > thead > tr > td, .dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody > table > tbody > tr > th, .dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody > table > tbody > tr > td {
+ vertical-align: middle;
+}
+.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody > table > thead > tr > th > div.dataTables_sizing,
+.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody > table > thead > tr > td > div.dataTables_sizing, .dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody > table > tbody > tr > th > div.dataTables_sizing,
+.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody > table > tbody > tr > td > div.dataTables_sizing {
+ height: 0;
+ overflow: hidden;
+ margin: 0 !important;
+ padding: 0 !important;
+}
+.dataTables_wrapper.no-footer .dataTables_scrollBody {
+ border-bottom: 1px solid #111;
+}
+.dataTables_wrapper.no-footer div.dataTables_scrollHead table.dataTable,
+.dataTables_wrapper.no-footer div.dataTables_scrollBody > table {
+ border-bottom: none;
+}
+.dataTables_wrapper:after {
+ visibility: hidden;
+ display: block;
+ content: "";
+ clear: both;
+ height: 0;
+}
+
+@media screen and (max-width: 767px) {
+ .dataTables_wrapper .dataTables_info,
+ .dataTables_wrapper .dataTables_paginate {
+ float: none;
+ text-align: center;
+ }
+ .dataTables_wrapper .dataTables_paginate {
+ margin-top: 0.5em;
+ }
+}
+@media screen and (max-width: 640px) {
+ .dataTables_wrapper .dataTables_length,
+ .dataTables_wrapper .dataTables_filter {
+ float: none;
+ text-align: center;
+ }
+ .dataTables_wrapper .dataTables_filter {
+ margin-top: 0.5em;
+ }
+}
+
+
diff --git a/public_html/estilos/datatables.min.css b/public_html/estilos/datatables.min.css
new file mode 100644
index 0000000..c71c5ac
--- /dev/null
+++ b/public_html/estilos/datatables.min.css
@@ -0,0 +1,15 @@
+/*
+ * This combined file was created by the DataTables downloader builder:
+ * https://datatables.net/download
+ *
+ * To rebuild or modify this file with the latest versions of the included
+ * software please visit:
+ * https://datatables.net/download/#dt/dt-1.10.18
+ *
+ * Included libraries:
+ * DataTables 1.10.18
+ */
+
+table.dataTable{width:100%;margin:0 auto;clear:both;border-collapse:separate;border-spacing:0}table.dataTable thead th,table.dataTable tfoot th{font-weight:bold}table.dataTable thead th,table.dataTable thead td{padding:10px 18px;border-bottom:1px solid #111}table.dataTable thead th:active,table.dataTable thead td:active{outline:none}table.dataTable tfoot th,table.dataTable tfoot td{padding:10px 18px 6px 18px;border-top:1px solid #111}table.dataTable thead .sorting,table.dataTable thead .sorting_asc,table.dataTable thead .sorting_desc,table.dataTable thead .sorting_asc_disabled,table.dataTable thead .sorting_desc_disabled{cursor:pointer;*cursor:hand;background-repeat:no-repeat;background-position:center right}table.dataTable thead .sorting_desc{background-image:url("DataTables-1.10.18/images/sort_desc.png")}table.dataTable thead .sorting_asc_disabled{background-image:url("DataTables-1.10.18/images/sort_asc_disabled.png")}table.dataTable thead .sorting_desc_disabled{background-image:url("DataTables-1.10.18/images/sort_desc_disabled.png")}table.dataTable tbody tr{background-color:#ffffff}table.dataTable tbody tr.selected{background-color:#B0BED9}table.dataTable tbody th,table.dataTable tbody td{padding:8px 10px}table.dataTable.row-border tbody th,table.dataTable.row-border tbody td,table.dataTable.display tbody th,table.dataTable.display tbody td{border-top:1px solid #ddd}table.dataTable.row-border tbody tr:first-child th,table.dataTable.row-border tbody tr:first-child td,table.dataTable.display tbody tr:first-child th,table.dataTable.display tbody tr:first-child td{border-top:none}table.dataTable.cell-border tbody th,table.dataTable.cell-border tbody td{border-top:1px solid #ddd;border-right:1px solid #ddd}table.dataTable.cell-border tbody tr th:first-child,table.dataTable.cell-border tbody tr td:first-child{border-left:1px solid #ddd}table.dataTable.cell-border tbody tr:first-child th,table.dataTable.cell-border tbody tr:first-child td{border-top:none}table.dataTable.stripe tbody tr.odd,table.dataTable.display tbody tr.odd{background-color:#f9f9f9}table.dataTable.stripe tbody tr.odd.selected,table.dataTable.display tbody tr.odd.selected{background-color:#acbad4}table.dataTable.hover tbody tr:hover,table.dataTable.display tbody tr:hover{background-color:#f6f6f6}table.dataTable.hover tbody tr:hover.selected,table.dataTable.display tbody tr:hover.selected{background-color:#aab7d1}table.dataTable.order-column tbody tr>.sorting_1,table.dataTable.order-column tbody tr>.sorting_2,table.dataTable.order-column tbody tr>.sorting_3,table.dataTable.display tbody tr>.sorting_1,table.dataTable.display tbody tr>.sorting_2,table.dataTable.display tbody tr>.sorting_3{background-color:#fafafa}table.dataTable.order-column tbody tr.selected>.sorting_1,table.dataTable.order-column tbody tr.selected>.sorting_2,table.dataTable.order-column tbody tr.selected>.sorting_3,table.dataTable.display tbody tr.selected>.sorting_1,table.dataTable.display tbody tr.selected>.sorting_2,table.dataTable.display tbody tr.selected>.sorting_3{background-color:#acbad5}table.dataTable.display tbody tr.odd>.sorting_1,table.dataTable.order-column.stripe tbody tr.odd>.sorting_1{background-color:#f1f1f1}table.dataTable.display tbody tr.odd>.sorting_2,table.dataTable.order-column.stripe tbody tr.odd>.sorting_2{background-color:#f3f3f3}table.dataTable.display tbody tr.odd>.sorting_3,table.dataTable.order-column.stripe tbody tr.odd>.sorting_3{background-color:whitesmoke}table.dataTable.display tbody tr.odd.selected>.sorting_1,table.dataTable.order-column.stripe tbody tr.odd.selected>.sorting_1{background-color:#a6b4cd}table.dataTable.display tbody tr.odd.selected>.sorting_2,table.dataTable.order-column.stripe tbody tr.odd.selected>.sorting_2{background-color:#a8b5cf}table.dataTable.display tbody tr.odd.selected>.sorting_3,table.dataTable.order-column.stripe tbody tr.odd.selected>.sorting_3{background-color:#a9b7d1}table.dataTable.display tbody tr.even>.sorting_1,table.dataTable.order-column.stripe tbody tr.even>.sorting_1{background-color:#fafafa}table.dataTable.display tbody tr.even>.sorting_2,table.dataTable.order-column.stripe tbody tr.even>.sorting_2{background-color:#fcfcfc}table.dataTable.display tbody tr.even>.sorting_3,table.dataTable.order-column.stripe tbody tr.even>.sorting_3{background-color:#fefefe}table.dataTable.display tbody tr.even.selected>.sorting_1,table.dataTable.order-column.stripe tbody tr.even.selected>.sorting_1{background-color:#acbad5}table.dataTable.display tbody tr.even.selected>.sorting_2,table.dataTable.order-column.stripe tbody tr.even.selected>.sorting_2{background-color:#aebcd6}table.dataTable.display tbody tr.even.selected>.sorting_3,table.dataTable.order-column.stripe tbody tr.even.selected>.sorting_3{background-color:#afbdd8}table.dataTable.display tbody tr:hover>.sorting_1,table.dataTable.order-column.hover tbody tr:hover>.sorting_1{background-color:#eaeaea}table.dataTable.display tbody tr:hover>.sorting_2,table.dataTable.order-column.hover tbody tr:hover>.sorting_2{background-color:#ececec}table.dataTable.display tbody tr:hover>.sorting_3,table.dataTable.order-column.hover tbody tr:hover>.sorting_3{background-color:#efefef}table.dataTable.display tbody tr:hover.selected>.sorting_1,table.dataTable.order-column.hover tbody tr:hover.selected>.sorting_1{background-color:#a2aec7}table.dataTable.display tbody tr:hover.selected>.sorting_2,table.dataTable.order-column.hover tbody tr:hover.selected>.sorting_2{background-color:#a3b0c9}table.dataTable.display tbody tr:hover.selected>.sorting_3,table.dataTable.order-column.hover tbody tr:hover.selected>.sorting_3{background-color:#a5b2cb}table.dataTable.no-footer{border-bottom:1px solid #111}table.dataTable.nowrap th,table.dataTable.nowrap td{white-space:nowrap}table.dataTable.compact thead th,table.dataTable.compact thead td{padding:4px 17px 4px 4px}table.dataTable.compact tfoot th,table.dataTable.compact tfoot td{padding:4px}table.dataTable.compact tbody th,table.dataTable.compact tbody td{padding:4px}table.dataTable th.dt-left,table.dataTable td.dt-left{text-align:left}table.dataTable th.dt-center,table.dataTable td.dt-center,table.dataTable td.dataTables_empty{text-align:center}table.dataTable th.dt-right,table.dataTable td.dt-right{text-align:right}table.dataTable th.dt-justify,table.dataTable td.dt-justify{text-align:justify}table.dataTable th.dt-nowrap,table.dataTable td.dt-nowrap{white-space:nowrap}table.dataTable thead th.dt-head-left,table.dataTable thead td.dt-head-left,table.dataTable tfoot th.dt-head-left,table.dataTable tfoot td.dt-head-left{text-align:left}table.dataTable thead th.dt-head-center,table.dataTable thead td.dt-head-center,table.dataTable tfoot th.dt-head-center,table.dataTable tfoot td.dt-head-center{text-align:center}table.dataTable thead th.dt-head-right,table.dataTable thead td.dt-head-right,table.dataTable tfoot th.dt-head-right,table.dataTable tfoot td.dt-head-right{text-align:right}table.dataTable thead th.dt-head-justify,table.dataTable thead td.dt-head-justify,table.dataTable tfoot th.dt-head-justify,table.dataTable tfoot td.dt-head-justify{text-align:justify}table.dataTable thead th.dt-head-nowrap,table.dataTable thead td.dt-head-nowrap,table.dataTable tfoot th.dt-head-nowrap,table.dataTable tfoot td.dt-head-nowrap{white-space:nowrap}table.dataTable tbody th.dt-body-left,table.dataTable tbody td.dt-body-left{text-align:left}table.dataTable tbody th.dt-body-center,table.dataTable tbody td.dt-body-center{text-align:center}table.dataTable tbody th.dt-body-right,table.dataTable tbody td.dt-body-right{text-align:right}table.dataTable tbody th.dt-body-justify,table.dataTable tbody td.dt-body-justify{text-align:justify}table.dataTable tbody th.dt-body-nowrap,table.dataTable tbody td.dt-body-nowrap{white-space:nowrap}table.dataTable,table.dataTable th,table.dataTable td{box-sizing:content-box}.dataTables_wrapper{position:relative;clear:both;*zoom:1;zoom:1}.dataTables_wrapper .dataTables_length{float:left}.dataTables_wrapper .dataTables_filter{float:right;text-align:right}.dataTables_wrapper .dataTables_filter input{margin-left:0.5em}.dataTables_wrapper .dataTables_info{clear:both;float:left;padding-top:0.755em}.dataTables_wrapper .dataTables_paginate{float:right;text-align:right;padding-top:0.25em}.dataTables_wrapper .dataTables_paginate .paginate_button{box-sizing:border-box;display:inline-block;min-width:1.5em;padding:0.5em 1em;margin-left:2px;text-align:center;text-decoration:none !important;cursor:pointer;*cursor:hand;color:#333 !important;border:1px solid transparent;border-radius:2px}.dataTables_wrapper .dataTables_paginate .paginate_button.current,.dataTables_wrapper .dataTables_paginate .paginate_button.current:hover{color:#333 !important;border:1px solid #979797;background-color:white;background:-webkit-gradient(linear, left top, left bottom, color-stop(0%, #fff), color-stop(100%, #dcdcdc));background:-webkit-linear-gradient(top, #fff 0%, #dcdcdc 100%);background:-moz-linear-gradient(top, #fff 0%, #dcdcdc 100%);background:-ms-linear-gradient(top, #fff 0%, #dcdcdc 100%);background:-o-linear-gradient(top, #fff 0%, #dcdcdc 100%);background:linear-gradient(to bottom, #fff 0%, #dcdcdc 100%)}.dataTables_wrapper .dataTables_paginate .paginate_button.disabled,.dataTables_wrapper .dataTables_paginate .paginate_button.disabled:hover,.dataTables_wrapper .dataTables_paginate .paginate_button.disabled:active{cursor:default;color:#666 !important;border:1px solid transparent;background:transparent;box-shadow:none}.dataTables_wrapper .dataTables_paginate .paginate_button:hover{color:white !important;border:1px solid #111;background-color:#585858;background:-webkit-gradient(linear, left top, left bottom, color-stop(0%, #585858), color-stop(100%, #111));background:-webkit-linear-gradient(top, #585858 0%, #111 100%);background:-moz-linear-gradient(top, #585858 0%, #111 100%);background:-ms-linear-gradient(top, #585858 0%, #111 100%);background:-o-linear-gradient(top, #585858 0%, #111 100%);background:linear-gradient(to bottom, #585858 0%, #111 100%)}.dataTables_wrapper .dataTables_paginate .paginate_button:active{outline:none;background-color:#2b2b2b;background:-webkit-gradient(linear, left top, left bottom, color-stop(0%, #2b2b2b), color-stop(100%, #0c0c0c));background:-webkit-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%);background:-moz-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%);background:-ms-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%);background:-o-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%);background:linear-gradient(to bottom, #2b2b2b 0%, #0c0c0c 100%);box-shadow:inset 0 0 3px #111}.dataTables_wrapper .dataTables_paginate .ellipsis{padding:0 1em}.dataTables_wrapper .dataTables_processing{position:absolute;top:50%;left:50%;width:100%;height:40px;margin-left:-50%;margin-top:-25px;padding-top:20px;text-align:center;font-size:1.2em;background-color:white;background:-webkit-gradient(linear, left top, right top, color-stop(0%, rgba(255,255,255,0)), color-stop(25%, rgba(255,255,255,0.9)), color-stop(75%, rgba(255,255,255,0.9)), color-stop(100%, rgba(255,255,255,0)));background:-webkit-linear-gradient(left, rgba(255,255,255,0) 0%, rgba(255,255,255,0.9) 25%, rgba(255,255,255,0.9) 75%, rgba(255,255,255,0) 100%);background:-moz-linear-gradient(left, rgba(255,255,255,0) 0%, rgba(255,255,255,0.9) 25%, rgba(255,255,255,0.9) 75%, rgba(255,255,255,0) 100%);background:-ms-linear-gradient(left, rgba(255,255,255,0) 0%, rgba(255,255,255,0.9) 25%, rgba(255,255,255,0.9) 75%, rgba(255,255,255,0) 100%);background:-o-linear-gradient(left, rgba(255,255,255,0) 0%, rgba(255,255,255,0.9) 25%, rgba(255,255,255,0.9) 75%, rgba(255,255,255,0) 100%);background:linear-gradient(to right, rgba(255,255,255,0) 0%, rgba(255,255,255,0.9) 25%, rgba(255,255,255,0.9) 75%, rgba(255,255,255,0) 100%)}.dataTables_wrapper .dataTables_length,.dataTables_wrapper .dataTables_filter,.dataTables_wrapper .dataTables_info,.dataTables_wrapper .dataTables_processing,.dataTables_wrapper .dataTables_paginate{color:#333}.dataTables_wrapper .dataTables_scroll{clear:both}.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody{*margin-top:-1px;-webkit-overflow-scrolling:touch}.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody>table>thead>tr>th,.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody>table>thead>tr>td,.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody>table>tbody>tr>th,.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody>table>tbody>tr>td{vertical-align:middle}.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody>table>thead>tr>th>div.dataTables_sizing,.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody>table>thead>tr>td>div.dataTables_sizing,.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody>table>tbody>tr>th>div.dataTables_sizing,.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody>table>tbody>tr>td>div.dataTables_sizing{height:0;overflow:hidden;margin:0 !important;padding:0 !important}.dataTables_wrapper.no-footer .dataTables_scrollBody{border-bottom:1px solid #111}.dataTables_wrapper.no-footer div.dataTables_scrollHead table.dataTable,.dataTables_wrapper.no-footer div.dataTables_scrollBody>table{border-bottom:none}.dataTables_wrapper:after{visibility:hidden;display:block;content:"";clear:both;height:0}@media screen and (max-width: 767px){.dataTables_wrapper .dataTables_info,.dataTables_wrapper .dataTables_paginate{float:none;text-align:center}.dataTables_wrapper .dataTables_paginate{margin-top:0.5em}}@media screen and (max-width: 640px){.dataTables_wrapper .dataTables_length,.dataTables_wrapper .dataTables_filter{float:none;text-align:center}.dataTables_wrapper .dataTables_filter{margin-top:0.5em}}
+
+
diff --git a/public_html/estilos/dhtmlxtabbar.css b/public_html/estilos/dhtmlxtabbar.css
new file mode 100644
index 0000000..090b70d
--- /dev/null
+++ b/public_html/estilos/dhtmlxtabbar.css
@@ -0,0 +1,324 @@
+.dhx_tabbar_zone_top{
+ position:relative;
+}
+.dhx_tabbar_zone, .dhx_tabbar_zoneB, .dhx_tabbar_zoneV, .dhx_tabbar_zoneVB{
+ position:relative;
+ width:100%;
+ height:100%;
+ overflow:hidden;
+ z-index:1;
+}
+.dhx_tablist_line{
+ height:1px;
+ width:1px;
+ background-color:#91A7B4;
+ position:absolute;
+ overflow:hidden;
+}
+.dhx_tabbar_row, .dhx_tablist_zone, .dhx_tabcontent_zone, .dhx_tab_element{
+ width:100%;
+ height:100%;
+ overflow:hidden;
+ position:absolute;
+}
+.dhx_tablist_zone{
+ z-index:3;
+ overflow:hidden;
+}
+.dhx_tabcontent_zone{
+ border:1px solid #91A7B4;
+ z-index:2;
+}
+.dhx_tabbar_zone_top .dhx_tab_element{
+ padding-top:3px;
+}
+.dhx_tab_element span{
+ white-space: nowrap;
+}
+.dhx_tab_element{
+ cursor:pointer;
+ text-align:center;
+ font-family:Tahoma;
+ font-size:8pt;
+ background-color:white;
+}
+.dhx_tabbar_zoneV .dhx_tab_element{
+ padding:0px 0px 0px 3px;
+ text-align:left;
+}
+.dhx_tabbar_zoneVB .dhx_tab_element{
+ padding:0px 3px 0px 0px;
+ text-align:right;
+}
+.dhx_tab_element div{
+ height:40px;
+ width:40px;
+ position:absolute;
+ overflow:hidden;
+}
+.dhx_tab_element span{
+ position:relative;
+ z-index:10;
+}
+
+.dhx_tabbar_zone_dhx_blue .dhx_tablist_line{
+ background-color:#C2D5DC;
+}
+.dhx_tabbar_zone_dhx_blue .dhx_tabcontent_zone{
+ border-color:#D2E3EA;
+}
+
+
+.dhx_tabbar_zone_dhx_blue .dhx_tab_element{
+ color:#006699;
+}
+.dhx_tab_element_active{
+ font-weight:bold;
+}
+.dhx_tabbar_zone_dark_blue .dhx_tab_element,.dhx_tabbar_zone_dhx_black .dhx_tab_element{
+ color:white;
+}
+.dhx_tabbar_zone_dhx_black .dhx_tablist_line{
+ background-color:#626262;
+}
+.dhx_tabbar_zone_dhx_black .dhx_tabcontent_zone{
+ border-color:#333333;
+}
+
+.dhx_tabbar_zone_dhx_web .dhx_tabbar_row{
+ background-color:#646464;
+}
+.dhx_tabbar_zone_dhx_web .dhx_tab_element span{
+ top:4px;
+ font-weight:normal !important;
+ font-size:12px;
+}
+.dhx_tabbar_zone_dhx_web .dhx_tablist_line{
+ display:none;
+}
+.dhx_tabbar_zone_dhx_web .dhx_tabcontent_zone{
+
+ border-width:0px 1px 1px 1px;
+ border-color:#646464;;
+
+ background-color:#646464!important;
+ border:none!important;
+}
+
+.dhx_tabbar_zone_dhx_skyblue .dhx_tabbar_row{
+ background-image:url(./imgs/dhx_skyblue/bg_top.png);
+ border-right:1px solid #B6CBDD;
+ border-left:1px solid #B6CBDD;
+}
+.dhx_tabbar_zone_dhx_blue .dhx_tabbar_row{
+ background-color: #D2E3EA;
+}
+.dhx_tabbar_zone_dhx_black .dhx_tabbar_row{
+ background-color: black;
+}
+.dhx_tabbar_zone_dhx_skyblue .dhx_tabbar_lineA{
+ position:absolute;
+ left:0px; width:1px; height:3px;
+ background-color:white;
+ z-index:999;
+ border-left:1px solid #A4BED4;
+ border-right:1px solid #A4BED4;
+ overflow:hidden;
+}
+.dhx_tabbar_zone_dhx_skyblue .dhx_tabbar_lineB{
+ position:absolute; left:2px; width:100px; height:3px;
+ background-color: #D0E5FF;
+ z-index:999; overflow:hidden;
+}
+.dhx_tabbar_zone_dhx_skyblue .dhx_tabbar_lineC{
+ position:absolute; right:0px; width:1px; height:21px;
+ background-color: white;
+ z-index:999; overflow:hidden;
+ border-right:1px solid #A4BED4;
+}
+.dhx_tabbar_zone_dhx_skyblue .dhx_tabbar_lineD{
+ position:absolute; left:1px; width:1px; height:21px;
+ background-color: white;
+ z-index:999; overflow:hidden;
+}
+.dhx_tabbar_zone_top .dhx_tabbar_zone_dhx_skyblue .dhx_tabbar_lineD{
+ top:1px;
+}
+.dhx_tabbar_zone_top .dhx_tabbar_zone_dhx_skyblue .dhx_tabbar_lineC{
+ top:1px;
+}
+
+
+
+.dhx_tabbar_zone_bottom .dhx_tabbar_zone_dhx_skyblue .dhx_tabbar_lineD{
+ bottom:1px;
+}
+.dhx_tabbar_zone_bottom .dhx_tabbar_zone_dhx_skyblue .dhx_tabbar_lineC{
+ bottom:1px;
+}
+.dhx_tabbar_zone_bottom .dhx_tabbar_zone_dhx_skyblue .dhx_tabbar_row{
+ background-image:url(./imgs/dhx_skyblue/bg_bottom.png);
+ background-position:bottom;
+}
+.dhx_tabbar_zone_bottom .dhx_tabbar_zone_dhx_skyblue .dhx_tablist_line {
+ border-width:0px 1px 1px 0px;
+}
+.dhx_tabbar_zone_bottom .dhx_tab_element span{
+ padding-top:5px;
+ display:block;
+}
+
+
+
+.dhx_tabbar_zone_left .dhx_tabbar_zone_dhx_skyblue .dhx_tabbar_lineB{
+ width:3px;left:auto; top:2px;
+}
+.dhx_tabbar_zone_left .dhx_tabbar_zone_dhx_skyblue .dhx_tabbar_lineA{
+ width:3px;
+ border:1px solid #A4BED4;
+ border-width:1px 0px 1px 0px;
+}
+.dhx_tabbar_zone_left .dhx_tabbar_zone_dhx_skyblue .dhx_tabbar_lineD{
+ height:1px; width:21px; right:auto; bottom:0px; left:1px;
+ border:1px solid #A4BED4;
+ border-width:0px 0px 1px 0px;
+}
+.dhx_tabbar_zone_left .dhx_tabbar_zone_dhx_skyblue .dhx_tabbar_lineC{
+ height:1px; width:21px; right:auto; top:1px; left:1px;
+}
+.dhx_tabbar_zone_left .dhx_tabbar_zone_dhx_skyblue .dhx_tabbar_row{
+ background-image:url(./imgs/dhx_skyblue/bg_left.png);
+ border:1px solid #B6CBDD;
+ border-width:1px 0px 1px 0px;
+}
+.dhx_tabbar_zone_left .dhx_tabbar_zone_dhx_skyblue .dhx_tablist_line {
+ border-width:0px 0px 1px 1px;
+ width:2px !ie;
+}
+.dhx_tabbar_zone_left .dhx_tabbar_zone_dhx_skyblue .dhx_tab_element{
+ padding-top:0px;
+}
+.dhx_tabbar_zone_left .dhx_tabbar_zone_dhx_skyblue .dhx_tab_element span{
+ padding-top:5px;
+ display:block;
+}
+
+
+.dhx_tabbar_zone_right .dhx_tabbar_zone_dhx_skyblue .dhx_tabbar_lineA{
+ left:auto; width:3px;
+ border:1px solid #A4BED4;
+ border-width:1px 0px 1px 0px;
+}
+.dhx_tabbar_zone_right .dhx_tabbar_zone_dhx_skyblue .dhx_tabbar_lineB{
+ width:3px;left:auto; top:2px;
+}
+.dhx_tabbar_zone_right .dhx_tabbar_zone_dhx_skyblue .dhx_tabbar_lineD{
+ height:1px; width:21px; left:auto; bottom:0px; right:1px;
+ border:1px solid #A4BED4;
+ border-width:0px 0px 1px 0px;
+}
+.dhx_tabbar_zone_right .dhx_tabbar_zone_dhx_skyblue .dhx_tabbar_lineC{
+ height:1px; width:21px; left:auto; top:1px; right:0px;
+}
+.dhx_tabbar_zone_right .dhx_tabbar_zone_dhx_skyblue .dhx_tabbar_row{
+ background-image:url(imgs/dhx_skyblue/bg_right.png);
+ background-position:right;
+ border:1px solid #B6CBDD;
+ border-width:1px 0px 1px 0px;
+}
+.dhx_tabbar_zone_right .dhx_tabbar_zone_dhx_skyblue .dhx_tablist_line {
+ border-width:0px 1px 1px 0px;
+ width:2px !ie;
+}
+.dhx_tabbar_zone_right .dhx_tabbar_zone_dhx_skyblue .dhx_tab_element{
+ padding-top:0px;
+}
+.dhx_tabbar_zone_right .dhx_tabbar_zone_dhx_skyblue .dhx_tab_element span{
+ padding-top:5px;
+ display:block;
+}
+
+
+
+.dhx_tabbar_zone_dhx_skyblue .dhx_tablist_line{
+ height:3px; border:1px solid #A4BED4; background-color:white; border-width:1px 1px 0px 0px;
+}
+.dhx_tabbar_zone_dhx_skyblue .dhx_tabcontent_zone{
+ border-color:#A4BED4;
+}
+
+/* common */
+div.dhxcont_main_content {
+ position: relative;
+ left: 0px;
+ top: 0px;
+ overflow: hidden;
+}
+div.dhxcont_content_blocker {
+ position: absolute;
+ left: 0px;
+ top: 0px;
+ width: 101%;
+ height: 101%;
+ filter: alpha(opacity=0);
+ -moz-opacity: 0;
+ opacity: 0;
+ background: #FFFFFF;
+ z-index: 1;
+ -moz-user-select: none;
+}
+
+div.dhx_tabbar_zone_dhx_skyblue div.dhxcont_sb_container {
+ position: relative;
+ height: 24px;
+}
+div.dhx_tabbar_zone_dhx_skyblue div.dhxcont_sb_container div.dhxcont_statusbar {
+ background-image: url("./imgs/dhx_skyblue/dhxlayout_bg_sb.gif");
+ position: relative;
+ top: 2px;
+ height: 22px;
+ line-height: 22px;
+ background-repeat: repeat-x;
+ width: auto;
+ padding: 0px 4px;
+ overflow: hidden;
+ white-space: nowrap;
+ border-top: none;
+ border-bottom: none;
+ border-left: #a4bed4 0px solid;
+ border-right: #a4bed4 0px solid;
+ font-family: Tahoma;
+ font-size: 11px;
+ vertical-align: middle;
+ color: #000000;
+}
+
+div.dhx_tabbar_zone_dhx_web div.dhxcont_sb_container {
+ position: relative;
+ height: 41px;
+}
+div.dhx_tabbar_zone_dhx_web div.dhxcont_sb_container div.dhxcont_statusbar {
+ position: relative;
+ top: 9px;
+ height: 32px;
+ line-height: 32px;
+ background-color: #ececec;
+ width: auto;
+ padding: 0px 12px;
+ overflow: hidden;
+ white-space: nowrap;
+ font-family: "Trebuchet MS";
+ font-size: 14px;
+ vertical-align: middle;
+ color: #666666;
+}
+
+/* dhxcont cells in layout */
+.dhx_tabbar_zone_dhx_web div.dhxcont_global_content_area {
+ position: absolute;
+ overflow: hidden; /* important for IE */
+ background-color: #FFFFFF;
+}
+.dhx_tabbar_zone_dhx_web div.dhxcont_global_content_area.dhxcont_tabbar_dhx_web {
+ border: white 8px solid; /* change to white */
+}
\ No newline at end of file
diff --git a/public_html/estilos/entrada.css b/public_html/estilos/entrada.css
new file mode 100644
index 0000000..78fdd4a
--- /dev/null
+++ b/public_html/estilos/entrada.css
@@ -0,0 +1,122 @@
+#colaboradores_block{
+width:600px;
+margin: auto;
+
+display: none;
+height:270px;
+background-color:transparent;
+position:absolute;
+left:400px;
+top:255px;
+}
+
+.indent{
+ padding-right: 15.5em;
+}
+
+#form {
+ -moz-border-radius: 10px;
+ -webkit-border-radius: 10px;
+ border:0.5px solid ;
+ /*border-color: blue;*/
+
+ width:500px;
+ margin:20px auto 80px;
+
+ color: #999999;
+}
+#form legend{
+ font-weight:bold;
+ font-size:12px;
+}
+#form ol{
+ list-style:none;
+}
+#form ol li{
+ padding-bottom:1px;
+}
+#form ol li label{
+ width:120px;
+ float:left;
+ text-align:left;
+}
+#form input[type=text] {
+ border:1px solid #CCCCCC;
+}
+#form input.btn {
+ -moz-border-radius: 5px;
+ -webkit-border-radius: 5px;
+ padding:3px;
+ color:#FFFFFF;
+ background-color:blue;
+ border:1px solid #000000;
+}
+
+
+#form_consulta {
+
+ border:0.5px solid ;
+ border-color: gray;
+ width:800px;
+ margin:20px auto 80px;
+
+}
+#form_consulta legend{
+ font-weight:bold;
+ font-size:12px;
+}
+#form_consulta ol{
+ list-style:none;
+}
+#form_consulta ol li{
+ padding-bottom:1px;
+}
+#form_consulta ol li label{
+ width:120px;
+ float:left;
+ text-align:left;
+}
+#form_consulta input[type=text] {
+ border:1px solid #CCCCCC;
+}
+#form_consulta input.btn {
+ -moz-border-radius: 5px;
+ -webkit-border-radius: 5px;
+ padding:3px;
+ color:#FFFFFF;
+ background-color:blue;
+
+ border:1px solid #000000;
+}
+
+
+fieldset {
+ width:580px;
+ margin:auto;
+}
+#contacto ol{
+ list-style:none;
+}
+#contacto ol li{
+ padding-bottom:10px;
+}
+#contacto ol li label{
+ float:left;
+ width:90px;
+}
+#result {
+ width:280px;
+ padding:10px;
+ border:1px solid #bfcddb;
+ margin:auto;
+ margin-top:10px;
+ text-align:center;
+ display:none;
+}
+#loading {
+ background-image:url(../images/ajax-loader.gif);
+ width:31px;
+ height:31px;
+ margin:auto;
+ display:none;
+}
\ No newline at end of file
diff --git a/public_html/estilos/imgs/blank1.html b/public_html/estilos/imgs/blank1.html
new file mode 100644
index 0000000..0519ecb
--- /dev/null
+++ b/public_html/estilos/imgs/blank1.html
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/public_html/estilos/imgs/dhx_blue/close.png b/public_html/estilos/imgs/dhx_blue/close.png
new file mode 100644
index 0000000..0fe3f49
Binary files /dev/null and b/public_html/estilos/imgs/dhx_blue/close.png differ
diff --git a/public_html/estilos/imgs/dhx_blue/dhx_blue_bottom.gif b/public_html/estilos/imgs/dhx_blue/dhx_blue_bottom.gif
new file mode 100644
index 0000000..952a3ab
Binary files /dev/null and b/public_html/estilos/imgs/dhx_blue/dhx_blue_bottom.gif differ
diff --git a/public_html/estilos/imgs/dhx_blue/dhx_blue_left.gif b/public_html/estilos/imgs/dhx_blue/dhx_blue_left.gif
new file mode 100644
index 0000000..5b48f81
Binary files /dev/null and b/public_html/estilos/imgs/dhx_blue/dhx_blue_left.gif differ
diff --git a/public_html/estilos/imgs/dhx_blue/dhx_blue_right.gif b/public_html/estilos/imgs/dhx_blue/dhx_blue_right.gif
new file mode 100644
index 0000000..8652f04
Binary files /dev/null and b/public_html/estilos/imgs/dhx_blue/dhx_blue_right.gif differ
diff --git a/public_html/estilos/imgs/dhx_blue/dhx_blue_scroll_left.gif b/public_html/estilos/imgs/dhx_blue/dhx_blue_scroll_left.gif
new file mode 100644
index 0000000..dcf6bb1
Binary files /dev/null and b/public_html/estilos/imgs/dhx_blue/dhx_blue_scroll_left.gif differ
diff --git a/public_html/estilos/imgs/dhx_blue/dhx_blue_scroll_right.gif b/public_html/estilos/imgs/dhx_blue/dhx_blue_scroll_right.gif
new file mode 100644
index 0000000..dd40fc6
Binary files /dev/null and b/public_html/estilos/imgs/dhx_blue/dhx_blue_scroll_right.gif differ
diff --git a/public_html/estilos/imgs/dhx_blue/dhx_blue_top.gif b/public_html/estilos/imgs/dhx_blue/dhx_blue_top.gif
new file mode 100644
index 0000000..dcbe2db
Binary files /dev/null and b/public_html/estilos/imgs/dhx_blue/dhx_blue_top.gif differ
diff --git a/public_html/estilos/imgs/glassy_blue/glassy_blue_bottom.gif b/public_html/estilos/imgs/glassy_blue/glassy_blue_bottom.gif
new file mode 100644
index 0000000..7da4a6c
Binary files /dev/null and b/public_html/estilos/imgs/glassy_blue/glassy_blue_bottom.gif differ
diff --git a/public_html/estilos/imgs/glassy_blue/glassy_blue_left.gif b/public_html/estilos/imgs/glassy_blue/glassy_blue_left.gif
new file mode 100644
index 0000000..d65c184
Binary files /dev/null and b/public_html/estilos/imgs/glassy_blue/glassy_blue_left.gif differ
diff --git a/public_html/estilos/imgs/glassy_blue/glassy_blue_right.gif b/public_html/estilos/imgs/glassy_blue/glassy_blue_right.gif
new file mode 100644
index 0000000..bf0a0fe
Binary files /dev/null and b/public_html/estilos/imgs/glassy_blue/glassy_blue_right.gif differ
diff --git a/public_html/estilos/imgs/glassy_blue/glassy_blue_top.gif b/public_html/estilos/imgs/glassy_blue/glassy_blue_top.gif
new file mode 100644
index 0000000..a5aef08
Binary files /dev/null and b/public_html/estilos/imgs/glassy_blue/glassy_blue_top.gif differ
diff --git a/public_html/estilos/imgs/silver/silver_bottom.gif b/public_html/estilos/imgs/silver/silver_bottom.gif
new file mode 100644
index 0000000..20f4ae8
Binary files /dev/null and b/public_html/estilos/imgs/silver/silver_bottom.gif differ
diff --git a/public_html/estilos/imgs/silver/silver_left.gif b/public_html/estilos/imgs/silver/silver_left.gif
new file mode 100644
index 0000000..a82bc61
Binary files /dev/null and b/public_html/estilos/imgs/silver/silver_left.gif differ
diff --git a/public_html/estilos/imgs/silver/silver_right.gif b/public_html/estilos/imgs/silver/silver_right.gif
new file mode 100644
index 0000000..4eda2c4
Binary files /dev/null and b/public_html/estilos/imgs/silver/silver_right.gif differ
diff --git a/public_html/estilos/imgs/silver/silver_top.gif b/public_html/estilos/imgs/silver/silver_top.gif
new file mode 100644
index 0000000..388b145
Binary files /dev/null and b/public_html/estilos/imgs/silver/silver_top.gif differ
diff --git a/public_html/estilos/imgs/winbiscarf/winbiscarf_bottom.gif b/public_html/estilos/imgs/winbiscarf/winbiscarf_bottom.gif
new file mode 100644
index 0000000..68e2be6
Binary files /dev/null and b/public_html/estilos/imgs/winbiscarf/winbiscarf_bottom.gif differ
diff --git a/public_html/estilos/imgs/winbiscarf/winbiscarf_right.gif b/public_html/estilos/imgs/winbiscarf/winbiscarf_right.gif
new file mode 100644
index 0000000..a68675a
Binary files /dev/null and b/public_html/estilos/imgs/winbiscarf/winbiscarf_right.gif differ
diff --git a/public_html/estilos/imgs/winbiscarf/winbiscarf_scroll_left.gif b/public_html/estilos/imgs/winbiscarf/winbiscarf_scroll_left.gif
new file mode 100644
index 0000000..ea2c94d
Binary files /dev/null and b/public_html/estilos/imgs/winbiscarf/winbiscarf_scroll_left.gif differ
diff --git a/public_html/estilos/imgs/winbiscarf/winbiscarf_top.gif b/public_html/estilos/imgs/winbiscarf/winbiscarf_top.gif
new file mode 100644
index 0000000..505b0e9
Binary files /dev/null and b/public_html/estilos/imgs/winbiscarf/winbiscarf_top.gif differ
diff --git a/public_html/estilos/imgs/winscarf/winscarf_bottom.gif b/public_html/estilos/imgs/winscarf/winscarf_bottom.gif
new file mode 100644
index 0000000..e69de29
diff --git a/public_html/estilos/imgs/winscarf/winscarf_left.gif b/public_html/estilos/imgs/winscarf/winscarf_left.gif
new file mode 100644
index 0000000..e69de29
diff --git a/public_html/estilos/imgs/winscarf/winscarf_right.gif b/public_html/estilos/imgs/winscarf/winscarf_right.gif
new file mode 100644
index 0000000..e69de29
diff --git a/public_html/estilos/imgs/winscarf/winscarf_scroll_left.gif b/public_html/estilos/imgs/winscarf/winscarf_scroll_left.gif
new file mode 100644
index 0000000..e69de29
diff --git a/public_html/estilos/imgs/winscarf/winscarf_scroll_right.gif b/public_html/estilos/imgs/winscarf/winscarf_scroll_right.gif
new file mode 100644
index 0000000..e69de29
diff --git a/public_html/estilos/imgs/winscarf/winscarf_top.gif b/public_html/estilos/imgs/winscarf/winscarf_top.gif
new file mode 100644
index 0000000..e69de29
diff --git a/public_html/estilos/login.css b/public_html/estilos/login.css
new file mode 100644
index 0000000..82ffd55
--- /dev/null
+++ b/public_html/estilos/login.css
@@ -0,0 +1,401 @@
+/* login form */
+#login_alumno , textarea, li{
+ font:1em "Lucida Sans Unicode", "Lucida Grande", sans-serif;
+ line-height:1.5em;
+ color:#444;
+ font-size:12px;
+ text-align:center;
+}
+#login_alumno input{
+ font:1em "Lucida Sans Unicode", "Lucida Grande", sans-serif;
+ line-height:1.5em;
+ color:#444;
+ font-size:12px;
+
+}
+#login_alumno{
+ margin:auto;
+ background:#fff;
+ border:8px solid #eee;
+ width:350px;
+ -moz-border-radius:5px;
+ -webkit-border-radius:5px;
+ border-radius:5px;
+ -moz-box-shadow:0 0 10px #4e707c;
+ -webkit-box-shadow:0 0 10px #4e707c;
+ box-shadow:0 0 10px #4e707c;
+ text-align:left;
+ position:relative;
+ }
+#login_alumno a, #login_alumno a:visited{color:#0283b2;}
+#login_alumno a:hover{color:#111;}
+#login_alumno h1{
+ background:#333333;
+ color:#fff;
+ font-size:14px;
+ padding:5px 10px;
+ margin:0 0 1.5em 0;
+ }
+#login_alumno .register{
+ position:absolute;
+ float:left;
+ margin:0;
+ line-height:30px;
+ top:-40px;
+ right:0;
+ font-size:11px;
+ }
+#login_alumno p{margin:.5em 25px;}
+#login_alumno div{
+ margin:.5em 15px;
+ background:#eee;
+ padding:1px;
+ -moz-border-radius:3px;
+ -webkit-border-radius:3px;
+ border-radius:3px;
+ text-align:right;
+ position:relative;
+ }
+#login_alumno label{
+ float:left;
+ font-size: 13px;
+ line-height:20px;
+ padding-left:10px;
+ }
+#login_alumno .field{
+ border:1px solid #ccc;
+ font:1em "Lucida Sans Unicode", "Lucida Grande", sans-serif;
+ width:200px;
+ font-size:13px;
+ padding:4px;
+ -moz-box-shadow:inset 0 0 5px #ccc;
+ -webkit-box-shadow:inset 0 0 5px #ccc;
+ box-shadow:inset 0 0 5px #ccc;
+ }
+#login_alumno div.submit{background:none;margin:1em 25px;text-align:left;}
+#login_alumno div.submit label{float:none;display:inline;font-size:11px;}
+
+#login_alumno .forgot{text-align:right;font-size:11px;}
+#login_alumno .error{
+ float:left;
+ position:absolute;
+ left:100%;
+ top:-5px;
+ background:#890000;
+ padding:5px 10px;
+ font-size:11px;
+ color:#fff;
+ text-shadow:#500 0 1px 0;
+ text-align:left;
+ white-space:nowrap;
+ border:1px solid #500;
+ -moz-border-radius:3px;
+ -webkit-border-radius:3px;
+ border-radius:3px;
+ -moz-box-shadow:0 0 5px #700;
+ -webkit-box-shadow:0 0 5px #700;
+ box-shadow:0 0 5px #700;
+ }
+
+
+
+
+ /* --------------*/
+
+ #login_profesor , table, textarea, li{
+ font:1em "Lucida Sans Unicode", "Lucida Grande", sans-serif;
+ line-height:1.5em;
+ color:#444;
+ font-size:12px;
+ text-align:center;
+}
+#login_profesor input{
+ font:1em "Lucida Sans Unicode", "Lucida Grande", sans-serif;
+ line-height:1.5em;
+ color:#444;
+ font-size:12px;
+
+}
+#login_profesor{
+ margin:auto;
+ background:#fff;
+ border:8px solid #eee;
+ width:350px;
+ -moz-border-radius:5px;
+ -webkit-border-radius:5px;
+ border-radius:5px;
+ -moz-box-shadow:0 0 10px #4e707c;
+ -webkit-box-shadow:0 0 10px #4e707c;
+ box-shadow:0 0 10px #4e707c;
+ text-align:left;
+ position:relative;
+ }
+#login_profesor a, #login_profesor a:visited{color:#0283b2;}
+#login_profesor a:hover{color:#111;}
+#login_profesor h1{
+ background:#333C4D;
+ color:#fff;
+ font-size:14px;
+ padding:5px 10px;
+ margin:0 0 1.5em 0;
+ }
+#login_profesor .register{
+ position:absolute;
+ float:left;
+ margin:0;
+ line-height:30px;
+ top:-40px;
+ right:0;
+ font-size:11px;
+ }
+#login_profesor p{margin:.5em 25px;}
+#login_profesor div{
+ margin:.5em 15px;
+ background:#eee;
+ padding:1px;
+ -moz-border-radius:3px;
+ -webkit-border-radius:3px;
+ border-radius:3px;
+ text-align:right;
+ position:relative;
+ }
+#login_profesor label{
+ float:left;
+ font-size: 13px;
+ line-height:20px;
+ padding-left:10px;
+ }
+#login_profesor .field{
+ border:1px solid #ccc;
+ font:1em "Lucida Sans Unicode", "Lucida Grande", sans-serif;
+ width:200px;
+ font-size:13px;
+ padding:4px;
+ -moz-box-shadow:inset 0 0 5px #ccc;
+ -webkit-box-shadow:inset 0 0 5px #ccc;
+ box-shadow:inset 0 0 5px #ccc;
+ }
+#login_profesor div.submit{background:none;margin:1em 25px;text-align:left;}
+#login_profesor div.submit label{float:none;display:inline;font-size:11px;}
+
+#login_profesor .forgot{text-align:right;font-size:11px;}
+#login_profesor .error{
+ float:left;
+ position:absolute;
+ left:100%;
+ top:-5px;
+ background:#890000;
+ padding:5px 10px;
+ font-size:11px;
+ color:#fff;
+ text-shadow:#500 0 1px 0;
+ text-align:left;
+ white-space:nowrap;
+ border:1px solid #500;
+ -moz-border-radius:3px;
+ -webkit-border-radius:3px;
+ border-radius:3px;
+ -moz-box-shadow:0 0 5px #700;
+ -webkit-box-shadow:0 0 5px #700;
+ box-shadow:0 0 5px #700;
+ }
+
+
+
+
+
+
+
+
+
+
+ /*--*----------------------------------*/
+
+ /* --------------*/
+
+ #login_idioma , table, textarea, li{
+ font:1em "Lucida Sans Unicode", "Lucida Grande", sans-serif;
+ line-height:1.5em;
+ color:#444;
+ font-size:12px;
+ text-align:center;
+}
+#login_idioma input{
+ font:1em "Lucida Sans Unicode", "Lucida Grande", sans-serif;
+ line-height:1.5em;
+ color:#444;
+ font-size:12px;
+
+}
+#login_idioma{
+ margin:auto;
+ background:#fff;
+ border:8px solid #eee;
+ width:420px;
+ -moz-border-radius:5px;
+ -webkit-border-radius:5px;
+ border-radius:5px;
+ -moz-box-shadow:0 0 10px #4e707c;
+ -webkit-box-shadow:0 0 10px #4e707c;
+ box-shadow:0 0 10px #4e707c;
+ text-align:left;
+ position:relative;
+ }
+#login_idioma a, #login_idioma a:visited{color:#0283b2;}
+#login_idioma a:hover{color:#111;}
+#login_idioma h1{
+ background:#08298A;
+ color:#fff;
+ font-size:14px;
+ padding:5px 10px;
+ margin:0 0 1.5em 0;
+ }
+#login_idioma .register{
+ position:absolute;
+ float:left;
+ margin:0;
+ line-height:30px;
+ top:-40px;
+ right:0;
+ font-size:11px;
+ }
+#login_idioma p{margin:.5em 25px;}
+#login_idioma div{
+ margin:.5em 15px;
+ background:#eee;
+ padding:1px;
+ -moz-border-radius:3px;
+ -webkit-border-radius:3px;
+ border-radius:3px;
+ text-align:right;
+ position:relative;
+ }
+#login_idioma label{
+ float:left;
+ font-size: 13px;
+ line-height:20px;
+ padding-left:10px;
+ }
+#login_idioma .field{
+ border:1px solid #ccc;
+ font:1em "Lucida Sans Unicode", "Lucida Grande", sans-serif;
+ width:200px;
+ font-size:13px;
+ padding:4px;
+ -moz-box-shadow:inset 0 0 5px #ccc;
+ -webkit-box-shadow:inset 0 0 5px #ccc;
+ box-shadow:inset 0 0 5px #ccc;
+ }
+#login_idioma div.submit{background:none;margin:1em 25px;text-align:left;}
+#login_idioma div.submit label{float:none;display:inline;font-size:11px;}
+
+#login_idioma .forgot{text-align:right;font-size:11px;}
+#login_idioma .error{
+ float:left;
+ position:absolute;
+ left:100%;
+ top:-5px;
+ background:#890000;
+ padding:5px 10px;
+ font-size:11px;
+ color:#fff;
+ text-shadow:#500 0 1px 0;
+ text-align:left;
+ white-space:nowrap;
+ border:1px solid #500;
+ -moz-border-radius:3px;
+ -webkit-border-radius:3px;
+ border-radius:3px;
+ -moz-box-shadow:0 0 5px #700;
+ -webkit-box-shadow:0 0 5px #700;
+ box-shadow:0 0 5px #700;
+ }
+
+
+
+
+ /*-------------------------------------*/
+
+
+
+
+ .response{
+ background:#890000;
+ display: none;
+ padding:5px 10px;
+ font-size:11px;
+ color:#fff;
+ text-shadow:#500 0 1px 0;
+ white-space:nowrap;
+ border:1px solid #500;
+ -moz-border-radius:3px;
+ -webkit-border-radius:3px;
+ border-radius:3px;
+ -moz-box-shadow:0 0 5px #700;
+ -webkit-box-shadow:0 0 5px #700;
+ box-shadow:0 0 5px #700;
+ }
+
+ .requerido, .requerido_correo{
+ margin-bottom: 10px;
+ margin-top: 10px;
+ background:#890000;
+ width: 200px;
+ padding:3px 10px;
+ font-size:11px;
+ color:#fff;
+ text-shadow:#500 0 1px 0;
+ white-space:nowrap;
+ border:1px solid #500;
+ -moz-border-radius:3px;
+ -webkit-border-radius:3px;
+ border-radius:3px;
+ -moz-box-shadow:0 0 5px #700;
+ -webkit-box-shadow:0 0 5px #700;
+ box-shadow:0 0 5px #700;
+ }
+
+ .mensaje_verde{
+ margin-bottom: 10px;
+ margin-top: 10px;
+ background-color: rgb(81, 163, 81);
+ width: 200px;
+ padding:3px 10px;
+ font-size:11px;
+ color: rgb(255, 255, 255);
+ border-style: none;
+ font-weight: normal;
+ -moz-border-radius:3px;
+ -webkit-border-radius:3px;
+ border-radius:3px;
+ -moz-box-shadow:0 0 5px white;
+ -webkit-box-shadow:0 0 5px white;
+ box-shadow:0 0 5px white;
+ }
+
+/* // login form */
+
+#enviar, #download_ticket, #enviar_1, .boton-verde{
+ border-style: none;
+ font-weight: normal;
+ padding: 10px 10px 10px 10px;
+ width: auto;
+ background-color: rgb(81,163,81);
+ color: rgb(255,255,255);
+}
+
+#descargar_comprobante, #generar_reporte{
+ border-style: none;
+ font-weight: bold;
+ /*margin-left: 400px;*/
+ padding: 10px 10px 10px 10px;
+ margin-bottom: 10px;
+ margin-top: 0px;
+ width: auto;
+ background-color: #2790B0;
+ color: rgb(255, 255, 255);
+}
+
+#generar_reporte{
+ padding-left: 500px;
+}
\ No newline at end of file
diff --git a/public_html/estilos/modal.css b/public_html/estilos/modal.css
new file mode 100644
index 0000000..f968f0a
--- /dev/null
+++ b/public_html/estilos/modal.css
@@ -0,0 +1,152 @@
+.modal
+{
+ display: none;
+ position: fixed;
+ z-index: 1;
+ left: 0;
+ top: 0;
+ width: 100%;
+ height: 100%;
+ overflow: auto;
+ background-color: rgb(0,0,0);
+ background-color: rgba(0,0,0,0.4);
+}
+.modal-content {
+ background-color: #fefefe;
+ margin: 15% auto; /* 15% from the top and centered */
+ padding: 20px;
+ border: 1px solid #888;
+ border-radius: 10px;
+ width: 50%; /* Could be more or less, depending on screen size */
+}
+.modal-footer
+{
+ position: relative;
+ left: 90%;
+}
+.close {
+ cursor: pointer;
+ color: #aaa;
+ float: right;
+ font-size: 28px;
+ font-weight: bold;
+}
+
+.input-seccion > label
+{
+ display: inline-block;
+ max-width: 100%;
+ margin-bottom: 5px;
+ font-weight: 700;
+}
+
+.input-seccion > input
+{
+ display: block;
+ width: 100%;
+ font-size: 14px;
+ line-height: 1.42857143;
+ color: #555;
+ background-color: #fff;
+ background-image: none;
+ border: 1px solid #ccc;
+ border-radius: 4px;
+}
+.warning
+{
+ background: #ffa7a7;
+ font-style: italic;
+ padding: 3px;
+ border-radius: 5px;
+}
+.send-btn
+{
+ padding: 10px;
+ margin-top: 20px;
+ background: #BB8800;
+ border: none;
+ border-radius: 3px;
+ color: white;
+}
+
+/****SPINER***/
+.spin
+{
+ display: none;
+ position: fixed;
+ z-index: 1;
+ left: 0;
+ top: 0;
+ width: 100%;
+ height: 100%;
+ overflow: auto;
+ background-color: rgb(0,0,0);
+ background-color: rgba(0,0,0,0.4);
+}
+.spin-content
+{
+ margin: 15% auto;
+ width: 60px;
+}
+.spin .spiner{
+ width: 20px;
+ position: relative;
+ float: left;
+ color: black;
+ font-size:35px;
+ -webkit-animation: slideIn 1s linear infinite; /* Safari */
+ animation: slideIn 1s linear infinite;
+}
+.spin1.slideIn
+{
+
+ animation-delay: 0.3s;
+ -moz-animation-delay: 0.3s;
+ -webkit-animation-delay: 0.3s;
+ -o-animation-delay: 0.3s;
+}
+
+.spin2.slideIn {
+
+ animation-delay: 0.6s;
+ -moz-animation-delay: 0.6s;
+ -webkit-animation-delay: 0.6s;
+ -o-animation-delay: 0.6s;
+}
+.spin3.slideIn {
+
+ animation-delay: 0.9s;
+ -moz-animation-delay: 0.9s;
+ -webkit-animation-delay: 0.9s;
+ -o-animation-delay: 0.9s;
+}
+
+@-webkit-keyframes slideIn {
+ 0% { font-size:35px; }
+ 100% { font-size:80px; }
+}
+
+@keyframes slideIn
+{
+ 0%{
+ font-size:35px;
+ }
+ 50%
+ {
+ color: white;
+ font-size:80px;
+ }
+ 100%
+ {
+ color: black;
+ font-size:35px;
+ }
+
+}
+
+
+.white
+{
+ color:white;
+ text-align: center;
+}
\ No newline at end of file
diff --git a/public_html/estilos/reportes.css b/public_html/estilos/reportes.css
new file mode 100644
index 0000000..9e1bf02
--- /dev/null
+++ b/public_html/estilos/reportes.css
@@ -0,0 +1,105 @@
+body{
+ color: #000000;
+ font-family: verdana,arial,sans-serif;
+ font-size:13px;
+ background: none repeat scroll 0 0 #E9E9E9;
+ }
+
+
+ #page {
+ background-color: #FFFFFF;
+ border: 1px solid #496077;
+ margin: auto;
+ padding-left: 20px;
+
+ padding-top: 20px;
+ padding-bottom: 20px;
+ width: 960px;
+}
+
+
+table.respuestas {
+ font-family: verdana,arial,sans-serif;
+ font-size:11px;
+ color:#333333;
+ border-width: 1px;
+ border-color: #666666;
+ border-collapse: collapse;
+ margin-left: 100px;
+}
+/*table.gridtable th {
+ border-width: 1px;
+ padding: 8px;
+ border-style: solid;
+ border-color: #666666;
+ background-color: #dedede;
+}*/
+table.respuestas td {
+ border-width: 1px;
+ padding: 4px;
+ border-style: solid;
+ border-color: #666666;
+ background-color: #ffffff;
+}
+.total
+{
+ margin-left: 100px;
+ width: 200px;
+}
+
+.pregunta
+{
+ margin-left: 20px;
+}
+
+.seccion
+{
+ margin-left: 10px;
+ width: 800px;
+ font-weight:bold;
+ font-size: 110%;
+
+}
+ #escudo
+ {
+ width: 300px;
+ margin-left: 20px;
+ margin-top: 10px;
+ margin-bottom: 50px;
+
+ }
+
+
+ #titulo
+{
+ font: 100% Arial,A030,"Nimbus Sans L",FreeSans,"Liberation Sans",sans-serif;
+ font-size: 20px;
+ color: #4787ED ;
+ margin-top: 20px;
+ padding-left: 200px;
+ padding-right: 50px;
+ padding-bottom: 10px;
+}
+#datos
+{
+
+ width: 800px;
+ margin-left: 50px;
+
+}
+
+.nota_mostrada
+ {
+ background-color: #E5EBFD;
+ background-position: -136px -33px;
+ border-color: #A0B1DE;
+
+ width:800px;
+ border-radius: 3px 3px 3px 3px;
+ border-style: solid;
+ border-width: 1px;
+ margin: auto;
+ margin-bottom: 10px;
+ margin-top: 10px;
+ padding: 8px 8px 8px 34px;
+ }
\ No newline at end of file
diff --git a/public_html/estilos/ribbon.css b/public_html/estilos/ribbon.css
new file mode 100644
index 0000000..f1df573
--- /dev/null
+++ b/public_html/estilos/ribbon.css
@@ -0,0 +1,94 @@
+html {
+
+
+
+ }
+
+ #cabecera
+ {
+ margin: 0px auto;
+ padding: 20px;
+ width: 80%;
+ height: 70px;;
+ background: #fff;
+ font-family: 'trebuchet MS', Arial, helvetica;
+ -moz-border-radius: 10px;
+ border-radius: 20px;
+ -moz-box-shadow: 0 0 10px #555;
+ -webkit-box-shadow: 0 0 10px #555;
+ box-shadow: 0 0 10px #555;
+ }
+ .ribbon:after, .ribbon:before,
+ h2:after, h2:before,
+ #twitter-follow:after, #twitter-follow:before
+ {
+ content: '';
+ position: absolute;
+ }
+
+ /* ---------------------------------------------- */
+
+ .ribbon{
+
+ position: relative;
+ color: #fff;
+ margin: 0 -30px 30px -30px;
+ padding: 10px 0;
+ text-shadow: 0 1px rgba(0,0,0,.8);
+ background: #333C4D;
+ background-image: -moz-linear-gradient(rgba(255,255,255,.3), rgba(255,255,255,0));
+ background-image: -webkit-linear-gradient(rgba(255,255,255,.3), rgba(255,255,255,0));
+ background-image: -o-linear-gradient(rgba(255,255,255,.3), rgba(255,255,255,0));
+ background-image: -ms-linear-gradient(rgba(255,255,255,.3), rgba(255,255,255,0));
+ background-image: linear-gradient(rgba(255,255,255,.3), rgba(255,255,255,0));
+ -moz-box-shadow: 0 2px 0 rgba(0,0,0,.3);
+ -webkit-box-shadow: 0 2px 0 rgba(0,0,0,.3);
+ box-shadow: 0 2px 0 rgba(0,0,0,.3);
+ clear: both;
+ }
+
+ .ribbon:before, .ribbon:after
+ {
+ border-style: solid;
+ border-color: transparent;
+ bottom: -10px;
+ }
+
+ .ribbon:before
+ {
+ border-width: 0 10px 10px 0;
+ border-right-color: #222;
+ left: 0;
+ }
+
+ .ribbon:after
+ {
+ border-width: 0 0 10px 10px;
+ border-left-color: #222;
+ right: 0;
+ }
+
+ .nota_mostrada
+ {
+ background-color: #E5EBFD;
+ background-position: -136px -33px;
+ border-color: #A0B1DE;
+ margin-left:-10px;
+ margin-bottom:20px;
+ width:auto;
+ border-radius: 3px 3px 3px 3px;
+ border-style: solid;
+ border-width: 1px;
+ margin: 10px 0 5px;
+ padding: 8px 8px 8px 34px;
+
+
+ }
+
+ /* ---------------------------------------------- */
+
+
+
+ /* ---------------------------------------------- */
+
+
\ No newline at end of file
diff --git a/public_html/estilos/style.css b/public_html/estilos/style.css
new file mode 100644
index 0000000..e038505
--- /dev/null
+++ b/public_html/estilos/style.css
@@ -0,0 +1,644 @@
+
+/* ------------------
+ styling for the tables
+ ------------------ */
+ul.lista-b {
+ margin-left:30px;
+ margin-right:50px;
+ margin-bottom: 25px;
+ text-align: justify;
+}
+ul.lista-a li{
+ height: 10px;
+}
+ul.lista-a, ul.lista-b {list-style-type: none;}
+#nombre, #app, #apm{width: 200px;}
+#star{color:red;}
+
+body
+{
+ line-height: 1.6em;
+}
+
+#hor-minimalist-a
+{
+ font-family: "Lucida Sans Unicode", "Lucida Grande", Sans-Serif;
+ font-size: 12px;
+ background: #fff;
+ margin: 45px;
+ width: 480px;
+ border-collapse: collapse;
+ text-align: left;
+ padding-top: 100px;
+}
+#hor-minimalist-a th
+{
+ font-size: 14px;
+ font-weight: normal;
+ color: #039;
+ padding: 10px 8px;
+ border-bottom: 2px solid #6678b1;
+}
+#hor-minimalist-a td
+{
+ color: #669;
+ padding: 9px 8px 0px 8px;
+}
+#hor-minimalist-a tbody tr:hover td
+{
+
+ color: #009;
+}
+
+
+#hor-minimalist-b
+{
+ font-family: "Lucida Sans Unicode", "Lucida Grande", Sans-Serif;
+ font-size: 12px;
+ background: #fff;
+ margin: 45px;
+ width: 480px;
+ border-collapse: collapse;
+ text-align: left;
+}
+#hor-minimalist-b th
+{
+ font-size: 14px;
+ font-weight: normal;
+ color: #039;
+ padding: 10px 8px;
+ border-bottom: 2px solid #6678b1;
+}
+#hor-minimalist-b td
+{
+ border-bottom: 1px solid #ccc;
+ color: #669;
+ padding: 6px 8px;
+}
+#hor-minimalist-b tbody tr:hover td
+{
+ color: #009;
+}
+
+
+#ver-minimalist
+{
+ font-family: "Lucida Sans Unicode", "Lucida Grande", Sans-Serif;
+ font-size: 12px;
+ margin: 45px;
+ width: 480px;
+ text-align: left;
+ border-collapse: collapse;
+}
+#ver-minimalist th
+{
+ padding: 8px 2px;
+ font-weight: normal;
+ font-size: 14px;
+ border-bottom: 2px solid #6678b1;
+ border-right: 30px solid #fff;
+ border-left: 30px solid #fff;
+ color: #039;
+}
+#ver-minimalist td
+{
+ padding: 12px 2px 0px 2px;
+ border-right: 30px solid #fff;
+ border-left: 30px solid #fff;
+ color: #669;
+}
+
+
+#box-table-a
+{
+ font-family: "Lucida Sans Unicode", "Lucida Grande", Sans-Serif;
+ font-size: 12px;
+ margin: 45px;
+ width: 480px;
+ text-align: left;
+ border-collapse: collapse;
+}
+#box-table-a th
+{
+ font-size: 13px;
+ font-weight: normal;
+ padding: 8px;
+ background: #b9c9fe;
+ border-top: 4px solid #aabcfe;
+ border-bottom: 1px solid #fff;
+ color: #039;
+}
+#box-table-a td
+{
+ padding: 8px;
+ background: #e8edff;
+ border-bottom: 1px solid #fff;
+ color: #669;
+ border-top: 1px solid transparent;
+}
+#box-table-a tr:hover td
+{
+ background: #d0dafd;
+ color: #339;
+}
+
+
+#box-table-b
+{
+ font-family: "Lucida Sans Unicode", "Lucida Grande", Sans-Serif;
+ font-size: 12px;
+ margin: 45px;
+ width: 480px;
+ text-align: left;
+ border-collapse: collapse;
+ border-top: 7px solid #9baff1;
+ border-bottom: 7px solid #9baff1;
+}
+#box-table-b th
+{
+ font-size: 13px;
+ font-weight: normal;
+ padding: 8px;
+ background: #e8edff;
+ border-right: 1px solid #9baff1;
+ border-left: 1px solid #9baff1;
+ color: #039;
+}
+#box-table-b td
+{
+ padding: 8px;
+ background: #e8edff;
+ border-right: 1px solid #aabcfe;
+ border-left: 1px solid #aabcfe;
+ color: #669;
+}
+
+
+#hor-zebra
+{
+ font-family: "Lucida Sans Unicode", "Lucida Grande", Sans-Serif;
+ font-size: 12px;
+ margin: 45px;
+ width: 480px;
+ text-align: left;
+ border-collapse: collapse;
+}
+#hor-zebra th
+{
+ font-size: 14px;
+ font-weight: normal;
+ padding: 10px 8px;
+ color: #039;
+}
+#hor-zebra td
+{
+ padding: 8px;
+ color: #669;
+}
+#hor-zebra .odd
+{
+ background: #e8edff;
+}
+
+
+#ver-zebra
+{
+ font-family: "Lucida Sans Unicode", "Lucida Grande", Sans-Serif;
+ font-size: 12px;
+ margin: 45px;
+ width: 480px;
+ text-align: left;
+ border-collapse: collapse;
+}
+#ver-zebra th
+{
+ font-size: 14px;
+ font-weight: normal;
+ padding: 12px 15px;
+ border-right: 1px solid #fff;
+ border-left: 1px solid #fff;
+ color: #039;
+}
+#ver-zebra td
+{
+ padding: 8px 15px;
+ border-right: 1px solid #fff;
+ border-left: 1px solid #fff;
+ color: #669;
+}
+.vzebra-odd
+{
+ background: #eff2ff;
+}
+.vzebra-even
+{
+ background: #e8edff;
+}
+#ver-zebra #vzebra-adventure, #ver-zebra #vzebra-children
+{
+ background: #d0dafd;
+ border-bottom: 1px solid #c8d4fd;
+}
+#ver-zebra #vzebra-comedy, #ver-zebra #vzebra-action
+{
+ background: #dce4ff;
+ border-bottom: 1px solid #d6dfff;
+}
+
+
+#one-column-emphasis
+{
+ font-family: "Lucida Sans Unicode", "Lucida Grande", Sans-Serif;
+ font-size: 12px;
+ margin: 45px;
+ width: 480px;
+ text-align: left;
+ border-collapse: collapse;
+}
+#one-column-emphasis th
+{
+ font-size: 14px;
+ font-weight: normal;
+ padding: 12px 15px;
+ color: #039;
+}
+#one-column-emphasis td
+{
+ padding: 10px 15px;
+ color: #669;
+ border-top: 1px solid #e8edff;
+}
+.oce-first
+{
+ background: #d0dafd;
+ border-right: 10px solid transparent;
+ border-left: 10px solid transparent;
+}
+#one-column-emphasis tr:hover td
+{
+ color: #339;
+ background: #eff2ff;
+}
+
+
+#newspaper-a
+{
+ font-family:Verdana,Geneva,Arial,Helvetica,sans-serif;
+/* font-family: "Lucida Sans Unicode", "Lucida Grande", Sans-Serif;*/
+ font-size: 12px;
+ margin: 45px;
+ width: 850px;
+ text-align: left;
+ border-collapse: collapse;
+ border: 1px solid #69c;
+}
+#newspaper-a th
+{
+ padding: 12px 17px 12px 17px;
+ font-weight: normal;
+ font-size: 14px;
+ color: #039;
+ border-bottom: 1px dashed #69c;
+}
+#newspaper-a td
+{
+ padding: 7px 17px 7px 17px;
+/* color: #669;*/
+}
+#newspaper-a tbody tr:hover td
+{
+
+/* color: #669;*/
+ background:#D7E8EA;
+ /*background: #d0dafd;*/
+}
+
+
+#newspaper-b
+{
+ font-family:Verdana,Geneva,Arial,Helvetica,sans-serif;
+ /*font-family: "Lucida Sans Unicode", "Lucida Grande", Sans-Serif;*/
+ font-size: 12px;
+ margin: 45px;
+ width: 480px;
+ text-align: left;
+ border-collapse: collapse;
+ border: 1px solid #69c;
+}
+#newspaper-b th
+{
+ padding: 15px 10px 10px 10px;
+ font-weight: normal;
+ font-size: 14px;
+ color: #039;
+}
+#newspaper-b tbody
+{
+ background: #e8edff;
+}
+#newspaper-b td
+{
+ padding: 10px;
+ color: #669;
+ border-top: 1px dashed #fff;
+}
+#newspaper-b tbody tr:hover td
+{
+ color: #339;
+ background: #d0dafd;
+}
+
+
+#newspaper-c
+{
+ font-family:Verdana,Geneva,Arial,Helvetica,sans-serif;
+ /*font-family: "Lucida Sans Unicode", "Lucida Grande", Sans-Serif;*/
+ font-size: 12px;
+ margin: 45px;
+ width: 480px;
+ text-align: left;
+ border-collapse: collapse;
+ border: 1px solid #6cf;
+}
+#newspaper-c th
+{
+ padding: 20px;
+ font-weight: normal;
+ font-size: 13px;
+ color: #039;
+ text-transform: uppercase;
+ border-right: 1px solid #0865c2;
+ border-top: 1px solid #0865c2;
+ border-left: 1px solid #0865c2;
+ border-bottom: 1px solid #fff;
+}
+#newspaper-c td
+{
+ padding: 10px 20px;
+ color: #669;
+ border-right: 1px dashed #6cf;
+}
+
+
+#rounded-corner
+{
+ font-family: "Lucida Sans Unicode", "Lucida Grande", Sans-Serif;
+ font-size: 12px;
+ margin: 45px;
+ width: 480px;
+ text-align: left;
+ border-collapse: collapse;
+}
+#rounded-corner thead th.rounded-company
+{
+ background: #b9c9fe url('table-images/left.png') left -1px no-repeat;
+}
+#rounded-corner thead th.rounded-q4
+{
+ background: #b9c9fe url('table-images/right.png') right -1px no-repeat;
+}
+#rounded-corner th
+{
+ padding: 8px;
+ font-weight: normal;
+ font-size: 13px;
+ color: #039;
+ background: #b9c9fe;
+}
+#rounded-corner td
+{
+ padding: 8px;
+ background: #e8edff;
+ border-top: 1px solid #fff;
+ color: #669;
+}
+#rounded-corner tfoot td.rounded-foot-left
+{
+ background: #e8edff url('table-images/botleft.png') left bottom no-repeat;
+}
+#rounded-corner tfoot td.rounded-foot-right
+{
+ background: #e8edff url('table-images/botright.png') right bottom no-repeat;
+}
+#rounded-corner tbody tr:hover td
+{
+ background: #d0dafd;
+}
+
+
+#background-image
+{
+ font-family: "Lucida Sans Unicode", "Lucida Grande", Sans-Serif;
+ font-size: 12px;
+ margin: 45px;
+ width: 480px;
+ text-align: left;
+ border-collapse: collapse;
+ background: url('table-images/blurry.jpg') 330px 59px no-repeat;
+}
+#background-image th
+{
+ padding: 12px;
+ font-weight: normal;
+ font-size: 14px;
+ color: #339;
+}
+#background-image td
+{
+ padding: 9px 12px;
+ color: #669;
+ border-top: 1px solid #fff;
+}
+#background-image tfoot td
+{
+ font-size: 11px;
+}
+#background-image tbody td
+{
+ background: url('table-images/back.png');
+}
+* html #background-image tbody td
+{
+ /*
+ ----------------------------
+ PUT THIS ON IE6 ONLY STYLE
+ AS THE RULE INVALIDATES
+ YOUR STYLESHEET
+ ----------------------------
+ */
+ filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src='table-images/back.png',sizingMethod='crop');
+ background: none;
+}
+#background-image tbody tr:hover td
+{
+ color: #339;
+ background: none;
+}
+
+
+#gradient-style
+{
+ font-family: "Lucida Sans Unicode", "Lucida Grande", Sans-Serif;
+ font-size: 12px;
+ margin: 45px;
+ width: 480px;
+ text-align: left;
+ border-collapse: collapse;
+}
+#gradient-style th
+{
+ font-size: 13px;
+ font-weight: normal;
+ padding: 8px;
+ background: #b9c9fe url('table-images/gradhead.png') repeat-x;
+ border-top: 2px solid #d3ddff;
+ border-bottom: 1px solid #fff;
+ color: #039;
+}
+#gradient-style td
+{
+ padding: 8px;
+ border-bottom: 1px solid #fff;
+ color: #669;
+ border-top: 1px solid #fff;
+ background: #e8edff url('table-images/gradback.png') repeat-x;
+}
+#gradient-style tfoot tr td
+{
+ background: #e8edff;
+ font-size: 12px;
+ color: #99c;
+}
+#gradient-style tbody tr:hover td
+{
+ background: #d0dafd url('table-images/gradhover.png') repeat-x;
+ color: #339;
+}
+
+
+#pattern-style-a
+{
+ font-family: "Lucida Sans Unicode", "Lucida Grande", Sans-Serif;
+ font-size: 12px;
+ margin: 45px;
+ width: 480px;
+ text-align: left;
+ border-collapse: collapse;
+ background: url('table-images/pattern.png');
+}
+#pattern-style-a thead tr
+{
+ background: url('table-images/pattern-head.png');
+}
+#pattern-style-a th
+{
+ font-size: 13px;
+ font-weight: normal;
+ padding: 8px;
+ border-bottom: 1px solid #fff;
+ color: #039;
+}
+#pattern-style-a td
+{
+ padding: 8px;
+ border-bottom: 1px solid #fff;
+ color: #669;
+ border-top: 1px solid transparent;
+}
+#pattern-style-a tbody tr:hover td
+{
+ color: #339;
+ background: #fff;
+}
+
+
+#pattern-style-b
+{
+ font-family: "Lucida Sans Unicode", "Lucida Grande", Sans-Serif;
+ font-size: 12px;
+ margin: 45px;
+ width: 480px;
+ text-align: left;
+ border-collapse: collapse;
+ background: url('table-images/patternb.png');
+}
+#pattern-style-b thead tr
+{
+ background: url('table-images/patternb-head.png');
+}
+#pattern-style-b th
+{
+ font-size: 13px;
+ font-weight: normal;
+ padding: 8px;
+ border-bottom: 1px solid #fff;
+ color: #039;
+}
+#pattern-style-b td
+{
+ padding: 8px;
+ border-bottom: 1px solid #fff;
+ color: #669;
+ border-top: 1px solid transparent;
+}
+#pattern-style-b tbody tr:hover td
+{
+ color: #339;
+ background: #cdcdee;
+}
+
+.varela
+{
+ margin-left: auto;
+ margin-right: auto;
+ border-collapse: collapse;
+ margin-bottom: 3em;
+ font-size: 90%;
+ line-height: 1.1;
+ text-align: left;
+}
+
+.varela tr:hover, td.start:hover, td.end:hover
+{
+ /*background: #FF9;*/
+ background: #FBF7BD;
+
+}
+
+.varela th, td
+{
+ padding: .3em .5em;
+}
+
+.varela th
+{
+ font-weight: normal;
+ text-align: left;
+
+ padding-left: 15px;
+}
+
+.varela th.name { width: 12em; }
+.varela th.location { width: 12em; }
+.varela th.color { width: 10em; }
+
+.varela thead th
+{
+ background: #c6ceda;
+ border-color: #fff #fff #888 #fff;
+ border-style: solid;
+ border-width: 1px 1px 2px 1px;
+ padding-left: .5em;
+}
+
+.varela tbody th.start
+{
+
+ padding-left: 26px;
+}
+
+.varela tbody th.end
+{
+
+ padding-left: 26px;
+}
\ No newline at end of file
diff --git a/public_html/estilos/table-images/back.png b/public_html/estilos/table-images/back.png
new file mode 100644
index 0000000..a0dd842
Binary files /dev/null and b/public_html/estilos/table-images/back.png differ
diff --git a/public_html/estilos/table-images/blurry.jpg b/public_html/estilos/table-images/blurry.jpg
new file mode 100644
index 0000000..3740fa4
Binary files /dev/null and b/public_html/estilos/table-images/blurry.jpg differ
diff --git a/public_html/estilos/table-images/botleft.png b/public_html/estilos/table-images/botleft.png
new file mode 100644
index 0000000..1761a8a
Binary files /dev/null and b/public_html/estilos/table-images/botleft.png differ
diff --git a/public_html/estilos/table-images/botright.png b/public_html/estilos/table-images/botright.png
new file mode 100644
index 0000000..76d248c
Binary files /dev/null and b/public_html/estilos/table-images/botright.png differ
diff --git a/public_html/estilos/table-images/gradback.png b/public_html/estilos/table-images/gradback.png
new file mode 100644
index 0000000..7f42889
Binary files /dev/null and b/public_html/estilos/table-images/gradback.png differ
diff --git a/public_html/estilos/table-images/gradhead.png b/public_html/estilos/table-images/gradhead.png
new file mode 100644
index 0000000..5d9b14d
Binary files /dev/null and b/public_html/estilos/table-images/gradhead.png differ
diff --git a/public_html/estilos/table-images/gradhover.png b/public_html/estilos/table-images/gradhover.png
new file mode 100644
index 0000000..957fd7f
Binary files /dev/null and b/public_html/estilos/table-images/gradhover.png differ
diff --git a/public_html/estilos/table-images/header.jpg b/public_html/estilos/table-images/header.jpg
new file mode 100644
index 0000000..75d3e3a
Binary files /dev/null and b/public_html/estilos/table-images/header.jpg differ
diff --git a/public_html/estilos/table-images/left.png b/public_html/estilos/table-images/left.png
new file mode 100644
index 0000000..b3733ee
Binary files /dev/null and b/public_html/estilos/table-images/left.png differ
diff --git a/public_html/estilos/table-images/pattern-head.png b/public_html/estilos/table-images/pattern-head.png
new file mode 100644
index 0000000..37d6072
Binary files /dev/null and b/public_html/estilos/table-images/pattern-head.png differ
diff --git a/public_html/estilos/table-images/pattern.gif b/public_html/estilos/table-images/pattern.gif
new file mode 100644
index 0000000..e76d77c
Binary files /dev/null and b/public_html/estilos/table-images/pattern.gif differ
diff --git a/public_html/estilos/table-images/pattern.png b/public_html/estilos/table-images/pattern.png
new file mode 100644
index 0000000..5159b3b
Binary files /dev/null and b/public_html/estilos/table-images/pattern.png differ
diff --git a/public_html/estilos/table-images/patternb-head.png b/public_html/estilos/table-images/patternb-head.png
new file mode 100644
index 0000000..7d197a3
Binary files /dev/null and b/public_html/estilos/table-images/patternb-head.png differ
diff --git a/public_html/estilos/table-images/patternb.png b/public_html/estilos/table-images/patternb.png
new file mode 100644
index 0000000..724363f
Binary files /dev/null and b/public_html/estilos/table-images/patternb.png differ
diff --git a/public_html/estilos/table-images/right.png b/public_html/estilos/table-images/right.png
new file mode 100644
index 0000000..2f84569
Binary files /dev/null and b/public_html/estilos/table-images/right.png differ
diff --git a/public_html/expira_cupo.php b/public_html/expira_cupo.php
new file mode 100644
index 0000000..ead8076
--- /dev/null
+++ b/public_html/expira_cupo.php
@@ -0,0 +1,32 @@
+¡Lo sentimos!, el cupo de registro por este medio se ha agotado. ";
+?>
+
+
+
+
+ Datos de contacto
+
+
+
+ Gloria Moctezuma Nájera
+
+ Secretaria Técnica de la Secretaría de Extensión Universitaria y Vinculación Institucional
+ Facultad de Estudios Superiores Acatlán
+ Universidad Nacional Autónoma de México
+ Número de contacto: 5623-1665
+ Correo electrónico: vegresados@apolo.acatlan.unam.mx
+
+
+
+
+
+
+
+
+
+
+
+
+ 220)
+ header("Location: expira_cupo.php");
+
+header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
+header("Last-Modified: " . gmdate("D,d M Y H:i:s") . " GMT");
+header("Cache-Control: no-store, no-cache, must-revalidate");
+header("Pragma: no-cache");
+//header("Location:timeout.php"); //Descomentar para dejar la página fuera de servicio...
+session_start();
+session_unset();
+session_destroy();
+?>
+
+
+ * 1D array of data - add a single row with the data provided
+ * 2D array of arrays - add multiple rows in a single call
+ * object - data object when using mData
+ * array of objects - multiple data objects when using mData
+ *
+ * @param {bool} [redraw=true] redraw the table or not
+ * @returns {array} An array of integers, representing the list of indexes in
+ * aoData ({@link DataTable.models.oSettings}) that have been added to
+ * the table.
+ * @dtopt API
+ * @deprecated Since v1.10
+ *
+ * @example
+ * // Global var for counter
+ * var giCount = 2;
+ *
+ * $(document).ready(function() {
+ * $('#example').dataTable();
+ * } );
+ *
+ * function fnClickAddRow() {
+ * $('#example').dataTable().fnAddData( [
+ * giCount+".1",
+ * giCount+".2",
+ * giCount+".3",
+ * giCount+".4" ]
+ * );
+ *
+ * giCount++;
+ * }
+ */
+ this.fnAddData = function( data, redraw )
+ {
+ var api = this.api( true );
+
+ /* Check if we want to add multiple rows or not */
+ var rows = $.isArray(data) && ( $.isArray(data[0]) || $.isPlainObject(data[0]) ) ?
+ api.rows.add( data ) :
+ api.row.add( data );
+
+ if ( redraw === undefined || redraw ) {
+ api.draw();
+ }
+
+ return rows.flatten().toArray();
+ };
+
+
+ /**
+ * This function will make DataTables recalculate the column sizes, based on the data
+ * contained in the table and the sizes applied to the columns (in the DOM, CSS or
+ * through the sWidth parameter). This can be useful when the width of the table's
+ * parent element changes (for example a window resize).
+ * @param {boolean} [bRedraw=true] Redraw the table or not, you will typically want to
+ * @dtopt API
+ * @deprecated Since v1.10
+ *
+ * @example
+ * $(document).ready(function() {
+ * var oTable = $('#example').dataTable( {
+ * "sScrollY": "200px",
+ * "bPaginate": false
+ * } );
+ *
+ * $(window).on('resize', function () {
+ * oTable.fnAdjustColumnSizing();
+ * } );
+ * } );
+ */
+ this.fnAdjustColumnSizing = function ( bRedraw )
+ {
+ var api = this.api( true ).columns.adjust();
+ var settings = api.settings()[0];
+ var scroll = settings.oScroll;
+
+ if ( bRedraw === undefined || bRedraw ) {
+ api.draw( false );
+ }
+ else if ( scroll.sX !== "" || scroll.sY !== "" ) {
+ /* If not redrawing, but scrolling, we want to apply the new column sizes anyway */
+ _fnScrollDraw( settings );
+ }
+ };
+
+
+ /**
+ * Quickly and simply clear a table
+ * @param {bool} [bRedraw=true] redraw the table or not
+ * @dtopt API
+ * @deprecated Since v1.10
+ *
+ * @example
+ * $(document).ready(function() {
+ * var oTable = $('#example').dataTable();
+ *
+ * // Immediately 'nuke' the current rows (perhaps waiting for an Ajax callback...)
+ * oTable.fnClearTable();
+ * } );
+ */
+ this.fnClearTable = function( bRedraw )
+ {
+ var api = this.api( true ).clear();
+
+ if ( bRedraw === undefined || bRedraw ) {
+ api.draw();
+ }
+ };
+
+
+ /**
+ * The exact opposite of 'opening' a row, this function will close any rows which
+ * are currently 'open'.
+ * @param {node} nTr the table row to 'close'
+ * @returns {int} 0 on success, or 1 if failed (can't find the row)
+ * @dtopt API
+ * @deprecated Since v1.10
+ *
+ * @example
+ * $(document).ready(function() {
+ * var oTable;
+ *
+ * // 'open' an information row when a row is clicked on
+ * $('#example tbody tr').click( function () {
+ * if ( oTable.fnIsOpen(this) ) {
+ * oTable.fnClose( this );
+ * } else {
+ * oTable.fnOpen( this, "Temporary row opened", "info_row" );
+ * }
+ * } );
+ *
+ * oTable = $('#example').dataTable();
+ * } );
+ */
+ this.fnClose = function( nTr )
+ {
+ this.api( true ).row( nTr ).child.hide();
+ };
+
+
+ /**
+ * Remove a row for the table
+ * @param {mixed} target The index of the row from aoData to be deleted, or
+ * the TR element you want to delete
+ * @param {function|null} [callBack] Callback function
+ * @param {bool} [redraw=true] Redraw the table or not
+ * @returns {array} The row that was deleted
+ * @dtopt API
+ * @deprecated Since v1.10
+ *
+ * @example
+ * $(document).ready(function() {
+ * var oTable = $('#example').dataTable();
+ *
+ * // Immediately remove the first row
+ * oTable.fnDeleteRow( 0 );
+ * } );
+ */
+ this.fnDeleteRow = function( target, callback, redraw )
+ {
+ var api = this.api( true );
+ var rows = api.rows( target );
+ var settings = rows.settings()[0];
+ var data = settings.aoData[ rows[0][0] ];
+
+ rows.remove();
+
+ if ( callback ) {
+ callback.call( this, settings, data );
+ }
+
+ if ( redraw === undefined || redraw ) {
+ api.draw();
+ }
+
+ return data;
+ };
+
+
+ /**
+ * Restore the table to it's original state in the DOM by removing all of DataTables
+ * enhancements, alterations to the DOM structure of the table and event listeners.
+ * @param {boolean} [remove=false] Completely remove the table from the DOM
+ * @dtopt API
+ * @deprecated Since v1.10
+ *
+ * @example
+ * $(document).ready(function() {
+ * // This example is fairly pointless in reality, but shows how fnDestroy can be used
+ * var oTable = $('#example').dataTable();
+ * oTable.fnDestroy();
+ * } );
+ */
+ this.fnDestroy = function ( remove )
+ {
+ this.api( true ).destroy( remove );
+ };
+
+
+ /**
+ * Redraw the table
+ * @param {bool} [complete=true] Re-filter and resort (if enabled) the table before the draw.
+ * @dtopt API
+ * @deprecated Since v1.10
+ *
+ * @example
+ * $(document).ready(function() {
+ * var oTable = $('#example').dataTable();
+ *
+ * // Re-draw the table - you wouldn't want to do it here, but it's an example :-)
+ * oTable.fnDraw();
+ * } );
+ */
+ this.fnDraw = function( complete )
+ {
+ // Note that this isn't an exact match to the old call to _fnDraw - it takes
+ // into account the new data, but can hold position.
+ this.api( true ).draw( complete );
+ };
+
+
+ /**
+ * Filter the input based on data
+ * @param {string} sInput String to filter the table on
+ * @param {int|null} [iColumn] Column to limit filtering to
+ * @param {bool} [bRegex=false] Treat as regular expression or not
+ * @param {bool} [bSmart=true] Perform smart filtering or not
+ * @param {bool} [bShowGlobal=true] Show the input global filter in it's input box(es)
+ * @param {bool} [bCaseInsensitive=true] Do case-insensitive matching (true) or not (false)
+ * @dtopt API
+ * @deprecated Since v1.10
+ *
+ * @example
+ * $(document).ready(function() {
+ * var oTable = $('#example').dataTable();
+ *
+ * // Sometime later - filter...
+ * oTable.fnFilter( 'test string' );
+ * } );
+ */
+ this.fnFilter = function( sInput, iColumn, bRegex, bSmart, bShowGlobal, bCaseInsensitive )
+ {
+ var api = this.api( true );
+
+ if ( iColumn === null || iColumn === undefined ) {
+ api.search( sInput, bRegex, bSmart, bCaseInsensitive );
+ }
+ else {
+ api.column( iColumn ).search( sInput, bRegex, bSmart, bCaseInsensitive );
+ }
+
+ api.draw();
+ };
+
+
+ /**
+ * Get the data for the whole table, an individual row or an individual cell based on the
+ * provided parameters.
+ * @param {int|node} [src] A TR row node, TD/TH cell node or an integer. If given as
+ * a TR node then the data source for the whole row will be returned. If given as a
+ * TD/TH cell node then iCol will be automatically calculated and the data for the
+ * cell returned. If given as an integer, then this is treated as the aoData internal
+ * data index for the row (see fnGetPosition) and the data for that row used.
+ * @param {int} [col] Optional column index that you want the data of.
+ * @returns {array|object|string} If mRow is undefined, then the data for all rows is
+ * returned. If mRow is defined, just data for that row, and is iCol is
+ * defined, only data for the designated cell is returned.
+ * @dtopt API
+ * @deprecated Since v1.10
+ *
+ * @example
+ * // Row data
+ * $(document).ready(function() {
+ * oTable = $('#example').dataTable();
+ *
+ * oTable.$('tr').click( function () {
+ * var data = oTable.fnGetData( this );
+ * // ... do something with the array / object of data for the row
+ * } );
+ * } );
+ *
+ * @example
+ * // Individual cell data
+ * $(document).ready(function() {
+ * oTable = $('#example').dataTable();
+ *
+ * oTable.$('td').click( function () {
+ * var sData = oTable.fnGetData( this );
+ * alert( 'The cell clicked on had the value of '+sData );
+ * } );
+ * } );
+ */
+ this.fnGetData = function( src, col )
+ {
+ var api = this.api( true );
+
+ if ( src !== undefined ) {
+ var type = src.nodeName ? src.nodeName.toLowerCase() : '';
+
+ return col !== undefined || type == 'td' || type == 'th' ?
+ api.cell( src, col ).data() :
+ api.row( src ).data() || null;
+ }
+
+ return api.data().toArray();
+ };
+
+
+ /**
+ * Get an array of the TR nodes that are used in the table's body. Note that you will
+ * typically want to use the '$' API method in preference to this as it is more
+ * flexible.
+ * @param {int} [iRow] Optional row index for the TR element you want
+ * @returns {array|node} If iRow is undefined, returns an array of all TR elements
+ * in the table's body, or iRow is defined, just the TR element requested.
+ * @dtopt API
+ * @deprecated Since v1.10
+ *
+ * @example
+ * $(document).ready(function() {
+ * var oTable = $('#example').dataTable();
+ *
+ * // Get the nodes from the table
+ * var nNodes = oTable.fnGetNodes( );
+ * } );
+ */
+ this.fnGetNodes = function( iRow )
+ {
+ var api = this.api( true );
+
+ return iRow !== undefined ?
+ api.row( iRow ).node() :
+ api.rows().nodes().flatten().toArray();
+ };
+
+
+ /**
+ * Get the array indexes of a particular cell from it's DOM element
+ * and column index including hidden columns
+ * @param {node} node this can either be a TR, TD or TH in the table's body
+ * @returns {int} If nNode is given as a TR, then a single index is returned, or
+ * if given as a cell, an array of [row index, column index (visible),
+ * column index (all)] is given.
+ * @dtopt API
+ * @deprecated Since v1.10
+ *
+ * @example
+ * $(document).ready(function() {
+ * $('#example tbody td').click( function () {
+ * // Get the position of the current data from the node
+ * var aPos = oTable.fnGetPosition( this );
+ *
+ * // Get the data array for this row
+ * var aData = oTable.fnGetData( aPos[0] );
+ *
+ * // Update the data array and return the value
+ * aData[ aPos[1] ] = 'clicked';
+ * this.innerHTML = 'clicked';
+ * } );
+ *
+ * // Init DataTables
+ * oTable = $('#example').dataTable();
+ * } );
+ */
+ this.fnGetPosition = function( node )
+ {
+ var api = this.api( true );
+ var nodeName = node.nodeName.toUpperCase();
+
+ if ( nodeName == 'TR' ) {
+ return api.row( node ).index();
+ }
+ else if ( nodeName == 'TD' || nodeName == 'TH' ) {
+ var cell = api.cell( node ).index();
+
+ return [
+ cell.row,
+ cell.columnVisible,
+ cell.column
+ ];
+ }
+ return null;
+ };
+
+
+ /**
+ * Check to see if a row is 'open' or not.
+ * @param {node} nTr the table row to check
+ * @returns {boolean} true if the row is currently open, false otherwise
+ * @dtopt API
+ * @deprecated Since v1.10
+ *
+ * @example
+ * $(document).ready(function() {
+ * var oTable;
+ *
+ * // 'open' an information row when a row is clicked on
+ * $('#example tbody tr').click( function () {
+ * if ( oTable.fnIsOpen(this) ) {
+ * oTable.fnClose( this );
+ * } else {
+ * oTable.fnOpen( this, "Temporary row opened", "info_row" );
+ * }
+ * } );
+ *
+ * oTable = $('#example').dataTable();
+ * } );
+ */
+ this.fnIsOpen = function( nTr )
+ {
+ return this.api( true ).row( nTr ).child.isShown();
+ };
+
+
+ /**
+ * This function will place a new row directly after a row which is currently
+ * on display on the page, with the HTML contents that is passed into the
+ * function. This can be used, for example, to ask for confirmation that a
+ * particular record should be deleted.
+ * @param {node} nTr The table row to 'open'
+ * @param {string|node|jQuery} mHtml The HTML to put into the row
+ * @param {string} sClass Class to give the new TD cell
+ * @returns {node} The row opened. Note that if the table row passed in as the
+ * first parameter, is not found in the table, this method will silently
+ * return.
+ * @dtopt API
+ * @deprecated Since v1.10
+ *
+ * @example
+ * $(document).ready(function() {
+ * var oTable;
+ *
+ * // 'open' an information row when a row is clicked on
+ * $('#example tbody tr').click( function () {
+ * if ( oTable.fnIsOpen(this) ) {
+ * oTable.fnClose( this );
+ * } else {
+ * oTable.fnOpen( this, "Temporary row opened", "info_row" );
+ * }
+ * } );
+ *
+ * oTable = $('#example').dataTable();
+ * } );
+ */
+ this.fnOpen = function( nTr, mHtml, sClass )
+ {
+ return this.api( true )
+ .row( nTr )
+ .child( mHtml, sClass )
+ .show()
+ .child()[0];
+ };
+
+
+ /**
+ * Change the pagination - provides the internal logic for pagination in a simple API
+ * function. With this function you can have a DataTables table go to the next,
+ * previous, first or last pages.
+ * @param {string|int} mAction Paging action to take: "first", "previous", "next" or "last"
+ * or page number to jump to (integer), note that page 0 is the first page.
+ * @param {bool} [bRedraw=true] Redraw the table or not
+ * @dtopt API
+ * @deprecated Since v1.10
+ *
+ * @example
+ * $(document).ready(function() {
+ * var oTable = $('#example').dataTable();
+ * oTable.fnPageChange( 'next' );
+ * } );
+ */
+ this.fnPageChange = function ( mAction, bRedraw )
+ {
+ var api = this.api( true ).page( mAction );
+
+ if ( bRedraw === undefined || bRedraw ) {
+ api.draw(false);
+ }
+ };
+
+
+ /**
+ * Show a particular column
+ * @param {int} iCol The column whose display should be changed
+ * @param {bool} bShow Show (true) or hide (false) the column
+ * @param {bool} [bRedraw=true] Redraw the table or not
+ * @dtopt API
+ * @deprecated Since v1.10
+ *
+ * @example
+ * $(document).ready(function() {
+ * var oTable = $('#example').dataTable();
+ *
+ * // Hide the second column after initialisation
+ * oTable.fnSetColumnVis( 1, false );
+ * } );
+ */
+ this.fnSetColumnVis = function ( iCol, bShow, bRedraw )
+ {
+ var api = this.api( true ).column( iCol ).visible( bShow );
+
+ if ( bRedraw === undefined || bRedraw ) {
+ api.columns.adjust().draw();
+ }
+ };
+
+
+ /**
+ * Get the settings for a particular table for external manipulation
+ * @returns {object} DataTables settings object. See
+ * {@link DataTable.models.oSettings}
+ * @dtopt API
+ * @deprecated Since v1.10
+ *
+ * @example
+ * $(document).ready(function() {
+ * var oTable = $('#example').dataTable();
+ * var oSettings = oTable.fnSettings();
+ *
+ * // Show an example parameter from the settings
+ * alert( oSettings._iDisplayStart );
+ * } );
+ */
+ this.fnSettings = function()
+ {
+ return _fnSettingsFromNode( this[_ext.iApiIndex] );
+ };
+
+
+ /**
+ * Sort the table by a particular column
+ * @param {int} iCol the data index to sort on. Note that this will not match the
+ * 'display index' if you have hidden data entries
+ * @dtopt API
+ * @deprecated Since v1.10
+ *
+ * @example
+ * $(document).ready(function() {
+ * var oTable = $('#example').dataTable();
+ *
+ * // Sort immediately with columns 0 and 1
+ * oTable.fnSort( [ [0,'asc'], [1,'asc'] ] );
+ * } );
+ */
+ this.fnSort = function( aaSort )
+ {
+ this.api( true ).order( aaSort ).draw();
+ };
+
+
+ /**
+ * Attach a sort listener to an element for a given column
+ * @param {node} nNode the element to attach the sort listener to
+ * @param {int} iColumn the column that a click on this node will sort on
+ * @param {function} [fnCallback] callback function when sort is run
+ * @dtopt API
+ * @deprecated Since v1.10
+ *
+ * @example
+ * $(document).ready(function() {
+ * var oTable = $('#example').dataTable();
+ *
+ * // Sort on column 1, when 'sorter' is clicked on
+ * oTable.fnSortListener( document.getElementById('sorter'), 1 );
+ * } );
+ */
+ this.fnSortListener = function( nNode, iColumn, fnCallback )
+ {
+ this.api( true ).order.listener( nNode, iColumn, fnCallback );
+ };
+
+
+ /**
+ * Update a table cell or row - this method will accept either a single value to
+ * update the cell with, an array of values with one element for each column or
+ * an object in the same format as the original data source. The function is
+ * self-referencing in order to make the multi column updates easier.
+ * @param {object|array|string} mData Data to update the cell/row with
+ * @param {node|int} mRow TR element you want to update or the aoData index
+ * @param {int} [iColumn] The column to update, give as null or undefined to
+ * update a whole row.
+ * @param {bool} [bRedraw=true] Redraw the table or not
+ * @param {bool} [bAction=true] Perform pre-draw actions or not
+ * @returns {int} 0 on success, 1 on error
+ * @dtopt API
+ * @deprecated Since v1.10
+ *
+ * @example
+ * $(document).ready(function() {
+ * var oTable = $('#example').dataTable();
+ * oTable.fnUpdate( 'Example update', 0, 0 ); // Single cell
+ * oTable.fnUpdate( ['a', 'b', 'c', 'd', 'e'], $('tbody tr')[0] ); // Row
+ * } );
+ */
+ this.fnUpdate = function( mData, mRow, iColumn, bRedraw, bAction )
+ {
+ var api = this.api( true );
+
+ if ( iColumn === undefined || iColumn === null ) {
+ api.row( mRow ).data( mData );
+ }
+ else {
+ api.cell( mRow, iColumn ).data( mData );
+ }
+
+ if ( bAction === undefined || bAction ) {
+ api.columns.adjust();
+ }
+
+ if ( bRedraw === undefined || bRedraw ) {
+ api.draw();
+ }
+ return 0;
+ };
+
+
+ /**
+ * Provide a common method for plug-ins to check the version of DataTables being used, in order
+ * to ensure compatibility.
+ * @param {string} sVersion Version string to check for, in the format "X.Y.Z". Note that the
+ * formats "X" and "X.Y" are also acceptable.
+ * @returns {boolean} true if this version of DataTables is greater or equal to the required
+ * version, or false if this version of DataTales is not suitable
+ * @method
+ * @dtopt API
+ * @deprecated Since v1.10
+ *
+ * @example
+ * $(document).ready(function() {
+ * var oTable = $('#example').dataTable();
+ * alert( oTable.fnVersionCheck( '1.9.0' ) );
+ * } );
+ */
+ this.fnVersionCheck = _ext.fnVersionCheck;
+
+
+ var _that = this;
+ var emptyInit = options === undefined;
+ var len = this.length;
+
+ if ( emptyInit ) {
+ options = {};
+ }
+
+ this.oApi = this.internal = _ext.internal;
+
+ // Extend with old style plug-in API methods
+ for ( var fn in DataTable.ext.internal ) {
+ if ( fn ) {
+ this[fn] = _fnExternApiFunc(fn);
+ }
+ }
+
+ this.each(function() {
+ // For each initialisation we want to give it a clean initialisation
+ // object that can be bashed around
+ var o = {};
+ var oInit = len > 1 ? // optimisation for single table case
+ _fnExtend( o, options, true ) :
+ options;
+
+ /*global oInit,_that,emptyInit*/
+ var i=0, iLen, j, jLen, k, kLen;
+ var sId = this.getAttribute( 'id' );
+ var bInitHandedOff = false;
+ var defaults = DataTable.defaults;
+ var $this = $(this);
+
+
+ /* Sanity check */
+ if ( this.nodeName.toLowerCase() != 'table' )
+ {
+ _fnLog( null, 0, 'Non-table node initialisation ('+this.nodeName+')', 2 );
+ return;
+ }
+
+ /* Backwards compatibility for the defaults */
+ _fnCompatOpts( defaults );
+ _fnCompatCols( defaults.column );
+
+ /* Convert the camel-case defaults to Hungarian */
+ _fnCamelToHungarian( defaults, defaults, true );
+ _fnCamelToHungarian( defaults.column, defaults.column, true );
+
+ /* Setting up the initialisation object */
+ _fnCamelToHungarian( defaults, $.extend( oInit, $this.data() ) );
+
+
+
+ /* Check to see if we are re-initialising a table */
+ var allSettings = DataTable.settings;
+ for ( i=0, iLen=allSettings.length ; i').appendTo($this);
+ }
+ oSettings.nTHead = thead[0];
+
+ var tbody = $this.children('tbody');
+ if ( tbody.length === 0 ) {
+ tbody = $(' ').appendTo($this);
+ }
+ oSettings.nTBody = tbody[0];
+
+ var tfoot = $this.children('tfoot');
+ if ( tfoot.length === 0 && captions.length > 0 && (oSettings.oScroll.sX !== "" || oSettings.oScroll.sY !== "") ) {
+ // If we are a scrolling table, and no footer has been given, then we need to create
+ // a tfoot element for the caption element to be appended to
+ tfoot = $(' ').appendTo($this);
+ }
+
+ if ( tfoot.length === 0 || tfoot.children().length === 0 ) {
+ $this.addClass( oClasses.sNoFooter );
+ }
+ else if ( tfoot.length > 0 ) {
+ oSettings.nTFoot = tfoot[0];
+ _fnDetectHeader( oSettings.aoFooter, oSettings.nTFoot );
+ }
+
+ /* Check if there is data passing into the constructor */
+ if ( oInit.aaData ) {
+ for ( i=0 ; i/g;
+
+ // This is not strict ISO8601 - Date.parse() is quite lax, although
+ // implementations differ between browsers.
+ var _re_date = /^\d{2,4}[\.\/\-]\d{1,2}[\.\/\-]\d{1,2}([T ]{1}\d{1,2}[:\.]\d{2}([\.:]\d{2})?)?$/;
+
+ // Escape regular expression special characters
+ var _re_escape_regex = new RegExp( '(\\' + [ '/', '.', '*', '+', '?', '|', '(', ')', '[', ']', '{', '}', '\\', '$', '^', '-' ].join('|\\') + ')', 'g' );
+
+ // http://en.wikipedia.org/wiki/Foreign_exchange_market
+ // - \u20BD - Russian ruble.
+ // - \u20a9 - South Korean Won
+ // - \u20BA - Turkish Lira
+ // - \u20B9 - Indian Rupee
+ // - R - Brazil (R$) and South Africa
+ // - fr - Swiss Franc
+ // - kr - Swedish krona, Norwegian krone and Danish krone
+ // - \u2009 is thin space and \u202F is narrow no-break space, both used in many
+ // - Ƀ - Bitcoin
+ // - Ξ - Ethereum
+ // standards as thousands separators.
+ var _re_formatted_numeric = /[',$£€¥%\u2009\u202F\u20BD\u20a9\u20BArfkɃΞ]/gi;
+
+
+ var _empty = function ( d ) {
+ return !d || d === true || d === '-' ? true : false;
+ };
+
+
+ var _intVal = function ( s ) {
+ var integer = parseInt( s, 10 );
+ return !isNaN(integer) && isFinite(s) ? integer : null;
+ };
+
+ // Convert from a formatted number with characters other than `.` as the
+ // decimal place, to a Javascript number
+ var _numToDecimal = function ( num, decimalPoint ) {
+ // Cache created regular expressions for speed as this function is called often
+ if ( ! _re_dic[ decimalPoint ] ) {
+ _re_dic[ decimalPoint ] = new RegExp( _fnEscapeRegex( decimalPoint ), 'g' );
+ }
+ return typeof num === 'string' && decimalPoint !== '.' ?
+ num.replace( /\./g, '' ).replace( _re_dic[ decimalPoint ], '.' ) :
+ num;
+ };
+
+
+ var _isNumber = function ( d, decimalPoint, formatted ) {
+ var strType = typeof d === 'string';
+
+ // If empty return immediately so there must be a number if it is a
+ // formatted string (this stops the string "k", or "kr", etc being detected
+ // as a formatted number for currency
+ if ( _empty( d ) ) {
+ return true;
+ }
+
+ if ( decimalPoint && strType ) {
+ d = _numToDecimal( d, decimalPoint );
+ }
+
+ if ( formatted && strType ) {
+ d = d.replace( _re_formatted_numeric, '' );
+ }
+
+ return !isNaN( parseFloat(d) ) && isFinite( d );
+ };
+
+
+ // A string without HTML in it can be considered to be HTML still
+ var _isHtml = function ( d ) {
+ return _empty( d ) || typeof d === 'string';
+ };
+
+
+ var _htmlNumeric = function ( d, decimalPoint, formatted ) {
+ if ( _empty( d ) ) {
+ return true;
+ }
+
+ var html = _isHtml( d );
+ return ! html ?
+ null :
+ _isNumber( _stripHtml( d ), decimalPoint, formatted ) ?
+ true :
+ null;
+ };
+
+
+ var _pluck = function ( a, prop, prop2 ) {
+ var out = [];
+ var i=0, ien=a.length;
+
+ // Could have the test in the loop for slightly smaller code, but speed
+ // is essential here
+ if ( prop2 !== undefined ) {
+ for ( ; i')
+ .css( {
+ position: 'fixed',
+ top: 0,
+ left: $(window).scrollLeft()*-1, // allow for scrolling
+ height: 1,
+ width: 1,
+ overflow: 'hidden'
+ } )
+ .append(
+ $('
')
+ .css( {
+ position: 'absolute',
+ top: 1,
+ left: 1,
+ width: 100,
+ overflow: 'scroll'
+ } )
+ .append(
+ $('
')
+ .css( {
+ width: '100%',
+ height: 10
+ } )
+ )
+ )
+ .appendTo( 'body' );
+
+ var outer = n.children();
+ var inner = outer.children();
+
+ // Numbers below, in order, are:
+ // inner.offsetWidth, inner.clientWidth, outer.offsetWidth, outer.clientWidth
+ //
+ // IE6 XP: 100 100 100 83
+ // IE7 Vista: 100 100 100 83
+ // IE 8+ Windows: 83 83 100 83
+ // Evergreen Windows: 83 83 100 83
+ // Evergreen Mac with scrollbars: 85 85 100 85
+ // Evergreen Mac without scrollbars: 100 100 100 100
+
+ // Get scrollbar width
+ browser.barWidth = outer[0].offsetWidth - outer[0].clientWidth;
+
+ // IE6/7 will oversize a width 100% element inside a scrolling element, to
+ // include the width of the scrollbar, while other browsers ensure the inner
+ // element is contained without forcing scrolling
+ browser.bScrollOversize = inner[0].offsetWidth === 100 && outer[0].clientWidth !== 100;
+
+ // In rtl text layout, some browsers (most, but not all) will place the
+ // scrollbar on the left, rather than the right.
+ browser.bScrollbarLeft = Math.round( inner.offset().left ) !== 1;
+
+ // IE8- don't provide height and width for getBoundingClientRect
+ browser.bBounding = n[0].getBoundingClientRect().width ? true : false;
+
+ n.remove();
+ }
+
+ $.extend( settings.oBrowser, DataTable.__browser );
+ settings.oScroll.iBarWidth = DataTable.__browser.barWidth;
+ }
+
+
+ /**
+ * Array.prototype reduce[Right] method, used for browsers which don't support
+ * JS 1.6. Done this way to reduce code size, since we iterate either way
+ * @param {object} settings dataTables settings object
+ * @memberof DataTable#oApi
+ */
+ function _fnReduce ( that, fn, init, start, end, inc )
+ {
+ var
+ i = start,
+ value,
+ isSet = false;
+
+ if ( init !== undefined ) {
+ value = init;
+ isSet = true;
+ }
+
+ while ( i !== end ) {
+ if ( ! that.hasOwnProperty(i) ) {
+ continue;
+ }
+
+ value = isSet ?
+ fn( value, that[i], i, that ) :
+ that[i];
+
+ isSet = true;
+ i += inc;
+ }
+
+ return value;
+ }
+
+ /**
+ * Add a column to the list used for the table with default values
+ * @param {object} oSettings dataTables settings object
+ * @param {node} nTh The th element for this column
+ * @memberof DataTable#oApi
+ */
+ function _fnAddColumn( oSettings, nTh )
+ {
+ // Add column to aoColumns array
+ var oDefaults = DataTable.defaults.column;
+ var iCol = oSettings.aoColumns.length;
+ var oCol = $.extend( {}, DataTable.models.oColumn, oDefaults, {
+ "nTh": nTh ? nTh : document.createElement('th'),
+ "sTitle": oDefaults.sTitle ? oDefaults.sTitle : nTh ? nTh.innerHTML : '',
+ "aDataSort": oDefaults.aDataSort ? oDefaults.aDataSort : [iCol],
+ "mData": oDefaults.mData ? oDefaults.mData : iCol,
+ idx: iCol
+ } );
+ oSettings.aoColumns.push( oCol );
+
+ // Add search object for column specific search. Note that the `searchCols[ iCol ]`
+ // passed into extend can be undefined. This allows the user to give a default
+ // with only some of the parameters defined, and also not give a default
+ var searchCols = oSettings.aoPreSearchCols;
+ searchCols[ iCol ] = $.extend( {}, DataTable.models.oSearch, searchCols[ iCol ] );
+
+ // Use the default column options function to initialise classes etc
+ _fnColumnOptions( oSettings, iCol, $(nTh).data() );
+ }
+
+
+ /**
+ * Apply options for a column
+ * @param {object} oSettings dataTables settings object
+ * @param {int} iCol column index to consider
+ * @param {object} oOptions object with sType, bVisible and bSearchable etc
+ * @memberof DataTable#oApi
+ */
+ function _fnColumnOptions( oSettings, iCol, oOptions )
+ {
+ var oCol = oSettings.aoColumns[ iCol ];
+ var oClasses = oSettings.oClasses;
+ var th = $(oCol.nTh);
+
+ // Try to get width information from the DOM. We can't get it from CSS
+ // as we'd need to parse the CSS stylesheet. `width` option can override
+ if ( ! oCol.sWidthOrig ) {
+ // Width attribute
+ oCol.sWidthOrig = th.attr('width') || null;
+
+ // Style attribute
+ var t = (th.attr('style') || '').match(/width:\s*(\d+[pxem%]+)/);
+ if ( t ) {
+ oCol.sWidthOrig = t[1];
+ }
+ }
+
+ /* User specified column options */
+ if ( oOptions !== undefined && oOptions !== null )
+ {
+ // Backwards compatibility
+ _fnCompatCols( oOptions );
+
+ // Map camel case parameters to their Hungarian counterparts
+ _fnCamelToHungarian( DataTable.defaults.column, oOptions );
+
+ /* Backwards compatibility for mDataProp */
+ if ( oOptions.mDataProp !== undefined && !oOptions.mData )
+ {
+ oOptions.mData = oOptions.mDataProp;
+ }
+
+ if ( oOptions.sType )
+ {
+ oCol._sManualType = oOptions.sType;
+ }
+
+ // `class` is a reserved word in Javascript, so we need to provide
+ // the ability to use a valid name for the camel case input
+ if ( oOptions.className && ! oOptions.sClass )
+ {
+ oOptions.sClass = oOptions.className;
+ }
+ if ( oOptions.sClass ) {
+ th.addClass( oOptions.sClass );
+ }
+
+ $.extend( oCol, oOptions );
+ _fnMap( oCol, oOptions, "sWidth", "sWidthOrig" );
+
+ /* iDataSort to be applied (backwards compatibility), but aDataSort will take
+ * priority if defined
+ */
+ if ( oOptions.iDataSort !== undefined )
+ {
+ oCol.aDataSort = [ oOptions.iDataSort ];
+ }
+ _fnMap( oCol, oOptions, "aDataSort" );
+ }
+
+ /* Cache the data get and set functions for speed */
+ var mDataSrc = oCol.mData;
+ var mData = _fnGetObjectDataFn( mDataSrc );
+ var mRender = oCol.mRender ? _fnGetObjectDataFn( oCol.mRender ) : null;
+
+ var attrTest = function( src ) {
+ return typeof src === 'string' && src.indexOf('@') !== -1;
+ };
+ oCol._bAttrSrc = $.isPlainObject( mDataSrc ) && (
+ attrTest(mDataSrc.sort) || attrTest(mDataSrc.type) || attrTest(mDataSrc.filter)
+ );
+ oCol._setter = null;
+
+ oCol.fnGetData = function (rowData, type, meta) {
+ var innerData = mData( rowData, type, undefined, meta );
+
+ return mRender && type ?
+ mRender( innerData, type, rowData, meta ) :
+ innerData;
+ };
+ oCol.fnSetData = function ( rowData, val, meta ) {
+ return _fnSetObjectDataFn( mDataSrc )( rowData, val, meta );
+ };
+
+ // Indicate if DataTables should read DOM data as an object or array
+ // Used in _fnGetRowElements
+ if ( typeof mDataSrc !== 'number' ) {
+ oSettings._rowReadObject = true;
+ }
+
+ /* Feature sorting overrides column specific when off */
+ if ( !oSettings.oFeatures.bSort )
+ {
+ oCol.bSortable = false;
+ th.addClass( oClasses.sSortableNone ); // Have to add class here as order event isn't called
+ }
+
+ /* Check that the class assignment is correct for sorting */
+ var bAsc = $.inArray('asc', oCol.asSorting) !== -1;
+ var bDesc = $.inArray('desc', oCol.asSorting) !== -1;
+ if ( !oCol.bSortable || (!bAsc && !bDesc) )
+ {
+ oCol.sSortingClass = oClasses.sSortableNone;
+ oCol.sSortingClassJUI = "";
+ }
+ else if ( bAsc && !bDesc )
+ {
+ oCol.sSortingClass = oClasses.sSortableAsc;
+ oCol.sSortingClassJUI = oClasses.sSortJUIAscAllowed;
+ }
+ else if ( !bAsc && bDesc )
+ {
+ oCol.sSortingClass = oClasses.sSortableDesc;
+ oCol.sSortingClassJUI = oClasses.sSortJUIDescAllowed;
+ }
+ else
+ {
+ oCol.sSortingClass = oClasses.sSortable;
+ oCol.sSortingClassJUI = oClasses.sSortJUI;
+ }
+ }
+
+
+ /**
+ * Adjust the table column widths for new data. Note: you would probably want to
+ * do a redraw after calling this function!
+ * @param {object} settings dataTables settings object
+ * @memberof DataTable#oApi
+ */
+ function _fnAdjustColumnSizing ( settings )
+ {
+ /* Not interested in doing column width calculation if auto-width is disabled */
+ if ( settings.oFeatures.bAutoWidth !== false )
+ {
+ var columns = settings.aoColumns;
+
+ _fnCalculateColumnWidths( settings );
+ for ( var i=0 , iLen=columns.length ; i=0 ; i-- )
+ {
+ def = aoColDefs[i];
+
+ /* Each definition can target multiple columns, as it is an array */
+ var aTargets = def.targets !== undefined ?
+ def.targets :
+ def.aTargets;
+
+ if ( ! $.isArray( aTargets ) )
+ {
+ aTargets = [ aTargets ];
+ }
+
+ for ( j=0, jLen=aTargets.length ; j= 0 )
+ {
+ /* Add columns that we don't yet know about */
+ while( columns.length <= aTargets[j] )
+ {
+ _fnAddColumn( oSettings );
+ }
+
+ /* Integer, basic index */
+ fn( aTargets[j], def );
+ }
+ else if ( typeof aTargets[j] === 'number' && aTargets[j] < 0 )
+ {
+ /* Negative integer, right to left column counting */
+ fn( columns.length+aTargets[j], def );
+ }
+ else if ( typeof aTargets[j] === 'string' )
+ {
+ /* Class name matching on TH element */
+ for ( k=0, kLen=columns.length ; k=0 if successful (index of new aoData entry), -1 if failed
+ * @memberof DataTable#oApi
+ */
+ function _fnAddData ( oSettings, aDataIn, nTr, anTds )
+ {
+ /* Create the object for storing information about this new row */
+ var iRow = oSettings.aoData.length;
+ var oData = $.extend( true, {}, DataTable.models.oRow, {
+ src: nTr ? 'dom' : 'data',
+ idx: iRow
+ } );
+
+ oData._aData = aDataIn;
+ oSettings.aoData.push( oData );
+
+ /* Create the cells */
+ var nTd, sThisType;
+ var columns = oSettings.aoColumns;
+
+ // Invalidate the column types as the new data needs to be revalidated
+ for ( var i=0, iLen=columns.length ; i iTarget )
+ {
+ a[i]--;
+ }
+ }
+
+ if ( iTargetIndex != -1 && splice === undefined )
+ {
+ a.splice( iTargetIndex, 1 );
+ }
+ }
+
+
+ /**
+ * Mark cached data as invalid such that a re-read of the data will occur when
+ * the cached data is next requested. Also update from the data source object.
+ *
+ * @param {object} settings DataTables settings object
+ * @param {int} rowIdx Row index to invalidate
+ * @param {string} [src] Source to invalidate from: undefined, 'auto', 'dom'
+ * or 'data'
+ * @param {int} [colIdx] Column index to invalidate. If undefined the whole
+ * row will be invalidated
+ * @memberof DataTable#oApi
+ *
+ * @todo For the modularisation of v1.11 this will need to become a callback, so
+ * the sort and filter methods can subscribe to it. That will required
+ * initialisation options for sorting, which is why it is not already baked in
+ */
+ function _fnInvalidate( settings, rowIdx, src, colIdx )
+ {
+ var row = settings.aoData[ rowIdx ];
+ var i, ien;
+ var cellWrite = function ( cell, col ) {
+ // This is very frustrating, but in IE if you just write directly
+ // to innerHTML, and elements that are overwritten are GC'ed,
+ // even if there is a reference to them elsewhere
+ while ( cell.childNodes.length ) {
+ cell.removeChild( cell.firstChild );
+ }
+
+ cell.innerHTML = _fnGetCellData( settings, rowIdx, col, 'display' );
+ };
+
+ // Are we reading last data from DOM or the data object?
+ if ( src === 'dom' || ((! src || src === 'auto') && row.src === 'dom') ) {
+ // Read the data from the DOM
+ row._aData = _fnGetRowElements(
+ settings, row, colIdx, colIdx === undefined ? undefined : row._aData
+ )
+ .data;
+ }
+ else {
+ // Reading from data object, update the DOM
+ var cells = row.anCells;
+
+ if ( cells ) {
+ if ( colIdx !== undefined ) {
+ cellWrite( cells[colIdx], colIdx );
+ }
+ else {
+ for ( i=0, ien=cells.length ; i').appendTo( thead );
+ }
+
+ for ( i=0, ien=columns.length ; itr').attr('role', 'row');
+
+ /* Deal with the footer - add classes if required */
+ $(thead).find('>tr>th, >tr>td').addClass( classes.sHeaderTH );
+ $(tfoot).find('>tr>th, >tr>td').addClass( classes.sFooterTH );
+
+ // Cache the footer cells. Note that we only take the cells from the first
+ // row in the footer. If there is more than one row the user wants to
+ // interact with, they need to use the table().foot() method. Note also this
+ // allows cells to be used for multiple columns using colspan
+ if ( tfoot !== null ) {
+ var cells = oSettings.aoFooter[0];
+
+ for ( i=0, ien=cells.length ; i=0 ; j-- )
+ {
+ if ( !oSettings.aoColumns[j].bVisible && !bIncludeHidden )
+ {
+ aoLocal[i].splice( j, 1 );
+ }
+ }
+
+ /* Prep the applied array - it needs an element for each row */
+ aApplied.push( [] );
+ }
+
+ for ( i=0, iLen=aoLocal.length ; i= oSettings.fnRecordsDisplay() ?
+ 0 :
+ iInitDisplayStart;
+
+ oSettings.iInitDisplayStart = -1;
+ }
+
+ var iDisplayStart = oSettings._iDisplayStart;
+ var iDisplayEnd = oSettings.fnDisplayEnd();
+
+ /* Server-side processing draw intercept */
+ if ( oSettings.bDeferLoading )
+ {
+ oSettings.bDeferLoading = false;
+ oSettings.iDraw++;
+ _fnProcessingDisplay( oSettings, false );
+ }
+ else if ( !bServerSide )
+ {
+ oSettings.iDraw++;
+ }
+ else if ( !oSettings.bDestroying && !_fnAjaxUpdate( oSettings ) )
+ {
+ return;
+ }
+
+ if ( aiDisplay.length !== 0 )
+ {
+ var iStart = bServerSide ? 0 : iDisplayStart;
+ var iEnd = bServerSide ? oSettings.aoData.length : iDisplayEnd;
+
+ for ( var j=iStart ; j ', { 'class': iStripes ? asStripeClasses[0] : '' } )
+ .append( $(' ', {
+ 'valign': 'top',
+ 'colSpan': _fnVisbleColumns( oSettings ),
+ 'class': oSettings.oClasses.sRowEmpty
+ } ).html( sZero ) )[0];
+ }
+
+ /* Header and footer callbacks */
+ _fnCallbackFire( oSettings, 'aoHeaderCallback', 'header', [ $(oSettings.nTHead).children('tr')[0],
+ _fnGetDataMaster( oSettings ), iDisplayStart, iDisplayEnd, aiDisplay ] );
+
+ _fnCallbackFire( oSettings, 'aoFooterCallback', 'footer', [ $(oSettings.nTFoot).children('tr')[0],
+ _fnGetDataMaster( oSettings ), iDisplayStart, iDisplayEnd, aiDisplay ] );
+
+ var body = $(oSettings.nTBody);
+
+ body.children().detach();
+ body.append( $(anRows) );
+
+ /* Call all required callback functions for the end of a draw */
+ _fnCallbackFire( oSettings, 'aoDrawCallback', 'draw', [oSettings] );
+
+ /* Draw is complete, sorting and filtering must be as well */
+ oSettings.bSorted = false;
+ oSettings.bFiltered = false;
+ oSettings.bDrawing = false;
+ }
+
+
+ /**
+ * Redraw the table - taking account of the various features which are enabled
+ * @param {object} oSettings dataTables settings object
+ * @param {boolean} [holdPosition] Keep the current paging position. By default
+ * the paging is reset to the first page
+ * @memberof DataTable#oApi
+ */
+ function _fnReDraw( settings, holdPosition )
+ {
+ var
+ features = settings.oFeatures,
+ sort = features.bSort,
+ filter = features.bFilter;
+
+ if ( sort ) {
+ _fnSort( settings );
+ }
+
+ if ( filter ) {
+ _fnFilterComplete( settings, settings.oPreviousSearch );
+ }
+ else {
+ // No filtering, so we want to just use the display master
+ settings.aiDisplay = settings.aiDisplayMaster.slice();
+ }
+
+ if ( holdPosition !== true ) {
+ settings._iDisplayStart = 0;
+ }
+
+ // Let any modules know about the draw hold position state (used by
+ // scrolling internally)
+ settings._drawHold = holdPosition;
+
+ _fnDraw( settings );
+
+ settings._drawHold = false;
+ }
+
+
+ /**
+ * Add the options to the page HTML for the table
+ * @param {object} oSettings dataTables settings object
+ * @memberof DataTable#oApi
+ */
+ function _fnAddOptionsHtml ( oSettings )
+ {
+ var classes = oSettings.oClasses;
+ var table = $(oSettings.nTable);
+ var holding = $('
').insertBefore( table ); // Holding element for speed
+ var features = oSettings.oFeatures;
+
+ // All DataTables are wrapped in a div
+ var insert = $('
', {
+ id: oSettings.sTableId+'_wrapper',
+ 'class': classes.sWrapper + (oSettings.nTFoot ? '' : ' '+classes.sNoFooter)
+ } );
+
+ oSettings.nHolding = holding[0];
+ oSettings.nTableWrapper = insert[0];
+ oSettings.nTableReinsertBefore = oSettings.nTable.nextSibling;
+
+ /* Loop over the user set positioning and place the elements as needed */
+ var aDom = oSettings.sDom.split('');
+ var featureNode, cOption, nNewNode, cNext, sAttr, j;
+ for ( var i=0 ; i')[0];
+
+ /* Check to see if we should append an id and/or a class name to the container */
+ cNext = aDom[i+1];
+ if ( cNext == "'" || cNext == '"' )
+ {
+ sAttr = "";
+ j = 2;
+ while ( aDom[i+j] != cNext )
+ {
+ sAttr += aDom[i+j];
+ j++;
+ }
+
+ /* Replace jQuery UI constants @todo depreciated */
+ if ( sAttr == "H" )
+ {
+ sAttr = classes.sJUIHeader;
+ }
+ else if ( sAttr == "F" )
+ {
+ sAttr = classes.sJUIFooter;
+ }
+
+ /* The attribute can be in the format of "#id.class", "#id" or "class" This logic
+ * breaks the string into parts and applies them as needed
+ */
+ if ( sAttr.indexOf('.') != -1 )
+ {
+ var aSplit = sAttr.split('.');
+ nNewNode.id = aSplit[0].substr(1, aSplit[0].length-1);
+ nNewNode.className = aSplit[1];
+ }
+ else if ( sAttr.charAt(0) == "#" )
+ {
+ nNewNode.id = sAttr.substr(1, sAttr.length-1);
+ }
+ else
+ {
+ nNewNode.className = sAttr;
+ }
+
+ i += j; /* Move along the position array */
+ }
+
+ insert.append( nNewNode );
+ insert = $(nNewNode);
+ }
+ else if ( cOption == '>' )
+ {
+ /* End container div */
+ insert = insert.parent();
+ }
+ // @todo Move options into their own plugins?
+ else if ( cOption == 'l' && features.bPaginate && features.bLengthChange )
+ {
+ /* Length */
+ featureNode = _fnFeatureHtmlLength( oSettings );
+ }
+ else if ( cOption == 'f' && features.bFilter )
+ {
+ /* Filter */
+ featureNode = _fnFeatureHtmlFilter( oSettings );
+ }
+ else if ( cOption == 'r' && features.bProcessing )
+ {
+ /* pRocessing */
+ featureNode = _fnFeatureHtmlProcessing( oSettings );
+ }
+ else if ( cOption == 't' )
+ {
+ /* Table */
+ featureNode = _fnFeatureHtmlTable( oSettings );
+ }
+ else if ( cOption == 'i' && features.bInfo )
+ {
+ /* Info */
+ featureNode = _fnFeatureHtmlInfo( oSettings );
+ }
+ else if ( cOption == 'p' && features.bPaginate )
+ {
+ /* Pagination */
+ featureNode = _fnFeatureHtmlPaginate( oSettings );
+ }
+ else if ( DataTable.ext.feature.length !== 0 )
+ {
+ /* Plug-in features */
+ var aoFeatures = DataTable.ext.feature;
+ for ( var k=0, kLen=aoFeatures.length ; k ';
+
+ var str = language.sSearch;
+ str = str.match(/_INPUT_/) ?
+ str.replace('_INPUT_', input) :
+ str+input;
+
+ var filter = $('
', {
+ 'id': ! features.f ? tableId+'_filter' : null,
+ 'class': classes.sFilter
+ } )
+ .append( $(' ' ).append( str ) );
+
+ var searchFn = function() {
+ /* Update all other filter input elements for the new display */
+ var n = features.f;
+ var val = !this.value ? "" : this.value; // mental IE8 fix :-(
+
+ /* Now do the filter */
+ if ( val != previousSearch.sSearch ) {
+ _fnFilterComplete( settings, {
+ "sSearch": val,
+ "bRegex": previousSearch.bRegex,
+ "bSmart": previousSearch.bSmart ,
+ "bCaseInsensitive": previousSearch.bCaseInsensitive
+ } );
+
+ // Need to redraw, without resorting
+ settings._iDisplayStart = 0;
+ _fnDraw( settings );
+ }
+ };
+
+ var searchDelay = settings.searchDelay !== null ?
+ settings.searchDelay :
+ _fnDataSource( settings ) === 'ssp' ?
+ 400 :
+ 0;
+
+ var jqFilter = $('input', filter)
+ .val( previousSearch.sSearch )
+ .attr( 'placeholder', language.sSearchPlaceholder )
+ .on(
+ 'keyup.DT search.DT input.DT paste.DT cut.DT',
+ searchDelay ?
+ _fnThrottle( searchFn, searchDelay ) :
+ searchFn
+ )
+ .on( 'keypress.DT', function(e) {
+ /* Prevent form submission */
+ if ( e.keyCode == 13 ) {
+ return false;
+ }
+ } )
+ .attr('aria-controls', tableId);
+
+ // Update the input elements whenever the table is filtered
+ $(settings.nTable).on( 'search.dt.DT', function ( ev, s ) {
+ if ( settings === s ) {
+ // IE9 throws an 'unknown error' if document.activeElement is used
+ // inside an iframe or frame...
+ try {
+ if ( jqFilter[0] !== document.activeElement ) {
+ jqFilter.val( previousSearch.sSearch );
+ }
+ }
+ catch ( e ) {}
+ }
+ } );
+
+ return filter[0];
+ }
+
+
+ /**
+ * Filter the table using both the global filter and column based filtering
+ * @param {object} oSettings dataTables settings object
+ * @param {object} oSearch search information
+ * @param {int} [iForce] force a research of the master array (1) or not (undefined or 0)
+ * @memberof DataTable#oApi
+ */
+ function _fnFilterComplete ( oSettings, oInput, iForce )
+ {
+ var oPrevSearch = oSettings.oPreviousSearch;
+ var aoPrevSearch = oSettings.aoPreSearchCols;
+ var fnSaveFilter = function ( oFilter ) {
+ /* Save the filtering values */
+ oPrevSearch.sSearch = oFilter.sSearch;
+ oPrevSearch.bRegex = oFilter.bRegex;
+ oPrevSearch.bSmart = oFilter.bSmart;
+ oPrevSearch.bCaseInsensitive = oFilter.bCaseInsensitive;
+ };
+ var fnRegex = function ( o ) {
+ // Backwards compatibility with the bEscapeRegex option
+ return o.bEscapeRegex !== undefined ? !o.bEscapeRegex : o.bRegex;
+ };
+
+ // Resolve any column types that are unknown due to addition or invalidation
+ // @todo As per sort - can this be moved into an event handler?
+ _fnColumnTypes( oSettings );
+
+ /* In server-side processing all filtering is done by the server, so no point hanging around here */
+ if ( _fnDataSource( oSettings ) != 'ssp' )
+ {
+ /* Global filter */
+ _fnFilter( oSettings, oInput.sSearch, iForce, fnRegex(oInput), oInput.bSmart, oInput.bCaseInsensitive );
+ fnSaveFilter( oInput );
+
+ /* Now do the individual column filter */
+ for ( var i=0 ; i input.length ||
+ input.indexOf(prevSearch) !== 0 ||
+ settings.bSorted // On resort, the display master needs to be
+ // re-filtered since indexes will have changed
+ ) {
+ settings.aiDisplay = displayMaster.slice();
+ }
+
+ // Search the display array
+ display = settings.aiDisplay;
+
+ for ( i=0 ; i')[0];
+ var __filter_div_textContent = __filter_div.textContent !== undefined;
+
+ // Update the filtering data for each row if needed (by invalidation or first run)
+ function _fnFilterData ( settings )
+ {
+ var columns = settings.aoColumns;
+ var column;
+ var i, j, ien, jen, filterData, cellData, row;
+ var fomatters = DataTable.ext.type.search;
+ var wasInvalidated = false;
+
+ for ( i=0, ien=settings.aoData.length ; i', {
+ 'class': settings.oClasses.sInfo,
+ 'id': ! nodes ? tid+'_info' : null
+ } );
+
+ if ( ! nodes ) {
+ // Update display on each draw
+ settings.aoDrawCallback.push( {
+ "fn": _fnUpdateInfo,
+ "sName": "information"
+ } );
+
+ n
+ .attr( 'role', 'status' )
+ .attr( 'aria-live', 'polite' );
+
+ // Table is described by our info div
+ $(settings.nTable).attr( 'aria-describedby', tid+'_info' );
+ }
+
+ return n[0];
+ }
+
+
+ /**
+ * Update the information elements in the display
+ * @param {object} settings dataTables settings object
+ * @memberof DataTable#oApi
+ */
+ function _fnUpdateInfo ( settings )
+ {
+ /* Show information about the table */
+ var nodes = settings.aanFeatures.i;
+ if ( nodes.length === 0 ) {
+ return;
+ }
+
+ var
+ lang = settings.oLanguage,
+ start = settings._iDisplayStart+1,
+ end = settings.fnDisplayEnd(),
+ max = settings.fnRecordsTotal(),
+ total = settings.fnRecordsDisplay(),
+ out = total ?
+ lang.sInfo :
+ lang.sInfoEmpty;
+
+ if ( total !== max ) {
+ /* Record set after filtering */
+ out += ' ' + lang.sInfoFiltered;
+ }
+
+ // Convert the macros
+ out += lang.sInfoPostFix;
+ out = _fnInfoMacros( settings, out );
+
+ var callback = lang.fnInfoCallback;
+ if ( callback !== null ) {
+ out = callback.call( settings.oInstance,
+ settings, start, end, max, total, out
+ );
+ }
+
+ $(nodes).html( out );
+ }
+
+
+ function _fnInfoMacros ( settings, str )
+ {
+ // When infinite scrolling, we are always starting at 1. _iDisplayStart is used only
+ // internally
+ var
+ formatter = settings.fnFormatNumber,
+ start = settings._iDisplayStart+1,
+ len = settings._iDisplayLength,
+ vis = settings.fnRecordsDisplay(),
+ all = len === -1;
+
+ return str.
+ replace(/_START_/g, formatter.call( settings, start ) ).
+ replace(/_END_/g, formatter.call( settings, settings.fnDisplayEnd() ) ).
+ replace(/_MAX_/g, formatter.call( settings, settings.fnRecordsTotal() ) ).
+ replace(/_TOTAL_/g, formatter.call( settings, vis ) ).
+ replace(/_PAGE_/g, formatter.call( settings, all ? 1 : Math.ceil( start / len ) ) ).
+ replace(/_PAGES_/g, formatter.call( settings, all ? 1 : Math.ceil( vis / len ) ) );
+ }
+
+
+
+ /**
+ * Draw the table for the first time, adding all required features
+ * @param {object} settings dataTables settings object
+ * @memberof DataTable#oApi
+ */
+ function _fnInitialise ( settings )
+ {
+ var i, iLen, iAjaxStart=settings.iInitDisplayStart;
+ var columns = settings.aoColumns, column;
+ var features = settings.oFeatures;
+ var deferLoading = settings.bDeferLoading; // value modified by the draw
+
+ /* Ensure that the table data is fully initialised */
+ if ( ! settings.bInitialised ) {
+ setTimeout( function(){ _fnInitialise( settings ); }, 200 );
+ return;
+ }
+
+ /* Show the display HTML options */
+ _fnAddOptionsHtml( settings );
+
+ /* Build and draw the header / footer for the table */
+ _fnBuildHead( settings );
+ _fnDrawHead( settings, settings.aoHeader );
+ _fnDrawHead( settings, settings.aoFooter );
+
+ /* Okay to show that something is going on now */
+ _fnProcessingDisplay( settings, true );
+
+ /* Calculate sizes for columns */
+ if ( features.bAutoWidth ) {
+ _fnCalculateColumnWidths( settings );
+ }
+
+ for ( i=0, iLen=columns.length ; i', {
+ 'name': tableId+'_length',
+ 'aria-controls': tableId,
+ 'class': classes.sLengthSelect
+ } );
+
+ for ( var i=0, ien=lengths.length ; i ').addClass( classes.sLength );
+ if ( ! settings.aanFeatures.l ) {
+ div[0].id = tableId+'_length';
+ }
+
+ div.children().append(
+ settings.oLanguage.sLengthMenu.replace( '_MENU_', select[0].outerHTML )
+ );
+
+ // Can't use `select` variable as user might provide their own and the
+ // reference is broken by the use of outerHTML
+ $('select', div)
+ .val( settings._iDisplayLength )
+ .on( 'change.DT', function(e) {
+ _fnLengthChange( settings, $(this).val() );
+ _fnDraw( settings );
+ } );
+
+ // Update node value whenever anything changes the table's length
+ $(settings.nTable).on( 'length.dt.DT', function (e, s, len) {
+ if ( settings === s ) {
+ $('select', div).val( len );
+ }
+ } );
+
+ return div[0];
+ }
+
+
+
+ /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Note that most of the paging logic is done in
+ * DataTable.ext.pager
+ */
+
+ /**
+ * Generate the node required for default pagination
+ * @param {object} oSettings dataTables settings object
+ * @returns {node} Pagination feature node
+ * @memberof DataTable#oApi
+ */
+ function _fnFeatureHtmlPaginate ( settings )
+ {
+ var
+ type = settings.sPaginationType,
+ plugin = DataTable.ext.pager[ type ],
+ modern = typeof plugin === 'function',
+ redraw = function( settings ) {
+ _fnDraw( settings );
+ },
+ node = $('
').addClass( settings.oClasses.sPaging + type )[0],
+ features = settings.aanFeatures;
+
+ if ( ! modern ) {
+ plugin.fnInit( settings, node, redraw );
+ }
+
+ /* Add a draw callback for the pagination on first instance, to update the paging display */
+ if ( ! features.p )
+ {
+ node.id = settings.sTableId+'_paginate';
+
+ settings.aoDrawCallback.push( {
+ "fn": function( settings ) {
+ if ( modern ) {
+ var
+ start = settings._iDisplayStart,
+ len = settings._iDisplayLength,
+ visRecords = settings.fnRecordsDisplay(),
+ all = len === -1,
+ page = all ? 0 : Math.ceil( start / len ),
+ pages = all ? 1 : Math.ceil( visRecords / len ),
+ buttons = plugin(page, pages),
+ i, ien;
+
+ for ( i=0, ien=features.p.length ; i records )
+ {
+ start = 0;
+ }
+ }
+ else if ( action == "first" )
+ {
+ start = 0;
+ }
+ else if ( action == "previous" )
+ {
+ start = len >= 0 ?
+ start - len :
+ 0;
+
+ if ( start < 0 )
+ {
+ start = 0;
+ }
+ }
+ else if ( action == "next" )
+ {
+ if ( start + len < records )
+ {
+ start += len;
+ }
+ }
+ else if ( action == "last" )
+ {
+ start = Math.floor( (records-1) / len) * len;
+ }
+ else
+ {
+ _fnLog( settings, 0, "Unknown paging action: "+action, 5 );
+ }
+
+ var changed = settings._iDisplayStart !== start;
+ settings._iDisplayStart = start;
+
+ if ( changed ) {
+ _fnCallbackFire( settings, null, 'page', [settings] );
+
+ if ( redraw ) {
+ _fnDraw( settings );
+ }
+ }
+
+ return changed;
+ }
+
+
+
+ /**
+ * Generate the node required for the processing node
+ * @param {object} settings dataTables settings object
+ * @returns {node} Processing element
+ * @memberof DataTable#oApi
+ */
+ function _fnFeatureHtmlProcessing ( settings )
+ {
+ return $('
', {
+ 'id': ! settings.aanFeatures.r ? settings.sTableId+'_processing' : null,
+ 'class': settings.oClasses.sProcessing
+ } )
+ .html( settings.oLanguage.sProcessing )
+ .insertBefore( settings.nTable )[0];
+ }
+
+
+ /**
+ * Display or hide the processing indicator
+ * @param {object} settings dataTables settings object
+ * @param {bool} show Show the processing indicator (true) or not (false)
+ * @memberof DataTable#oApi
+ */
+ function _fnProcessingDisplay ( settings, show )
+ {
+ if ( settings.oFeatures.bProcessing ) {
+ $(settings.aanFeatures.r).css( 'display', show ? 'block' : 'none' );
+ }
+
+ _fnCallbackFire( settings, null, 'processing', [settings, show] );
+ }
+
+ /**
+ * Add any control elements for the table - specifically scrolling
+ * @param {object} settings dataTables settings object
+ * @returns {node} Node to add to the DOM
+ * @memberof DataTable#oApi
+ */
+ function _fnFeatureHtmlTable ( settings )
+ {
+ var table = $(settings.nTable);
+
+ // Add the ARIA grid role to the table
+ table.attr( 'role', 'grid' );
+
+ // Scrolling from here on in
+ var scroll = settings.oScroll;
+
+ if ( scroll.sX === '' && scroll.sY === '' ) {
+ return settings.nTable;
+ }
+
+ var scrollX = scroll.sX;
+ var scrollY = scroll.sY;
+ var classes = settings.oClasses;
+ var caption = table.children('caption');
+ var captionSide = caption.length ? caption[0]._captionSide : null;
+ var headerClone = $( table[0].cloneNode(false) );
+ var footerClone = $( table[0].cloneNode(false) );
+ var footer = table.children('tfoot');
+ var _div = '
';
+ var size = function ( s ) {
+ return !s ? null : _fnStringToCss( s );
+ };
+
+ if ( ! footer.length ) {
+ footer = null;
+ }
+
+ /*
+ * The HTML structure that we want to generate in this function is:
+ * div - scroller
+ * div - scroll head
+ * div - scroll head inner
+ * table - scroll head table
+ * thead - thead
+ * div - scroll body
+ * table - table (master table)
+ * thead - thead clone for sizing
+ * tbody - tbody
+ * div - scroll foot
+ * div - scroll foot inner
+ * table - scroll foot table
+ * tfoot - tfoot
+ */
+ var scroller = $( _div, { 'class': classes.sScrollWrapper } )
+ .append(
+ $(_div, { 'class': classes.sScrollHead } )
+ .css( {
+ overflow: 'hidden',
+ position: 'relative',
+ border: 0,
+ width: scrollX ? size(scrollX) : '100%'
+ } )
+ .append(
+ $(_div, { 'class': classes.sScrollHeadInner } )
+ .css( {
+ 'box-sizing': 'content-box',
+ width: scroll.sXInner || '100%'
+ } )
+ .append(
+ headerClone
+ .removeAttr('id')
+ .css( 'margin-left', 0 )
+ .append( captionSide === 'top' ? caption : null )
+ .append(
+ table.children('thead')
+ )
+ )
+ )
+ )
+ .append(
+ $(_div, { 'class': classes.sScrollBody } )
+ .css( {
+ position: 'relative',
+ overflow: 'auto',
+ width: size( scrollX )
+ } )
+ .append( table )
+ );
+
+ if ( footer ) {
+ scroller.append(
+ $(_div, { 'class': classes.sScrollFoot } )
+ .css( {
+ overflow: 'hidden',
+ border: 0,
+ width: scrollX ? size(scrollX) : '100%'
+ } )
+ .append(
+ $(_div, { 'class': classes.sScrollFootInner } )
+ .append(
+ footerClone
+ .removeAttr('id')
+ .css( 'margin-left', 0 )
+ .append( captionSide === 'bottom' ? caption : null )
+ .append(
+ table.children('tfoot')
+ )
+ )
+ )
+ );
+ }
+
+ var children = scroller.children();
+ var scrollHead = children[0];
+ var scrollBody = children[1];
+ var scrollFoot = footer ? children[2] : null;
+
+ // When the body is scrolled, then we also want to scroll the headers
+ if ( scrollX ) {
+ $(scrollBody).on( 'scroll.DT', function (e) {
+ var scrollLeft = this.scrollLeft;
+
+ scrollHead.scrollLeft = scrollLeft;
+
+ if ( footer ) {
+ scrollFoot.scrollLeft = scrollLeft;
+ }
+ } );
+ }
+
+ $(scrollBody).css(
+ scrollY && scroll.bCollapse ? 'max-height' : 'height',
+ scrollY
+ );
+
+ settings.nScrollHead = scrollHead;
+ settings.nScrollBody = scrollBody;
+ settings.nScrollFoot = scrollFoot;
+
+ // On redraw - align columns
+ settings.aoDrawCallback.push( {
+ "fn": _fnScrollDraw,
+ "sName": "scrolling"
+ } );
+
+ return scroller[0];
+ }
+
+
+
+ /**
+ * Update the header, footer and body tables for resizing - i.e. column
+ * alignment.
+ *
+ * Welcome to the most horrible function DataTables. The process that this
+ * function follows is basically:
+ * 1. Re-create the table inside the scrolling div
+ * 2. Take live measurements from the DOM
+ * 3. Apply the measurements to align the columns
+ * 4. Clean up
+ *
+ * @param {object} settings dataTables settings object
+ * @memberof DataTable#oApi
+ */
+ function _fnScrollDraw ( settings )
+ {
+ // Given that this is such a monster function, a lot of variables are use
+ // to try and keep the minimised size as small as possible
+ var
+ scroll = settings.oScroll,
+ scrollX = scroll.sX,
+ scrollXInner = scroll.sXInner,
+ scrollY = scroll.sY,
+ barWidth = scroll.iBarWidth,
+ divHeader = $(settings.nScrollHead),
+ divHeaderStyle = divHeader[0].style,
+ divHeaderInner = divHeader.children('div'),
+ divHeaderInnerStyle = divHeaderInner[0].style,
+ divHeaderTable = divHeaderInner.children('table'),
+ divBodyEl = settings.nScrollBody,
+ divBody = $(divBodyEl),
+ divBodyStyle = divBodyEl.style,
+ divFooter = $(settings.nScrollFoot),
+ divFooterInner = divFooter.children('div'),
+ divFooterTable = divFooterInner.children('table'),
+ header = $(settings.nTHead),
+ table = $(settings.nTable),
+ tableEl = table[0],
+ tableStyle = tableEl.style,
+ footer = settings.nTFoot ? $(settings.nTFoot) : null,
+ browser = settings.oBrowser,
+ ie67 = browser.bScrollOversize,
+ dtHeaderCells = _pluck( settings.aoColumns, 'nTh' ),
+ headerTrgEls, footerTrgEls,
+ headerSrcEls, footerSrcEls,
+ headerCopy, footerCopy,
+ headerWidths=[], footerWidths=[],
+ headerContent=[], footerContent=[],
+ idx, correction, sanityWidth,
+ zeroOut = function(nSizer) {
+ var style = nSizer.style;
+ style.paddingTop = "0";
+ style.paddingBottom = "0";
+ style.borderTopWidth = "0";
+ style.borderBottomWidth = "0";
+ style.height = 0;
+ };
+
+ // If the scrollbar visibility has changed from the last draw, we need to
+ // adjust the column sizes as the table width will have changed to account
+ // for the scrollbar
+ var scrollBarVis = divBodyEl.scrollHeight > divBodyEl.clientHeight;
+
+ if ( settings.scrollBarVis !== scrollBarVis && settings.scrollBarVis !== undefined ) {
+ settings.scrollBarVis = scrollBarVis;
+ _fnAdjustColumnSizing( settings );
+ return; // adjust column sizing will call this function again
+ }
+ else {
+ settings.scrollBarVis = scrollBarVis;
+ }
+
+ /*
+ * 1. Re-create the table inside the scrolling div
+ */
+
+ // Remove the old minimised thead and tfoot elements in the inner table
+ table.children('thead, tfoot').remove();
+
+ if ( footer ) {
+ footerCopy = footer.clone().prependTo( table );
+ footerTrgEls = footer.find('tr'); // the original tfoot is in its own table and must be sized
+ footerSrcEls = footerCopy.find('tr');
+ }
+
+ // Clone the current header and footer elements and then place it into the inner table
+ headerCopy = header.clone().prependTo( table );
+ headerTrgEls = header.find('tr'); // original header is in its own table
+ headerSrcEls = headerCopy.find('tr');
+ headerCopy.find('th, td').removeAttr('tabindex');
+
+
+ /*
+ * 2. Take live measurements from the DOM - do not alter the DOM itself!
+ */
+
+ // Remove old sizing and apply the calculated column widths
+ // Get the unique column headers in the newly created (cloned) header. We want to apply the
+ // calculated sizes to this header
+ if ( ! scrollX )
+ {
+ divBodyStyle.width = '100%';
+ divHeader[0].style.width = '100%';
+ }
+
+ $.each( _fnGetUniqueThs( settings, headerCopy ), function ( i, el ) {
+ idx = _fnVisibleToColumnIndex( settings, i );
+ el.style.width = settings.aoColumns[idx].sWidth;
+ } );
+
+ if ( footer ) {
+ _fnApplyToChildren( function(n) {
+ n.style.width = "";
+ }, footerSrcEls );
+ }
+
+ // Size the table as a whole
+ sanityWidth = table.outerWidth();
+ if ( scrollX === "" ) {
+ // No x scrolling
+ tableStyle.width = "100%";
+
+ // IE7 will make the width of the table when 100% include the scrollbar
+ // - which is shouldn't. When there is a scrollbar we need to take this
+ // into account.
+ if ( ie67 && (table.find('tbody').height() > divBodyEl.offsetHeight ||
+ divBody.css('overflow-y') == "scroll")
+ ) {
+ tableStyle.width = _fnStringToCss( table.outerWidth() - barWidth);
+ }
+
+ // Recalculate the sanity width
+ sanityWidth = table.outerWidth();
+ }
+ else if ( scrollXInner !== "" ) {
+ // legacy x scroll inner has been given - use it
+ tableStyle.width = _fnStringToCss(scrollXInner);
+
+ // Recalculate the sanity width
+ sanityWidth = table.outerWidth();
+ }
+
+ // Hidden header should have zero height, so remove padding and borders. Then
+ // set the width based on the real headers
+
+ // Apply all styles in one pass
+ _fnApplyToChildren( zeroOut, headerSrcEls );
+
+ // Read all widths in next pass
+ _fnApplyToChildren( function(nSizer) {
+ headerContent.push( nSizer.innerHTML );
+ headerWidths.push( _fnStringToCss( $(nSizer).css('width') ) );
+ }, headerSrcEls );
+
+ // Apply all widths in final pass
+ _fnApplyToChildren( function(nToSize, i) {
+ // Only apply widths to the DataTables detected header cells - this
+ // prevents complex headers from having contradictory sizes applied
+ if ( $.inArray( nToSize, dtHeaderCells ) !== -1 ) {
+ nToSize.style.width = headerWidths[i];
+ }
+ }, headerTrgEls );
+
+ $(headerSrcEls).height(0);
+
+ /* Same again with the footer if we have one */
+ if ( footer )
+ {
+ _fnApplyToChildren( zeroOut, footerSrcEls );
+
+ _fnApplyToChildren( function(nSizer) {
+ footerContent.push( nSizer.innerHTML );
+ footerWidths.push( _fnStringToCss( $(nSizer).css('width') ) );
+ }, footerSrcEls );
+
+ _fnApplyToChildren( function(nToSize, i) {
+ nToSize.style.width = footerWidths[i];
+ }, footerTrgEls );
+
+ $(footerSrcEls).height(0);
+ }
+
+
+ /*
+ * 3. Apply the measurements
+ */
+
+ // "Hide" the header and footer that we used for the sizing. We need to keep
+ // the content of the cell so that the width applied to the header and body
+ // both match, but we want to hide it completely. We want to also fix their
+ // width to what they currently are
+ _fnApplyToChildren( function(nSizer, i) {
+ nSizer.innerHTML = ''+headerContent[i]+'
';
+ nSizer.childNodes[0].style.height = "0";
+ nSizer.childNodes[0].style.overflow = "hidden";
+ nSizer.style.width = headerWidths[i];
+ }, headerSrcEls );
+
+ if ( footer )
+ {
+ _fnApplyToChildren( function(nSizer, i) {
+ nSizer.innerHTML = ''+footerContent[i]+'
';
+ nSizer.childNodes[0].style.height = "0";
+ nSizer.childNodes[0].style.overflow = "hidden";
+ nSizer.style.width = footerWidths[i];
+ }, footerSrcEls );
+ }
+
+ // Sanity check that the table is of a sensible width. If not then we are going to get
+ // misalignment - try to prevent this by not allowing the table to shrink below its min width
+ if ( table.outerWidth() < sanityWidth )
+ {
+ // The min width depends upon if we have a vertical scrollbar visible or not */
+ correction = ((divBodyEl.scrollHeight > divBodyEl.offsetHeight ||
+ divBody.css('overflow-y') == "scroll")) ?
+ sanityWidth+barWidth :
+ sanityWidth;
+
+ // IE6/7 are a law unto themselves...
+ if ( ie67 && (divBodyEl.scrollHeight >
+ divBodyEl.offsetHeight || divBody.css('overflow-y') == "scroll")
+ ) {
+ tableStyle.width = _fnStringToCss( correction-barWidth );
+ }
+
+ // And give the user a warning that we've stopped the table getting too small
+ if ( scrollX === "" || scrollXInner !== "" ) {
+ _fnLog( settings, 1, 'Possible column misalignment', 6 );
+ }
+ }
+ else
+ {
+ correction = '100%';
+ }
+
+ // Apply to the container elements
+ divBodyStyle.width = _fnStringToCss( correction );
+ divHeaderStyle.width = _fnStringToCss( correction );
+
+ if ( footer ) {
+ settings.nScrollFoot.style.width = _fnStringToCss( correction );
+ }
+
+
+ /*
+ * 4. Clean up
+ */
+ if ( ! scrollY ) {
+ /* IE7< puts a vertical scrollbar in place (when it shouldn't be) due to subtracting
+ * the scrollbar height from the visible display, rather than adding it on. We need to
+ * set the height in order to sort this. Don't want to do it in any other browsers.
+ */
+ if ( ie67 ) {
+ divBodyStyle.height = _fnStringToCss( tableEl.offsetHeight+barWidth );
+ }
+ }
+
+ /* Finally set the width's of the header and footer tables */
+ var iOuterWidth = table.outerWidth();
+ divHeaderTable[0].style.width = _fnStringToCss( iOuterWidth );
+ divHeaderInnerStyle.width = _fnStringToCss( iOuterWidth );
+
+ // Figure out if there are scrollbar present - if so then we need a the header and footer to
+ // provide a bit more space to allow "overflow" scrolling (i.e. past the scrollbar)
+ var bScrolling = table.height() > divBodyEl.clientHeight || divBody.css('overflow-y') == "scroll";
+ var padding = 'padding' + (browser.bScrollbarLeft ? 'Left' : 'Right' );
+ divHeaderInnerStyle[ padding ] = bScrolling ? barWidth+"px" : "0px";
+
+ if ( footer ) {
+ divFooterTable[0].style.width = _fnStringToCss( iOuterWidth );
+ divFooterInner[0].style.width = _fnStringToCss( iOuterWidth );
+ divFooterInner[0].style[padding] = bScrolling ? barWidth+"px" : "0px";
+ }
+
+ // Correct DOM ordering for colgroup - comes before the thead
+ table.children('colgroup').insertBefore( table.children('thead') );
+
+ /* Adjust the position of the header in case we loose the y-scrollbar */
+ divBody.scroll();
+
+ // If sorting or filtering has occurred, jump the scrolling back to the top
+ // only if we aren't holding the position
+ if ( (settings.bSorted || settings.bFiltered) && ! settings._drawHold ) {
+ divBodyEl.scrollTop = 0;
+ }
+ }
+
+
+
+ /**
+ * Apply a given function to the display child nodes of an element array (typically
+ * TD children of TR rows
+ * @param {function} fn Method to apply to the objects
+ * @param array {nodes} an1 List of elements to look through for display children
+ * @param array {nodes} an2 Another list (identical structure to the first) - optional
+ * @memberof DataTable#oApi
+ */
+ function _fnApplyToChildren( fn, an1, an2 )
+ {
+ var index=0, i=0, iLen=an1.length;
+ var nNode1, nNode2;
+
+ while ( i < iLen ) {
+ nNode1 = an1[i].firstChild;
+ nNode2 = an2 ? an2[i].firstChild : null;
+
+ while ( nNode1 ) {
+ if ( nNode1.nodeType === 1 ) {
+ if ( an2 ) {
+ fn( nNode1, nNode2, index );
+ }
+ else {
+ fn( nNode1, index );
+ }
+
+ index++;
+ }
+
+ nNode1 = nNode1.nextSibling;
+ nNode2 = an2 ? nNode2.nextSibling : null;
+ }
+
+ i++;
+ }
+ }
+
+
+
+ var __re_html_remove = /<.*?>/g;
+
+
+ /**
+ * Calculate the width of columns for the table
+ * @param {object} oSettings dataTables settings object
+ * @memberof DataTable#oApi
+ */
+ function _fnCalculateColumnWidths ( oSettings )
+ {
+ var
+ table = oSettings.nTable,
+ columns = oSettings.aoColumns,
+ scroll = oSettings.oScroll,
+ scrollY = scroll.sY,
+ scrollX = scroll.sX,
+ scrollXInner = scroll.sXInner,
+ columnCount = columns.length,
+ visibleColumns = _fnGetColumns( oSettings, 'bVisible' ),
+ headerCells = $('th', oSettings.nTHead),
+ tableWidthAttr = table.getAttribute('width'), // from DOM element
+ tableContainer = table.parentNode,
+ userInputs = false,
+ i, column, columnIdx, width, outerWidth,
+ browser = oSettings.oBrowser,
+ ie67 = browser.bScrollOversize;
+
+ var styleWidth = table.style.width;
+ if ( styleWidth && styleWidth.indexOf('%') !== -1 ) {
+ tableWidthAttr = styleWidth;
+ }
+
+ /* Convert any user input sizes into pixel sizes */
+ for ( i=0 ; i').appendTo( tmpTable.find('tbody') );
+
+ // Clone the table header and footer - we can't use the header / footer
+ // from the cloned table, since if scrolling is active, the table's
+ // real header and footer are contained in different table tags
+ tmpTable.find('thead, tfoot').remove();
+ tmpTable
+ .append( $(oSettings.nTHead).clone() )
+ .append( $(oSettings.nTFoot).clone() );
+
+ // Remove any assigned widths from the footer (from scrolling)
+ tmpTable.find('tfoot th, tfoot td').css('width', '');
+
+ // Apply custom sizing to the cloned header
+ headerCells = _fnGetUniqueThs( oSettings, tmpTable.find('thead')[0] );
+
+ for ( i=0 ; i ').css( {
+ width: column.sWidthOrig,
+ margin: 0,
+ padding: 0,
+ border: 0,
+ height: 1
+ } ) );
+ }
+ }
+
+ // Find the widest cell for each column and put it into the table
+ if ( oSettings.aoData.length ) {
+ for ( i=0 ; i').css( scrollX || scrollY ?
+ {
+ position: 'absolute',
+ top: 0,
+ left: 0,
+ height: 1,
+ right: 0,
+ overflow: 'hidden'
+ } :
+ {}
+ )
+ .append( tmpTable )
+ .appendTo( tableContainer );
+
+ // When scrolling (X or Y) we want to set the width of the table as
+ // appropriate. However, when not scrolling leave the table width as it
+ // is. This results in slightly different, but I think correct behaviour
+ if ( scrollX && scrollXInner ) {
+ tmpTable.width( scrollXInner );
+ }
+ else if ( scrollX ) {
+ tmpTable.css( 'width', 'auto' );
+ tmpTable.removeAttr('width');
+
+ // If there is no width attribute or style, then allow the table to
+ // collapse
+ if ( tmpTable.width() < tableContainer.clientWidth && tableWidthAttr ) {
+ tmpTable.width( tableContainer.clientWidth );
+ }
+ }
+ else if ( scrollY ) {
+ tmpTable.width( tableContainer.clientWidth );
+ }
+ else if ( tableWidthAttr ) {
+ tmpTable.width( tableWidthAttr );
+ }
+
+ // Get the width of each column in the constructed table - we need to
+ // know the inner width (so it can be assigned to the other table's
+ // cells) and the outer width so we can calculate the full width of the
+ // table. This is safe since DataTables requires a unique cell for each
+ // column, but if ever a header can span multiple columns, this will
+ // need to be modified.
+ var total = 0;
+ for ( i=0 ; i')
+ .css( 'width', _fnStringToCss( width ) )
+ .appendTo( parent || document.body );
+
+ var val = n[0].offsetWidth;
+ n.remove();
+
+ return val;
+ }
+
+
+ /**
+ * Get the widest node
+ * @param {object} settings dataTables settings object
+ * @param {int} colIdx column of interest
+ * @returns {node} widest table node
+ * @memberof DataTable#oApi
+ */
+ function _fnGetWidestNode( settings, colIdx )
+ {
+ var idx = _fnGetMaxLenString( settings, colIdx );
+ if ( idx < 0 ) {
+ return null;
+ }
+
+ var data = settings.aoData[ idx ];
+ return ! data.nTr ? // Might not have been created when deferred rendering
+ $(' ').html( _fnGetCellData( settings, idx, colIdx, 'display' ) )[0] :
+ data.anCells[ colIdx ];
+ }
+
+
+ /**
+ * Get the maximum strlen for each data column
+ * @param {object} settings dataTables settings object
+ * @param {int} colIdx column of interest
+ * @returns {string} max string length for each column
+ * @memberof DataTable#oApi
+ */
+ function _fnGetMaxLenString( settings, colIdx )
+ {
+ var s, max=-1, maxIdx = -1;
+
+ for ( var i=0, ien=settings.aoData.length ; i max ) {
+ max = s.length;
+ maxIdx = i;
+ }
+ }
+
+ return maxIdx;
+ }
+
+
+ /**
+ * Append a CSS unit (only if required) to a string
+ * @param {string} value to css-ify
+ * @returns {string} value with css unit
+ * @memberof DataTable#oApi
+ */
+ function _fnStringToCss( s )
+ {
+ if ( s === null ) {
+ return '0px';
+ }
+
+ if ( typeof s == 'number' ) {
+ return s < 0 ?
+ '0px' :
+ s+'px';
+ }
+
+ // Check it has a unit character already
+ return s.match(/\d$/) ?
+ s+'px' :
+ s;
+ }
+
+
+
+ function _fnSortFlatten ( settings )
+ {
+ var
+ i, iLen, k, kLen,
+ aSort = [],
+ aiOrig = [],
+ aoColumns = settings.aoColumns,
+ aDataSort, iCol, sType, srcCol,
+ fixed = settings.aaSortingFixed,
+ fixedObj = $.isPlainObject( fixed ),
+ nestedSort = [],
+ add = function ( a ) {
+ if ( a.length && ! $.isArray( a[0] ) ) {
+ // 1D array
+ nestedSort.push( a );
+ }
+ else {
+ // 2D array
+ $.merge( nestedSort, a );
+ }
+ };
+
+ // Build the sort array, with pre-fix and post-fix options if they have been
+ // specified
+ if ( $.isArray( fixed ) ) {
+ add( fixed );
+ }
+
+ if ( fixedObj && fixed.pre ) {
+ add( fixed.pre );
+ }
+
+ add( settings.aaSorting );
+
+ if (fixedObj && fixed.post ) {
+ add( fixed.post );
+ }
+
+ for ( i=0 ; iy ? 1 : 0;
+ if ( test !== 0 ) {
+ return sort.dir === 'asc' ? test : -test;
+ }
+ }
+
+ x = aiOrig[a];
+ y = aiOrig[b];
+ return xy ? 1 : 0;
+ } );
+ }
+ else {
+ // Depreciated - remove in 1.11 (providing a plug-in option)
+ // Not all sort types have formatting methods, so we have to call their sorting
+ // methods.
+ displayMaster.sort( function ( a, b ) {
+ var
+ x, y, k, l, test, sort, fn,
+ len=aSort.length,
+ dataA = aoData[a]._aSortData,
+ dataB = aoData[b]._aSortData;
+
+ for ( k=0 ; ky ? 1 : 0;
+ } );
+ }
+ }
+
+ /* Tell the draw function that we have sorted the data */
+ oSettings.bSorted = true;
+ }
+
+
+ function _fnSortAria ( settings )
+ {
+ var label;
+ var nextSort;
+ var columns = settings.aoColumns;
+ var aSort = _fnSortFlatten( settings );
+ var oAria = settings.oLanguage.oAria;
+
+ // ARIA attributes - need to loop all columns, to update all (removing old
+ // attributes as needed)
+ for ( var i=0, iLen=columns.length ; i/g, "" );
+ var th = col.nTh;
+
+ // IE7 is throwing an error when setting these properties with jQuery's
+ // attr() and removeAttr() methods...
+ th.removeAttribute('aria-sort');
+
+ /* In ARIA only the first sorting column can be marked as sorting - no multi-sort option */
+ if ( col.bSortable ) {
+ if ( aSort.length > 0 && aSort[0].col == i ) {
+ th.setAttribute('aria-sort', aSort[0].dir=="asc" ? "ascending" : "descending" );
+ nextSort = asSorting[ aSort[0].index+1 ] || asSorting[0];
+ }
+ else {
+ nextSort = asSorting[0];
+ }
+
+ label = sTitle + ( nextSort === "asc" ?
+ oAria.sSortAscending :
+ oAria.sSortDescending
+ );
+ }
+ else {
+ label = sTitle;
+ }
+
+ th.setAttribute('aria-label', label);
+ }
+ }
+
+
+ /**
+ * Function to run on user sort request
+ * @param {object} settings dataTables settings object
+ * @param {node} attachTo node to attach the handler to
+ * @param {int} colIdx column sorting index
+ * @param {boolean} [append=false] Append the requested sort to the existing
+ * sort if true (i.e. multi-column sort)
+ * @param {function} [callback] callback function
+ * @memberof DataTable#oApi
+ */
+ function _fnSortListener ( settings, colIdx, append, callback )
+ {
+ var col = settings.aoColumns[ colIdx ];
+ var sorting = settings.aaSorting;
+ var asSorting = col.asSorting;
+ var nextSortIdx;
+ var next = function ( a, overflow ) {
+ var idx = a._idx;
+ if ( idx === undefined ) {
+ idx = $.inArray( a[1], asSorting );
+ }
+
+ return idx+1 < asSorting.length ?
+ idx+1 :
+ overflow ?
+ null :
+ 0;
+ };
+
+ // Convert to 2D array if needed
+ if ( typeof sorting[0] === 'number' ) {
+ sorting = settings.aaSorting = [ sorting ];
+ }
+
+ // If appending the sort then we are multi-column sorting
+ if ( append && settings.oFeatures.bSortMulti ) {
+ // Are we already doing some kind of sort on this column?
+ var sortIdx = $.inArray( colIdx, _pluck(sorting, '0') );
+
+ if ( sortIdx !== -1 ) {
+ // Yes, modify the sort
+ nextSortIdx = next( sorting[sortIdx], true );
+
+ if ( nextSortIdx === null && sorting.length === 1 ) {
+ nextSortIdx = 0; // can't remove sorting completely
+ }
+
+ if ( nextSortIdx === null ) {
+ sorting.splice( sortIdx, 1 );
+ }
+ else {
+ sorting[sortIdx][1] = asSorting[ nextSortIdx ];
+ sorting[sortIdx]._idx = nextSortIdx;
+ }
+ }
+ else {
+ // No sort on this column yet
+ sorting.push( [ colIdx, asSorting[0], 0 ] );
+ sorting[sorting.length-1]._idx = 0;
+ }
+ }
+ else if ( sorting.length && sorting[0][0] == colIdx ) {
+ // Single column - already sorting on this column, modify the sort
+ nextSortIdx = next( sorting[0] );
+
+ sorting.length = 1;
+ sorting[0][1] = asSorting[ nextSortIdx ];
+ sorting[0]._idx = nextSortIdx;
+ }
+ else {
+ // Single column - sort only on this column
+ sorting.length = 0;
+ sorting.push( [ colIdx, asSorting[0] ] );
+ sorting[0]._idx = 0;
+ }
+
+ // Run the sort by calling a full redraw
+ _fnReDraw( settings );
+
+ // callback used for async user interaction
+ if ( typeof callback == 'function' ) {
+ callback( settings );
+ }
+ }
+
+
+ /**
+ * Attach a sort handler (click) to a node
+ * @param {object} settings dataTables settings object
+ * @param {node} attachTo node to attach the handler to
+ * @param {int} colIdx column sorting index
+ * @param {function} [callback] callback function
+ * @memberof DataTable#oApi
+ */
+ function _fnSortAttachListener ( settings, attachTo, colIdx, callback )
+ {
+ var col = settings.aoColumns[ colIdx ];
+
+ _fnBindAction( attachTo, {}, function (e) {
+ /* If the column is not sortable - don't to anything */
+ if ( col.bSortable === false ) {
+ return;
+ }
+
+ // If processing is enabled use a timeout to allow the processing
+ // display to be shown - otherwise to it synchronously
+ if ( settings.oFeatures.bProcessing ) {
+ _fnProcessingDisplay( settings, true );
+
+ setTimeout( function() {
+ _fnSortListener( settings, colIdx, e.shiftKey, callback );
+
+ // In server-side processing, the draw callback will remove the
+ // processing display
+ if ( _fnDataSource( settings ) !== 'ssp' ) {
+ _fnProcessingDisplay( settings, false );
+ }
+ }, 0 );
+ }
+ else {
+ _fnSortListener( settings, colIdx, e.shiftKey, callback );
+ }
+ } );
+ }
+
+
+ /**
+ * Set the sorting classes on table's body, Note: it is safe to call this function
+ * when bSort and bSortClasses are false
+ * @param {object} oSettings dataTables settings object
+ * @memberof DataTable#oApi
+ */
+ function _fnSortingClasses( settings )
+ {
+ var oldSort = settings.aLastSort;
+ var sortClass = settings.oClasses.sSortColumn;
+ var sort = _fnSortFlatten( settings );
+ var features = settings.oFeatures;
+ var i, ien, colIdx;
+
+ if ( features.bSort && features.bSortClasses ) {
+ // Remove old sorting classes
+ for ( i=0, ien=oldSort.length ; i 0 && s.time < +new Date() - (duration*1000) ) {
+ callback();
+ return;
+ }
+
+ // Number of columns have changed - all bets are off, no restore of settings
+ if ( s.columns && columns.length !== s.columns.length ) {
+ callback();
+ return;
+ }
+
+ // Store the saved state so it might be accessed at any time
+ settings.oLoadedState = $.extend( true, {}, s );
+
+ // Restore key features - todo - for 1.11 this needs to be done by
+ // subscribed events
+ if ( s.start !== undefined ) {
+ settings._iDisplayStart = s.start;
+ settings.iInitDisplayStart = s.start;
+ }
+ if ( s.length !== undefined ) {
+ settings._iDisplayLength = s.length;
+ }
+
+ // Order
+ if ( s.order !== undefined ) {
+ settings.aaSorting = [];
+ $.each( s.order, function ( i, col ) {
+ settings.aaSorting.push( col[0] >= columns.length ?
+ [ 0, col[1] ] :
+ col
+ );
+ } );
+ }
+
+ // Search
+ if ( s.search !== undefined ) {
+ $.extend( settings.oPreviousSearch, _fnSearchToHung( s.search ) );
+ }
+
+ // Columns
+ //
+ if ( s.columns ) {
+ for ( i=0, ien=s.columns.length ; i= end )
+ {
+ start = end - len;
+ }
+
+ // Keep the start record on the current page
+ start -= (start % len);
+
+ if ( len === -1 || start < 0 )
+ {
+ start = 0;
+ }
+
+ settings._iDisplayStart = start;
+ }
+
+
+ function _fnRenderer( settings, type )
+ {
+ var renderer = settings.renderer;
+ var host = DataTable.ext.renderer[type];
+
+ if ( $.isPlainObject( renderer ) && renderer[type] ) {
+ // Specific renderer for this type. If available use it, otherwise use
+ // the default.
+ return host[renderer[type]] || host._;
+ }
+ else if ( typeof renderer === 'string' ) {
+ // Common renderer - if there is one available for this type use it,
+ // otherwise use the default
+ return host[renderer] || host._;
+ }
+
+ // Use the default
+ return host._;
+ }
+
+
+ /**
+ * Detect the data source being used for the table. Used to simplify the code
+ * a little (ajax) and to make it compress a little smaller.
+ *
+ * @param {object} settings dataTables settings object
+ * @returns {string} Data source
+ * @memberof DataTable#oApi
+ */
+ function _fnDataSource ( settings )
+ {
+ if ( settings.oFeatures.bServerSide ) {
+ return 'ssp';
+ }
+ else if ( settings.ajax || settings.sAjaxSource ) {
+ return 'ajax';
+ }
+ return 'dom';
+ }
+
+
+
+
+ /**
+ * Computed structure of the DataTables API, defined by the options passed to
+ * `DataTable.Api.register()` when building the API.
+ *
+ * The structure is built in order to speed creation and extension of the Api
+ * objects since the extensions are effectively pre-parsed.
+ *
+ * The array is an array of objects with the following structure, where this
+ * base array represents the Api prototype base:
+ *
+ * [
+ * {
+ * name: 'data' -- string - Property name
+ * val: function () {}, -- function - Api method (or undefined if just an object
+ * methodExt: [ ... ], -- array - Array of Api object definitions to extend the method result
+ * propExt: [ ... ] -- array - Array of Api object definitions to extend the property
+ * },
+ * {
+ * name: 'row'
+ * val: {},
+ * methodExt: [ ... ],
+ * propExt: [
+ * {
+ * name: 'data'
+ * val: function () {},
+ * methodExt: [ ... ],
+ * propExt: [ ... ]
+ * },
+ * ...
+ * ]
+ * }
+ * ]
+ *
+ * @type {Array}
+ * @ignore
+ */
+ var __apiStruct = [];
+
+
+ /**
+ * `Array.prototype` reference.
+ *
+ * @type object
+ * @ignore
+ */
+ var __arrayProto = Array.prototype;
+
+
+ /**
+ * Abstraction for `context` parameter of the `Api` constructor to allow it to
+ * take several different forms for ease of use.
+ *
+ * Each of the input parameter types will be converted to a DataTables settings
+ * object where possible.
+ *
+ * @param {string|node|jQuery|object} mixed DataTable identifier. Can be one
+ * of:
+ *
+ * * `string` - jQuery selector. Any DataTables' matching the given selector
+ * with be found and used.
+ * * `node` - `TABLE` node which has already been formed into a DataTable.
+ * * `jQuery` - A jQuery object of `TABLE` nodes.
+ * * `object` - DataTables settings object
+ * * `DataTables.Api` - API instance
+ * @return {array|null} Matching DataTables settings objects. `null` or
+ * `undefined` is returned if no matching DataTable is found.
+ * @ignore
+ */
+ var _toSettings = function ( mixed )
+ {
+ var idx, jq;
+ var settings = DataTable.settings;
+ var tables = $.map( settings, function (el, i) {
+ return el.nTable;
+ } );
+
+ if ( ! mixed ) {
+ return [];
+ }
+ else if ( mixed.nTable && mixed.oApi ) {
+ // DataTables settings object
+ return [ mixed ];
+ }
+ else if ( mixed.nodeName && mixed.nodeName.toLowerCase() === 'table' ) {
+ // Table node
+ idx = $.inArray( mixed, tables );
+ return idx !== -1 ? [ settings[idx] ] : null;
+ }
+ else if ( mixed && typeof mixed.settings === 'function' ) {
+ return mixed.settings().toArray();
+ }
+ else if ( typeof mixed === 'string' ) {
+ // jQuery selector
+ jq = $(mixed);
+ }
+ else if ( mixed instanceof $ ) {
+ // jQuery object (also DataTables instance)
+ jq = mixed;
+ }
+
+ if ( jq ) {
+ return jq.map( function(i) {
+ idx = $.inArray( this, tables );
+ return idx !== -1 ? settings[idx] : null;
+ } ).toArray();
+ }
+ };
+
+
+ /**
+ * DataTables API class - used to control and interface with one or more
+ * DataTables enhanced tables.
+ *
+ * The API class is heavily based on jQuery, presenting a chainable interface
+ * that you can use to interact with tables. Each instance of the API class has
+ * a "context" - i.e. the tables that it will operate on. This could be a single
+ * table, all tables on a page or a sub-set thereof.
+ *
+ * Additionally the API is designed to allow you to easily work with the data in
+ * the tables, retrieving and manipulating it as required. This is done by
+ * presenting the API class as an array like interface. The contents of the
+ * array depend upon the actions requested by each method (for example
+ * `rows().nodes()` will return an array of nodes, while `rows().data()` will
+ * return an array of objects or arrays depending upon your table's
+ * configuration). The API object has a number of array like methods (`push`,
+ * `pop`, `reverse` etc) as well as additional helper methods (`each`, `pluck`,
+ * `unique` etc) to assist your working with the data held in a table.
+ *
+ * Most methods (those which return an Api instance) are chainable, which means
+ * the return from a method call also has all of the methods available that the
+ * top level object had. For example, these two calls are equivalent:
+ *
+ * // Not chained
+ * api.row.add( {...} );
+ * api.draw();
+ *
+ * // Chained
+ * api.row.add( {...} ).draw();
+ *
+ * @class DataTable.Api
+ * @param {array|object|string|jQuery} context DataTable identifier. This is
+ * used to define which DataTables enhanced tables this API will operate on.
+ * Can be one of:
+ *
+ * * `string` - jQuery selector. Any DataTables' matching the given selector
+ * with be found and used.
+ * * `node` - `TABLE` node which has already been formed into a DataTable.
+ * * `jQuery` - A jQuery object of `TABLE` nodes.
+ * * `object` - DataTables settings object
+ * @param {array} [data] Data to initialise the Api instance with.
+ *
+ * @example
+ * // Direct initialisation during DataTables construction
+ * var api = $('#example').DataTable();
+ *
+ * @example
+ * // Initialisation using a DataTables jQuery object
+ * var api = $('#example').dataTable().api();
+ *
+ * @example
+ * // Initialisation as a constructor
+ * var api = new $.fn.DataTable.Api( 'table.dataTable' );
+ */
+ _Api = function ( context, data )
+ {
+ if ( ! (this instanceof _Api) ) {
+ return new _Api( context, data );
+ }
+
+ var settings = [];
+ var ctxSettings = function ( o ) {
+ var a = _toSettings( o );
+ if ( a ) {
+ settings = settings.concat( a );
+ }
+ };
+
+ if ( $.isArray( context ) ) {
+ for ( var i=0, ien=context.length ; i idx ?
+ new _Api( ctx[idx], this[idx] ) :
+ null;
+ },
+
+
+ filter: function ( fn )
+ {
+ var a = [];
+
+ if ( __arrayProto.filter ) {
+ a = __arrayProto.filter.call( this, fn, this );
+ }
+ else {
+ // Compatibility for browsers without EMCA-252-5 (JS 1.6)
+ for ( var i=0, ien=this.length ; i 0 ) {
+ return ctx[0].json;
+ }
+
+ // else return undefined;
+ } );
+
+
+ /**
+ * Get the data submitted in the last Ajax request
+ */
+ _api_register( 'ajax.params()', function () {
+ var ctx = this.context;
+
+ if ( ctx.length > 0 ) {
+ return ctx[0].oAjaxData;
+ }
+
+ // else return undefined;
+ } );
+
+
+ /**
+ * Reload tables from the Ajax data source. Note that this function will
+ * automatically re-draw the table when the remote data has been loaded.
+ *
+ * @param {boolean} [reset=true] Reset (default) or hold the current paging
+ * position. A full re-sort and re-filter is performed when this method is
+ * called, which is why the pagination reset is the default action.
+ * @returns {DataTables.Api} this
+ */
+ _api_register( 'ajax.reload()', function ( callback, resetPaging ) {
+ return this.iterator( 'table', function (settings) {
+ __reload( settings, resetPaging===false, callback );
+ } );
+ } );
+
+
+ /**
+ * Get the current Ajax URL. Note that this returns the URL from the first
+ * table in the current context.
+ *
+ * @return {string} Current Ajax source URL
+ *//**
+ * Set the Ajax URL. Note that this will set the URL for all tables in the
+ * current context.
+ *
+ * @param {string} url URL to set.
+ * @returns {DataTables.Api} this
+ */
+ _api_register( 'ajax.url()', function ( url ) {
+ var ctx = this.context;
+
+ if ( url === undefined ) {
+ // get
+ if ( ctx.length === 0 ) {
+ return undefined;
+ }
+ ctx = ctx[0];
+
+ return ctx.ajax ?
+ $.isPlainObject( ctx.ajax ) ?
+ ctx.ajax.url :
+ ctx.ajax :
+ ctx.sAjaxSource;
+ }
+
+ // set
+ return this.iterator( 'table', function ( settings ) {
+ if ( $.isPlainObject( settings.ajax ) ) {
+ settings.ajax.url = url;
+ }
+ else {
+ settings.ajax = url;
+ }
+ // No need to consider sAjaxSource here since DataTables gives priority
+ // to `ajax` over `sAjaxSource`. So setting `ajax` here, renders any
+ // value of `sAjaxSource` redundant.
+ } );
+ } );
+
+
+ /**
+ * Load data from the newly set Ajax URL. Note that this method is only
+ * available when `ajax.url()` is used to set a URL. Additionally, this method
+ * has the same effect as calling `ajax.reload()` but is provided for
+ * convenience when setting a new URL. Like `ajax.reload()` it will
+ * automatically redraw the table once the remote data has been loaded.
+ *
+ * @returns {DataTables.Api} this
+ */
+ _api_register( 'ajax.url().load()', function ( callback, resetPaging ) {
+ // Same as a reload, but makes sense to present it for easy access after a
+ // url change
+ return this.iterator( 'table', function ( ctx ) {
+ __reload( ctx, resetPaging===false, callback );
+ } );
+ } );
+
+
+
+
+ var _selector_run = function ( type, selector, selectFn, settings, opts )
+ {
+ var
+ out = [], res,
+ a, i, ien, j, jen,
+ selectorType = typeof selector;
+
+ // Can't just check for isArray here, as an API or jQuery instance might be
+ // given with their array like look
+ if ( ! selector || selectorType === 'string' || selectorType === 'function' || selector.length === undefined ) {
+ selector = [ selector ];
+ }
+
+ for ( i=0, ien=selector.length ; i 0 ) {
+ // Assign the first element to the first item in the instance
+ // and truncate the instance and context
+ inst[0] = inst[i];
+ inst[0].length = 1;
+ inst.length = 1;
+ inst.context = [ inst.context[i] ];
+
+ return inst;
+ }
+ }
+
+ // Not found - return an empty instance
+ inst.length = 0;
+ return inst;
+ };
+
+
+ var _selector_row_indexes = function ( settings, opts )
+ {
+ var
+ i, ien, tmp, a=[],
+ displayFiltered = settings.aiDisplay,
+ displayMaster = settings.aiDisplayMaster;
+
+ var
+ search = opts.search, // none, applied, removed
+ order = opts.order, // applied, current, index (original - compatibility with 1.9)
+ page = opts.page; // all, current
+
+ if ( _fnDataSource( settings ) == 'ssp' ) {
+ // In server-side processing mode, most options are irrelevant since
+ // rows not shown don't exist and the index order is the applied order
+ // Removed is a special case - for consistency just return an empty
+ // array
+ return search === 'removed' ?
+ [] :
+ _range( 0, displayMaster.length );
+ }
+ else if ( page == 'current' ) {
+ // Current page implies that order=current and fitler=applied, since it is
+ // fairly senseless otherwise, regardless of what order and search actually
+ // are
+ for ( i=settings._iDisplayStart, ien=settings.fnDisplayEnd() ; i= 0 && search == 'applied') )
+ {
+ a.push( i );
+ }
+ }
+ }
+ }
+
+ return a;
+ };
+
+
+ /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Rows
+ *
+ * {} - no selector - use all available rows
+ * {integer} - row aoData index
+ * {node} - TR node
+ * {string} - jQuery selector to apply to the TR elements
+ * {array} - jQuery array of nodes, or simply an array of TR nodes
+ *
+ */
+ var __row_selector = function ( settings, selector, opts )
+ {
+ var rows;
+ var run = function ( sel ) {
+ var selInt = _intVal( sel );
+ var i, ien;
+ var aoData = settings.aoData;
+
+ // Short cut - selector is a number and no options provided (default is
+ // all records, so no need to check if the index is in there, since it
+ // must be - dev error if the index doesn't exist).
+ if ( selInt !== null && ! opts ) {
+ return [ selInt ];
+ }
+
+ if ( ! rows ) {
+ rows = _selector_row_indexes( settings, opts );
+ }
+
+ if ( selInt !== null && $.inArray( selInt, rows ) !== -1 ) {
+ // Selector - integer
+ return [ selInt ];
+ }
+ else if ( sel === null || sel === undefined || sel === '' ) {
+ // Selector - none
+ return rows;
+ }
+
+ // Selector - function
+ if ( typeof sel === 'function' ) {
+ return $.map( rows, function (idx) {
+ var row = aoData[ idx ];
+ return sel( idx, row._aData, row.nTr ) ? idx : null;
+ } );
+ }
+
+ // Selector - node
+ if ( sel.nodeName ) {
+ var rowIdx = sel._DT_RowIndex; // Property added by DT for fast lookup
+ var cellIdx = sel._DT_CellIndex;
+
+ if ( rowIdx !== undefined ) {
+ // Make sure that the row is actually still present in the table
+ return aoData[ rowIdx ] && aoData[ rowIdx ].nTr === sel ?
+ [ rowIdx ] :
+ [];
+ }
+ else if ( cellIdx ) {
+ return aoData[ cellIdx.row ] && aoData[ cellIdx.row ].nTr === sel ?
+ [ cellIdx.row ] :
+ [];
+ }
+ else {
+ var host = $(sel).closest('*[data-dt-row]');
+ return host.length ?
+ [ host.data('dt-row') ] :
+ [];
+ }
+ }
+
+ // ID selector. Want to always be able to select rows by id, regardless
+ // of if the tr element has been created or not, so can't rely upon
+ // jQuery here - hence a custom implementation. This does not match
+ // Sizzle's fast selector or HTML4 - in HTML5 the ID can be anything,
+ // but to select it using a CSS selector engine (like Sizzle or
+ // querySelect) it would need to need to be escaped for some characters.
+ // DataTables simplifies this for row selectors since you can select
+ // only a row. A # indicates an id any anything that follows is the id -
+ // unescaped.
+ if ( typeof sel === 'string' && sel.charAt(0) === '#' ) {
+ // get row index from id
+ var rowObj = settings.aIds[ sel.replace( /^#/, '' ) ];
+ if ( rowObj !== undefined ) {
+ return [ rowObj.idx ];
+ }
+
+ // need to fall through to jQuery in case there is DOM id that
+ // matches
+ }
+
+ // Get nodes in the order from the `rows` array with null values removed
+ var nodes = _removeEmpty(
+ _pluck_order( settings.aoData, rows, 'nTr' )
+ );
+
+ // Selector - jQuery selector string, array of nodes or jQuery object/
+ // As jQuery's .filter() allows jQuery objects to be passed in filter,
+ // it also allows arrays, so this will cope with all three options
+ return $(nodes)
+ .filter( sel )
+ .map( function () {
+ return this._DT_RowIndex;
+ } )
+ .toArray();
+ };
+
+ return _selector_run( 'row', selector, run, settings, opts );
+ };
+
+
+ _api_register( 'rows()', function ( selector, opts ) {
+ // argument shifting
+ if ( selector === undefined ) {
+ selector = '';
+ }
+ else if ( $.isPlainObject( selector ) ) {
+ opts = selector;
+ selector = '';
+ }
+
+ opts = _selector_opts( opts );
+
+ var inst = this.iterator( 'table', function ( settings ) {
+ return __row_selector( settings, selector, opts );
+ }, 1 );
+
+ // Want argument shifting here and in __row_selector?
+ inst.selector.rows = selector;
+ inst.selector.opts = opts;
+
+ return inst;
+ } );
+
+ _api_register( 'rows().nodes()', function () {
+ return this.iterator( 'row', function ( settings, row ) {
+ return settings.aoData[ row ].nTr || undefined;
+ }, 1 );
+ } );
+
+ _api_register( 'rows().data()', function () {
+ return this.iterator( true, 'rows', function ( settings, rows ) {
+ return _pluck_order( settings.aoData, rows, '_aData' );
+ }, 1 );
+ } );
+
+ _api_registerPlural( 'rows().cache()', 'row().cache()', function ( type ) {
+ return this.iterator( 'row', function ( settings, row ) {
+ var r = settings.aoData[ row ];
+ return type === 'search' ? r._aFilterData : r._aSortData;
+ }, 1 );
+ } );
+
+ _api_registerPlural( 'rows().invalidate()', 'row().invalidate()', function ( src ) {
+ return this.iterator( 'row', function ( settings, row ) {
+ _fnInvalidate( settings, row, src );
+ } );
+ } );
+
+ _api_registerPlural( 'rows().indexes()', 'row().index()', function () {
+ return this.iterator( 'row', function ( settings, row ) {
+ return row;
+ }, 1 );
+ } );
+
+ _api_registerPlural( 'rows().ids()', 'row().id()', function ( hash ) {
+ var a = [];
+ var context = this.context;
+
+ // `iterator` will drop undefined values, but in this case we want them
+ for ( var i=0, ien=context.length ; i 0 ) {
+ settings._iRecordsDisplay--;
+ }
+
+ // Check for an 'overflow' they case for displaying the table
+ _fnLengthOverflow( settings );
+
+ // Remove the row's ID reference if there is one
+ var id = settings.rowIdFn( rowData._aData );
+ if ( id !== undefined ) {
+ delete settings.aIds[ id ];
+ }
+ } );
+
+ this.iterator( 'table', function ( settings ) {
+ for ( var i=0, ien=settings.aoData.length ; i ').addClass( k );
+ $('td', created)
+ .addClass( k )
+ .html( r )
+ [0].colSpan = _fnVisbleColumns( ctx );
+
+ rows.push( created[0] );
+ }
+ };
+
+ addRow( data, klass );
+
+ if ( row._details ) {
+ row._details.detach();
+ }
+
+ row._details = $(rows);
+
+ // If the children were already shown, that state should be retained
+ if ( row._detailsShow ) {
+ row._details.insertAfter( row.nTr );
+ }
+ };
+
+
+ var __details_remove = function ( api, idx )
+ {
+ var ctx = api.context;
+
+ if ( ctx.length ) {
+ var row = ctx[0].aoData[ idx !== undefined ? idx : api[0] ];
+
+ if ( row && row._details ) {
+ row._details.remove();
+
+ row._detailsShow = undefined;
+ row._details = undefined;
+ }
+ }
+ };
+
+
+ var __details_display = function ( api, show ) {
+ var ctx = api.context;
+
+ if ( ctx.length && api.length ) {
+ var row = ctx[0].aoData[ api[0] ];
+
+ if ( row._details ) {
+ row._detailsShow = show;
+
+ if ( show ) {
+ row._details.insertAfter( row.nTr );
+ }
+ else {
+ row._details.detach();
+ }
+
+ __details_events( ctx[0] );
+ }
+ }
+ };
+
+
+ var __details_events = function ( settings )
+ {
+ var api = new _Api( settings );
+ var namespace = '.dt.DT_details';
+ var drawEvent = 'draw'+namespace;
+ var colvisEvent = 'column-visibility'+namespace;
+ var destroyEvent = 'destroy'+namespace;
+ var data = settings.aoData;
+
+ api.off( drawEvent +' '+ colvisEvent +' '+ destroyEvent );
+
+ if ( _pluck( data, '_details' ).length > 0 ) {
+ // On each draw, insert the required elements into the document
+ api.on( drawEvent, function ( e, ctx ) {
+ if ( settings !== ctx ) {
+ return;
+ }
+
+ api.rows( {page:'current'} ).eq(0).each( function (idx) {
+ // Internal data grab
+ var row = data[ idx ];
+
+ if ( row._detailsShow ) {
+ row._details.insertAfter( row.nTr );
+ }
+ } );
+ } );
+
+ // Column visibility change - update the colspan
+ api.on( colvisEvent, function ( e, ctx, idx, vis ) {
+ if ( settings !== ctx ) {
+ return;
+ }
+
+ // Update the colspan for the details rows (note, only if it already has
+ // a colspan)
+ var row, visible = _fnVisbleColumns( ctx );
+
+ for ( var i=0, ien=data.length ; i=0 count from left, <0 count from right)
+ * "{integer}:visIdx" - visible column index (i.e. translate to column index) (>=0 count from left, <0 count from right)
+ * "{integer}:visible" - alias for {integer}:visIdx (>=0 count from left, <0 count from right)
+ * "{string}:name" - column name
+ * "{string}" - jQuery selector on column header nodes
+ *
+ */
+
+ // can be an array of these items, comma separated list, or an array of comma
+ // separated lists
+
+ var __re_column_selector = /^([^:]+):(name|visIdx|visible)$/;
+
+
+ // r1 and r2 are redundant - but it means that the parameters match for the
+ // iterator callback in columns().data()
+ var __columnData = function ( settings, column, r1, r2, rows ) {
+ var a = [];
+ for ( var row=0, ien=rows.length ; row= 0 ?
+ selInt : // Count from left
+ columns.length + selInt // Count from right (+ because its a negative value)
+ ];
+ }
+
+ // Selector = function
+ if ( typeof s === 'function' ) {
+ var rows = _selector_row_indexes( settings, opts );
+
+ return $.map( columns, function (col, idx) {
+ return s(
+ idx,
+ __columnData( settings, idx, 0, 0, rows ),
+ nodes[ idx ]
+ ) ? idx : null;
+ } );
+ }
+
+ // jQuery or string selector
+ var match = typeof s === 'string' ?
+ s.match( __re_column_selector ) :
+ '';
+
+ if ( match ) {
+ switch( match[2] ) {
+ case 'visIdx':
+ case 'visible':
+ var idx = parseInt( match[1], 10 );
+ // Visible index given, convert to column index
+ if ( idx < 0 ) {
+ // Counting from the right
+ var visColumns = $.map( columns, function (col,i) {
+ return col.bVisible ? i : null;
+ } );
+ return [ visColumns[ visColumns.length + idx ] ];
+ }
+ // Counting from the left
+ return [ _fnVisibleToColumnIndex( settings, idx ) ];
+
+ case 'name':
+ // match by name. `names` is column index complete and in order
+ return $.map( names, function (name, i) {
+ return name === match[1] ? i : null;
+ } );
+
+ default:
+ return [];
+ }
+ }
+
+ // Cell in the table body
+ if ( s.nodeName && s._DT_CellIndex ) {
+ return [ s._DT_CellIndex.column ];
+ }
+
+ // jQuery selector on the TH elements for the columns
+ var jqResult = $( nodes )
+ .filter( s )
+ .map( function () {
+ return $.inArray( this, nodes ); // `nodes` is column index complete and in order
+ } )
+ .toArray();
+
+ if ( jqResult.length || ! s.nodeName ) {
+ return jqResult;
+ }
+
+ // Otherwise a node which might have a `dt-column` data attribute, or be
+ // a child or such an element
+ var host = $(s).closest('*[data-dt-column]');
+ return host.length ?
+ [ host.data('dt-column') ] :
+ [];
+ };
+
+ return _selector_run( 'column', selector, run, settings, opts );
+ };
+
+
+ var __setColumnVis = function ( settings, column, vis ) {
+ var
+ cols = settings.aoColumns,
+ col = cols[ column ],
+ data = settings.aoData,
+ row, cells, i, ien, tr;
+
+ // Get
+ if ( vis === undefined ) {
+ return col.bVisible;
+ }
+
+ // Set
+ // No change
+ if ( col.bVisible === vis ) {
+ return;
+ }
+
+ if ( vis ) {
+ // Insert column
+ // Need to decide if we should use appendChild or insertBefore
+ var insertBefore = $.inArray( true, _pluck(cols, 'bVisible'), column+1 );
+
+ for ( i=0, ien=data.length ; i iThat;
+ }
+
+ return true;
+ };
+
+
+ /**
+ * Check if a `` node is a DataTable table already or not.
+ *
+ * @param {node|jquery|string} table Table node, jQuery object or jQuery
+ * selector for the table to test. Note that if more than more than one
+ * table is passed on, only the first will be checked
+ * @returns {boolean} true the table given is a DataTable, or false otherwise
+ * @static
+ * @dtopt API-Static
+ *
+ * @example
+ * if ( ! $.fn.DataTable.isDataTable( '#example' ) ) {
+ * $('#example').dataTable();
+ * }
+ */
+ DataTable.isDataTable = DataTable.fnIsDataTable = function ( table )
+ {
+ var t = $(table).get(0);
+ var is = false;
+
+ if ( table instanceof DataTable.Api ) {
+ return true;
+ }
+
+ $.each( DataTable.settings, function (i, o) {
+ var head = o.nScrollHead ? $('table', o.nScrollHead)[0] : null;
+ var foot = o.nScrollFoot ? $('table', o.nScrollFoot)[0] : null;
+
+ if ( o.nTable === t || head === t || foot === t ) {
+ is = true;
+ }
+ } );
+
+ return is;
+ };
+
+
+ /**
+ * Get all DataTable tables that have been initialised - optionally you can
+ * select to get only currently visible tables.
+ *
+ * @param {boolean} [visible=false] Flag to indicate if you want all (default)
+ * or visible tables only.
+ * @returns {array} Array of `table` nodes (not DataTable instances) which are
+ * DataTables
+ * @static
+ * @dtopt API-Static
+ *
+ * @example
+ * $.each( $.fn.dataTable.tables(true), function () {
+ * $(table).DataTable().columns.adjust();
+ * } );
+ */
+ DataTable.tables = DataTable.fnTables = function ( visible )
+ {
+ var api = false;
+
+ if ( $.isPlainObject( visible ) ) {
+ api = visible.api;
+ visible = visible.visible;
+ }
+
+ var a = $.map( DataTable.settings, function (o) {
+ if ( !visible || (visible && $(o.nTable).is(':visible')) ) {
+ return o.nTable;
+ }
+ } );
+
+ return api ?
+ new _Api( a ) :
+ a;
+ };
+
+
+ /**
+ * Convert from camel case parameters to Hungarian notation. This is made public
+ * for the extensions to provide the same ability as DataTables core to accept
+ * either the 1.9 style Hungarian notation, or the 1.10+ style camelCase
+ * parameters.
+ *
+ * @param {object} src The model object which holds all parameters that can be
+ * mapped.
+ * @param {object} user The object to convert from camel case to Hungarian.
+ * @param {boolean} force When set to `true`, properties which already have a
+ * Hungarian value in the `user` object will be overwritten. Otherwise they
+ * won't be.
+ */
+ DataTable.camelToHungarian = _fnCamelToHungarian;
+
+
+
+ /**
+ *
+ */
+ _api_register( '$()', function ( selector, opts ) {
+ var
+ rows = this.rows( opts ).nodes(), // Get all rows
+ jqRows = $(rows);
+
+ return $( [].concat(
+ jqRows.filter( selector ).toArray(),
+ jqRows.find( selector ).toArray()
+ ) );
+ } );
+
+
+ // jQuery functions to operate on the tables
+ $.each( [ 'on', 'one', 'off' ], function (i, key) {
+ _api_register( key+'()', function ( /* event, handler */ ) {
+ var args = Array.prototype.slice.call(arguments);
+
+ // Add the `dt` namespace automatically if it isn't already present
+ args[0] = $.map( args[0].split( /\s/ ), function ( e ) {
+ return ! e.match(/\.dt\b/) ?
+ e+'.dt' :
+ e;
+ } ).join( ' ' );
+
+ var inst = $( this.tables().nodes() );
+ inst[key].apply( inst, args );
+ return this;
+ } );
+ } );
+
+
+ _api_register( 'clear()', function () {
+ return this.iterator( 'table', function ( settings ) {
+ _fnClearTable( settings );
+ } );
+ } );
+
+
+ _api_register( 'settings()', function () {
+ return new _Api( this.context, this.context );
+ } );
+
+
+ _api_register( 'init()', function () {
+ var ctx = this.context;
+ return ctx.length ? ctx[0].oInit : null;
+ } );
+
+
+ _api_register( 'data()', function () {
+ return this.iterator( 'table', function ( settings ) {
+ return _pluck( settings.aoData, '_aData' );
+ } ).flatten();
+ } );
+
+
+ _api_register( 'destroy()', function ( remove ) {
+ remove = remove || false;
+
+ return this.iterator( 'table', function ( settings ) {
+ var orig = settings.nTableWrapper.parentNode;
+ var classes = settings.oClasses;
+ var table = settings.nTable;
+ var tbody = settings.nTBody;
+ var thead = settings.nTHead;
+ var tfoot = settings.nTFoot;
+ var jqTable = $(table);
+ var jqTbody = $(tbody);
+ var jqWrapper = $(settings.nTableWrapper);
+ var rows = $.map( settings.aoData, function (r) { return r.nTr; } );
+ var i, ien;
+
+ // Flag to note that the table is currently being destroyed - no action
+ // should be taken
+ settings.bDestroying = true;
+
+ // Fire off the destroy callbacks for plug-ins etc
+ _fnCallbackFire( settings, "aoDestroyCallback", "destroy", [settings] );
+
+ // If not being removed from the document, make all columns visible
+ if ( ! remove ) {
+ new _Api( settings ).columns().visible( true );
+ }
+
+ // Blitz all `DT` namespaced events (these are internal events, the
+ // lowercase, `dt` events are user subscribed and they are responsible
+ // for removing them
+ jqWrapper.off('.DT').find(':not(tbody *)').off('.DT');
+ $(window).off('.DT-'+settings.sInstance);
+
+ // When scrolling we had to break the table up - restore it
+ if ( table != thead.parentNode ) {
+ jqTable.children('thead').detach();
+ jqTable.append( thead );
+ }
+
+ if ( tfoot && table != tfoot.parentNode ) {
+ jqTable.children('tfoot').detach();
+ jqTable.append( tfoot );
+ }
+
+ settings.aaSorting = [];
+ settings.aaSortingFixed = [];
+ _fnSortingClasses( settings );
+
+ $( rows ).removeClass( settings.asStripeClasses.join(' ') );
+
+ $('th, td', thead).removeClass( classes.sSortable+' '+
+ classes.sSortableAsc+' '+classes.sSortableDesc+' '+classes.sSortableNone
+ );
+
+ // Add the TR elements back into the table in their original order
+ jqTbody.children().detach();
+ jqTbody.append( rows );
+
+ // Remove the DataTables generated nodes, events and classes
+ var removedMethod = remove ? 'remove' : 'detach';
+ jqTable[ removedMethod ]();
+ jqWrapper[ removedMethod ]();
+
+ // If we need to reattach the table to the document
+ if ( ! remove && orig ) {
+ // insertBefore acts like appendChild if !arg[1]
+ orig.insertBefore( table, settings.nTableReinsertBefore );
+
+ // Restore the width of the original table - was read from the style property,
+ // so we can restore directly to that
+ jqTable
+ .css( 'width', settings.sDestroyWidth )
+ .removeClass( classes.sTable );
+
+ // If the were originally stripe classes - then we add them back here.
+ // Note this is not fool proof (for example if not all rows had stripe
+ // classes - but it's a good effort without getting carried away
+ ien = settings.asDestroyStripes.length;
+
+ if ( ien ) {
+ jqTbody.children().each( function (i) {
+ $(this).addClass( settings.asDestroyStripes[i % ien] );
+ } );
+ }
+ }
+
+ /* Remove the settings object from the settings array */
+ var idx = $.inArray( settings, DataTable.settings );
+ if ( idx !== -1 ) {
+ DataTable.settings.splice( idx, 1 );
+ }
+ } );
+ } );
+
+
+ // Add the `every()` method for rows, columns and cells in a compact form
+ $.each( [ 'column', 'row', 'cell' ], function ( i, type ) {
+ _api_register( type+'s().every()', function ( fn ) {
+ var opts = this.selector.opts;
+ var api = this;
+
+ return this.iterator( type, function ( settings, arg1, arg2, arg3, arg4 ) {
+ // Rows and columns:
+ // arg1 - index
+ // arg2 - table counter
+ // arg3 - loop counter
+ // arg4 - undefined
+ // Cells:
+ // arg1 - row index
+ // arg2 - column index
+ // arg3 - table counter
+ // arg4 - loop counter
+ fn.call(
+ api[ type ](
+ arg1,
+ type==='cell' ? arg2 : opts,
+ type==='cell' ? opts : undefined
+ ),
+ arg1, arg2, arg3, arg4
+ );
+ } );
+ } );
+ } );
+
+
+ // i18n method for extensions to be able to use the language object from the
+ // DataTable
+ _api_register( 'i18n()', function ( token, def, plural ) {
+ var ctx = this.context[0];
+ var resolved = _fnGetObjectDataFn( token )( ctx.oLanguage );
+
+ if ( resolved === undefined ) {
+ resolved = def;
+ }
+
+ if ( plural !== undefined && $.isPlainObject( resolved ) ) {
+ resolved = resolved[ plural ] !== undefined ?
+ resolved[ plural ] :
+ resolved._;
+ }
+
+ return resolved.replace( '%d', plural ); // nb: plural might be undefined,
+ } );
+
+ /**
+ * Version string for plug-ins to check compatibility. Allowed format is
+ * `a.b.c-d` where: a:int, b:int, c:int, d:string(dev|beta|alpha). `d` is used
+ * only for non-release builds. See http://semver.org/ for more information.
+ * @member
+ * @type string
+ * @default Version number
+ */
+ DataTable.version = "1.10.18";
+
+ /**
+ * Private data store, containing all of the settings objects that are
+ * created for the tables on a given page.
+ *
+ * Note that the `DataTable.settings` object is aliased to
+ * `jQuery.fn.dataTableExt` through which it may be accessed and
+ * manipulated, or `jQuery.fn.dataTable.settings`.
+ * @member
+ * @type array
+ * @default []
+ * @private
+ */
+ DataTable.settings = [];
+
+ /**
+ * Object models container, for the various models that DataTables has
+ * available to it. These models define the objects that are used to hold
+ * the active state and configuration of the table.
+ * @namespace
+ */
+ DataTable.models = {};
+
+
+
+ /**
+ * Template object for the way in which DataTables holds information about
+ * search information for the global filter and individual column filters.
+ * @namespace
+ */
+ DataTable.models.oSearch = {
+ /**
+ * Flag to indicate if the filtering should be case insensitive or not
+ * @type boolean
+ * @default true
+ */
+ "bCaseInsensitive": true,
+
+ /**
+ * Applied search term
+ * @type string
+ * @default Empty string
+ */
+ "sSearch": "",
+
+ /**
+ * Flag to indicate if the search term should be interpreted as a
+ * regular expression (true) or not (false) and therefore and special
+ * regex characters escaped.
+ * @type boolean
+ * @default false
+ */
+ "bRegex": false,
+
+ /**
+ * Flag to indicate if DataTables is to use its smart filtering or not.
+ * @type boolean
+ * @default true
+ */
+ "bSmart": true
+ };
+
+
+
+
+ /**
+ * Template object for the way in which DataTables holds information about
+ * each individual row. This is the object format used for the settings
+ * aoData array.
+ * @namespace
+ */
+ DataTable.models.oRow = {
+ /**
+ * TR element for the row
+ * @type node
+ * @default null
+ */
+ "nTr": null,
+
+ /**
+ * Array of TD elements for each row. This is null until the row has been
+ * created.
+ * @type array nodes
+ * @default []
+ */
+ "anCells": null,
+
+ /**
+ * Data object from the original data source for the row. This is either
+ * an array if using the traditional form of DataTables, or an object if
+ * using mData options. The exact type will depend on the passed in
+ * data from the data source, or will be an array if using DOM a data
+ * source.
+ * @type array|object
+ * @default []
+ */
+ "_aData": [],
+
+ /**
+ * Sorting data cache - this array is ostensibly the same length as the
+ * number of columns (although each index is generated only as it is
+ * needed), and holds the data that is used for sorting each column in the
+ * row. We do this cache generation at the start of the sort in order that
+ * the formatting of the sort data need be done only once for each cell
+ * per sort. This array should not be read from or written to by anything
+ * other than the master sorting methods.
+ * @type array
+ * @default null
+ * @private
+ */
+ "_aSortData": null,
+
+ /**
+ * Per cell filtering data cache. As per the sort data cache, used to
+ * increase the performance of the filtering in DataTables
+ * @type array
+ * @default null
+ * @private
+ */
+ "_aFilterData": null,
+
+ /**
+ * Filtering data cache. This is the same as the cell filtering cache, but
+ * in this case a string rather than an array. This is easily computed with
+ * a join on `_aFilterData`, but is provided as a cache so the join isn't
+ * needed on every search (memory traded for performance)
+ * @type array
+ * @default null
+ * @private
+ */
+ "_sFilterRow": null,
+
+ /**
+ * Cache of the class name that DataTables has applied to the row, so we
+ * can quickly look at this variable rather than needing to do a DOM check
+ * on className for the nTr property.
+ * @type string
+ * @default Empty string
+ * @private
+ */
+ "_sRowStripe": "",
+
+ /**
+ * Denote if the original data source was from the DOM, or the data source
+ * object. This is used for invalidating data, so DataTables can
+ * automatically read data from the original source, unless uninstructed
+ * otherwise.
+ * @type string
+ * @default null
+ * @private
+ */
+ "src": null,
+
+ /**
+ * Index in the aoData array. This saves an indexOf lookup when we have the
+ * object, but want to know the index
+ * @type integer
+ * @default -1
+ * @private
+ */
+ "idx": -1
+ };
+
+
+ /**
+ * Template object for the column information object in DataTables. This object
+ * is held in the settings aoColumns array and contains all the information that
+ * DataTables needs about each individual column.
+ *
+ * Note that this object is related to {@link DataTable.defaults.column}
+ * but this one is the internal data store for DataTables's cache of columns.
+ * It should NOT be manipulated outside of DataTables. Any configuration should
+ * be done through the initialisation options.
+ * @namespace
+ */
+ DataTable.models.oColumn = {
+ /**
+ * Column index. This could be worked out on-the-fly with $.inArray, but it
+ * is faster to just hold it as a variable
+ * @type integer
+ * @default null
+ */
+ "idx": null,
+
+ /**
+ * A list of the columns that sorting should occur on when this column
+ * is sorted. That this property is an array allows multi-column sorting
+ * to be defined for a column (for example first name / last name columns
+ * would benefit from this). The values are integers pointing to the
+ * columns to be sorted on (typically it will be a single integer pointing
+ * at itself, but that doesn't need to be the case).
+ * @type array
+ */
+ "aDataSort": null,
+
+ /**
+ * Define the sorting directions that are applied to the column, in sequence
+ * as the column is repeatedly sorted upon - i.e. the first value is used
+ * as the sorting direction when the column if first sorted (clicked on).
+ * Sort it again (click again) and it will move on to the next index.
+ * Repeat until loop.
+ * @type array
+ */
+ "asSorting": null,
+
+ /**
+ * Flag to indicate if the column is searchable, and thus should be included
+ * in the filtering or not.
+ * @type boolean
+ */
+ "bSearchable": null,
+
+ /**
+ * Flag to indicate if the column is sortable or not.
+ * @type boolean
+ */
+ "bSortable": null,
+
+ /**
+ * Flag to indicate if the column is currently visible in the table or not
+ * @type boolean
+ */
+ "bVisible": null,
+
+ /**
+ * Store for manual type assignment using the `column.type` option. This
+ * is held in store so we can manipulate the column's `sType` property.
+ * @type string
+ * @default null
+ * @private
+ */
+ "_sManualType": null,
+
+ /**
+ * Flag to indicate if HTML5 data attributes should be used as the data
+ * source for filtering or sorting. True is either are.
+ * @type boolean
+ * @default false
+ * @private
+ */
+ "_bAttrSrc": false,
+
+ /**
+ * Developer definable function that is called whenever a cell is created (Ajax source,
+ * etc) or processed for input (DOM source). This can be used as a compliment to mRender
+ * allowing you to modify the DOM element (add background colour for example) when the
+ * element is available.
+ * @type function
+ * @param {element} nTd The TD node that has been created
+ * @param {*} sData The Data for the cell
+ * @param {array|object} oData The data for the whole row
+ * @param {int} iRow The row index for the aoData data store
+ * @default null
+ */
+ "fnCreatedCell": null,
+
+ /**
+ * Function to get data from a cell in a column. You should never
+ * access data directly through _aData internally in DataTables - always use
+ * the method attached to this property. It allows mData to function as
+ * required. This function is automatically assigned by the column
+ * initialisation method
+ * @type function
+ * @param {array|object} oData The data array/object for the array
+ * (i.e. aoData[]._aData)
+ * @param {string} sSpecific The specific data type you want to get -
+ * 'display', 'type' 'filter' 'sort'
+ * @returns {*} The data for the cell from the given row's data
+ * @default null
+ */
+ "fnGetData": null,
+
+ /**
+ * Function to set data for a cell in the column. You should never
+ * set the data directly to _aData internally in DataTables - always use
+ * this method. It allows mData to function as required. This function
+ * is automatically assigned by the column initialisation method
+ * @type function
+ * @param {array|object} oData The data array/object for the array
+ * (i.e. aoData[]._aData)
+ * @param {*} sValue Value to set
+ * @default null
+ */
+ "fnSetData": null,
+
+ /**
+ * Property to read the value for the cells in the column from the data
+ * source array / object. If null, then the default content is used, if a
+ * function is given then the return from the function is used.
+ * @type function|int|string|null
+ * @default null
+ */
+ "mData": null,
+
+ /**
+ * Partner property to mData which is used (only when defined) to get
+ * the data - i.e. it is basically the same as mData, but without the
+ * 'set' option, and also the data fed to it is the result from mData.
+ * This is the rendering method to match the data method of mData.
+ * @type function|int|string|null
+ * @default null
+ */
+ "mRender": null,
+
+ /**
+ * Unique header TH/TD element for this column - this is what the sorting
+ * listener is attached to (if sorting is enabled.)
+ * @type node
+ * @default null
+ */
+ "nTh": null,
+
+ /**
+ * Unique footer TH/TD element for this column (if there is one). Not used
+ * in DataTables as such, but can be used for plug-ins to reference the
+ * footer for each column.
+ * @type node
+ * @default null
+ */
+ "nTf": null,
+
+ /**
+ * The class to apply to all TD elements in the table's TBODY for the column
+ * @type string
+ * @default null
+ */
+ "sClass": null,
+
+ /**
+ * When DataTables calculates the column widths to assign to each column,
+ * it finds the longest string in each column and then constructs a
+ * temporary table and reads the widths from that. The problem with this
+ * is that "mmm" is much wider then "iiii", but the latter is a longer
+ * string - thus the calculation can go wrong (doing it properly and putting
+ * it into an DOM object and measuring that is horribly(!) slow). Thus as
+ * a "work around" we provide this option. It will append its value to the
+ * text that is found to be the longest string for the column - i.e. padding.
+ * @type string
+ */
+ "sContentPadding": null,
+
+ /**
+ * Allows a default value to be given for a column's data, and will be used
+ * whenever a null data source is encountered (this can be because mData
+ * is set to null, or because the data source itself is null).
+ * @type string
+ * @default null
+ */
+ "sDefaultContent": null,
+
+ /**
+ * Name for the column, allowing reference to the column by name as well as
+ * by index (needs a lookup to work by name).
+ * @type string
+ */
+ "sName": null,
+
+ /**
+ * Custom sorting data type - defines which of the available plug-ins in
+ * afnSortData the custom sorting will use - if any is defined.
+ * @type string
+ * @default std
+ */
+ "sSortDataType": 'std',
+
+ /**
+ * Class to be applied to the header element when sorting on this column
+ * @type string
+ * @default null
+ */
+ "sSortingClass": null,
+
+ /**
+ * Class to be applied to the header element when sorting on this column -
+ * when jQuery UI theming is used.
+ * @type string
+ * @default null
+ */
+ "sSortingClassJUI": null,
+
+ /**
+ * Title of the column - what is seen in the TH element (nTh).
+ * @type string
+ */
+ "sTitle": null,
+
+ /**
+ * Column sorting and filtering type
+ * @type string
+ * @default null
+ */
+ "sType": null,
+
+ /**
+ * Width of the column
+ * @type string
+ * @default null
+ */
+ "sWidth": null,
+
+ /**
+ * Width of the column when it was first "encountered"
+ * @type string
+ * @default null
+ */
+ "sWidthOrig": null
+ };
+
+
+ /*
+ * Developer note: The properties of the object below are given in Hungarian
+ * notation, that was used as the interface for DataTables prior to v1.10, however
+ * from v1.10 onwards the primary interface is camel case. In order to avoid
+ * breaking backwards compatibility utterly with this change, the Hungarian
+ * version is still, internally the primary interface, but is is not documented
+ * - hence the @name tags in each doc comment. This allows a Javascript function
+ * to create a map from Hungarian notation to camel case (going the other direction
+ * would require each property to be listed, which would at around 3K to the size
+ * of DataTables, while this method is about a 0.5K hit.
+ *
+ * Ultimately this does pave the way for Hungarian notation to be dropped
+ * completely, but that is a massive amount of work and will break current
+ * installs (therefore is on-hold until v2).
+ */
+
+ /**
+ * Initialisation options that can be given to DataTables at initialisation
+ * time.
+ * @namespace
+ */
+ DataTable.defaults = {
+ /**
+ * An array of data to use for the table, passed in at initialisation which
+ * will be used in preference to any data which is already in the DOM. This is
+ * particularly useful for constructing tables purely in Javascript, for
+ * example with a custom Ajax call.
+ * @type array
+ * @default null
+ *
+ * @dtopt Option
+ * @name DataTable.defaults.data
+ *
+ * @example
+ * // Using a 2D array data source
+ * $(document).ready( function () {
+ * $('#example').dataTable( {
+ * "data": [
+ * ['Trident', 'Internet Explorer 4.0', 'Win 95+', 4, 'X'],
+ * ['Trident', 'Internet Explorer 5.0', 'Win 95+', 5, 'C'],
+ * ],
+ * "columns": [
+ * { "title": "Engine" },
+ * { "title": "Browser" },
+ * { "title": "Platform" },
+ * { "title": "Version" },
+ * { "title": "Grade" }
+ * ]
+ * } );
+ * } );
+ *
+ * @example
+ * // Using an array of objects as a data source (`data`)
+ * $(document).ready( function () {
+ * $('#example').dataTable( {
+ * "data": [
+ * {
+ * "engine": "Trident",
+ * "browser": "Internet Explorer 4.0",
+ * "platform": "Win 95+",
+ * "version": 4,
+ * "grade": "X"
+ * },
+ * {
+ * "engine": "Trident",
+ * "browser": "Internet Explorer 5.0",
+ * "platform": "Win 95+",
+ * "version": 5,
+ * "grade": "C"
+ * }
+ * ],
+ * "columns": [
+ * { "title": "Engine", "data": "engine" },
+ * { "title": "Browser", "data": "browser" },
+ * { "title": "Platform", "data": "platform" },
+ * { "title": "Version", "data": "version" },
+ * { "title": "Grade", "data": "grade" }
+ * ]
+ * } );
+ * } );
+ */
+ "aaData": null,
+
+
+ /**
+ * If ordering is enabled, then DataTables will perform a first pass sort on
+ * initialisation. You can define which column(s) the sort is performed
+ * upon, and the sorting direction, with this variable. The `sorting` array
+ * should contain an array for each column to be sorted initially containing
+ * the column's index and a direction string ('asc' or 'desc').
+ * @type array
+ * @default [[0,'asc']]
+ *
+ * @dtopt Option
+ * @name DataTable.defaults.order
+ *
+ * @example
+ * // Sort by 3rd column first, and then 4th column
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "order": [[2,'asc'], [3,'desc']]
+ * } );
+ * } );
+ *
+ * // No initial sorting
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "order": []
+ * } );
+ * } );
+ */
+ "aaSorting": [[0,'asc']],
+
+
+ /**
+ * This parameter is basically identical to the `sorting` parameter, but
+ * cannot be overridden by user interaction with the table. What this means
+ * is that you could have a column (visible or hidden) which the sorting
+ * will always be forced on first - any sorting after that (from the user)
+ * will then be performed as required. This can be useful for grouping rows
+ * together.
+ * @type array
+ * @default null
+ *
+ * @dtopt Option
+ * @name DataTable.defaults.orderFixed
+ *
+ * @example
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "orderFixed": [[0,'asc']]
+ * } );
+ * } )
+ */
+ "aaSortingFixed": [],
+
+
+ /**
+ * DataTables can be instructed to load data to display in the table from a
+ * Ajax source. This option defines how that Ajax call is made and where to.
+ *
+ * The `ajax` property has three different modes of operation, depending on
+ * how it is defined. These are:
+ *
+ * * `string` - Set the URL from where the data should be loaded from.
+ * * `object` - Define properties for `jQuery.ajax`.
+ * * `function` - Custom data get function
+ *
+ * `string`
+ * --------
+ *
+ * As a string, the `ajax` property simply defines the URL from which
+ * DataTables will load data.
+ *
+ * `object`
+ * --------
+ *
+ * As an object, the parameters in the object are passed to
+ * [jQuery.ajax](http://api.jquery.com/jQuery.ajax/) allowing fine control
+ * of the Ajax request. DataTables has a number of default parameters which
+ * you can override using this option. Please refer to the jQuery
+ * documentation for a full description of the options available, although
+ * the following parameters provide additional options in DataTables or
+ * require special consideration:
+ *
+ * * `data` - As with jQuery, `data` can be provided as an object, but it
+ * can also be used as a function to manipulate the data DataTables sends
+ * to the server. The function takes a single parameter, an object of
+ * parameters with the values that DataTables has readied for sending. An
+ * object may be returned which will be merged into the DataTables
+ * defaults, or you can add the items to the object that was passed in and
+ * not return anything from the function. This supersedes `fnServerParams`
+ * from DataTables 1.9-.
+ *
+ * * `dataSrc` - By default DataTables will look for the property `data` (or
+ * `aaData` for compatibility with DataTables 1.9-) when obtaining data
+ * from an Ajax source or for server-side processing - this parameter
+ * allows that property to be changed. You can use Javascript dotted
+ * object notation to get a data source for multiple levels of nesting, or
+ * it my be used as a function. As a function it takes a single parameter,
+ * the JSON returned from the server, which can be manipulated as
+ * required, with the returned value being that used by DataTables as the
+ * data source for the table. This supersedes `sAjaxDataProp` from
+ * DataTables 1.9-.
+ *
+ * * `success` - Should not be overridden it is used internally in
+ * DataTables. To manipulate / transform the data returned by the server
+ * use `ajax.dataSrc`, or use `ajax` as a function (see below).
+ *
+ * `function`
+ * ----------
+ *
+ * As a function, making the Ajax call is left up to yourself allowing
+ * complete control of the Ajax request. Indeed, if desired, a method other
+ * than Ajax could be used to obtain the required data, such as Web storage
+ * or an AIR database.
+ *
+ * The function is given four parameters and no return is required. The
+ * parameters are:
+ *
+ * 1. _object_ - Data to send to the server
+ * 2. _function_ - Callback function that must be executed when the required
+ * data has been obtained. That data should be passed into the callback
+ * as the only parameter
+ * 3. _object_ - DataTables settings object for the table
+ *
+ * Note that this supersedes `fnServerData` from DataTables 1.9-.
+ *
+ * @type string|object|function
+ * @default null
+ *
+ * @dtopt Option
+ * @name DataTable.defaults.ajax
+ * @since 1.10.0
+ *
+ * @example
+ * // Get JSON data from a file via Ajax.
+ * // Note DataTables expects data in the form `{ data: [ ...data... ] }` by default).
+ * $('#example').dataTable( {
+ * "ajax": "data.json"
+ * } );
+ *
+ * @example
+ * // Get JSON data from a file via Ajax, using `dataSrc` to change
+ * // `data` to `tableData` (i.e. `{ tableData: [ ...data... ] }`)
+ * $('#example').dataTable( {
+ * "ajax": {
+ * "url": "data.json",
+ * "dataSrc": "tableData"
+ * }
+ * } );
+ *
+ * @example
+ * // Get JSON data from a file via Ajax, using `dataSrc` to read data
+ * // from a plain array rather than an array in an object
+ * $('#example').dataTable( {
+ * "ajax": {
+ * "url": "data.json",
+ * "dataSrc": ""
+ * }
+ * } );
+ *
+ * @example
+ * // Manipulate the data returned from the server - add a link to data
+ * // (note this can, should, be done using `render` for the column - this
+ * // is just a simple example of how the data can be manipulated).
+ * $('#example').dataTable( {
+ * "ajax": {
+ * "url": "data.json",
+ * "dataSrc": function ( json ) {
+ * for ( var i=0, ien=json.length ; i
+ * a string - class name will be matched on the TH for the column
+ * 0 or a positive integer - column index counting from the left
+ * a negative integer - column index counting from the right
+ * the string "_all" - all columns (i.e. assign a default)
+ *
+ * @member
+ *
+ * @name DataTable.defaults.columnDefs
+ */
+ "aoColumnDefs": null,
+
+
+ /**
+ * Basically the same as `search`, this parameter defines the individual column
+ * filtering state at initialisation time. The array must be of the same size
+ * as the number of columns, and each element be an object with the parameters
+ * `search` and `escapeRegex` (the latter is optional). 'null' is also
+ * accepted and the default will be used.
+ * @type array
+ * @default []
+ *
+ * @dtopt Option
+ * @name DataTable.defaults.searchCols
+ *
+ * @example
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "searchCols": [
+ * null,
+ * { "search": "My filter" },
+ * null,
+ * { "search": "^[0-9]", "escapeRegex": false }
+ * ]
+ * } );
+ * } )
+ */
+ "aoSearchCols": [],
+
+
+ /**
+ * An array of CSS classes that should be applied to displayed rows. This
+ * array may be of any length, and DataTables will apply each class
+ * sequentially, looping when required.
+ * @type array
+ * @default null Will take the values determined by the `oClasses.stripe*`
+ * options
+ *
+ * @dtopt Option
+ * @name DataTable.defaults.stripeClasses
+ *
+ * @example
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "stripeClasses": [ 'strip1', 'strip2', 'strip3' ]
+ * } );
+ * } )
+ */
+ "asStripeClasses": null,
+
+
+ /**
+ * Enable or disable automatic column width calculation. This can be disabled
+ * as an optimisation (it takes some time to calculate the widths) if the
+ * tables widths are passed in using `columns`.
+ * @type boolean
+ * @default true
+ *
+ * @dtopt Features
+ * @name DataTable.defaults.autoWidth
+ *
+ * @example
+ * $(document).ready( function () {
+ * $('#example').dataTable( {
+ * "autoWidth": false
+ * } );
+ * } );
+ */
+ "bAutoWidth": true,
+
+
+ /**
+ * Deferred rendering can provide DataTables with a huge speed boost when you
+ * are using an Ajax or JS data source for the table. This option, when set to
+ * true, will cause DataTables to defer the creation of the table elements for
+ * each row until they are needed for a draw - saving a significant amount of
+ * time.
+ * @type boolean
+ * @default false
+ *
+ * @dtopt Features
+ * @name DataTable.defaults.deferRender
+ *
+ * @example
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "ajax": "sources/arrays.txt",
+ * "deferRender": true
+ * } );
+ * } );
+ */
+ "bDeferRender": false,
+
+
+ /**
+ * Replace a DataTable which matches the given selector and replace it with
+ * one which has the properties of the new initialisation object passed. If no
+ * table matches the selector, then the new DataTable will be constructed as
+ * per normal.
+ * @type boolean
+ * @default false
+ *
+ * @dtopt Options
+ * @name DataTable.defaults.destroy
+ *
+ * @example
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "srollY": "200px",
+ * "paginate": false
+ * } );
+ *
+ * // Some time later....
+ * $('#example').dataTable( {
+ * "filter": false,
+ * "destroy": true
+ * } );
+ * } );
+ */
+ "bDestroy": false,
+
+
+ /**
+ * Enable or disable filtering of data. Filtering in DataTables is "smart" in
+ * that it allows the end user to input multiple words (space separated) and
+ * will match a row containing those words, even if not in the order that was
+ * specified (this allow matching across multiple columns). Note that if you
+ * wish to use filtering in DataTables this must remain 'true' - to remove the
+ * default filtering input box and retain filtering abilities, please use
+ * {@link DataTable.defaults.dom}.
+ * @type boolean
+ * @default true
+ *
+ * @dtopt Features
+ * @name DataTable.defaults.searching
+ *
+ * @example
+ * $(document).ready( function () {
+ * $('#example').dataTable( {
+ * "searching": false
+ * } );
+ * } );
+ */
+ "bFilter": true,
+
+
+ /**
+ * Enable or disable the table information display. This shows information
+ * about the data that is currently visible on the page, including information
+ * about filtered data if that action is being performed.
+ * @type boolean
+ * @default true
+ *
+ * @dtopt Features
+ * @name DataTable.defaults.info
+ *
+ * @example
+ * $(document).ready( function () {
+ * $('#example').dataTable( {
+ * "info": false
+ * } );
+ * } );
+ */
+ "bInfo": true,
+
+
+ /**
+ * Allows the end user to select the size of a formatted page from a select
+ * menu (sizes are 10, 25, 50 and 100). Requires pagination (`paginate`).
+ * @type boolean
+ * @default true
+ *
+ * @dtopt Features
+ * @name DataTable.defaults.lengthChange
+ *
+ * @example
+ * $(document).ready( function () {
+ * $('#example').dataTable( {
+ * "lengthChange": false
+ * } );
+ * } );
+ */
+ "bLengthChange": true,
+
+
+ /**
+ * Enable or disable pagination.
+ * @type boolean
+ * @default true
+ *
+ * @dtopt Features
+ * @name DataTable.defaults.paging
+ *
+ * @example
+ * $(document).ready( function () {
+ * $('#example').dataTable( {
+ * "paging": false
+ * } );
+ * } );
+ */
+ "bPaginate": true,
+
+
+ /**
+ * Enable or disable the display of a 'processing' indicator when the table is
+ * being processed (e.g. a sort). This is particularly useful for tables with
+ * large amounts of data where it can take a noticeable amount of time to sort
+ * the entries.
+ * @type boolean
+ * @default false
+ *
+ * @dtopt Features
+ * @name DataTable.defaults.processing
+ *
+ * @example
+ * $(document).ready( function () {
+ * $('#example').dataTable( {
+ * "processing": true
+ * } );
+ * } );
+ */
+ "bProcessing": false,
+
+
+ /**
+ * Retrieve the DataTables object for the given selector. Note that if the
+ * table has already been initialised, this parameter will cause DataTables
+ * to simply return the object that has already been set up - it will not take
+ * account of any changes you might have made to the initialisation object
+ * passed to DataTables (setting this parameter to true is an acknowledgement
+ * that you understand this). `destroy` can be used to reinitialise a table if
+ * you need.
+ * @type boolean
+ * @default false
+ *
+ * @dtopt Options
+ * @name DataTable.defaults.retrieve
+ *
+ * @example
+ * $(document).ready( function() {
+ * initTable();
+ * tableActions();
+ * } );
+ *
+ * function initTable ()
+ * {
+ * return $('#example').dataTable( {
+ * "scrollY": "200px",
+ * "paginate": false,
+ * "retrieve": true
+ * } );
+ * }
+ *
+ * function tableActions ()
+ * {
+ * var table = initTable();
+ * // perform API operations with oTable
+ * }
+ */
+ "bRetrieve": false,
+
+
+ /**
+ * When vertical (y) scrolling is enabled, DataTables will force the height of
+ * the table's viewport to the given height at all times (useful for layout).
+ * However, this can look odd when filtering data down to a small data set,
+ * and the footer is left "floating" further down. This parameter (when
+ * enabled) will cause DataTables to collapse the table's viewport down when
+ * the result set will fit within the given Y height.
+ * @type boolean
+ * @default false
+ *
+ * @dtopt Options
+ * @name DataTable.defaults.scrollCollapse
+ *
+ * @example
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "scrollY": "200",
+ * "scrollCollapse": true
+ * } );
+ * } );
+ */
+ "bScrollCollapse": false,
+
+
+ /**
+ * Configure DataTables to use server-side processing. Note that the
+ * `ajax` parameter must also be given in order to give DataTables a
+ * source to obtain the required data for each draw.
+ * @type boolean
+ * @default false
+ *
+ * @dtopt Features
+ * @dtopt Server-side
+ * @name DataTable.defaults.serverSide
+ *
+ * @example
+ * $(document).ready( function () {
+ * $('#example').dataTable( {
+ * "serverSide": true,
+ * "ajax": "xhr.php"
+ * } );
+ * } );
+ */
+ "bServerSide": false,
+
+
+ /**
+ * Enable or disable sorting of columns. Sorting of individual columns can be
+ * disabled by the `sortable` option for each column.
+ * @type boolean
+ * @default true
+ *
+ * @dtopt Features
+ * @name DataTable.defaults.ordering
+ *
+ * @example
+ * $(document).ready( function () {
+ * $('#example').dataTable( {
+ * "ordering": false
+ * } );
+ * } );
+ */
+ "bSort": true,
+
+
+ /**
+ * Enable or display DataTables' ability to sort multiple columns at the
+ * same time (activated by shift-click by the user).
+ * @type boolean
+ * @default true
+ *
+ * @dtopt Options
+ * @name DataTable.defaults.orderMulti
+ *
+ * @example
+ * // Disable multiple column sorting ability
+ * $(document).ready( function () {
+ * $('#example').dataTable( {
+ * "orderMulti": false
+ * } );
+ * } );
+ */
+ "bSortMulti": true,
+
+
+ /**
+ * Allows control over whether DataTables should use the top (true) unique
+ * cell that is found for a single column, or the bottom (false - default).
+ * This is useful when using complex headers.
+ * @type boolean
+ * @default false
+ *
+ * @dtopt Options
+ * @name DataTable.defaults.orderCellsTop
+ *
+ * @example
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "orderCellsTop": true
+ * } );
+ * } );
+ */
+ "bSortCellsTop": false,
+
+
+ /**
+ * Enable or disable the addition of the classes `sorting\_1`, `sorting\_2` and
+ * `sorting\_3` to the columns which are currently being sorted on. This is
+ * presented as a feature switch as it can increase processing time (while
+ * classes are removed and added) so for large data sets you might want to
+ * turn this off.
+ * @type boolean
+ * @default true
+ *
+ * @dtopt Features
+ * @name DataTable.defaults.orderClasses
+ *
+ * @example
+ * $(document).ready( function () {
+ * $('#example').dataTable( {
+ * "orderClasses": false
+ * } );
+ * } );
+ */
+ "bSortClasses": true,
+
+
+ /**
+ * Enable or disable state saving. When enabled HTML5 `localStorage` will be
+ * used to save table display information such as pagination information,
+ * display length, filtering and sorting. As such when the end user reloads
+ * the page the display display will match what thy had previously set up.
+ *
+ * Due to the use of `localStorage` the default state saving is not supported
+ * in IE6 or 7. If state saving is required in those browsers, use
+ * `stateSaveCallback` to provide a storage solution such as cookies.
+ * @type boolean
+ * @default false
+ *
+ * @dtopt Features
+ * @name DataTable.defaults.stateSave
+ *
+ * @example
+ * $(document).ready( function () {
+ * $('#example').dataTable( {
+ * "stateSave": true
+ * } );
+ * } );
+ */
+ "bStateSave": false,
+
+
+ /**
+ * This function is called when a TR element is created (and all TD child
+ * elements have been inserted), or registered if using a DOM source, allowing
+ * manipulation of the TR element (adding classes etc).
+ * @type function
+ * @param {node} row "TR" element for the current row
+ * @param {array} data Raw data array for this row
+ * @param {int} dataIndex The index of this row in the internal aoData array
+ *
+ * @dtopt Callbacks
+ * @name DataTable.defaults.createdRow
+ *
+ * @example
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "createdRow": function( row, data, dataIndex ) {
+ * // Bold the grade for all 'A' grade browsers
+ * if ( data[4] == "A" )
+ * {
+ * $('td:eq(4)', row).html( 'A ' );
+ * }
+ * }
+ * } );
+ * } );
+ */
+ "fnCreatedRow": null,
+
+
+ /**
+ * This function is called on every 'draw' event, and allows you to
+ * dynamically modify any aspect you want about the created DOM.
+ * @type function
+ * @param {object} settings DataTables settings object
+ *
+ * @dtopt Callbacks
+ * @name DataTable.defaults.drawCallback
+ *
+ * @example
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "drawCallback": function( settings ) {
+ * alert( 'DataTables has redrawn the table' );
+ * }
+ * } );
+ * } );
+ */
+ "fnDrawCallback": null,
+
+
+ /**
+ * Identical to fnHeaderCallback() but for the table footer this function
+ * allows you to modify the table footer on every 'draw' event.
+ * @type function
+ * @param {node} foot "TR" element for the footer
+ * @param {array} data Full table data (as derived from the original HTML)
+ * @param {int} start Index for the current display starting point in the
+ * display array
+ * @param {int} end Index for the current display ending point in the
+ * display array
+ * @param {array int} display Index array to translate the visual position
+ * to the full data array
+ *
+ * @dtopt Callbacks
+ * @name DataTable.defaults.footerCallback
+ *
+ * @example
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "footerCallback": function( tfoot, data, start, end, display ) {
+ * tfoot.getElementsByTagName('th')[0].innerHTML = "Starting index is "+start;
+ * }
+ * } );
+ * } )
+ */
+ "fnFooterCallback": null,
+
+
+ /**
+ * When rendering large numbers in the information element for the table
+ * (i.e. "Showing 1 to 10 of 57 entries") DataTables will render large numbers
+ * to have a comma separator for the 'thousands' units (e.g. 1 million is
+ * rendered as "1,000,000") to help readability for the end user. This
+ * function will override the default method DataTables uses.
+ * @type function
+ * @member
+ * @param {int} toFormat number to be formatted
+ * @returns {string} formatted string for DataTables to show the number
+ *
+ * @dtopt Callbacks
+ * @name DataTable.defaults.formatNumber
+ *
+ * @example
+ * // Format a number using a single quote for the separator (note that
+ * // this can also be done with the language.thousands option)
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "formatNumber": function ( toFormat ) {
+ * return toFormat.toString().replace(
+ * /\B(?=(\d{3})+(?!\d))/g, "'"
+ * );
+ * };
+ * } );
+ * } );
+ */
+ "fnFormatNumber": function ( toFormat ) {
+ return toFormat.toString().replace(
+ /\B(?=(\d{3})+(?!\d))/g,
+ this.oLanguage.sThousands
+ );
+ },
+
+
+ /**
+ * This function is called on every 'draw' event, and allows you to
+ * dynamically modify the header row. This can be used to calculate and
+ * display useful information about the table.
+ * @type function
+ * @param {node} head "TR" element for the header
+ * @param {array} data Full table data (as derived from the original HTML)
+ * @param {int} start Index for the current display starting point in the
+ * display array
+ * @param {int} end Index for the current display ending point in the
+ * display array
+ * @param {array int} display Index array to translate the visual position
+ * to the full data array
+ *
+ * @dtopt Callbacks
+ * @name DataTable.defaults.headerCallback
+ *
+ * @example
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "fheaderCallback": function( head, data, start, end, display ) {
+ * head.getElementsByTagName('th')[0].innerHTML = "Displaying "+(end-start)+" records";
+ * }
+ * } );
+ * } )
+ */
+ "fnHeaderCallback": null,
+
+
+ /**
+ * The information element can be used to convey information about the current
+ * state of the table. Although the internationalisation options presented by
+ * DataTables are quite capable of dealing with most customisations, there may
+ * be times where you wish to customise the string further. This callback
+ * allows you to do exactly that.
+ * @type function
+ * @param {object} oSettings DataTables settings object
+ * @param {int} start Starting position in data for the draw
+ * @param {int} end End position in data for the draw
+ * @param {int} max Total number of rows in the table (regardless of
+ * filtering)
+ * @param {int} total Total number of rows in the data set, after filtering
+ * @param {string} pre The string that DataTables has formatted using it's
+ * own rules
+ * @returns {string} The string to be displayed in the information element.
+ *
+ * @dtopt Callbacks
+ * @name DataTable.defaults.infoCallback
+ *
+ * @example
+ * $('#example').dataTable( {
+ * "infoCallback": function( settings, start, end, max, total, pre ) {
+ * return start +" to "+ end;
+ * }
+ * } );
+ */
+ "fnInfoCallback": null,
+
+
+ /**
+ * Called when the table has been initialised. Normally DataTables will
+ * initialise sequentially and there will be no need for this function,
+ * however, this does not hold true when using external language information
+ * since that is obtained using an async XHR call.
+ * @type function
+ * @param {object} settings DataTables settings object
+ * @param {object} json The JSON object request from the server - only
+ * present if client-side Ajax sourced data is used
+ *
+ * @dtopt Callbacks
+ * @name DataTable.defaults.initComplete
+ *
+ * @example
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "initComplete": function(settings, json) {
+ * alert( 'DataTables has finished its initialisation.' );
+ * }
+ * } );
+ * } )
+ */
+ "fnInitComplete": null,
+
+
+ /**
+ * Called at the very start of each table draw and can be used to cancel the
+ * draw by returning false, any other return (including undefined) results in
+ * the full draw occurring).
+ * @type function
+ * @param {object} settings DataTables settings object
+ * @returns {boolean} False will cancel the draw, anything else (including no
+ * return) will allow it to complete.
+ *
+ * @dtopt Callbacks
+ * @name DataTable.defaults.preDrawCallback
+ *
+ * @example
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "preDrawCallback": function( settings ) {
+ * if ( $('#test').val() == 1 ) {
+ * return false;
+ * }
+ * }
+ * } );
+ * } );
+ */
+ "fnPreDrawCallback": null,
+
+
+ /**
+ * This function allows you to 'post process' each row after it have been
+ * generated for each table draw, but before it is rendered on screen. This
+ * function might be used for setting the row class name etc.
+ * @type function
+ * @param {node} row "TR" element for the current row
+ * @param {array} data Raw data array for this row
+ * @param {int} displayIndex The display index for the current table draw
+ * @param {int} displayIndexFull The index of the data in the full list of
+ * rows (after filtering)
+ *
+ * @dtopt Callbacks
+ * @name DataTable.defaults.rowCallback
+ *
+ * @example
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "rowCallback": function( row, data, displayIndex, displayIndexFull ) {
+ * // Bold the grade for all 'A' grade browsers
+ * if ( data[4] == "A" ) {
+ * $('td:eq(4)', row).html( 'A ' );
+ * }
+ * }
+ * } );
+ * } );
+ */
+ "fnRowCallback": null,
+
+
+ /**
+ * __Deprecated__ The functionality provided by this parameter has now been
+ * superseded by that provided through `ajax`, which should be used instead.
+ *
+ * This parameter allows you to override the default function which obtains
+ * the data from the server so something more suitable for your application.
+ * For example you could use POST data, or pull information from a Gears or
+ * AIR database.
+ * @type function
+ * @member
+ * @param {string} source HTTP source to obtain the data from (`ajax`)
+ * @param {array} data A key/value pair object containing the data to send
+ * to the server
+ * @param {function} callback to be called on completion of the data get
+ * process that will draw the data on the page.
+ * @param {object} settings DataTables settings object
+ *
+ * @dtopt Callbacks
+ * @dtopt Server-side
+ * @name DataTable.defaults.serverData
+ *
+ * @deprecated 1.10. Please use `ajax` for this functionality now.
+ */
+ "fnServerData": null,
+
+
+ /**
+ * __Deprecated__ The functionality provided by this parameter has now been
+ * superseded by that provided through `ajax`, which should be used instead.
+ *
+ * It is often useful to send extra data to the server when making an Ajax
+ * request - for example custom filtering information, and this callback
+ * function makes it trivial to send extra information to the server. The
+ * passed in parameter is the data set that has been constructed by
+ * DataTables, and you can add to this or modify it as you require.
+ * @type function
+ * @param {array} data Data array (array of objects which are name/value
+ * pairs) that has been constructed by DataTables and will be sent to the
+ * server. In the case of Ajax sourced data with server-side processing
+ * this will be an empty array, for server-side processing there will be a
+ * significant number of parameters!
+ * @returns {undefined} Ensure that you modify the data array passed in,
+ * as this is passed by reference.
+ *
+ * @dtopt Callbacks
+ * @dtopt Server-side
+ * @name DataTable.defaults.serverParams
+ *
+ * @deprecated 1.10. Please use `ajax` for this functionality now.
+ */
+ "fnServerParams": null,
+
+
+ /**
+ * Load the table state. With this function you can define from where, and how, the
+ * state of a table is loaded. By default DataTables will load from `localStorage`
+ * but you might wish to use a server-side database or cookies.
+ * @type function
+ * @member
+ * @param {object} settings DataTables settings object
+ * @param {object} callback Callback that can be executed when done. It
+ * should be passed the loaded state object.
+ * @return {object} The DataTables state object to be loaded
+ *
+ * @dtopt Callbacks
+ * @name DataTable.defaults.stateLoadCallback
+ *
+ * @example
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "stateSave": true,
+ * "stateLoadCallback": function (settings, callback) {
+ * $.ajax( {
+ * "url": "/state_load",
+ * "dataType": "json",
+ * "success": function (json) {
+ * callback( json );
+ * }
+ * } );
+ * }
+ * } );
+ * } );
+ */
+ "fnStateLoadCallback": function ( settings ) {
+ try {
+ return JSON.parse(
+ (settings.iStateDuration === -1 ? sessionStorage : localStorage).getItem(
+ 'DataTables_'+settings.sInstance+'_'+location.pathname
+ )
+ );
+ } catch (e) {}
+ },
+
+
+ /**
+ * Callback which allows modification of the saved state prior to loading that state.
+ * This callback is called when the table is loading state from the stored data, but
+ * prior to the settings object being modified by the saved state. Note that for
+ * plug-in authors, you should use the `stateLoadParams` event to load parameters for
+ * a plug-in.
+ * @type function
+ * @param {object} settings DataTables settings object
+ * @param {object} data The state object that is to be loaded
+ *
+ * @dtopt Callbacks
+ * @name DataTable.defaults.stateLoadParams
+ *
+ * @example
+ * // Remove a saved filter, so filtering is never loaded
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "stateSave": true,
+ * "stateLoadParams": function (settings, data) {
+ * data.oSearch.sSearch = "";
+ * }
+ * } );
+ * } );
+ *
+ * @example
+ * // Disallow state loading by returning false
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "stateSave": true,
+ * "stateLoadParams": function (settings, data) {
+ * return false;
+ * }
+ * } );
+ * } );
+ */
+ "fnStateLoadParams": null,
+
+
+ /**
+ * Callback that is called when the state has been loaded from the state saving method
+ * and the DataTables settings object has been modified as a result of the loaded state.
+ * @type function
+ * @param {object} settings DataTables settings object
+ * @param {object} data The state object that was loaded
+ *
+ * @dtopt Callbacks
+ * @name DataTable.defaults.stateLoaded
+ *
+ * @example
+ * // Show an alert with the filtering value that was saved
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "stateSave": true,
+ * "stateLoaded": function (settings, data) {
+ * alert( 'Saved filter was: '+data.oSearch.sSearch );
+ * }
+ * } );
+ * } );
+ */
+ "fnStateLoaded": null,
+
+
+ /**
+ * Save the table state. This function allows you to define where and how the state
+ * information for the table is stored By default DataTables will use `localStorage`
+ * but you might wish to use a server-side database or cookies.
+ * @type function
+ * @member
+ * @param {object} settings DataTables settings object
+ * @param {object} data The state object to be saved
+ *
+ * @dtopt Callbacks
+ * @name DataTable.defaults.stateSaveCallback
+ *
+ * @example
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "stateSave": true,
+ * "stateSaveCallback": function (settings, data) {
+ * // Send an Ajax request to the server with the state object
+ * $.ajax( {
+ * "url": "/state_save",
+ * "data": data,
+ * "dataType": "json",
+ * "method": "POST"
+ * "success": function () {}
+ * } );
+ * }
+ * } );
+ * } );
+ */
+ "fnStateSaveCallback": function ( settings, data ) {
+ try {
+ (settings.iStateDuration === -1 ? sessionStorage : localStorage).setItem(
+ 'DataTables_'+settings.sInstance+'_'+location.pathname,
+ JSON.stringify( data )
+ );
+ } catch (e) {}
+ },
+
+
+ /**
+ * Callback which allows modification of the state to be saved. Called when the table
+ * has changed state a new state save is required. This method allows modification of
+ * the state saving object prior to actually doing the save, including addition or
+ * other state properties or modification. Note that for plug-in authors, you should
+ * use the `stateSaveParams` event to save parameters for a plug-in.
+ * @type function
+ * @param {object} settings DataTables settings object
+ * @param {object} data The state object to be saved
+ *
+ * @dtopt Callbacks
+ * @name DataTable.defaults.stateSaveParams
+ *
+ * @example
+ * // Remove a saved filter, so filtering is never saved
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "stateSave": true,
+ * "stateSaveParams": function (settings, data) {
+ * data.oSearch.sSearch = "";
+ * }
+ * } );
+ * } );
+ */
+ "fnStateSaveParams": null,
+
+
+ /**
+ * Duration for which the saved state information is considered valid. After this period
+ * has elapsed the state will be returned to the default.
+ * Value is given in seconds.
+ * @type int
+ * @default 7200 (2 hours)
+ *
+ * @dtopt Options
+ * @name DataTable.defaults.stateDuration
+ *
+ * @example
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "stateDuration": 60*60*24; // 1 day
+ * } );
+ * } )
+ */
+ "iStateDuration": 7200,
+
+
+ /**
+ * When enabled DataTables will not make a request to the server for the first
+ * page draw - rather it will use the data already on the page (no sorting etc
+ * will be applied to it), thus saving on an XHR at load time. `deferLoading`
+ * is used to indicate that deferred loading is required, but it is also used
+ * to tell DataTables how many records there are in the full table (allowing
+ * the information element and pagination to be displayed correctly). In the case
+ * where a filtering is applied to the table on initial load, this can be
+ * indicated by giving the parameter as an array, where the first element is
+ * the number of records available after filtering and the second element is the
+ * number of records without filtering (allowing the table information element
+ * to be shown correctly).
+ * @type int | array
+ * @default null
+ *
+ * @dtopt Options
+ * @name DataTable.defaults.deferLoading
+ *
+ * @example
+ * // 57 records available in the table, no filtering applied
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "serverSide": true,
+ * "ajax": "scripts/server_processing.php",
+ * "deferLoading": 57
+ * } );
+ * } );
+ *
+ * @example
+ * // 57 records after filtering, 100 without filtering (an initial filter applied)
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "serverSide": true,
+ * "ajax": "scripts/server_processing.php",
+ * "deferLoading": [ 57, 100 ],
+ * "search": {
+ * "search": "my_filter"
+ * }
+ * } );
+ * } );
+ */
+ "iDeferLoading": null,
+
+
+ /**
+ * Number of rows to display on a single page when using pagination. If
+ * feature enabled (`lengthChange`) then the end user will be able to override
+ * this to a custom setting using a pop-up menu.
+ * @type int
+ * @default 10
+ *
+ * @dtopt Options
+ * @name DataTable.defaults.pageLength
+ *
+ * @example
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "pageLength": 50
+ * } );
+ * } )
+ */
+ "iDisplayLength": 10,
+
+
+ /**
+ * Define the starting point for data display when using DataTables with
+ * pagination. Note that this parameter is the number of records, rather than
+ * the page number, so if you have 10 records per page and want to start on
+ * the third page, it should be "20".
+ * @type int
+ * @default 0
+ *
+ * @dtopt Options
+ * @name DataTable.defaults.displayStart
+ *
+ * @example
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "displayStart": 20
+ * } );
+ * } )
+ */
+ "iDisplayStart": 0,
+
+
+ /**
+ * By default DataTables allows keyboard navigation of the table (sorting, paging,
+ * and filtering) by adding a `tabindex` attribute to the required elements. This
+ * allows you to tab through the controls and press the enter key to activate them.
+ * The tabindex is default 0, meaning that the tab follows the flow of the document.
+ * You can overrule this using this parameter if you wish. Use a value of -1 to
+ * disable built-in keyboard navigation.
+ * @type int
+ * @default 0
+ *
+ * @dtopt Options
+ * @name DataTable.defaults.tabIndex
+ *
+ * @example
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "tabIndex": 1
+ * } );
+ * } );
+ */
+ "iTabIndex": 0,
+
+
+ /**
+ * Classes that DataTables assigns to the various components and features
+ * that it adds to the HTML table. This allows classes to be configured
+ * during initialisation in addition to through the static
+ * {@link DataTable.ext.oStdClasses} object).
+ * @namespace
+ * @name DataTable.defaults.classes
+ */
+ "oClasses": {},
+
+
+ /**
+ * All strings that DataTables uses in the user interface that it creates
+ * are defined in this object, allowing you to modified them individually or
+ * completely replace them all as required.
+ * @namespace
+ * @name DataTable.defaults.language
+ */
+ "oLanguage": {
+ /**
+ * Strings that are used for WAI-ARIA labels and controls only (these are not
+ * actually visible on the page, but will be read by screenreaders, and thus
+ * must be internationalised as well).
+ * @namespace
+ * @name DataTable.defaults.language.aria
+ */
+ "oAria": {
+ /**
+ * ARIA label that is added to the table headers when the column may be
+ * sorted ascending by activing the column (click or return when focused).
+ * Note that the column header is prefixed to this string.
+ * @type string
+ * @default : activate to sort column ascending
+ *
+ * @dtopt Language
+ * @name DataTable.defaults.language.aria.sortAscending
+ *
+ * @example
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "language": {
+ * "aria": {
+ * "sortAscending": " - click/return to sort ascending"
+ * }
+ * }
+ * } );
+ * } );
+ */
+ "sSortAscending": ": activate to sort column ascending",
+
+ /**
+ * ARIA label that is added to the table headers when the column may be
+ * sorted descending by activing the column (click or return when focused).
+ * Note that the column header is prefixed to this string.
+ * @type string
+ * @default : activate to sort column ascending
+ *
+ * @dtopt Language
+ * @name DataTable.defaults.language.aria.sortDescending
+ *
+ * @example
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "language": {
+ * "aria": {
+ * "sortDescending": " - click/return to sort descending"
+ * }
+ * }
+ * } );
+ * } );
+ */
+ "sSortDescending": ": activate to sort column descending"
+ },
+
+ /**
+ * Pagination string used by DataTables for the built-in pagination
+ * control types.
+ * @namespace
+ * @name DataTable.defaults.language.paginate
+ */
+ "oPaginate": {
+ /**
+ * Text to use when using the 'full_numbers' type of pagination for the
+ * button to take the user to the first page.
+ * @type string
+ * @default First
+ *
+ * @dtopt Language
+ * @name DataTable.defaults.language.paginate.first
+ *
+ * @example
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "language": {
+ * "paginate": {
+ * "first": "First page"
+ * }
+ * }
+ * } );
+ * } );
+ */
+ "sFirst": "First",
+
+
+ /**
+ * Text to use when using the 'full_numbers' type of pagination for the
+ * button to take the user to the last page.
+ * @type string
+ * @default Last
+ *
+ * @dtopt Language
+ * @name DataTable.defaults.language.paginate.last
+ *
+ * @example
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "language": {
+ * "paginate": {
+ * "last": "Last page"
+ * }
+ * }
+ * } );
+ * } );
+ */
+ "sLast": "Last",
+
+
+ /**
+ * Text to use for the 'next' pagination button (to take the user to the
+ * next page).
+ * @type string
+ * @default Next
+ *
+ * @dtopt Language
+ * @name DataTable.defaults.language.paginate.next
+ *
+ * @example
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "language": {
+ * "paginate": {
+ * "next": "Next page"
+ * }
+ * }
+ * } );
+ * } );
+ */
+ "sNext": "Next",
+
+
+ /**
+ * Text to use for the 'previous' pagination button (to take the user to
+ * the previous page).
+ * @type string
+ * @default Previous
+ *
+ * @dtopt Language
+ * @name DataTable.defaults.language.paginate.previous
+ *
+ * @example
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "language": {
+ * "paginate": {
+ * "previous": "Previous page"
+ * }
+ * }
+ * } );
+ * } );
+ */
+ "sPrevious": "Previous"
+ },
+
+ /**
+ * This string is shown in preference to `zeroRecords` when the table is
+ * empty of data (regardless of filtering). Note that this is an optional
+ * parameter - if it is not given, the value of `zeroRecords` will be used
+ * instead (either the default or given value).
+ * @type string
+ * @default No data available in table
+ *
+ * @dtopt Language
+ * @name DataTable.defaults.language.emptyTable
+ *
+ * @example
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "language": {
+ * "emptyTable": "No data available in table"
+ * }
+ * } );
+ * } );
+ */
+ "sEmptyTable": "No data available in table",
+
+
+ /**
+ * This string gives information to the end user about the information
+ * that is current on display on the page. The following tokens can be
+ * used in the string and will be dynamically replaced as the table
+ * display updates. This tokens can be placed anywhere in the string, or
+ * removed as needed by the language requires:
+ *
+ * * `\_START\_` - Display index of the first record on the current page
+ * * `\_END\_` - Display index of the last record on the current page
+ * * `\_TOTAL\_` - Number of records in the table after filtering
+ * * `\_MAX\_` - Number of records in the table without filtering
+ * * `\_PAGE\_` - Current page number
+ * * `\_PAGES\_` - Total number of pages of data in the table
+ *
+ * @type string
+ * @default Showing _START_ to _END_ of _TOTAL_ entries
+ *
+ * @dtopt Language
+ * @name DataTable.defaults.language.info
+ *
+ * @example
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "language": {
+ * "info": "Showing page _PAGE_ of _PAGES_"
+ * }
+ * } );
+ * } );
+ */
+ "sInfo": "Showing _START_ to _END_ of _TOTAL_ entries",
+
+
+ /**
+ * Display information string for when the table is empty. Typically the
+ * format of this string should match `info`.
+ * @type string
+ * @default Showing 0 to 0 of 0 entries
+ *
+ * @dtopt Language
+ * @name DataTable.defaults.language.infoEmpty
+ *
+ * @example
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "language": {
+ * "infoEmpty": "No entries to show"
+ * }
+ * } );
+ * } );
+ */
+ "sInfoEmpty": "Showing 0 to 0 of 0 entries",
+
+
+ /**
+ * When a user filters the information in a table, this string is appended
+ * to the information (`info`) to give an idea of how strong the filtering
+ * is. The variable _MAX_ is dynamically updated.
+ * @type string
+ * @default (filtered from _MAX_ total entries)
+ *
+ * @dtopt Language
+ * @name DataTable.defaults.language.infoFiltered
+ *
+ * @example
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "language": {
+ * "infoFiltered": " - filtering from _MAX_ records"
+ * }
+ * } );
+ * } );
+ */
+ "sInfoFiltered": "(filtered from _MAX_ total entries)",
+
+
+ /**
+ * If can be useful to append extra information to the info string at times,
+ * and this variable does exactly that. This information will be appended to
+ * the `info` (`infoEmpty` and `infoFiltered` in whatever combination they are
+ * being used) at all times.
+ * @type string
+ * @default Empty string
+ *
+ * @dtopt Language
+ * @name DataTable.defaults.language.infoPostFix
+ *
+ * @example
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "language": {
+ * "infoPostFix": "All records shown are derived from real information."
+ * }
+ * } );
+ * } );
+ */
+ "sInfoPostFix": "",
+
+
+ /**
+ * This decimal place operator is a little different from the other
+ * language options since DataTables doesn't output floating point
+ * numbers, so it won't ever use this for display of a number. Rather,
+ * what this parameter does is modify the sort methods of the table so
+ * that numbers which are in a format which has a character other than
+ * a period (`.`) as a decimal place will be sorted numerically.
+ *
+ * Note that numbers with different decimal places cannot be shown in
+ * the same table and still be sortable, the table must be consistent.
+ * However, multiple different tables on the page can use different
+ * decimal place characters.
+ * @type string
+ * @default
+ *
+ * @dtopt Language
+ * @name DataTable.defaults.language.decimal
+ *
+ * @example
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "language": {
+ * "decimal": ","
+ * "thousands": "."
+ * }
+ * } );
+ * } );
+ */
+ "sDecimal": "",
+
+
+ /**
+ * DataTables has a build in number formatter (`formatNumber`) which is
+ * used to format large numbers that are used in the table information.
+ * By default a comma is used, but this can be trivially changed to any
+ * character you wish with this parameter.
+ * @type string
+ * @default ,
+ *
+ * @dtopt Language
+ * @name DataTable.defaults.language.thousands
+ *
+ * @example
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "language": {
+ * "thousands": "'"
+ * }
+ * } );
+ * } );
+ */
+ "sThousands": ",",
+
+
+ /**
+ * Detail the action that will be taken when the drop down menu for the
+ * pagination length option is changed. The '_MENU_' variable is replaced
+ * with a default select list of 10, 25, 50 and 100, and can be replaced
+ * with a custom select box if required.
+ * @type string
+ * @default Show _MENU_ entries
+ *
+ * @dtopt Language
+ * @name DataTable.defaults.language.lengthMenu
+ *
+ * @example
+ * // Language change only
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "language": {
+ * "lengthMenu": "Display _MENU_ records"
+ * }
+ * } );
+ * } );
+ *
+ * @example
+ * // Language and options change
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "language": {
+ * "lengthMenu": 'Display '+
+ * '10 '+
+ * '20 '+
+ * '30 '+
+ * '40 '+
+ * '50 '+
+ * 'All '+
+ * ' records'
+ * }
+ * } );
+ * } );
+ */
+ "sLengthMenu": "Show _MENU_ entries",
+
+
+ /**
+ * When using Ajax sourced data and during the first draw when DataTables is
+ * gathering the data, this message is shown in an empty row in the table to
+ * indicate to the end user the the data is being loaded. Note that this
+ * parameter is not used when loading data by server-side processing, just
+ * Ajax sourced data with client-side processing.
+ * @type string
+ * @default Loading...
+ *
+ * @dtopt Language
+ * @name DataTable.defaults.language.loadingRecords
+ *
+ * @example
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "language": {
+ * "loadingRecords": "Please wait - loading..."
+ * }
+ * } );
+ * } );
+ */
+ "sLoadingRecords": "Loading...",
+
+
+ /**
+ * Text which is displayed when the table is processing a user action
+ * (usually a sort command or similar).
+ * @type string
+ * @default Processing...
+ *
+ * @dtopt Language
+ * @name DataTable.defaults.language.processing
+ *
+ * @example
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "language": {
+ * "processing": "DataTables is currently busy"
+ * }
+ * } );
+ * } );
+ */
+ "sProcessing": "Processing...",
+
+
+ /**
+ * Details the actions that will be taken when the user types into the
+ * filtering input text box. The variable "_INPUT_", if used in the string,
+ * is replaced with the HTML text box for the filtering input allowing
+ * control over where it appears in the string. If "_INPUT_" is not given
+ * then the input box is appended to the string automatically.
+ * @type string
+ * @default Search:
+ *
+ * @dtopt Language
+ * @name DataTable.defaults.language.search
+ *
+ * @example
+ * // Input text box will be appended at the end automatically
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "language": {
+ * "search": "Filter records:"
+ * }
+ * } );
+ * } );
+ *
+ * @example
+ * // Specify where the filter should appear
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "language": {
+ * "search": "Apply filter _INPUT_ to table"
+ * }
+ * } );
+ * } );
+ */
+ "sSearch": "Search:",
+
+
+ /**
+ * Assign a `placeholder` attribute to the search `input` element
+ * @type string
+ * @default
+ *
+ * @dtopt Language
+ * @name DataTable.defaults.language.searchPlaceholder
+ */
+ "sSearchPlaceholder": "",
+
+
+ /**
+ * All of the language information can be stored in a file on the
+ * server-side, which DataTables will look up if this parameter is passed.
+ * It must store the URL of the language file, which is in a JSON format,
+ * and the object has the same properties as the oLanguage object in the
+ * initialiser object (i.e. the above parameters). Please refer to one of
+ * the example language files to see how this works in action.
+ * @type string
+ * @default Empty string - i.e. disabled
+ *
+ * @dtopt Language
+ * @name DataTable.defaults.language.url
+ *
+ * @example
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "language": {
+ * "url": "http://www.sprymedia.co.uk/dataTables/lang.txt"
+ * }
+ * } );
+ * } );
+ */
+ "sUrl": "",
+
+
+ /**
+ * Text shown inside the table records when the is no information to be
+ * displayed after filtering. `emptyTable` is shown when there is simply no
+ * information in the table at all (regardless of filtering).
+ * @type string
+ * @default No matching records found
+ *
+ * @dtopt Language
+ * @name DataTable.defaults.language.zeroRecords
+ *
+ * @example
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "language": {
+ * "zeroRecords": "No records to display"
+ * }
+ * } );
+ * } );
+ */
+ "sZeroRecords": "No matching records found"
+ },
+
+
+ /**
+ * This parameter allows you to have define the global filtering state at
+ * initialisation time. As an object the `search` parameter must be
+ * defined, but all other parameters are optional. When `regex` is true,
+ * the search string will be treated as a regular expression, when false
+ * (default) it will be treated as a straight string. When `smart`
+ * DataTables will use it's smart filtering methods (to word match at
+ * any point in the data), when false this will not be done.
+ * @namespace
+ * @extends DataTable.models.oSearch
+ *
+ * @dtopt Options
+ * @name DataTable.defaults.search
+ *
+ * @example
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "search": {"search": "Initial search"}
+ * } );
+ * } )
+ */
+ "oSearch": $.extend( {}, DataTable.models.oSearch ),
+
+
+ /**
+ * __Deprecated__ The functionality provided by this parameter has now been
+ * superseded by that provided through `ajax`, which should be used instead.
+ *
+ * By default DataTables will look for the property `data` (or `aaData` for
+ * compatibility with DataTables 1.9-) when obtaining data from an Ajax
+ * source or for server-side processing - this parameter allows that
+ * property to be changed. You can use Javascript dotted object notation to
+ * get a data source for multiple levels of nesting.
+ * @type string
+ * @default data
+ *
+ * @dtopt Options
+ * @dtopt Server-side
+ * @name DataTable.defaults.ajaxDataProp
+ *
+ * @deprecated 1.10. Please use `ajax` for this functionality now.
+ */
+ "sAjaxDataProp": "data",
+
+
+ /**
+ * __Deprecated__ The functionality provided by this parameter has now been
+ * superseded by that provided through `ajax`, which should be used instead.
+ *
+ * You can instruct DataTables to load data from an external
+ * source using this parameter (use aData if you want to pass data in you
+ * already have). Simply provide a url a JSON object can be obtained from.
+ * @type string
+ * @default null
+ *
+ * @dtopt Options
+ * @dtopt Server-side
+ * @name DataTable.defaults.ajaxSource
+ *
+ * @deprecated 1.10. Please use `ajax` for this functionality now.
+ */
+ "sAjaxSource": null,
+
+
+ /**
+ * This initialisation variable allows you to specify exactly where in the
+ * DOM you want DataTables to inject the various controls it adds to the page
+ * (for example you might want the pagination controls at the top of the
+ * table). DIV elements (with or without a custom class) can also be added to
+ * aid styling. The follow syntax is used:
+ *
+ * The following options are allowed:
+ *
+ * 'l' - Length changing
+ * 'f' - Filtering input
+ * 't' - The table!
+ * 'i' - Information
+ * 'p' - Pagination
+ * 'r' - pRocessing
+ *
+ *
+ * The following constants are allowed:
+ *
+ * 'H' - jQueryUI theme "header" classes ('fg-toolbar ui-widget-header ui-corner-tl ui-corner-tr ui-helper-clearfix')
+ * 'F' - jQueryUI theme "footer" classes ('fg-toolbar ui-widget-header ui-corner-bl ui-corner-br ui-helper-clearfix')
+ *
+ *
+ * The following syntax is expected:
+ *
+ * '<' and '>' - div elements
+ * '<"class" and '>' - div with a class
+ * '<"#id" and '>' - div with an ID
+ *
+ *
+ * Examples:
+ *
+ * '<"wrapper"flipt>'
+ * '<lf<t>ip>'
+ *
+ *
+ *
+ * @type string
+ * @default lfrtip (when `jQueryUI` is false) or
+ * <"H"lfr>t<"F"ip> (when `jQueryUI` is true)
+ *
+ * @dtopt Options
+ * @name DataTable.defaults.dom
+ *
+ * @example
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "dom": '<"top"i>rt<"bottom"flp><"clear">'
+ * } );
+ * } );
+ */
+ "sDom": "lfrtip",
+
+
+ /**
+ * Search delay option. This will throttle full table searches that use the
+ * DataTables provided search input element (it does not effect calls to
+ * `dt-api search()`, providing a delay before the search is made.
+ * @type integer
+ * @default 0
+ *
+ * @dtopt Options
+ * @name DataTable.defaults.searchDelay
+ *
+ * @example
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "searchDelay": 200
+ * } );
+ * } )
+ */
+ "searchDelay": null,
+
+
+ /**
+ * DataTables features six different built-in options for the buttons to
+ * display for pagination control:
+ *
+ * * `numbers` - Page number buttons only
+ * * `simple` - 'Previous' and 'Next' buttons only
+ * * 'simple_numbers` - 'Previous' and 'Next' buttons, plus page numbers
+ * * `full` - 'First', 'Previous', 'Next' and 'Last' buttons
+ * * `full_numbers` - 'First', 'Previous', 'Next' and 'Last' buttons, plus page numbers
+ * * `first_last_numbers` - 'First' and 'Last' buttons, plus page numbers
+ *
+ * Further methods can be added using {@link DataTable.ext.oPagination}.
+ * @type string
+ * @default simple_numbers
+ *
+ * @dtopt Options
+ * @name DataTable.defaults.pagingType
+ *
+ * @example
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "pagingType": "full_numbers"
+ * } );
+ * } )
+ */
+ "sPaginationType": "simple_numbers",
+
+
+ /**
+ * Enable horizontal scrolling. When a table is too wide to fit into a
+ * certain layout, or you have a large number of columns in the table, you
+ * can enable x-scrolling to show the table in a viewport, which can be
+ * scrolled. This property can be `true` which will allow the table to
+ * scroll horizontally when needed, or any CSS unit, or a number (in which
+ * case it will be treated as a pixel measurement). Setting as simply `true`
+ * is recommended.
+ * @type boolean|string
+ * @default blank string - i.e. disabled
+ *
+ * @dtopt Features
+ * @name DataTable.defaults.scrollX
+ *
+ * @example
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "scrollX": true,
+ * "scrollCollapse": true
+ * } );
+ * } );
+ */
+ "sScrollX": "",
+
+
+ /**
+ * This property can be used to force a DataTable to use more width than it
+ * might otherwise do when x-scrolling is enabled. For example if you have a
+ * table which requires to be well spaced, this parameter is useful for
+ * "over-sizing" the table, and thus forcing scrolling. This property can by
+ * any CSS unit, or a number (in which case it will be treated as a pixel
+ * measurement).
+ * @type string
+ * @default blank string - i.e. disabled
+ *
+ * @dtopt Options
+ * @name DataTable.defaults.scrollXInner
+ *
+ * @example
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "scrollX": "100%",
+ * "scrollXInner": "110%"
+ * } );
+ * } );
+ */
+ "sScrollXInner": "",
+
+
+ /**
+ * Enable vertical scrolling. Vertical scrolling will constrain the DataTable
+ * to the given height, and enable scrolling for any data which overflows the
+ * current viewport. This can be used as an alternative to paging to display
+ * a lot of data in a small area (although paging and scrolling can both be
+ * enabled at the same time). This property can be any CSS unit, or a number
+ * (in which case it will be treated as a pixel measurement).
+ * @type string
+ * @default blank string - i.e. disabled
+ *
+ * @dtopt Features
+ * @name DataTable.defaults.scrollY
+ *
+ * @example
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "scrollY": "200px",
+ * "paginate": false
+ * } );
+ * } );
+ */
+ "sScrollY": "",
+
+
+ /**
+ * __Deprecated__ The functionality provided by this parameter has now been
+ * superseded by that provided through `ajax`, which should be used instead.
+ *
+ * Set the HTTP method that is used to make the Ajax call for server-side
+ * processing or Ajax sourced data.
+ * @type string
+ * @default GET
+ *
+ * @dtopt Options
+ * @dtopt Server-side
+ * @name DataTable.defaults.serverMethod
+ *
+ * @deprecated 1.10. Please use `ajax` for this functionality now.
+ */
+ "sServerMethod": "GET",
+
+
+ /**
+ * DataTables makes use of renderers when displaying HTML elements for
+ * a table. These renderers can be added or modified by plug-ins to
+ * generate suitable mark-up for a site. For example the Bootstrap
+ * integration plug-in for DataTables uses a paging button renderer to
+ * display pagination buttons in the mark-up required by Bootstrap.
+ *
+ * For further information about the renderers available see
+ * DataTable.ext.renderer
+ * @type string|object
+ * @default null
+ *
+ * @name DataTable.defaults.renderer
+ *
+ */
+ "renderer": null,
+
+
+ /**
+ * Set the data property name that DataTables should use to get a row's id
+ * to set as the `id` property in the node.
+ * @type string
+ * @default DT_RowId
+ *
+ * @name DataTable.defaults.rowId
+ */
+ "rowId": "DT_RowId"
+ };
+
+ _fnHungarianMap( DataTable.defaults );
+
+
+
+ /*
+ * Developer note - See note in model.defaults.js about the use of Hungarian
+ * notation and camel case.
+ */
+
+ /**
+ * Column options that can be given to DataTables at initialisation time.
+ * @namespace
+ */
+ DataTable.defaults.column = {
+ /**
+ * Define which column(s) an order will occur on for this column. This
+ * allows a column's ordering to take multiple columns into account when
+ * doing a sort or use the data from a different column. For example first
+ * name / last name columns make sense to do a multi-column sort over the
+ * two columns.
+ * @type array|int
+ * @default null Takes the value of the column index automatically
+ *
+ * @name DataTable.defaults.column.orderData
+ * @dtopt Columns
+ *
+ * @example
+ * // Using `columnDefs`
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "columnDefs": [
+ * { "orderData": [ 0, 1 ], "targets": [ 0 ] },
+ * { "orderData": [ 1, 0 ], "targets": [ 1 ] },
+ * { "orderData": 2, "targets": [ 2 ] }
+ * ]
+ * } );
+ * } );
+ *
+ * @example
+ * // Using `columns`
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "columns": [
+ * { "orderData": [ 0, 1 ] },
+ * { "orderData": [ 1, 0 ] },
+ * { "orderData": 2 },
+ * null,
+ * null
+ * ]
+ * } );
+ * } );
+ */
+ "aDataSort": null,
+ "iDataSort": -1,
+
+
+ /**
+ * You can control the default ordering direction, and even alter the
+ * behaviour of the sort handler (i.e. only allow ascending ordering etc)
+ * using this parameter.
+ * @type array
+ * @default [ 'asc', 'desc' ]
+ *
+ * @name DataTable.defaults.column.orderSequence
+ * @dtopt Columns
+ *
+ * @example
+ * // Using `columnDefs`
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "columnDefs": [
+ * { "orderSequence": [ "asc" ], "targets": [ 1 ] },
+ * { "orderSequence": [ "desc", "asc", "asc" ], "targets": [ 2 ] },
+ * { "orderSequence": [ "desc" ], "targets": [ 3 ] }
+ * ]
+ * } );
+ * } );
+ *
+ * @example
+ * // Using `columns`
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "columns": [
+ * null,
+ * { "orderSequence": [ "asc" ] },
+ * { "orderSequence": [ "desc", "asc", "asc" ] },
+ * { "orderSequence": [ "desc" ] },
+ * null
+ * ]
+ * } );
+ * } );
+ */
+ "asSorting": [ 'asc', 'desc' ],
+
+
+ /**
+ * Enable or disable filtering on the data in this column.
+ * @type boolean
+ * @default true
+ *
+ * @name DataTable.defaults.column.searchable
+ * @dtopt Columns
+ *
+ * @example
+ * // Using `columnDefs`
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "columnDefs": [
+ * { "searchable": false, "targets": [ 0 ] }
+ * ] } );
+ * } );
+ *
+ * @example
+ * // Using `columns`
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "columns": [
+ * { "searchable": false },
+ * null,
+ * null,
+ * null,
+ * null
+ * ] } );
+ * } );
+ */
+ "bSearchable": true,
+
+
+ /**
+ * Enable or disable ordering on this column.
+ * @type boolean
+ * @default true
+ *
+ * @name DataTable.defaults.column.orderable
+ * @dtopt Columns
+ *
+ * @example
+ * // Using `columnDefs`
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "columnDefs": [
+ * { "orderable": false, "targets": [ 0 ] }
+ * ] } );
+ * } );
+ *
+ * @example
+ * // Using `columns`
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "columns": [
+ * { "orderable": false },
+ * null,
+ * null,
+ * null,
+ * null
+ * ] } );
+ * } );
+ */
+ "bSortable": true,
+
+
+ /**
+ * Enable or disable the display of this column.
+ * @type boolean
+ * @default true
+ *
+ * @name DataTable.defaults.column.visible
+ * @dtopt Columns
+ *
+ * @example
+ * // Using `columnDefs`
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "columnDefs": [
+ * { "visible": false, "targets": [ 0 ] }
+ * ] } );
+ * } );
+ *
+ * @example
+ * // Using `columns`
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "columns": [
+ * { "visible": false },
+ * null,
+ * null,
+ * null,
+ * null
+ * ] } );
+ * } );
+ */
+ "bVisible": true,
+
+
+ /**
+ * Developer definable function that is called whenever a cell is created (Ajax source,
+ * etc) or processed for input (DOM source). This can be used as a compliment to mRender
+ * allowing you to modify the DOM element (add background colour for example) when the
+ * element is available.
+ * @type function
+ * @param {element} td The TD node that has been created
+ * @param {*} cellData The Data for the cell
+ * @param {array|object} rowData The data for the whole row
+ * @param {int} row The row index for the aoData data store
+ * @param {int} col The column index for aoColumns
+ *
+ * @name DataTable.defaults.column.createdCell
+ * @dtopt Columns
+ *
+ * @example
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "columnDefs": [ {
+ * "targets": [3],
+ * "createdCell": function (td, cellData, rowData, row, col) {
+ * if ( cellData == "1.7" ) {
+ * $(td).css('color', 'blue')
+ * }
+ * }
+ * } ]
+ * });
+ * } );
+ */
+ "fnCreatedCell": null,
+
+
+ /**
+ * This parameter has been replaced by `data` in DataTables to ensure naming
+ * consistency. `dataProp` can still be used, as there is backwards
+ * compatibility in DataTables for this option, but it is strongly
+ * recommended that you use `data` in preference to `dataProp`.
+ * @name DataTable.defaults.column.dataProp
+ */
+
+
+ /**
+ * This property can be used to read data from any data source property,
+ * including deeply nested objects / properties. `data` can be given in a
+ * number of different ways which effect its behaviour:
+ *
+ * * `integer` - treated as an array index for the data source. This is the
+ * default that DataTables uses (incrementally increased for each column).
+ * * `string` - read an object property from the data source. There are
+ * three 'special' options that can be used in the string to alter how
+ * DataTables reads the data from the source object:
+ * * `.` - Dotted Javascript notation. Just as you use a `.` in
+ * Javascript to read from nested objects, so to can the options
+ * specified in `data`. For example: `browser.version` or
+ * `browser.name`. If your object parameter name contains a period, use
+ * `\\` to escape it - i.e. `first\\.name`.
+ * * `[]` - Array notation. DataTables can automatically combine data
+ * from and array source, joining the data with the characters provided
+ * between the two brackets. For example: `name[, ]` would provide a
+ * comma-space separated list from the source array. If no characters
+ * are provided between the brackets, the original array source is
+ * returned.
+ * * `()` - Function notation. Adding `()` to the end of a parameter will
+ * execute a function of the name given. For example: `browser()` for a
+ * simple function on the data source, `browser.version()` for a
+ * function in a nested property or even `browser().version` to get an
+ * object property if the function called returns an object. Note that
+ * function notation is recommended for use in `render` rather than
+ * `data` as it is much simpler to use as a renderer.
+ * * `null` - use the original data source for the row rather than plucking
+ * data directly from it. This action has effects on two other
+ * initialisation options:
+ * * `defaultContent` - When null is given as the `data` option and
+ * `defaultContent` is specified for the column, the value defined by
+ * `defaultContent` will be used for the cell.
+ * * `render` - When null is used for the `data` option and the `render`
+ * option is specified for the column, the whole data source for the
+ * row is used for the renderer.
+ * * `function` - the function given will be executed whenever DataTables
+ * needs to set or get the data for a cell in the column. The function
+ * takes three parameters:
+ * * Parameters:
+ * * `{array|object}` The data source for the row
+ * * `{string}` The type call data requested - this will be 'set' when
+ * setting data or 'filter', 'display', 'type', 'sort' or undefined
+ * when gathering data. Note that when `undefined` is given for the
+ * type DataTables expects to get the raw data for the object back<
+ * * `{*}` Data to set when the second parameter is 'set'.
+ * * Return:
+ * * The return value from the function is not required when 'set' is
+ * the type of call, but otherwise the return is what will be used
+ * for the data requested.
+ *
+ * Note that `data` is a getter and setter option. If you just require
+ * formatting of data for output, you will likely want to use `render` which
+ * is simply a getter and thus simpler to use.
+ *
+ * Note that prior to DataTables 1.9.2 `data` was called `mDataProp`. The
+ * name change reflects the flexibility of this property and is consistent
+ * with the naming of mRender. If 'mDataProp' is given, then it will still
+ * be used by DataTables, as it automatically maps the old name to the new
+ * if required.
+ *
+ * @type string|int|function|null
+ * @default null Use automatically calculated column index
+ *
+ * @name DataTable.defaults.column.data
+ * @dtopt Columns
+ *
+ * @example
+ * // Read table data from objects
+ * // JSON structure for each row:
+ * // {
+ * // "engine": {value},
+ * // "browser": {value},
+ * // "platform": {value},
+ * // "version": {value},
+ * // "grade": {value}
+ * // }
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "ajaxSource": "sources/objects.txt",
+ * "columns": [
+ * { "data": "engine" },
+ * { "data": "browser" },
+ * { "data": "platform" },
+ * { "data": "version" },
+ * { "data": "grade" }
+ * ]
+ * } );
+ * } );
+ *
+ * @example
+ * // Read information from deeply nested objects
+ * // JSON structure for each row:
+ * // {
+ * // "engine": {value},
+ * // "browser": {value},
+ * // "platform": {
+ * // "inner": {value}
+ * // },
+ * // "details": [
+ * // {value}, {value}
+ * // ]
+ * // }
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "ajaxSource": "sources/deep.txt",
+ * "columns": [
+ * { "data": "engine" },
+ * { "data": "browser" },
+ * { "data": "platform.inner" },
+ * { "data": "details.0" },
+ * { "data": "details.1" }
+ * ]
+ * } );
+ * } );
+ *
+ * @example
+ * // Using `data` as a function to provide different information for
+ * // sorting, filtering and display. In this case, currency (price)
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "columnDefs": [ {
+ * "targets": [ 0 ],
+ * "data": function ( source, type, val ) {
+ * if (type === 'set') {
+ * source.price = val;
+ * // Store the computed dislay and filter values for efficiency
+ * source.price_display = val=="" ? "" : "$"+numberFormat(val);
+ * source.price_filter = val=="" ? "" : "$"+numberFormat(val)+" "+val;
+ * return;
+ * }
+ * else if (type === 'display') {
+ * return source.price_display;
+ * }
+ * else if (type === 'filter') {
+ * return source.price_filter;
+ * }
+ * // 'sort', 'type' and undefined all just use the integer
+ * return source.price;
+ * }
+ * } ]
+ * } );
+ * } );
+ *
+ * @example
+ * // Using default content
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "columnDefs": [ {
+ * "targets": [ 0 ],
+ * "data": null,
+ * "defaultContent": "Click to edit"
+ * } ]
+ * } );
+ * } );
+ *
+ * @example
+ * // Using array notation - outputting a list from an array
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "columnDefs": [ {
+ * "targets": [ 0 ],
+ * "data": "name[, ]"
+ * } ]
+ * } );
+ * } );
+ *
+ */
+ "mData": null,
+
+
+ /**
+ * This property is the rendering partner to `data` and it is suggested that
+ * when you want to manipulate data for display (including filtering,
+ * sorting etc) without altering the underlying data for the table, use this
+ * property. `render` can be considered to be the the read only companion to
+ * `data` which is read / write (then as such more complex). Like `data`
+ * this option can be given in a number of different ways to effect its
+ * behaviour:
+ *
+ * * `integer` - treated as an array index for the data source. This is the
+ * default that DataTables uses (incrementally increased for each column).
+ * * `string` - read an object property from the data source. There are
+ * three 'special' options that can be used in the string to alter how
+ * DataTables reads the data from the source object:
+ * * `.` - Dotted Javascript notation. Just as you use a `.` in
+ * Javascript to read from nested objects, so to can the options
+ * specified in `data`. For example: `browser.version` or
+ * `browser.name`. If your object parameter name contains a period, use
+ * `\\` to escape it - i.e. `first\\.name`.
+ * * `[]` - Array notation. DataTables can automatically combine data
+ * from and array source, joining the data with the characters provided
+ * between the two brackets. For example: `name[, ]` would provide a
+ * comma-space separated list from the source array. If no characters
+ * are provided between the brackets, the original array source is
+ * returned.
+ * * `()` - Function notation. Adding `()` to the end of a parameter will
+ * execute a function of the name given. For example: `browser()` for a
+ * simple function on the data source, `browser.version()` for a
+ * function in a nested property or even `browser().version` to get an
+ * object property if the function called returns an object.
+ * * `object` - use different data for the different data types requested by
+ * DataTables ('filter', 'display', 'type' or 'sort'). The property names
+ * of the object is the data type the property refers to and the value can
+ * defined using an integer, string or function using the same rules as
+ * `render` normally does. Note that an `_` option _must_ be specified.
+ * This is the default value to use if you haven't specified a value for
+ * the data type requested by DataTables.
+ * * `function` - the function given will be executed whenever DataTables
+ * needs to set or get the data for a cell in the column. The function
+ * takes three parameters:
+ * * Parameters:
+ * * {array|object} The data source for the row (based on `data`)
+ * * {string} The type call data requested - this will be 'filter',
+ * 'display', 'type' or 'sort'.
+ * * {array|object} The full data source for the row (not based on
+ * `data`)
+ * * Return:
+ * * The return value from the function is what will be used for the
+ * data requested.
+ *
+ * @type string|int|function|object|null
+ * @default null Use the data source value.
+ *
+ * @name DataTable.defaults.column.render
+ * @dtopt Columns
+ *
+ * @example
+ * // Create a comma separated list from an array of objects
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "ajaxSource": "sources/deep.txt",
+ * "columns": [
+ * { "data": "engine" },
+ * { "data": "browser" },
+ * {
+ * "data": "platform",
+ * "render": "[, ].name"
+ * }
+ * ]
+ * } );
+ * } );
+ *
+ * @example
+ * // Execute a function to obtain data
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "columnDefs": [ {
+ * "targets": [ 0 ],
+ * "data": null, // Use the full data source object for the renderer's source
+ * "render": "browserName()"
+ * } ]
+ * } );
+ * } );
+ *
+ * @example
+ * // As an object, extracting different data for the different types
+ * // This would be used with a data source such as:
+ * // { "phone": 5552368, "phone_filter": "5552368 555-2368", "phone_display": "555-2368" }
+ * // Here the `phone` integer is used for sorting and type detection, while `phone_filter`
+ * // (which has both forms) is used for filtering for if a user inputs either format, while
+ * // the formatted phone number is the one that is shown in the table.
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "columnDefs": [ {
+ * "targets": [ 0 ],
+ * "data": null, // Use the full data source object for the renderer's source
+ * "render": {
+ * "_": "phone",
+ * "filter": "phone_filter",
+ * "display": "phone_display"
+ * }
+ * } ]
+ * } );
+ * } );
+ *
+ * @example
+ * // Use as a function to create a link from the data source
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "columnDefs": [ {
+ * "targets": [ 0 ],
+ * "data": "download_link",
+ * "render": function ( data, type, full ) {
+ * return 'Download ';
+ * }
+ * } ]
+ * } );
+ * } );
+ */
+ "mRender": null,
+
+
+ /**
+ * Change the cell type created for the column - either TD cells or TH cells. This
+ * can be useful as TH cells have semantic meaning in the table body, allowing them
+ * to act as a header for a row (you may wish to add scope='row' to the TH elements).
+ * @type string
+ * @default td
+ *
+ * @name DataTable.defaults.column.cellType
+ * @dtopt Columns
+ *
+ * @example
+ * // Make the first column use TH cells
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "columnDefs": [ {
+ * "targets": [ 0 ],
+ * "cellType": "th"
+ * } ]
+ * } );
+ * } );
+ */
+ "sCellType": "td",
+
+
+ /**
+ * Class to give to each cell in this column.
+ * @type string
+ * @default Empty string
+ *
+ * @name DataTable.defaults.column.class
+ * @dtopt Columns
+ *
+ * @example
+ * // Using `columnDefs`
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "columnDefs": [
+ * { "class": "my_class", "targets": [ 0 ] }
+ * ]
+ * } );
+ * } );
+ *
+ * @example
+ * // Using `columns`
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "columns": [
+ * { "class": "my_class" },
+ * null,
+ * null,
+ * null,
+ * null
+ * ]
+ * } );
+ * } );
+ */
+ "sClass": "",
+
+ /**
+ * When DataTables calculates the column widths to assign to each column,
+ * it finds the longest string in each column and then constructs a
+ * temporary table and reads the widths from that. The problem with this
+ * is that "mmm" is much wider then "iiii", but the latter is a longer
+ * string - thus the calculation can go wrong (doing it properly and putting
+ * it into an DOM object and measuring that is horribly(!) slow). Thus as
+ * a "work around" we provide this option. It will append its value to the
+ * text that is found to be the longest string for the column - i.e. padding.
+ * Generally you shouldn't need this!
+ * @type string
+ * @default Empty string
+ *
+ * @name DataTable.defaults.column.contentPadding
+ * @dtopt Columns
+ *
+ * @example
+ * // Using `columns`
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "columns": [
+ * null,
+ * null,
+ * null,
+ * {
+ * "contentPadding": "mmm"
+ * }
+ * ]
+ * } );
+ * } );
+ */
+ "sContentPadding": "",
+
+
+ /**
+ * Allows a default value to be given for a column's data, and will be used
+ * whenever a null data source is encountered (this can be because `data`
+ * is set to null, or because the data source itself is null).
+ * @type string
+ * @default null
+ *
+ * @name DataTable.defaults.column.defaultContent
+ * @dtopt Columns
+ *
+ * @example
+ * // Using `columnDefs`
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "columnDefs": [
+ * {
+ * "data": null,
+ * "defaultContent": "Edit",
+ * "targets": [ -1 ]
+ * }
+ * ]
+ * } );
+ * } );
+ *
+ * @example
+ * // Using `columns`
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "columns": [
+ * null,
+ * null,
+ * null,
+ * {
+ * "data": null,
+ * "defaultContent": "Edit"
+ * }
+ * ]
+ * } );
+ * } );
+ */
+ "sDefaultContent": null,
+
+
+ /**
+ * This parameter is only used in DataTables' server-side processing. It can
+ * be exceptionally useful to know what columns are being displayed on the
+ * client side, and to map these to database fields. When defined, the names
+ * also allow DataTables to reorder information from the server if it comes
+ * back in an unexpected order (i.e. if you switch your columns around on the
+ * client-side, your server-side code does not also need updating).
+ * @type string
+ * @default Empty string
+ *
+ * @name DataTable.defaults.column.name
+ * @dtopt Columns
+ *
+ * @example
+ * // Using `columnDefs`
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "columnDefs": [
+ * { "name": "engine", "targets": [ 0 ] },
+ * { "name": "browser", "targets": [ 1 ] },
+ * { "name": "platform", "targets": [ 2 ] },
+ * { "name": "version", "targets": [ 3 ] },
+ * { "name": "grade", "targets": [ 4 ] }
+ * ]
+ * } );
+ * } );
+ *
+ * @example
+ * // Using `columns`
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "columns": [
+ * { "name": "engine" },
+ * { "name": "browser" },
+ * { "name": "platform" },
+ * { "name": "version" },
+ * { "name": "grade" }
+ * ]
+ * } );
+ * } );
+ */
+ "sName": "",
+
+
+ /**
+ * Defines a data source type for the ordering which can be used to read
+ * real-time information from the table (updating the internally cached
+ * version) prior to ordering. This allows ordering to occur on user
+ * editable elements such as form inputs.
+ * @type string
+ * @default std
+ *
+ * @name DataTable.defaults.column.orderDataType
+ * @dtopt Columns
+ *
+ * @example
+ * // Using `columnDefs`
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "columnDefs": [
+ * { "orderDataType": "dom-text", "targets": [ 2, 3 ] },
+ * { "type": "numeric", "targets": [ 3 ] },
+ * { "orderDataType": "dom-select", "targets": [ 4 ] },
+ * { "orderDataType": "dom-checkbox", "targets": [ 5 ] }
+ * ]
+ * } );
+ * } );
+ *
+ * @example
+ * // Using `columns`
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "columns": [
+ * null,
+ * null,
+ * { "orderDataType": "dom-text" },
+ * { "orderDataType": "dom-text", "type": "numeric" },
+ * { "orderDataType": "dom-select" },
+ * { "orderDataType": "dom-checkbox" }
+ * ]
+ * } );
+ * } );
+ */
+ "sSortDataType": "std",
+
+
+ /**
+ * The title of this column.
+ * @type string
+ * @default null Derived from the 'TH' value for this column in the
+ * original HTML table.
+ *
+ * @name DataTable.defaults.column.title
+ * @dtopt Columns
+ *
+ * @example
+ * // Using `columnDefs`
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "columnDefs": [
+ * { "title": "My column title", "targets": [ 0 ] }
+ * ]
+ * } );
+ * } );
+ *
+ * @example
+ * // Using `columns`
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "columns": [
+ * { "title": "My column title" },
+ * null,
+ * null,
+ * null,
+ * null
+ * ]
+ * } );
+ * } );
+ */
+ "sTitle": null,
+
+
+ /**
+ * The type allows you to specify how the data for this column will be
+ * ordered. Four types (string, numeric, date and html (which will strip
+ * HTML tags before ordering)) are currently available. Note that only date
+ * formats understood by Javascript's Date() object will be accepted as type
+ * date. For example: "Mar 26, 2008 5:03 PM". May take the values: 'string',
+ * 'numeric', 'date' or 'html' (by default). Further types can be adding
+ * through plug-ins.
+ * @type string
+ * @default null Auto-detected from raw data
+ *
+ * @name DataTable.defaults.column.type
+ * @dtopt Columns
+ *
+ * @example
+ * // Using `columnDefs`
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "columnDefs": [
+ * { "type": "html", "targets": [ 0 ] }
+ * ]
+ * } );
+ * } );
+ *
+ * @example
+ * // Using `columns`
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "columns": [
+ * { "type": "html" },
+ * null,
+ * null,
+ * null,
+ * null
+ * ]
+ * } );
+ * } );
+ */
+ "sType": null,
+
+
+ /**
+ * Defining the width of the column, this parameter may take any CSS value
+ * (3em, 20px etc). DataTables applies 'smart' widths to columns which have not
+ * been given a specific width through this interface ensuring that the table
+ * remains readable.
+ * @type string
+ * @default null Automatic
+ *
+ * @name DataTable.defaults.column.width
+ * @dtopt Columns
+ *
+ * @example
+ * // Using `columnDefs`
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "columnDefs": [
+ * { "width": "20%", "targets": [ 0 ] }
+ * ]
+ * } );
+ * } );
+ *
+ * @example
+ * // Using `columns`
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "columns": [
+ * { "width": "20%" },
+ * null,
+ * null,
+ * null,
+ * null
+ * ]
+ * } );
+ * } );
+ */
+ "sWidth": null
+ };
+
+ _fnHungarianMap( DataTable.defaults.column );
+
+
+
+ /**
+ * DataTables settings object - this holds all the information needed for a
+ * given table, including configuration, data and current application of the
+ * table options. DataTables does not have a single instance for each DataTable
+ * with the settings attached to that instance, but rather instances of the
+ * DataTable "class" are created on-the-fly as needed (typically by a
+ * $().dataTable() call) and the settings object is then applied to that
+ * instance.
+ *
+ * Note that this object is related to {@link DataTable.defaults} but this
+ * one is the internal data store for DataTables's cache of columns. It should
+ * NOT be manipulated outside of DataTables. Any configuration should be done
+ * through the initialisation options.
+ * @namespace
+ * @todo Really should attach the settings object to individual instances so we
+ * don't need to create new instances on each $().dataTable() call (if the
+ * table already exists). It would also save passing oSettings around and
+ * into every single function. However, this is a very significant
+ * architecture change for DataTables and will almost certainly break
+ * backwards compatibility with older installations. This is something that
+ * will be done in 2.0.
+ */
+ DataTable.models.oSettings = {
+ /**
+ * Primary features of DataTables and their enablement state.
+ * @namespace
+ */
+ "oFeatures": {
+
+ /**
+ * Flag to say if DataTables should automatically try to calculate the
+ * optimum table and columns widths (true) or not (false).
+ * Note that this parameter will be set by the initialisation routine. To
+ * set a default use {@link DataTable.defaults}.
+ * @type boolean
+ */
+ "bAutoWidth": null,
+
+ /**
+ * Delay the creation of TR and TD elements until they are actually
+ * needed by a driven page draw. This can give a significant speed
+ * increase for Ajax source and Javascript source data, but makes no
+ * difference at all fro DOM and server-side processing tables.
+ * Note that this parameter will be set by the initialisation routine. To
+ * set a default use {@link DataTable.defaults}.
+ * @type boolean
+ */
+ "bDeferRender": null,
+
+ /**
+ * Enable filtering on the table or not. Note that if this is disabled
+ * then there is no filtering at all on the table, including fnFilter.
+ * To just remove the filtering input use sDom and remove the 'f' option.
+ * Note that this parameter will be set by the initialisation routine. To
+ * set a default use {@link DataTable.defaults}.
+ * @type boolean
+ */
+ "bFilter": null,
+
+ /**
+ * Table information element (the 'Showing x of y records' div) enable
+ * flag.
+ * Note that this parameter will be set by the initialisation routine. To
+ * set a default use {@link DataTable.defaults}.
+ * @type boolean
+ */
+ "bInfo": null,
+
+ /**
+ * Present a user control allowing the end user to change the page size
+ * when pagination is enabled.
+ * Note that this parameter will be set by the initialisation routine. To
+ * set a default use {@link DataTable.defaults}.
+ * @type boolean
+ */
+ "bLengthChange": null,
+
+ /**
+ * Pagination enabled or not. Note that if this is disabled then length
+ * changing must also be disabled.
+ * Note that this parameter will be set by the initialisation routine. To
+ * set a default use {@link DataTable.defaults}.
+ * @type boolean
+ */
+ "bPaginate": null,
+
+ /**
+ * Processing indicator enable flag whenever DataTables is enacting a
+ * user request - typically an Ajax request for server-side processing.
+ * Note that this parameter will be set by the initialisation routine. To
+ * set a default use {@link DataTable.defaults}.
+ * @type boolean
+ */
+ "bProcessing": null,
+
+ /**
+ * Server-side processing enabled flag - when enabled DataTables will
+ * get all data from the server for every draw - there is no filtering,
+ * sorting or paging done on the client-side.
+ * Note that this parameter will be set by the initialisation routine. To
+ * set a default use {@link DataTable.defaults}.
+ * @type boolean
+ */
+ "bServerSide": null,
+
+ /**
+ * Sorting enablement flag.
+ * Note that this parameter will be set by the initialisation routine. To
+ * set a default use {@link DataTable.defaults}.
+ * @type boolean
+ */
+ "bSort": null,
+
+ /**
+ * Multi-column sorting
+ * Note that this parameter will be set by the initialisation routine. To
+ * set a default use {@link DataTable.defaults}.
+ * @type boolean
+ */
+ "bSortMulti": null,
+
+ /**
+ * Apply a class to the columns which are being sorted to provide a
+ * visual highlight or not. This can slow things down when enabled since
+ * there is a lot of DOM interaction.
+ * Note that this parameter will be set by the initialisation routine. To
+ * set a default use {@link DataTable.defaults}.
+ * @type boolean
+ */
+ "bSortClasses": null,
+
+ /**
+ * State saving enablement flag.
+ * Note that this parameter will be set by the initialisation routine. To
+ * set a default use {@link DataTable.defaults}.
+ * @type boolean
+ */
+ "bStateSave": null
+ },
+
+
+ /**
+ * Scrolling settings for a table.
+ * @namespace
+ */
+ "oScroll": {
+ /**
+ * When the table is shorter in height than sScrollY, collapse the
+ * table container down to the height of the table (when true).
+ * Note that this parameter will be set by the initialisation routine. To
+ * set a default use {@link DataTable.defaults}.
+ * @type boolean
+ */
+ "bCollapse": null,
+
+ /**
+ * Width of the scrollbar for the web-browser's platform. Calculated
+ * during table initialisation.
+ * @type int
+ * @default 0
+ */
+ "iBarWidth": 0,
+
+ /**
+ * Viewport width for horizontal scrolling. Horizontal scrolling is
+ * disabled if an empty string.
+ * Note that this parameter will be set by the initialisation routine. To
+ * set a default use {@link DataTable.defaults}.
+ * @type string
+ */
+ "sX": null,
+
+ /**
+ * Width to expand the table to when using x-scrolling. Typically you
+ * should not need to use this.
+ * Note that this parameter will be set by the initialisation routine. To
+ * set a default use {@link DataTable.defaults}.
+ * @type string
+ * @deprecated
+ */
+ "sXInner": null,
+
+ /**
+ * Viewport height for vertical scrolling. Vertical scrolling is disabled
+ * if an empty string.
+ * Note that this parameter will be set by the initialisation routine. To
+ * set a default use {@link DataTable.defaults}.
+ * @type string
+ */
+ "sY": null
+ },
+
+ /**
+ * Language information for the table.
+ * @namespace
+ * @extends DataTable.defaults.oLanguage
+ */
+ "oLanguage": {
+ /**
+ * Information callback function. See
+ * {@link DataTable.defaults.fnInfoCallback}
+ * @type function
+ * @default null
+ */
+ "fnInfoCallback": null
+ },
+
+ /**
+ * Browser support parameters
+ * @namespace
+ */
+ "oBrowser": {
+ /**
+ * Indicate if the browser incorrectly calculates width:100% inside a
+ * scrolling element (IE6/7)
+ * @type boolean
+ * @default false
+ */
+ "bScrollOversize": false,
+
+ /**
+ * Determine if the vertical scrollbar is on the right or left of the
+ * scrolling container - needed for rtl language layout, although not
+ * all browsers move the scrollbar (Safari).
+ * @type boolean
+ * @default false
+ */
+ "bScrollbarLeft": false,
+
+ /**
+ * Flag for if `getBoundingClientRect` is fully supported or not
+ * @type boolean
+ * @default false
+ */
+ "bBounding": false,
+
+ /**
+ * Browser scrollbar width
+ * @type integer
+ * @default 0
+ */
+ "barWidth": 0
+ },
+
+
+ "ajax": null,
+
+
+ /**
+ * Array referencing the nodes which are used for the features. The
+ * parameters of this object match what is allowed by sDom - i.e.
+ *
+ * 'l' - Length changing
+ * 'f' - Filtering input
+ * 't' - The table!
+ * 'i' - Information
+ * 'p' - Pagination
+ * 'r' - pRocessing
+ *
+ * @type array
+ * @default []
+ */
+ "aanFeatures": [],
+
+ /**
+ * Store data information - see {@link DataTable.models.oRow} for detailed
+ * information.
+ * @type array
+ * @default []
+ */
+ "aoData": [],
+
+ /**
+ * Array of indexes which are in the current display (after filtering etc)
+ * @type array
+ * @default []
+ */
+ "aiDisplay": [],
+
+ /**
+ * Array of indexes for display - no filtering
+ * @type array
+ * @default []
+ */
+ "aiDisplayMaster": [],
+
+ /**
+ * Map of row ids to data indexes
+ * @type object
+ * @default {}
+ */
+ "aIds": {},
+
+ /**
+ * Store information about each column that is in use
+ * @type array
+ * @default []
+ */
+ "aoColumns": [],
+
+ /**
+ * Store information about the table's header
+ * @type array
+ * @default []
+ */
+ "aoHeader": [],
+
+ /**
+ * Store information about the table's footer
+ * @type array
+ * @default []
+ */
+ "aoFooter": [],
+
+ /**
+ * Store the applied global search information in case we want to force a
+ * research or compare the old search to a new one.
+ * Note that this parameter will be set by the initialisation routine. To
+ * set a default use {@link DataTable.defaults}.
+ * @namespace
+ * @extends DataTable.models.oSearch
+ */
+ "oPreviousSearch": {},
+
+ /**
+ * Store the applied search for each column - see
+ * {@link DataTable.models.oSearch} for the format that is used for the
+ * filtering information for each column.
+ * @type array
+ * @default []
+ */
+ "aoPreSearchCols": [],
+
+ /**
+ * Sorting that is applied to the table. Note that the inner arrays are
+ * used in the following manner:
+ *
+ * Index 0 - column number
+ * Index 1 - current sorting direction
+ *
+ * Note that this parameter will be set by the initialisation routine. To
+ * set a default use {@link DataTable.defaults}.
+ * @type array
+ * @todo These inner arrays should really be objects
+ */
+ "aaSorting": null,
+
+ /**
+ * Sorting that is always applied to the table (i.e. prefixed in front of
+ * aaSorting).
+ * Note that this parameter will be set by the initialisation routine. To
+ * set a default use {@link DataTable.defaults}.
+ * @type array
+ * @default []
+ */
+ "aaSortingFixed": [],
+
+ /**
+ * Classes to use for the striping of a table.
+ * Note that this parameter will be set by the initialisation routine. To
+ * set a default use {@link DataTable.defaults}.
+ * @type array
+ * @default []
+ */
+ "asStripeClasses": null,
+
+ /**
+ * If restoring a table - we should restore its striping classes as well
+ * @type array
+ * @default []
+ */
+ "asDestroyStripes": [],
+
+ /**
+ * If restoring a table - we should restore its width
+ * @type int
+ * @default 0
+ */
+ "sDestroyWidth": 0,
+
+ /**
+ * Callback functions array for every time a row is inserted (i.e. on a draw).
+ * @type array
+ * @default []
+ */
+ "aoRowCallback": [],
+
+ /**
+ * Callback functions for the header on each draw.
+ * @type array
+ * @default []
+ */
+ "aoHeaderCallback": [],
+
+ /**
+ * Callback function for the footer on each draw.
+ * @type array
+ * @default []
+ */
+ "aoFooterCallback": [],
+
+ /**
+ * Array of callback functions for draw callback functions
+ * @type array
+ * @default []
+ */
+ "aoDrawCallback": [],
+
+ /**
+ * Array of callback functions for row created function
+ * @type array
+ * @default []
+ */
+ "aoRowCreatedCallback": [],
+
+ /**
+ * Callback functions for just before the table is redrawn. A return of
+ * false will be used to cancel the draw.
+ * @type array
+ * @default []
+ */
+ "aoPreDrawCallback": [],
+
+ /**
+ * Callback functions for when the table has been initialised.
+ * @type array
+ * @default []
+ */
+ "aoInitComplete": [],
+
+
+ /**
+ * Callbacks for modifying the settings to be stored for state saving, prior to
+ * saving state.
+ * @type array
+ * @default []
+ */
+ "aoStateSaveParams": [],
+
+ /**
+ * Callbacks for modifying the settings that have been stored for state saving
+ * prior to using the stored values to restore the state.
+ * @type array
+ * @default []
+ */
+ "aoStateLoadParams": [],
+
+ /**
+ * Callbacks for operating on the settings object once the saved state has been
+ * loaded
+ * @type array
+ * @default []
+ */
+ "aoStateLoaded": [],
+
+ /**
+ * Cache the table ID for quick access
+ * @type string
+ * @default Empty string
+ */
+ "sTableId": "",
+
+ /**
+ * The TABLE node for the main table
+ * @type node
+ * @default null
+ */
+ "nTable": null,
+
+ /**
+ * Permanent ref to the thead element
+ * @type node
+ * @default null
+ */
+ "nTHead": null,
+
+ /**
+ * Permanent ref to the tfoot element - if it exists
+ * @type node
+ * @default null
+ */
+ "nTFoot": null,
+
+ /**
+ * Permanent ref to the tbody element
+ * @type node
+ * @default null
+ */
+ "nTBody": null,
+
+ /**
+ * Cache the wrapper node (contains all DataTables controlled elements)
+ * @type node
+ * @default null
+ */
+ "nTableWrapper": null,
+
+ /**
+ * Indicate if when using server-side processing the loading of data
+ * should be deferred until the second draw.
+ * Note that this parameter will be set by the initialisation routine. To
+ * set a default use {@link DataTable.defaults}.
+ * @type boolean
+ * @default false
+ */
+ "bDeferLoading": false,
+
+ /**
+ * Indicate if all required information has been read in
+ * @type boolean
+ * @default false
+ */
+ "bInitialised": false,
+
+ /**
+ * Information about open rows. Each object in the array has the parameters
+ * 'nTr' and 'nParent'
+ * @type array
+ * @default []
+ */
+ "aoOpenRows": [],
+
+ /**
+ * Dictate the positioning of DataTables' control elements - see
+ * {@link DataTable.model.oInit.sDom}.
+ * Note that this parameter will be set by the initialisation routine. To
+ * set a default use {@link DataTable.defaults}.
+ * @type string
+ * @default null
+ */
+ "sDom": null,
+
+ /**
+ * Search delay (in mS)
+ * @type integer
+ * @default null
+ */
+ "searchDelay": null,
+
+ /**
+ * Which type of pagination should be used.
+ * Note that this parameter will be set by the initialisation routine. To
+ * set a default use {@link DataTable.defaults}.
+ * @type string
+ * @default two_button
+ */
+ "sPaginationType": "two_button",
+
+ /**
+ * The state duration (for `stateSave`) in seconds.
+ * Note that this parameter will be set by the initialisation routine. To
+ * set a default use {@link DataTable.defaults}.
+ * @type int
+ * @default 0
+ */
+ "iStateDuration": 0,
+
+ /**
+ * Array of callback functions for state saving. Each array element is an
+ * object with the following parameters:
+ *
+ * function:fn - function to call. Takes two parameters, oSettings
+ * and the JSON string to save that has been thus far created. Returns
+ * a JSON string to be inserted into a json object
+ * (i.e. '"param": [ 0, 1, 2]')
+ * string:sName - name of callback
+ *
+ * @type array
+ * @default []
+ */
+ "aoStateSave": [],
+
+ /**
+ * Array of callback functions for state loading. Each array element is an
+ * object with the following parameters:
+ *
+ * function:fn - function to call. Takes two parameters, oSettings
+ * and the object stored. May return false to cancel state loading
+ * string:sName - name of callback
+ *
+ * @type array
+ * @default []
+ */
+ "aoStateLoad": [],
+
+ /**
+ * State that was saved. Useful for back reference
+ * @type object
+ * @default null
+ */
+ "oSavedState": null,
+
+ /**
+ * State that was loaded. Useful for back reference
+ * @type object
+ * @default null
+ */
+ "oLoadedState": null,
+
+ /**
+ * Source url for AJAX data for the table.
+ * Note that this parameter will be set by the initialisation routine. To
+ * set a default use {@link DataTable.defaults}.
+ * @type string
+ * @default null
+ */
+ "sAjaxSource": null,
+
+ /**
+ * Property from a given object from which to read the table data from. This
+ * can be an empty string (when not server-side processing), in which case
+ * it is assumed an an array is given directly.
+ * Note that this parameter will be set by the initialisation routine. To
+ * set a default use {@link DataTable.defaults}.
+ * @type string
+ */
+ "sAjaxDataProp": null,
+
+ /**
+ * Note if draw should be blocked while getting data
+ * @type boolean
+ * @default true
+ */
+ "bAjaxDataGet": true,
+
+ /**
+ * The last jQuery XHR object that was used for server-side data gathering.
+ * This can be used for working with the XHR information in one of the
+ * callbacks
+ * @type object
+ * @default null
+ */
+ "jqXHR": null,
+
+ /**
+ * JSON returned from the server in the last Ajax request
+ * @type object
+ * @default undefined
+ */
+ "json": undefined,
+
+ /**
+ * Data submitted as part of the last Ajax request
+ * @type object
+ * @default undefined
+ */
+ "oAjaxData": undefined,
+
+ /**
+ * Function to get the server-side data.
+ * Note that this parameter will be set by the initialisation routine. To
+ * set a default use {@link DataTable.defaults}.
+ * @type function
+ */
+ "fnServerData": null,
+
+ /**
+ * Functions which are called prior to sending an Ajax request so extra
+ * parameters can easily be sent to the server
+ * @type array
+ * @default []
+ */
+ "aoServerParams": [],
+
+ /**
+ * Send the XHR HTTP method - GET or POST (could be PUT or DELETE if
+ * required).
+ * Note that this parameter will be set by the initialisation routine. To
+ * set a default use {@link DataTable.defaults}.
+ * @type string
+ */
+ "sServerMethod": null,
+
+ /**
+ * Format numbers for display.
+ * Note that this parameter will be set by the initialisation routine. To
+ * set a default use {@link DataTable.defaults}.
+ * @type function
+ */
+ "fnFormatNumber": null,
+
+ /**
+ * List of options that can be used for the user selectable length menu.
+ * Note that this parameter will be set by the initialisation routine. To
+ * set a default use {@link DataTable.defaults}.
+ * @type array
+ * @default []
+ */
+ "aLengthMenu": null,
+
+ /**
+ * Counter for the draws that the table does. Also used as a tracker for
+ * server-side processing
+ * @type int
+ * @default 0
+ */
+ "iDraw": 0,
+
+ /**
+ * Indicate if a redraw is being done - useful for Ajax
+ * @type boolean
+ * @default false
+ */
+ "bDrawing": false,
+
+ /**
+ * Draw index (iDraw) of the last error when parsing the returned data
+ * @type int
+ * @default -1
+ */
+ "iDrawError": -1,
+
+ /**
+ * Paging display length
+ * @type int
+ * @default 10
+ */
+ "_iDisplayLength": 10,
+
+ /**
+ * Paging start point - aiDisplay index
+ * @type int
+ * @default 0
+ */
+ "_iDisplayStart": 0,
+
+ /**
+ * Server-side processing - number of records in the result set
+ * (i.e. before filtering), Use fnRecordsTotal rather than
+ * this property to get the value of the number of records, regardless of
+ * the server-side processing setting.
+ * @type int
+ * @default 0
+ * @private
+ */
+ "_iRecordsTotal": 0,
+
+ /**
+ * Server-side processing - number of records in the current display set
+ * (i.e. after filtering). Use fnRecordsDisplay rather than
+ * this property to get the value of the number of records, regardless of
+ * the server-side processing setting.
+ * @type boolean
+ * @default 0
+ * @private
+ */
+ "_iRecordsDisplay": 0,
+
+ /**
+ * The classes to use for the table
+ * @type object
+ * @default {}
+ */
+ "oClasses": {},
+
+ /**
+ * Flag attached to the settings object so you can check in the draw
+ * callback if filtering has been done in the draw. Deprecated in favour of
+ * events.
+ * @type boolean
+ * @default false
+ * @deprecated
+ */
+ "bFiltered": false,
+
+ /**
+ * Flag attached to the settings object so you can check in the draw
+ * callback if sorting has been done in the draw. Deprecated in favour of
+ * events.
+ * @type boolean
+ * @default false
+ * @deprecated
+ */
+ "bSorted": false,
+
+ /**
+ * Indicate that if multiple rows are in the header and there is more than
+ * one unique cell per column, if the top one (true) or bottom one (false)
+ * should be used for sorting / title by DataTables.
+ * Note that this parameter will be set by the initialisation routine. To
+ * set a default use {@link DataTable.defaults}.
+ * @type boolean
+ */
+ "bSortCellsTop": null,
+
+ /**
+ * Initialisation object that is used for the table
+ * @type object
+ * @default null
+ */
+ "oInit": null,
+
+ /**
+ * Destroy callback functions - for plug-ins to attach themselves to the
+ * destroy so they can clean up markup and events.
+ * @type array
+ * @default []
+ */
+ "aoDestroyCallback": [],
+
+
+ /**
+ * Get the number of records in the current record set, before filtering
+ * @type function
+ */
+ "fnRecordsTotal": function ()
+ {
+ return _fnDataSource( this ) == 'ssp' ?
+ this._iRecordsTotal * 1 :
+ this.aiDisplayMaster.length;
+ },
+
+ /**
+ * Get the number of records in the current record set, after filtering
+ * @type function
+ */
+ "fnRecordsDisplay": function ()
+ {
+ return _fnDataSource( this ) == 'ssp' ?
+ this._iRecordsDisplay * 1 :
+ this.aiDisplay.length;
+ },
+
+ /**
+ * Get the display end point - aiDisplay index
+ * @type function
+ */
+ "fnDisplayEnd": function ()
+ {
+ var
+ len = this._iDisplayLength,
+ start = this._iDisplayStart,
+ calc = start + len,
+ records = this.aiDisplay.length,
+ features = this.oFeatures,
+ paginate = features.bPaginate;
+
+ if ( features.bServerSide ) {
+ return paginate === false || len === -1 ?
+ start + records :
+ Math.min( start+len, this._iRecordsDisplay );
+ }
+ else {
+ return ! paginate || calc>records || len===-1 ?
+ records :
+ calc;
+ }
+ },
+
+ /**
+ * The DataTables object for this table
+ * @type object
+ * @default null
+ */
+ "oInstance": null,
+
+ /**
+ * Unique identifier for each instance of the DataTables object. If there
+ * is an ID on the table node, then it takes that value, otherwise an
+ * incrementing internal counter is used.
+ * @type string
+ * @default null
+ */
+ "sInstance": null,
+
+ /**
+ * tabindex attribute value that is added to DataTables control elements, allowing
+ * keyboard navigation of the table and its controls.
+ */
+ "iTabIndex": 0,
+
+ /**
+ * DIV container for the footer scrolling table if scrolling
+ */
+ "nScrollHead": null,
+
+ /**
+ * DIV container for the footer scrolling table if scrolling
+ */
+ "nScrollFoot": null,
+
+ /**
+ * Last applied sort
+ * @type array
+ * @default []
+ */
+ "aLastSort": [],
+
+ /**
+ * Stored plug-in instances
+ * @type object
+ * @default {}
+ */
+ "oPlugins": {},
+
+ /**
+ * Function used to get a row's id from the row's data
+ * @type function
+ * @default null
+ */
+ "rowIdFn": null,
+
+ /**
+ * Data location where to store a row's id
+ * @type string
+ * @default null
+ */
+ "rowId": null
+ };
+
+ /**
+ * Extension object for DataTables that is used to provide all extension
+ * options.
+ *
+ * Note that the `DataTable.ext` object is available through
+ * `jQuery.fn.dataTable.ext` where it may be accessed and manipulated. It is
+ * also aliased to `jQuery.fn.dataTableExt` for historic reasons.
+ * @namespace
+ * @extends DataTable.models.ext
+ */
+
+
+ /**
+ * DataTables extensions
+ *
+ * This namespace acts as a collection area for plug-ins that can be used to
+ * extend DataTables capabilities. Indeed many of the build in methods
+ * use this method to provide their own capabilities (sorting methods for
+ * example).
+ *
+ * Note that this namespace is aliased to `jQuery.fn.dataTableExt` for legacy
+ * reasons
+ *
+ * @namespace
+ */
+ DataTable.ext = _ext = {
+ /**
+ * Buttons. For use with the Buttons extension for DataTables. This is
+ * defined here so other extensions can define buttons regardless of load
+ * order. It is _not_ used by DataTables core.
+ *
+ * @type object
+ * @default {}
+ */
+ buttons: {},
+
+
+ /**
+ * Element class names
+ *
+ * @type object
+ * @default {}
+ */
+ classes: {},
+
+
+ /**
+ * DataTables build type (expanded by the download builder)
+ *
+ * @type string
+ */
+ build:"dt/dt-1.10.18",
+
+
+ /**
+ * Error reporting.
+ *
+ * How should DataTables report an error. Can take the value 'alert',
+ * 'throw', 'none' or a function.
+ *
+ * @type string|function
+ * @default alert
+ */
+ errMode: "alert",
+
+
+ /**
+ * Feature plug-ins.
+ *
+ * This is an array of objects which describe the feature plug-ins that are
+ * available to DataTables. These feature plug-ins are then available for
+ * use through the `dom` initialisation option.
+ *
+ * Each feature plug-in is described by an object which must have the
+ * following properties:
+ *
+ * * `fnInit` - function that is used to initialise the plug-in,
+ * * `cFeature` - a character so the feature can be enabled by the `dom`
+ * instillation option. This is case sensitive.
+ *
+ * The `fnInit` function has the following input parameters:
+ *
+ * 1. `{object}` DataTables settings object: see
+ * {@link DataTable.models.oSettings}
+ *
+ * And the following return is expected:
+ *
+ * * {node|null} The element which contains your feature. Note that the
+ * return may also be void if your plug-in does not require to inject any
+ * DOM elements into DataTables control (`dom`) - for example this might
+ * be useful when developing a plug-in which allows table control via
+ * keyboard entry
+ *
+ * @type array
+ *
+ * @example
+ * $.fn.dataTable.ext.features.push( {
+ * "fnInit": function( oSettings ) {
+ * return new TableTools( { "oDTSettings": oSettings } );
+ * },
+ * "cFeature": "T"
+ * } );
+ */
+ feature: [],
+
+
+ /**
+ * Row searching.
+ *
+ * This method of searching is complimentary to the default type based
+ * searching, and a lot more comprehensive as it allows you complete control
+ * over the searching logic. Each element in this array is a function
+ * (parameters described below) that is called for every row in the table,
+ * and your logic decides if it should be included in the searching data set
+ * or not.
+ *
+ * Searching functions have the following input parameters:
+ *
+ * 1. `{object}` DataTables settings object: see
+ * {@link DataTable.models.oSettings}
+ * 2. `{array|object}` Data for the row to be processed (same as the
+ * original format that was passed in as the data source, or an array
+ * from a DOM data source
+ * 3. `{int}` Row index ({@link DataTable.models.oSettings.aoData}), which
+ * can be useful to retrieve the `TR` element if you need DOM interaction.
+ *
+ * And the following return is expected:
+ *
+ * * {boolean} Include the row in the searched result set (true) or not
+ * (false)
+ *
+ * Note that as with the main search ability in DataTables, technically this
+ * is "filtering", since it is subtractive. However, for consistency in
+ * naming we call it searching here.
+ *
+ * @type array
+ * @default []
+ *
+ * @example
+ * // The following example shows custom search being applied to the
+ * // fourth column (i.e. the data[3] index) based on two input values
+ * // from the end-user, matching the data in a certain range.
+ * $.fn.dataTable.ext.search.push(
+ * function( settings, data, dataIndex ) {
+ * var min = document.getElementById('min').value * 1;
+ * var max = document.getElementById('max').value * 1;
+ * var version = data[3] == "-" ? 0 : data[3]*1;
+ *
+ * if ( min == "" && max == "" ) {
+ * return true;
+ * }
+ * else if ( min == "" && version < max ) {
+ * return true;
+ * }
+ * else if ( min < version && "" == max ) {
+ * return true;
+ * }
+ * else if ( min < version && version < max ) {
+ * return true;
+ * }
+ * return false;
+ * }
+ * );
+ */
+ search: [],
+
+
+ /**
+ * Selector extensions
+ *
+ * The `selector` option can be used to extend the options available for the
+ * selector modifier options (`selector-modifier` object data type) that
+ * each of the three built in selector types offer (row, column and cell +
+ * their plural counterparts). For example the Select extension uses this
+ * mechanism to provide an option to select only rows, columns and cells
+ * that have been marked as selected by the end user (`{selected: true}`),
+ * which can be used in conjunction with the existing built in selector
+ * options.
+ *
+ * Each property is an array to which functions can be pushed. The functions
+ * take three attributes:
+ *
+ * * Settings object for the host table
+ * * Options object (`selector-modifier` object type)
+ * * Array of selected item indexes
+ *
+ * The return is an array of the resulting item indexes after the custom
+ * selector has been applied.
+ *
+ * @type object
+ */
+ selector: {
+ cell: [],
+ column: [],
+ row: []
+ },
+
+
+ /**
+ * Internal functions, exposed for used in plug-ins.
+ *
+ * Please note that you should not need to use the internal methods for
+ * anything other than a plug-in (and even then, try to avoid if possible).
+ * The internal function may change between releases.
+ *
+ * @type object
+ * @default {}
+ */
+ internal: {},
+
+
+ /**
+ * Legacy configuration options. Enable and disable legacy options that
+ * are available in DataTables.
+ *
+ * @type object
+ */
+ legacy: {
+ /**
+ * Enable / disable DataTables 1.9 compatible server-side processing
+ * requests
+ *
+ * @type boolean
+ * @default null
+ */
+ ajax: null
+ },
+
+
+ /**
+ * Pagination plug-in methods.
+ *
+ * Each entry in this object is a function and defines which buttons should
+ * be shown by the pagination rendering method that is used for the table:
+ * {@link DataTable.ext.renderer.pageButton}. The renderer addresses how the
+ * buttons are displayed in the document, while the functions here tell it
+ * what buttons to display. This is done by returning an array of button
+ * descriptions (what each button will do).
+ *
+ * Pagination types (the four built in options and any additional plug-in
+ * options defined here) can be used through the `paginationType`
+ * initialisation parameter.
+ *
+ * The functions defined take two parameters:
+ *
+ * 1. `{int} page` The current page index
+ * 2. `{int} pages` The number of pages in the table
+ *
+ * Each function is expected to return an array where each element of the
+ * array can be one of:
+ *
+ * * `first` - Jump to first page when activated
+ * * `last` - Jump to last page when activated
+ * * `previous` - Show previous page when activated
+ * * `next` - Show next page when activated
+ * * `{int}` - Show page of the index given
+ * * `{array}` - A nested array containing the above elements to add a
+ * containing 'DIV' element (might be useful for styling).
+ *
+ * Note that DataTables v1.9- used this object slightly differently whereby
+ * an object with two functions would be defined for each plug-in. That
+ * ability is still supported by DataTables 1.10+ to provide backwards
+ * compatibility, but this option of use is now decremented and no longer
+ * documented in DataTables 1.10+.
+ *
+ * @type object
+ * @default {}
+ *
+ * @example
+ * // Show previous, next and current page buttons only
+ * $.fn.dataTableExt.oPagination.current = function ( page, pages ) {
+ * return [ 'previous', page, 'next' ];
+ * };
+ */
+ pager: {},
+
+
+ renderer: {
+ pageButton: {},
+ header: {}
+ },
+
+
+ /**
+ * Ordering plug-ins - custom data source
+ *
+ * The extension options for ordering of data available here is complimentary
+ * to the default type based ordering that DataTables typically uses. It
+ * allows much greater control over the the data that is being used to
+ * order a column, but is necessarily therefore more complex.
+ *
+ * This type of ordering is useful if you want to do ordering based on data
+ * live from the DOM (for example the contents of an 'input' element) rather
+ * than just the static string that DataTables knows of.
+ *
+ * The way these plug-ins work is that you create an array of the values you
+ * wish to be ordering for the column in question and then return that
+ * array. The data in the array much be in the index order of the rows in
+ * the table (not the currently ordering order!). Which order data gathering
+ * function is run here depends on the `dt-init columns.orderDataType`
+ * parameter that is used for the column (if any).
+ *
+ * The functions defined take two parameters:
+ *
+ * 1. `{object}` DataTables settings object: see
+ * {@link DataTable.models.oSettings}
+ * 2. `{int}` Target column index
+ *
+ * Each function is expected to return an array:
+ *
+ * * `{array}` Data for the column to be ordering upon
+ *
+ * @type array
+ *
+ * @example
+ * // Ordering using `input` node values
+ * $.fn.dataTable.ext.order['dom-text'] = function ( settings, col )
+ * {
+ * return this.api().column( col, {order:'index'} ).nodes().map( function ( td, i ) {
+ * return $('input', td).val();
+ * } );
+ * }
+ */
+ order: {},
+
+
+ /**
+ * Type based plug-ins.
+ *
+ * Each column in DataTables has a type assigned to it, either by automatic
+ * detection or by direct assignment using the `type` option for the column.
+ * The type of a column will effect how it is ordering and search (plug-ins
+ * can also make use of the column type if required).
+ *
+ * @namespace
+ */
+ type: {
+ /**
+ * Type detection functions.
+ *
+ * The functions defined in this object are used to automatically detect
+ * a column's type, making initialisation of DataTables super easy, even
+ * when complex data is in the table.
+ *
+ * The functions defined take two parameters:
+ *
+ * 1. `{*}` Data from the column cell to be analysed
+ * 2. `{settings}` DataTables settings object. This can be used to
+ * perform context specific type detection - for example detection
+ * based on language settings such as using a comma for a decimal
+ * place. Generally speaking the options from the settings will not
+ * be required
+ *
+ * Each function is expected to return:
+ *
+ * * `{string|null}` Data type detected, or null if unknown (and thus
+ * pass it on to the other type detection functions.
+ *
+ * @type array
+ *
+ * @example
+ * // Currency type detection plug-in:
+ * $.fn.dataTable.ext.type.detect.push(
+ * function ( data, settings ) {
+ * // Check the numeric part
+ * if ( ! data.substring(1).match(/[0-9]/) ) {
+ * return null;
+ * }
+ *
+ * // Check prefixed by currency
+ * if ( data.charAt(0) == '$' || data.charAt(0) == '£' ) {
+ * return 'currency';
+ * }
+ * return null;
+ * }
+ * );
+ */
+ detect: [],
+
+
+ /**
+ * Type based search formatting.
+ *
+ * The type based searching functions can be used to pre-format the
+ * data to be search on. For example, it can be used to strip HTML
+ * tags or to de-format telephone numbers for numeric only searching.
+ *
+ * Note that is a search is not defined for a column of a given type,
+ * no search formatting will be performed.
+ *
+ * Pre-processing of searching data plug-ins - When you assign the sType
+ * for a column (or have it automatically detected for you by DataTables
+ * or a type detection plug-in), you will typically be using this for
+ * custom sorting, but it can also be used to provide custom searching
+ * by allowing you to pre-processing the data and returning the data in
+ * the format that should be searched upon. This is done by adding
+ * functions this object with a parameter name which matches the sType
+ * for that target column. This is the corollary of afnSortData
+ * for searching data.
+ *
+ * The functions defined take a single parameter:
+ *
+ * 1. `{*}` Data from the column cell to be prepared for searching
+ *
+ * Each function is expected to return:
+ *
+ * * `{string|null}` Formatted string that will be used for the searching.
+ *
+ * @type object
+ * @default {}
+ *
+ * @example
+ * $.fn.dataTable.ext.type.search['title-numeric'] = function ( d ) {
+ * return d.replace(/\n/g," ").replace( /<.*?>/g, "" );
+ * }
+ */
+ search: {},
+
+
+ /**
+ * Type based ordering.
+ *
+ * The column type tells DataTables what ordering to apply to the table
+ * when a column is sorted upon. The order for each type that is defined,
+ * is defined by the functions available in this object.
+ *
+ * Each ordering option can be described by three properties added to
+ * this object:
+ *
+ * * `{type}-pre` - Pre-formatting function
+ * * `{type}-asc` - Ascending order function
+ * * `{type}-desc` - Descending order function
+ *
+ * All three can be used together, only `{type}-pre` or only
+ * `{type}-asc` and `{type}-desc` together. It is generally recommended
+ * that only `{type}-pre` is used, as this provides the optimal
+ * implementation in terms of speed, although the others are provided
+ * for compatibility with existing Javascript sort functions.
+ *
+ * `{type}-pre`: Functions defined take a single parameter:
+ *
+ * 1. `{*}` Data from the column cell to be prepared for ordering
+ *
+ * And return:
+ *
+ * * `{*}` Data to be sorted upon
+ *
+ * `{type}-asc` and `{type}-desc`: Functions are typical Javascript sort
+ * functions, taking two parameters:
+ *
+ * 1. `{*}` Data to compare to the second parameter
+ * 2. `{*}` Data to compare to the first parameter
+ *
+ * And returning:
+ *
+ * * `{*}` Ordering match: <0 if first parameter should be sorted lower
+ * than the second parameter, ===0 if the two parameters are equal and
+ * >0 if the first parameter should be sorted height than the second
+ * parameter.
+ *
+ * @type object
+ * @default {}
+ *
+ * @example
+ * // Numeric ordering of formatted numbers with a pre-formatter
+ * $.extend( $.fn.dataTable.ext.type.order, {
+ * "string-pre": function(x) {
+ * a = (a === "-" || a === "") ? 0 : a.replace( /[^\d\-\.]/g, "" );
+ * return parseFloat( a );
+ * }
+ * } );
+ *
+ * @example
+ * // Case-sensitive string ordering, with no pre-formatting method
+ * $.extend( $.fn.dataTable.ext.order, {
+ * "string-case-asc": function(x,y) {
+ * return ((x < y) ? -1 : ((x > y) ? 1 : 0));
+ * },
+ * "string-case-desc": function(x,y) {
+ * return ((x < y) ? 1 : ((x > y) ? -1 : 0));
+ * }
+ * } );
+ */
+ order: {}
+ },
+
+ /**
+ * Unique DataTables instance counter
+ *
+ * @type int
+ * @private
+ */
+ _unique: 0,
+
+
+ //
+ // Depreciated
+ // The following properties are retained for backwards compatiblity only.
+ // The should not be used in new projects and will be removed in a future
+ // version
+ //
+
+ /**
+ * Version check function.
+ * @type function
+ * @depreciated Since 1.10
+ */
+ fnVersionCheck: DataTable.fnVersionCheck,
+
+
+ /**
+ * Index for what 'this' index API functions should use
+ * @type int
+ * @deprecated Since v1.10
+ */
+ iApiIndex: 0,
+
+
+ /**
+ * jQuery UI class container
+ * @type object
+ * @deprecated Since v1.10
+ */
+ oJUIClasses: {},
+
+
+ /**
+ * Software version
+ * @type string
+ * @deprecated Since v1.10
+ */
+ sVersion: DataTable.version
+ };
+
+
+ //
+ // Backwards compatibility. Alias to pre 1.10 Hungarian notation counter parts
+ //
+ $.extend( _ext, {
+ afnFiltering: _ext.search,
+ aTypes: _ext.type.detect,
+ ofnSearch: _ext.type.search,
+ oSort: _ext.type.order,
+ afnSortData: _ext.order,
+ aoFeatures: _ext.feature,
+ oApi: _ext.internal,
+ oStdClasses: _ext.classes,
+ oPagination: _ext.pager
+ } );
+
+
+ $.extend( DataTable.ext.classes, {
+ "sTable": "dataTable",
+ "sNoFooter": "no-footer",
+
+ /* Paging buttons */
+ "sPageButton": "paginate_button",
+ "sPageButtonActive": "current",
+ "sPageButtonDisabled": "disabled",
+
+ /* Striping classes */
+ "sStripeOdd": "odd",
+ "sStripeEven": "even",
+
+ /* Empty row */
+ "sRowEmpty": "dataTables_empty",
+
+ /* Features */
+ "sWrapper": "dataTables_wrapper",
+ "sFilter": "dataTables_filter",
+ "sInfo": "dataTables_info",
+ "sPaging": "dataTables_paginate paging_", /* Note that the type is postfixed */
+ "sLength": "dataTables_length",
+ "sProcessing": "dataTables_processing",
+
+ /* Sorting */
+ "sSortAsc": "sorting_asc",
+ "sSortDesc": "sorting_desc",
+ "sSortable": "sorting", /* Sortable in both directions */
+ "sSortableAsc": "sorting_asc_disabled",
+ "sSortableDesc": "sorting_desc_disabled",
+ "sSortableNone": "sorting_disabled",
+ "sSortColumn": "sorting_", /* Note that an int is postfixed for the sorting order */
+
+ /* Filtering */
+ "sFilterInput": "",
+
+ /* Page length */
+ "sLengthSelect": "",
+
+ /* Scrolling */
+ "sScrollWrapper": "dataTables_scroll",
+ "sScrollHead": "dataTables_scrollHead",
+ "sScrollHeadInner": "dataTables_scrollHeadInner",
+ "sScrollBody": "dataTables_scrollBody",
+ "sScrollFoot": "dataTables_scrollFoot",
+ "sScrollFootInner": "dataTables_scrollFootInner",
+
+ /* Misc */
+ "sHeaderTH": "",
+ "sFooterTH": "",
+
+ // Deprecated
+ "sSortJUIAsc": "",
+ "sSortJUIDesc": "",
+ "sSortJUI": "",
+ "sSortJUIAscAllowed": "",
+ "sSortJUIDescAllowed": "",
+ "sSortJUIWrapper": "",
+ "sSortIcon": "",
+ "sJUIHeader": "",
+ "sJUIFooter": ""
+ } );
+
+
+ var extPagination = DataTable.ext.pager;
+
+ function _numbers ( page, pages ) {
+ var
+ numbers = [],
+ buttons = extPagination.numbers_length,
+ half = Math.floor( buttons / 2 ),
+ i = 1;
+
+ if ( pages <= buttons ) {
+ numbers = _range( 0, pages );
+ }
+ else if ( page <= half ) {
+ numbers = _range( 0, buttons-2 );
+ numbers.push( 'ellipsis' );
+ numbers.push( pages-1 );
+ }
+ else if ( page >= pages - 1 - half ) {
+ numbers = _range( pages-(buttons-2), pages );
+ numbers.splice( 0, 0, 'ellipsis' ); // no unshift in ie6
+ numbers.splice( 0, 0, 0 );
+ }
+ else {
+ numbers = _range( page-half+2, page+half-1 );
+ numbers.push( 'ellipsis' );
+ numbers.push( pages-1 );
+ numbers.splice( 0, 0, 'ellipsis' );
+ numbers.splice( 0, 0, 0 );
+ }
+
+ numbers.DT_el = 'span';
+ return numbers;
+ }
+
+
+ $.extend( extPagination, {
+ simple: function ( page, pages ) {
+ return [ 'previous', 'next' ];
+ },
+
+ full: function ( page, pages ) {
+ return [ 'first', 'previous', 'next', 'last' ];
+ },
+
+ numbers: function ( page, pages ) {
+ return [ _numbers(page, pages) ];
+ },
+
+ simple_numbers: function ( page, pages ) {
+ return [ 'previous', _numbers(page, pages), 'next' ];
+ },
+
+ full_numbers: function ( page, pages ) {
+ return [ 'first', 'previous', _numbers(page, pages), 'next', 'last' ];
+ },
+
+ first_last_numbers: function (page, pages) {
+ return ['first', _numbers(page, pages), 'last'];
+ },
+
+ // For testing and plug-ins to use
+ _numbers: _numbers,
+
+ // Number of number buttons (including ellipsis) to show. _Must be odd!_
+ numbers_length: 7
+ } );
+
+
+ $.extend( true, DataTable.ext.renderer, {
+ pageButton: {
+ _: function ( settings, host, idx, buttons, page, pages ) {
+ var classes = settings.oClasses;
+ var lang = settings.oLanguage.oPaginate;
+ var aria = settings.oLanguage.oAria.paginate || {};
+ var btnDisplay, btnClass, counter=0;
+
+ var attach = function( container, buttons ) {
+ var i, ien, node, button;
+ var clickHandler = function ( e ) {
+ _fnPageChange( settings, e.data.action, true );
+ };
+
+ for ( i=0, ien=buttons.length ; i ' )
+ .appendTo( container );
+ attach( inner, button );
+ }
+ else {
+ btnDisplay = null;
+ btnClass = '';
+
+ switch ( button ) {
+ case 'ellipsis':
+ container.append('… ');
+ break;
+
+ case 'first':
+ btnDisplay = lang.sFirst;
+ btnClass = button + (page > 0 ?
+ '' : ' '+classes.sPageButtonDisabled);
+ break;
+
+ case 'previous':
+ btnDisplay = lang.sPrevious;
+ btnClass = button + (page > 0 ?
+ '' : ' '+classes.sPageButtonDisabled);
+ break;
+
+ case 'next':
+ btnDisplay = lang.sNext;
+ btnClass = button + (page < pages-1 ?
+ '' : ' '+classes.sPageButtonDisabled);
+ break;
+
+ case 'last':
+ btnDisplay = lang.sLast;
+ btnClass = button + (page < pages-1 ?
+ '' : ' '+classes.sPageButtonDisabled);
+ break;
+
+ default:
+ btnDisplay = button + 1;
+ btnClass = page === button ?
+ classes.sPageButtonActive : '';
+ break;
+ }
+
+ if ( btnDisplay !== null ) {
+ node = $('', {
+ 'class': classes.sPageButton+' '+btnClass,
+ 'aria-controls': settings.sTableId,
+ 'aria-label': aria[ button ],
+ 'data-dt-idx': counter,
+ 'tabindex': settings.iTabIndex,
+ 'id': idx === 0 && typeof button === 'string' ?
+ settings.sTableId +'_'+ button :
+ null
+ } )
+ .html( btnDisplay )
+ .appendTo( container );
+
+ _fnBindAction(
+ node, {action: button}, clickHandler
+ );
+
+ counter++;
+ }
+ }
+ }
+ };
+
+ // IE9 throws an 'unknown error' if document.activeElement is used
+ // inside an iframe or frame. Try / catch the error. Not good for
+ // accessibility, but neither are frames.
+ var activeEl;
+
+ try {
+ // Because this approach is destroying and recreating the paging
+ // elements, focus is lost on the select button which is bad for
+ // accessibility. So we want to restore focus once the draw has
+ // completed
+ activeEl = $(host).find(document.activeElement).data('dt-idx');
+ }
+ catch (e) {}
+
+ attach( $(host).empty(), buttons );
+
+ if ( activeEl !== undefined ) {
+ $(host).find( '[data-dt-idx='+activeEl+']' ).focus();
+ }
+ }
+ }
+ } );
+
+
+
+ // Built in type detection. See model.ext.aTypes for information about
+ // what is required from this methods.
+ $.extend( DataTable.ext.type.detect, [
+ // Plain numbers - first since V8 detects some plain numbers as dates
+ // e.g. Date.parse('55') (but not all, e.g. Date.parse('22')...).
+ function ( d, settings )
+ {
+ var decimal = settings.oLanguage.sDecimal;
+ return _isNumber( d, decimal ) ? 'num'+decimal : null;
+ },
+
+ // Dates (only those recognised by the browser's Date.parse)
+ function ( d, settings )
+ {
+ // V8 tries _very_ hard to make a string passed into `Date.parse()`
+ // valid, so we need to use a regex to restrict date formats. Use a
+ // plug-in for anything other than ISO8601 style strings
+ if ( d && !(d instanceof Date) && ! _re_date.test(d) ) {
+ return null;
+ }
+ var parsed = Date.parse(d);
+ return (parsed !== null && !isNaN(parsed)) || _empty(d) ? 'date' : null;
+ },
+
+ // Formatted numbers
+ function ( d, settings )
+ {
+ var decimal = settings.oLanguage.sDecimal;
+ return _isNumber( d, decimal, true ) ? 'num-fmt'+decimal : null;
+ },
+
+ // HTML numeric
+ function ( d, settings )
+ {
+ var decimal = settings.oLanguage.sDecimal;
+ return _htmlNumeric( d, decimal ) ? 'html-num'+decimal : null;
+ },
+
+ // HTML numeric, formatted
+ function ( d, settings )
+ {
+ var decimal = settings.oLanguage.sDecimal;
+ return _htmlNumeric( d, decimal, true ) ? 'html-num-fmt'+decimal : null;
+ },
+
+ // HTML (this is strict checking - there must be html)
+ function ( d, settings )
+ {
+ return _empty( d ) || (typeof d === 'string' && d.indexOf('<') !== -1) ?
+ 'html' : null;
+ }
+ ] );
+
+
+
+ // Filter formatting functions. See model.ext.ofnSearch for information about
+ // what is required from these methods.
+ //
+ // Note that additional search methods are added for the html numbers and
+ // html formatted numbers by `_addNumericSort()` when we know what the decimal
+ // place is
+
+
+ $.extend( DataTable.ext.type.search, {
+ html: function ( data ) {
+ return _empty(data) ?
+ data :
+ typeof data === 'string' ?
+ data
+ .replace( _re_new_lines, " " )
+ .replace( _re_html, "" ) :
+ '';
+ },
+
+ string: function ( data ) {
+ return _empty(data) ?
+ data :
+ typeof data === 'string' ?
+ data.replace( _re_new_lines, " " ) :
+ data;
+ }
+ } );
+
+
+
+ var __numericReplace = function ( d, decimalPlace, re1, re2 ) {
+ if ( d !== 0 && (!d || d === '-') ) {
+ return -Infinity;
+ }
+
+ // If a decimal place other than `.` is used, it needs to be given to the
+ // function so we can detect it and replace with a `.` which is the only
+ // decimal place Javascript recognises - it is not locale aware.
+ if ( decimalPlace ) {
+ d = _numToDecimal( d, decimalPlace );
+ }
+
+ if ( d.replace ) {
+ if ( re1 ) {
+ d = d.replace( re1, '' );
+ }
+
+ if ( re2 ) {
+ d = d.replace( re2, '' );
+ }
+ }
+
+ return d * 1;
+ };
+
+
+ // Add the numeric 'deformatting' functions for sorting and search. This is done
+ // in a function to provide an easy ability for the language options to add
+ // additional methods if a non-period decimal place is used.
+ function _addNumericSort ( decimalPlace ) {
+ $.each(
+ {
+ // Plain numbers
+ "num": function ( d ) {
+ return __numericReplace( d, decimalPlace );
+ },
+
+ // Formatted numbers
+ "num-fmt": function ( d ) {
+ return __numericReplace( d, decimalPlace, _re_formatted_numeric );
+ },
+
+ // HTML numeric
+ "html-num": function ( d ) {
+ return __numericReplace( d, decimalPlace, _re_html );
+ },
+
+ // HTML numeric, formatted
+ "html-num-fmt": function ( d ) {
+ return __numericReplace( d, decimalPlace, _re_html, _re_formatted_numeric );
+ }
+ },
+ function ( key, fn ) {
+ // Add the ordering method
+ _ext.type.order[ key+decimalPlace+'-pre' ] = fn;
+
+ // For HTML types add a search formatter that will strip the HTML
+ if ( key.match(/^html\-/) ) {
+ _ext.type.search[ key+decimalPlace ] = _ext.type.search.html;
+ }
+ }
+ );
+ }
+
+
+ // Default sort methods
+ $.extend( _ext.type.order, {
+ // Dates
+ "date-pre": function ( d ) {
+ var ts = Date.parse( d );
+ return isNaN(ts) ? -Infinity : ts;
+ },
+
+ // html
+ "html-pre": function ( a ) {
+ return _empty(a) ?
+ '' :
+ a.replace ?
+ a.replace( /<.*?>/g, "" ).toLowerCase() :
+ a+'';
+ },
+
+ // string
+ "string-pre": function ( a ) {
+ // This is a little complex, but faster than always calling toString,
+ // http://jsperf.com/tostring-v-check
+ return _empty(a) ?
+ '' :
+ typeof a === 'string' ?
+ a.toLowerCase() :
+ ! a.toString ?
+ '' :
+ a.toString();
+ },
+
+ // string-asc and -desc are retained only for compatibility with the old
+ // sort methods
+ "string-asc": function ( x, y ) {
+ return ((x < y) ? -1 : ((x > y) ? 1 : 0));
+ },
+
+ "string-desc": function ( x, y ) {
+ return ((x < y) ? 1 : ((x > y) ? -1 : 0));
+ }
+ } );
+
+
+ // Numeric sorting types - order doesn't matter here
+ _addNumericSort( '' );
+
+
+ $.extend( true, DataTable.ext.renderer, {
+ header: {
+ _: function ( settings, cell, column, classes ) {
+ // No additional mark-up required
+ // Attach a sort listener to update on sort - note that using the
+ // `DT` namespace will allow the event to be removed automatically
+ // on destroy, while the `dt` namespaced event is the one we are
+ // listening for
+ $(settings.nTable).on( 'order.dt.DT', function ( e, ctx, sorting, columns ) {
+ if ( settings !== ctx ) { // need to check this this is the host
+ return; // table, not a nested one
+ }
+
+ var colIdx = column.idx;
+
+ cell
+ .removeClass(
+ column.sSortingClass +' '+
+ classes.sSortAsc +' '+
+ classes.sSortDesc
+ )
+ .addClass( columns[ colIdx ] == 'asc' ?
+ classes.sSortAsc : columns[ colIdx ] == 'desc' ?
+ classes.sSortDesc :
+ column.sSortingClass
+ );
+ } );
+ },
+
+ jqueryui: function ( settings, cell, column, classes ) {
+ $('
')
+ .addClass( classes.sSortJUIWrapper )
+ .append( cell.contents() )
+ .append( $(' ')
+ .addClass( classes.sSortIcon+' '+column.sSortingClassJUI )
+ )
+ .appendTo( cell );
+
+ // Attach a sort listener to update on sort
+ $(settings.nTable).on( 'order.dt.DT', function ( e, ctx, sorting, columns ) {
+ if ( settings !== ctx ) {
+ return;
+ }
+
+ var colIdx = column.idx;
+
+ cell
+ .removeClass( classes.sSortAsc +" "+classes.sSortDesc )
+ .addClass( columns[ colIdx ] == 'asc' ?
+ classes.sSortAsc : columns[ colIdx ] == 'desc' ?
+ classes.sSortDesc :
+ column.sSortingClass
+ );
+
+ cell
+ .find( 'span.'+classes.sSortIcon )
+ .removeClass(
+ classes.sSortJUIAsc +" "+
+ classes.sSortJUIDesc +" "+
+ classes.sSortJUI +" "+
+ classes.sSortJUIAscAllowed +" "+
+ classes.sSortJUIDescAllowed
+ )
+ .addClass( columns[ colIdx ] == 'asc' ?
+ classes.sSortJUIAsc : columns[ colIdx ] == 'desc' ?
+ classes.sSortJUIDesc :
+ column.sSortingClassJUI
+ );
+ } );
+ }
+ }
+ } );
+
+ /*
+ * Public helper functions. These aren't used internally by DataTables, or
+ * called by any of the options passed into DataTables, but they can be used
+ * externally by developers working with DataTables. They are helper functions
+ * to make working with DataTables a little bit easier.
+ */
+
+ var __htmlEscapeEntities = function ( d ) {
+ return typeof d === 'string' ?
+ d.replace(//g, '>').replace(/"/g, '"') :
+ d;
+ };
+
+ /**
+ * Helpers for `columns.render`.
+ *
+ * The options defined here can be used with the `columns.render` initialisation
+ * option to provide a display renderer. The following functions are defined:
+ *
+ * * `number` - Will format numeric data (defined by `columns.data`) for
+ * display, retaining the original unformatted data for sorting and filtering.
+ * It takes 5 parameters:
+ * * `string` - Thousands grouping separator
+ * * `string` - Decimal point indicator
+ * * `integer` - Number of decimal points to show
+ * * `string` (optional) - Prefix.
+ * * `string` (optional) - Postfix (/suffix).
+ * * `text` - Escape HTML to help prevent XSS attacks. It has no optional
+ * parameters.
+ *
+ * @example
+ * // Column definition using the number renderer
+ * {
+ * data: "salary",
+ * render: $.fn.dataTable.render.number( '\'', '.', 0, '$' )
+ * }
+ *
+ * @namespace
+ */
+ DataTable.render = {
+ number: function ( thousands, decimal, precision, prefix, postfix ) {
+ return {
+ display: function ( d ) {
+ if ( typeof d !== 'number' && typeof d !== 'string' ) {
+ return d;
+ }
+
+ var negative = d < 0 ? '-' : '';
+ var flo = parseFloat( d );
+
+ // If NaN then there isn't much formatting that we can do - just
+ // return immediately, escaping any HTML (this was supposed to
+ // be a number after all)
+ if ( isNaN( flo ) ) {
+ return __htmlEscapeEntities( d );
+ }
+
+ flo = flo.toFixed( precision );
+ d = Math.abs( flo );
+
+ var intPart = parseInt( d, 10 );
+ var floatPart = precision ?
+ decimal+(d - intPart).toFixed( precision ).substring( 2 ):
+ '';
+
+ return negative + (prefix||'') +
+ intPart.toString().replace(
+ /\B(?=(\d{3})+(?!\d))/g, thousands
+ ) +
+ floatPart +
+ (postfix||'');
+ }
+ };
+ },
+
+ text: function () {
+ return {
+ display: __htmlEscapeEntities
+ };
+ }
+ };
+
+
+ /*
+ * This is really a good bit rubbish this method of exposing the internal methods
+ * publicly... - To be fixed in 2.0 using methods on the prototype
+ */
+
+
+ /**
+ * Create a wrapper function for exporting an internal functions to an external API.
+ * @param {string} fn API function name
+ * @returns {function} wrapped function
+ * @memberof DataTable#internal
+ */
+ function _fnExternApiFunc (fn)
+ {
+ return function() {
+ var args = [_fnSettingsFromNode( this[DataTable.ext.iApiIndex] )].concat(
+ Array.prototype.slice.call(arguments)
+ );
+ return DataTable.ext.internal[fn].apply( this, args );
+ };
+ }
+
+
+ /**
+ * Reference to internal functions for use by plug-in developers. Note that
+ * these methods are references to internal functions and are considered to be
+ * private. If you use these methods, be aware that they are liable to change
+ * between versions.
+ * @namespace
+ */
+ $.extend( DataTable.ext.internal, {
+ _fnExternApiFunc: _fnExternApiFunc,
+ _fnBuildAjax: _fnBuildAjax,
+ _fnAjaxUpdate: _fnAjaxUpdate,
+ _fnAjaxParameters: _fnAjaxParameters,
+ _fnAjaxUpdateDraw: _fnAjaxUpdateDraw,
+ _fnAjaxDataSrc: _fnAjaxDataSrc,
+ _fnAddColumn: _fnAddColumn,
+ _fnColumnOptions: _fnColumnOptions,
+ _fnAdjustColumnSizing: _fnAdjustColumnSizing,
+ _fnVisibleToColumnIndex: _fnVisibleToColumnIndex,
+ _fnColumnIndexToVisible: _fnColumnIndexToVisible,
+ _fnVisbleColumns: _fnVisbleColumns,
+ _fnGetColumns: _fnGetColumns,
+ _fnColumnTypes: _fnColumnTypes,
+ _fnApplyColumnDefs: _fnApplyColumnDefs,
+ _fnHungarianMap: _fnHungarianMap,
+ _fnCamelToHungarian: _fnCamelToHungarian,
+ _fnLanguageCompat: _fnLanguageCompat,
+ _fnBrowserDetect: _fnBrowserDetect,
+ _fnAddData: _fnAddData,
+ _fnAddTr: _fnAddTr,
+ _fnNodeToDataIndex: _fnNodeToDataIndex,
+ _fnNodeToColumnIndex: _fnNodeToColumnIndex,
+ _fnGetCellData: _fnGetCellData,
+ _fnSetCellData: _fnSetCellData,
+ _fnSplitObjNotation: _fnSplitObjNotation,
+ _fnGetObjectDataFn: _fnGetObjectDataFn,
+ _fnSetObjectDataFn: _fnSetObjectDataFn,
+ _fnGetDataMaster: _fnGetDataMaster,
+ _fnClearTable: _fnClearTable,
+ _fnDeleteIndex: _fnDeleteIndex,
+ _fnInvalidate: _fnInvalidate,
+ _fnGetRowElements: _fnGetRowElements,
+ _fnCreateTr: _fnCreateTr,
+ _fnBuildHead: _fnBuildHead,
+ _fnDrawHead: _fnDrawHead,
+ _fnDraw: _fnDraw,
+ _fnReDraw: _fnReDraw,
+ _fnAddOptionsHtml: _fnAddOptionsHtml,
+ _fnDetectHeader: _fnDetectHeader,
+ _fnGetUniqueThs: _fnGetUniqueThs,
+ _fnFeatureHtmlFilter: _fnFeatureHtmlFilter,
+ _fnFilterComplete: _fnFilterComplete,
+ _fnFilterCustom: _fnFilterCustom,
+ _fnFilterColumn: _fnFilterColumn,
+ _fnFilter: _fnFilter,
+ _fnFilterCreateSearch: _fnFilterCreateSearch,
+ _fnEscapeRegex: _fnEscapeRegex,
+ _fnFilterData: _fnFilterData,
+ _fnFeatureHtmlInfo: _fnFeatureHtmlInfo,
+ _fnUpdateInfo: _fnUpdateInfo,
+ _fnInfoMacros: _fnInfoMacros,
+ _fnInitialise: _fnInitialise,
+ _fnInitComplete: _fnInitComplete,
+ _fnLengthChange: _fnLengthChange,
+ _fnFeatureHtmlLength: _fnFeatureHtmlLength,
+ _fnFeatureHtmlPaginate: _fnFeatureHtmlPaginate,
+ _fnPageChange: _fnPageChange,
+ _fnFeatureHtmlProcessing: _fnFeatureHtmlProcessing,
+ _fnProcessingDisplay: _fnProcessingDisplay,
+ _fnFeatureHtmlTable: _fnFeatureHtmlTable,
+ _fnScrollDraw: _fnScrollDraw,
+ _fnApplyToChildren: _fnApplyToChildren,
+ _fnCalculateColumnWidths: _fnCalculateColumnWidths,
+ _fnThrottle: _fnThrottle,
+ _fnConvertToWidth: _fnConvertToWidth,
+ _fnGetWidestNode: _fnGetWidestNode,
+ _fnGetMaxLenString: _fnGetMaxLenString,
+ _fnStringToCss: _fnStringToCss,
+ _fnSortFlatten: _fnSortFlatten,
+ _fnSort: _fnSort,
+ _fnSortAria: _fnSortAria,
+ _fnSortListener: _fnSortListener,
+ _fnSortAttachListener: _fnSortAttachListener,
+ _fnSortingClasses: _fnSortingClasses,
+ _fnSortData: _fnSortData,
+ _fnSaveState: _fnSaveState,
+ _fnLoadState: _fnLoadState,
+ _fnSettingsFromNode: _fnSettingsFromNode,
+ _fnLog: _fnLog,
+ _fnMap: _fnMap,
+ _fnBindAction: _fnBindAction,
+ _fnCallbackReg: _fnCallbackReg,
+ _fnCallbackFire: _fnCallbackFire,
+ _fnLengthOverflow: _fnLengthOverflow,
+ _fnRenderer: _fnRenderer,
+ _fnDataSource: _fnDataSource,
+ _fnRowAttributes: _fnRowAttributes,
+ _fnExtend: _fnExtend,
+ _fnCalculateEnd: function () {} // Used by a lot of plug-ins, but redundant
+ // in 1.10, so this dead-end function is
+ // added to prevent errors
+ } );
+
+
+ // jQuery access
+ $.fn.dataTable = DataTable;
+
+ // Provide access to the host jQuery object (circular reference)
+ DataTable.$ = $;
+
+ // Legacy aliases
+ $.fn.dataTableSettings = DataTable.settings;
+ $.fn.dataTableExt = DataTable.ext;
+
+ // With a capital `D` we return a DataTables API instance rather than a
+ // jQuery object
+ $.fn.DataTable = function ( opts ) {
+ return $(this).dataTable( opts ).api();
+ };
+
+ // All properties that are available to $.fn.dataTable should also be
+ // available on $.fn.DataTable
+ $.each( DataTable, function ( prop, val ) {
+ $.fn.DataTable[ prop ] = val;
+ } );
+
+
+ // Information about events fired by DataTables - for documentation.
+ /**
+ * Draw event, fired whenever the table is redrawn on the page, at the same
+ * point as fnDrawCallback. This may be useful for binding events or
+ * performing calculations when the table is altered at all.
+ * @name DataTable#draw.dt
+ * @event
+ * @param {event} e jQuery event object
+ * @param {object} o DataTables settings object {@link DataTable.models.oSettings}
+ */
+
+ /**
+ * Search event, fired when the searching applied to the table (using the
+ * built-in global search, or column filters) is altered.
+ * @name DataTable#search.dt
+ * @event
+ * @param {event} e jQuery event object
+ * @param {object} o DataTables settings object {@link DataTable.models.oSettings}
+ */
+
+ /**
+ * Page change event, fired when the paging of the table is altered.
+ * @name DataTable#page.dt
+ * @event
+ * @param {event} e jQuery event object
+ * @param {object} o DataTables settings object {@link DataTable.models.oSettings}
+ */
+
+ /**
+ * Order event, fired when the ordering applied to the table is altered.
+ * @name DataTable#order.dt
+ * @event
+ * @param {event} e jQuery event object
+ * @param {object} o DataTables settings object {@link DataTable.models.oSettings}
+ */
+
+ /**
+ * DataTables initialisation complete event, fired when the table is fully
+ * drawn, including Ajax data loaded, if Ajax data is required.
+ * @name DataTable#init.dt
+ * @event
+ * @param {event} e jQuery event object
+ * @param {object} oSettings DataTables settings object
+ * @param {object} json The JSON object request from the server - only
+ * present if client-side Ajax sourced data is used
+ */
+
+ /**
+ * State save event, fired when the table has changed state a new state save
+ * is required. This event allows modification of the state saving object
+ * prior to actually doing the save, including addition or other state
+ * properties (for plug-ins) or modification of a DataTables core property.
+ * @name DataTable#stateSaveParams.dt
+ * @event
+ * @param {event} e jQuery event object
+ * @param {object} oSettings DataTables settings object
+ * @param {object} json The state information to be saved
+ */
+
+ /**
+ * State load event, fired when the table is loading state from the stored
+ * data, but prior to the settings object being modified by the saved state
+ * - allowing modification of the saved state is required or loading of
+ * state for a plug-in.
+ * @name DataTable#stateLoadParams.dt
+ * @event
+ * @param {event} e jQuery event object
+ * @param {object} oSettings DataTables settings object
+ * @param {object} json The saved state information
+ */
+
+ /**
+ * State loaded event, fired when state has been loaded from stored data and
+ * the settings object has been modified by the loaded data.
+ * @name DataTable#stateLoaded.dt
+ * @event
+ * @param {event} e jQuery event object
+ * @param {object} oSettings DataTables settings object
+ * @param {object} json The saved state information
+ */
+
+ /**
+ * Processing event, fired when DataTables is doing some kind of processing
+ * (be it, order, searcg or anything else). It can be used to indicate to
+ * the end user that there is something happening, or that something has
+ * finished.
+ * @name DataTable#processing.dt
+ * @event
+ * @param {event} e jQuery event object
+ * @param {object} oSettings DataTables settings object
+ * @param {boolean} bShow Flag for if DataTables is doing processing or not
+ */
+
+ /**
+ * Ajax (XHR) event, fired whenever an Ajax request is completed from a
+ * request to made to the server for new data. This event is called before
+ * DataTables processed the returned data, so it can also be used to pre-
+ * process the data returned from the server, if needed.
+ *
+ * Note that this trigger is called in `fnServerData`, if you override
+ * `fnServerData` and which to use this event, you need to trigger it in you
+ * success function.
+ * @name DataTable#xhr.dt
+ * @event
+ * @param {event} e jQuery event object
+ * @param {object} o DataTables settings object {@link DataTable.models.oSettings}
+ * @param {object} json JSON returned from the server
+ *
+ * @example
+ * // Use a custom property returned from the server in another DOM element
+ * $('#table').dataTable().on('xhr.dt', function (e, settings, json) {
+ * $('#status').html( json.status );
+ * } );
+ *
+ * @example
+ * // Pre-process the data returned from the server
+ * $('#table').dataTable().on('xhr.dt', function (e, settings, json) {
+ * for ( var i=0, ien=json.aaData.length ; i").css({position:"fixed",top:0,left:-1*h(E).scrollLeft(),height:1,width:1,
+overflow:"hidden"}).append(h("
").css({position:"absolute",top:1,left:1,width:100,overflow:"scroll"}).append(h("
").css({width:"100%",height:10}))).appendTo("body"),d=c.children(),e=d.children();b.barWidth=d[0].offsetWidth-d[0].clientWidth;b.bScrollOversize=100===e[0].offsetWidth&&100!==d[0].clientWidth;b.bScrollbarLeft=1!==Math.round(e.offset().left);b.bBounding=c[0].getBoundingClientRect().width?!0:!1;c.remove()}h.extend(a.oBrowser,n.__browser);a.oScroll.iBarWidth=n.__browser.barWidth}
+function hb(a,b,c,d,e,f){var g,j=!1;c!==k&&(g=c,j=!0);for(;d!==e;)a.hasOwnProperty(d)&&(g=j?b(g,a[d],d,a):a[d],j=!0,d+=f);return g}function Ea(a,b){var c=n.defaults.column,d=a.aoColumns.length,c=h.extend({},n.models.oColumn,c,{nTh:b?b:H.createElement("th"),sTitle:c.sTitle?c.sTitle:b?b.innerHTML:"",aDataSort:c.aDataSort?c.aDataSort:[d],mData:c.mData?c.mData:d,idx:d});a.aoColumns.push(c);c=a.aoPreSearchCols;c[d]=h.extend({},n.models.oSearch,c[d]);ka(a,d,h(b).data())}function ka(a,b,c){var b=a.aoColumns[b],
+d=a.oClasses,e=h(b.nTh);if(!b.sWidthOrig){b.sWidthOrig=e.attr("width")||null;var f=(e.attr("style")||"").match(/width:\s*(\d+[pxem%]+)/);f&&(b.sWidthOrig=f[1])}c!==k&&null!==c&&(fb(c),J(n.defaults.column,c),c.mDataProp!==k&&!c.mData&&(c.mData=c.mDataProp),c.sType&&(b._sManualType=c.sType),c.className&&!c.sClass&&(c.sClass=c.className),c.sClass&&e.addClass(c.sClass),h.extend(b,c),F(b,c,"sWidth","sWidthOrig"),c.iDataSort!==k&&(b.aDataSort=[c.iDataSort]),F(b,c,"aDataSort"));var g=b.mData,j=S(g),i=b.mRender?
+S(b.mRender):null,c=function(a){return"string"===typeof a&&-1!==a.indexOf("@")};b._bAttrSrc=h.isPlainObject(g)&&(c(g.sort)||c(g.type)||c(g.filter));b._setter=null;b.fnGetData=function(a,b,c){var d=j(a,b,k,c);return i&&b?i(d,b,a,c):d};b.fnSetData=function(a,b,c){return N(g)(a,b,c)};"number"!==typeof g&&(a._rowReadObject=!0);a.oFeatures.bSort||(b.bSortable=!1,e.addClass(d.sSortableNone));a=-1!==h.inArray("asc",b.asSorting);c=-1!==h.inArray("desc",b.asSorting);!b.bSortable||!a&&!c?(b.sSortingClass=d.sSortableNone,
+b.sSortingClassJUI=""):a&&!c?(b.sSortingClass=d.sSortableAsc,b.sSortingClassJUI=d.sSortJUIAscAllowed):!a&&c?(b.sSortingClass=d.sSortableDesc,b.sSortingClassJUI=d.sSortJUIDescAllowed):(b.sSortingClass=d.sSortable,b.sSortingClassJUI=d.sSortJUI)}function $(a){if(!1!==a.oFeatures.bAutoWidth){var b=a.aoColumns;Fa(a);for(var c=0,d=b.length;cq[f])d(l.length+q[f],m);else if("string"===
+typeof q[f]){j=0;for(i=l.length;jb&&a[e]--; -1!=d&&c===k&&a.splice(d,
+1)}function da(a,b,c,d){var e=a.aoData[b],f,g=function(c,d){for(;c.childNodes.length;)c.removeChild(c.firstChild);c.innerHTML=B(a,b,d,"display")};if("dom"===c||(!c||"auto"===c)&&"dom"===e.src)e._aData=Ia(a,e,d,d===k?k:e._aData).data;else{var j=e.anCells;if(j)if(d!==k)g(j[d],d);else{c=0;for(f=j.length;c ").appendTo(g));b=0;for(c=l.length;btr").attr("role","row");h(g).find(">tr>th, >tr>td").addClass(m.sHeaderTH);h(j).find(">tr>th, >tr>td").addClass(m.sFooterTH);if(null!==j){a=a.aoFooter[0];b=0;for(c=a.length;b=a.fnRecordsDisplay()?0:g,a.iInitDisplayStart=-1);var g=a._iDisplayStart,m=a.fnDisplayEnd();if(a.bDeferLoading)a.bDeferLoading=!1,a.iDraw++,C(a,!1);else if(j){if(!a.bDestroying&&!lb(a))return}else a.iDraw++;if(0!==i.length){f=j?a.aoData.length:m;for(j=j?0:g;j",{"class":e?d[0]:""}).append(h(" ",{valign:"top",colSpan:V(a),"class":a.oClasses.sRowEmpty}).html(c))[0];r(a,"aoHeaderCallback","header",[h(a.nTHead).children("tr")[0],Ka(a),g,m,i]);r(a,"aoFooterCallback","footer",[h(a.nTFoot).children("tr")[0],Ka(a),g,m,i]);d=h(a.nTBody);d.children().detach();
+d.append(h(b));r(a,"aoDrawCallback","draw",[a]);a.bSorted=!1;a.bFiltered=!1;a.bDrawing=!1}}function T(a,b){var c=a.oFeatures,d=c.bFilter;c.bSort&&mb(a);d?ga(a,a.oPreviousSearch):a.aiDisplay=a.aiDisplayMaster.slice();!0!==b&&(a._iDisplayStart=0);a._drawHold=b;P(a);a._drawHold=!1}function nb(a){var b=a.oClasses,c=h(a.nTable),c=h("
").insertBefore(c),d=a.oFeatures,e=h("
",{id:a.sTableId+"_wrapper","class":b.sWrapper+(a.nTFoot?"":" "+b.sNoFooter)});a.nHolding=c[0];a.nTableWrapper=e[0];a.nTableReinsertBefore=
+a.nTable.nextSibling;for(var f=a.sDom.split(""),g,j,i,m,l,q,k=0;k ")[0];m=f[k+1];if("'"==m||'"'==m){l="";for(q=2;f[k+q]!=m;)l+=f[k+q],q++;"H"==l?l=b.sJUIHeader:"F"==l&&(l=b.sJUIFooter);-1!=l.indexOf(".")?(m=l.split("."),i.id=m[0].substr(1,m[0].length-1),i.className=m[1]):"#"==l.charAt(0)?i.id=l.substr(1,l.length-1):i.className=l;k+=q}e.append(i);e=h(i)}else if(">"==j)e=e.parent();else if("l"==j&&d.bPaginate&&d.bLengthChange)g=ob(a);else if("f"==j&&
+d.bFilter)g=pb(a);else if("r"==j&&d.bProcessing)g=qb(a);else if("t"==j)g=rb(a);else if("i"==j&&d.bInfo)g=sb(a);else if("p"==j&&d.bPaginate)g=tb(a);else if(0!==n.ext.feature.length){i=n.ext.feature;q=0;for(m=i.length;q ',j=d.sSearch,j=j.match(/_INPUT_/)?j.replace("_INPUT_",
+g):j+g,b=h("
",{id:!f.f?c+"_filter":null,"class":b.sFilter}).append(h(" ").append(j)),f=function(){var b=!this.value?"":this.value;b!=e.sSearch&&(ga(a,{sSearch:b,bRegex:e.bRegex,bSmart:e.bSmart,bCaseInsensitive:e.bCaseInsensitive}),a._iDisplayStart=0,P(a))},g=null!==a.searchDelay?a.searchDelay:"ssp"===y(a)?400:0,i=h("input",b).val(e.sSearch).attr("placeholder",d.sSearchPlaceholder).on("keyup.DT search.DT input.DT paste.DT cut.DT",g?Oa(f,g):f).on("keypress.DT",function(a){if(13==a.keyCode)return!1}).attr("aria-controls",
+c);h(a.nTable).on("search.dt.DT",function(b,c){if(a===c)try{i[0]!==H.activeElement&&i.val(e.sSearch)}catch(d){}});return b[0]}function ga(a,b,c){var d=a.oPreviousSearch,e=a.aoPreSearchCols,f=function(a){d.sSearch=a.sSearch;d.bRegex=a.bRegex;d.bSmart=a.bSmart;d.bCaseInsensitive=a.bCaseInsensitive};Ga(a);if("ssp"!=y(a)){wb(a,b.sSearch,c,b.bEscapeRegex!==k?!b.bEscapeRegex:b.bRegex,b.bSmart,b.bCaseInsensitive);f(b);for(b=0;b=b.length)a.aiDisplay=g.slice();else{if(j||c||f.length>b.length||0!==b.indexOf(f)||a.bSorted)a.aiDisplay=g.slice();b=a.aiDisplay;for(c=0;c",{"class":a.oClasses.sInfo,id:!c?b+"_info":null});c||(a.aoDrawCallback.push({fn:Cb,sName:"information"}),d.attr("role","status").attr("aria-live","polite"),h(a.nTable).attr("aria-describedby",
+b+"_info"));return d[0]}function Cb(a){var b=a.aanFeatures.i;if(0!==b.length){var c=a.oLanguage,d=a._iDisplayStart+1,e=a.fnDisplayEnd(),f=a.fnRecordsTotal(),g=a.fnRecordsDisplay(),j=g?c.sInfo:c.sInfoEmpty;g!==f&&(j+=" "+c.sInfoFiltered);j+=c.sInfoPostFix;j=Db(a,j);c=c.fnInfoCallback;null!==c&&(j=c.call(a.oInstance,a,d,e,f,g,j));h(b).html(j)}}function Db(a,b){var c=a.fnFormatNumber,d=a._iDisplayStart+1,e=a._iDisplayLength,f=a.fnRecordsDisplay(),g=-1===e;return b.replace(/_START_/g,c.call(a,d)).replace(/_END_/g,
+c.call(a,a.fnDisplayEnd())).replace(/_MAX_/g,c.call(a,a.fnRecordsTotal())).replace(/_TOTAL_/g,c.call(a,f)).replace(/_PAGE_/g,c.call(a,g?1:Math.ceil(d/e))).replace(/_PAGES_/g,c.call(a,g?1:Math.ceil(f/e)))}function ha(a){var b,c,d=a.iInitDisplayStart,e=a.aoColumns,f;c=a.oFeatures;var g=a.bDeferLoading;if(a.bInitialised){nb(a);kb(a);fa(a,a.aoHeader);fa(a,a.aoFooter);C(a,!0);c.bAutoWidth&&Fa(a);b=0;for(c=e.length;b ",{name:c+"_length","aria-controls":c,"class":b.sLengthSelect}),g=0,j=f.length;g ").addClass(b.sLength);a.aanFeatures.l||(i[0].id=c+"_length");i.children().append(a.oLanguage.sLengthMenu.replace("_MENU_",e[0].outerHTML));h("select",i).val(a._iDisplayLength).on("change.DT",function(){Ra(a,h(this).val());P(a)});h(a.nTable).on("length.dt.DT",function(b,c,d){a===
+c&&h("select",i).val(d)});return i[0]}function tb(a){var b=a.sPaginationType,c=n.ext.pager[b],d="function"===typeof c,e=function(a){P(a)},b=h("
").addClass(a.oClasses.sPaging+b)[0],f=a.aanFeatures;d||c.fnInit(a,b,e);f.p||(b.id=a.sTableId+"_paginate",a.aoDrawCallback.push({fn:function(a){if(d){var b=a._iDisplayStart,i=a._iDisplayLength,h=a.fnRecordsDisplay(),l=-1===i,b=l?0:Math.ceil(b/i),i=l?1:Math.ceil(h/i),h=c(b,i),k,l=0;for(k=f.p.length;lf&&(d=0)):"first"==b?d=0:"previous"==b?(d=0<=e?d-e:0,0>d&&(d=0)):"next"==b?d+e ",{id:!a.aanFeatures.r?a.sTableId+"_processing":null,"class":a.oClasses.sProcessing}).html(a.oLanguage.sProcessing).insertBefore(a.nTable)[0]}
+function C(a,b){a.oFeatures.bProcessing&&h(a.aanFeatures.r).css("display",b?"block":"none");r(a,null,"processing",[a,b])}function rb(a){var b=h(a.nTable);b.attr("role","grid");var c=a.oScroll;if(""===c.sX&&""===c.sY)return a.nTable;var d=c.sX,e=c.sY,f=a.oClasses,g=b.children("caption"),j=g.length?g[0]._captionSide:null,i=h(b[0].cloneNode(!1)),m=h(b[0].cloneNode(!1)),l=b.children("tfoot");l.length||(l=null);i=h("
",{"class":f.sScrollWrapper}).append(h("
",{"class":f.sScrollHead}).css({overflow:"hidden",
+position:"relative",border:0,width:d?!d?null:v(d):"100%"}).append(h("
",{"class":f.sScrollHeadInner}).css({"box-sizing":"content-box",width:c.sXInner||"100%"}).append(i.removeAttr("id").css("margin-left",0).append("top"===j?g:null).append(b.children("thead"))))).append(h("
",{"class":f.sScrollBody}).css({position:"relative",overflow:"auto",width:!d?null:v(d)}).append(b));l&&i.append(h("
",{"class":f.sScrollFoot}).css({overflow:"hidden",border:0,width:d?!d?null:v(d):"100%"}).append(h("
",
+{"class":f.sScrollFootInner}).append(m.removeAttr("id").css("margin-left",0).append("bottom"===j?g:null).append(b.children("tfoot")))));var b=i.children(),k=b[0],f=b[1],t=l?b[2]:null;if(d)h(f).on("scroll.DT",function(){var a=this.scrollLeft;k.scrollLeft=a;l&&(t.scrollLeft=a)});h(f).css(e&&c.bCollapse?"max-height":"height",e);a.nScrollHead=k;a.nScrollBody=f;a.nScrollFoot=t;a.aoDrawCallback.push({fn:la,sName:"scrolling"});return i[0]}function la(a){var b=a.oScroll,c=b.sX,d=b.sXInner,e=b.sY,b=b.iBarWidth,
+f=h(a.nScrollHead),g=f[0].style,j=f.children("div"),i=j[0].style,m=j.children("table"),j=a.nScrollBody,l=h(j),q=j.style,t=h(a.nScrollFoot).children("div"),n=t.children("table"),o=h(a.nTHead),p=h(a.nTable),s=p[0],r=s.style,u=a.nTFoot?h(a.nTFoot):null,x=a.oBrowser,U=x.bScrollOversize,Xb=D(a.aoColumns,"nTh"),Q,L,R,w,Ua=[],y=[],z=[],A=[],B,C=function(a){a=a.style;a.paddingTop="0";a.paddingBottom="0";a.borderTopWidth="0";a.borderBottomWidth="0";a.height=0};L=j.scrollHeight>j.clientHeight;if(a.scrollBarVis!==
+L&&a.scrollBarVis!==k)a.scrollBarVis=L,$(a);else{a.scrollBarVis=L;p.children("thead, tfoot").remove();u&&(R=u.clone().prependTo(p),Q=u.find("tr"),R=R.find("tr"));w=o.clone().prependTo(p);o=o.find("tr");L=w.find("tr");w.find("th, td").removeAttr("tabindex");c||(q.width="100%",f[0].style.width="100%");h.each(ra(a,w),function(b,c){B=aa(a,b);c.style.width=a.aoColumns[B].sWidth});u&&I(function(a){a.style.width=""},R);f=p.outerWidth();if(""===c){r.width="100%";if(U&&(p.find("tbody").height()>j.offsetHeight||
+"scroll"==l.css("overflow-y")))r.width=v(p.outerWidth()-b);f=p.outerWidth()}else""!==d&&(r.width=v(d),f=p.outerWidth());I(C,L);I(function(a){z.push(a.innerHTML);Ua.push(v(h(a).css("width")))},L);I(function(a,b){if(h.inArray(a,Xb)!==-1)a.style.width=Ua[b]},o);h(L).height(0);u&&(I(C,R),I(function(a){A.push(a.innerHTML);y.push(v(h(a).css("width")))},R),I(function(a,b){a.style.width=y[b]},Q),h(R).height(0));I(function(a,b){a.innerHTML=''+z[b]+"
";a.childNodes[0].style.height=
+"0";a.childNodes[0].style.overflow="hidden";a.style.width=Ua[b]},L);u&&I(function(a,b){a.innerHTML=''+A[b]+"
";a.childNodes[0].style.height="0";a.childNodes[0].style.overflow="hidden";a.style.width=y[b]},R);if(p.outerWidth()j.offsetHeight||"scroll"==l.css("overflow-y")?f+b:f;if(U&&(j.scrollHeight>j.offsetHeight||"scroll"==l.css("overflow-y")))r.width=v(Q-b);(""===c||""!==d)&&K(a,1,"Possible column misalignment",6)}else Q="100%";q.width=v(Q);
+g.width=v(Q);u&&(a.nScrollFoot.style.width=v(Q));!e&&U&&(q.height=v(s.offsetHeight+b));c=p.outerWidth();m[0].style.width=v(c);i.width=v(c);d=p.height()>j.clientHeight||"scroll"==l.css("overflow-y");e="padding"+(x.bScrollbarLeft?"Left":"Right");i[e]=d?b+"px":"0px";u&&(n[0].style.width=v(c),t[0].style.width=v(c),t[0].style[e]=d?b+"px":"0px");p.children("colgroup").insertBefore(p.children("thead"));l.scroll();if((a.bSorted||a.bFiltered)&&!a._drawHold)j.scrollTop=0}}function I(a,b,c){for(var d=0,e=0,
+f=b.length,g,j;e").appendTo(j.find("tbody"));j.find("thead, tfoot").remove();j.append(h(a.nTHead).clone()).append(h(a.nTFoot).clone());j.find("tfoot th, tfoot td").css("width","");m=ra(a,j.find("thead")[0]);for(n=0;n ").css({width:o.sWidthOrig,margin:0,padding:0,border:0,height:1}));if(a.aoData.length)for(n=0;n ").css(f||e?{position:"absolute",top:0,left:0,height:1,right:0,overflow:"hidden"}:{}).append(j).appendTo(k);f&&g?j.width(g):f?(j.css("width","auto"),j.removeAttr("width"),j.width()").css("width",v(a)).appendTo(b||H.body),d=c[0].offsetWidth;c.remove();return d}function Fb(a,
+b){var c=Gb(a,b);if(0>c)return null;var d=a.aoData[c];return!d.nTr?h(" ").html(B(a,c,b,"display"))[0]:d.anCells[b]}function Gb(a,b){for(var c,d=-1,e=-1,f=0,g=a.aoData.length;fd&&(d=c.length,e=f);return e}function v(a){return null===a?"0px":"number"==typeof a?0>a?"0px":a+"px":a.match(/\d$/)?a+"px":a}function X(a){var b,c,d=[],e=a.aoColumns,f,g,j,i;b=a.aaSortingFixed;c=h.isPlainObject(b);var m=[];f=function(a){a.length&&
+!h.isArray(a[0])?m.push(a):h.merge(m,a)};h.isArray(b)&&f(b);c&&b.pre&&f(b.pre);f(a.aaSorting);c&&b.post&&f(b.post);for(a=0;ae?1:0,0!==c)return"asc"===j.dir?c:-c;c=d[a];e=d[b];return ce?1:0}):i.sort(function(a,b){var c,g,j,i,k=h.length,n=f[a]._aSortData,o=f[b]._aSortData;for(j=0;jg?1:0})}a.bSorted=!0}function Ib(a){for(var b,c,d=a.aoColumns,e=X(a),a=a.oLanguage.oAria,f=0,g=d.length;f/g,"");var i=c.nTh;i.removeAttribute("aria-sort");c.bSortable&&(0e?e+1:3));e=0;for(f=d.length;ee?e+1:3))}a.aLastSort=d}function Hb(a,b){var c=a.aoColumns[b],d=n.ext.order[c.sSortDataType],e;d&&(e=d.call(a.oInstance,a,b,ba(a,b)));for(var f,g=n.ext.type.order[c.sType+"-pre"],j=0,i=a.aoData.length;j=f.length?[0,c[1]]:c)}));b.search!==k&&h.extend(a.oPreviousSearch,Bb(b.search));if(b.columns){d=0;for(e=b.columns.length;d=c&&(b=c-d);b-=b%d;if(-1===d||0>b)b=0;a._iDisplayStart=b}function Na(a,b){var c=a.renderer,d=n.ext.renderer[b];return h.isPlainObject(c)&&c[b]?d[c[b]]||d._:"string"===
+typeof c?d[c]||d._:d._}function y(a){return a.oFeatures.bServerSide?"ssp":a.ajax||a.sAjaxSource?"ajax":"dom"}function ia(a,b){var c=[],c=Kb.numbers_length,d=Math.floor(c/2);b<=c?c=Y(0,b):a<=d?(c=Y(0,c-2),c.push("ellipsis"),c.push(b-1)):(a>=b-1-d?c=Y(b-(c-2),b):(c=Y(a-d+2,a+d-1),c.push("ellipsis"),c.push(b-1)),c.splice(0,0,"ellipsis"),c.splice(0,0,0));c.DT_el="span";return c}function Da(a){h.each({num:function(b){return za(b,a)},"num-fmt":function(b){return za(b,a,Ya)},"html-num":function(b){return za(b,
+a,Aa)},"html-num-fmt":function(b){return za(b,a,Aa,Ya)}},function(b,c){x.type.order[b+a+"-pre"]=c;b.match(/^html\-/)&&(x.type.search[b+a]=x.type.search.html)})}function Lb(a){return function(){var b=[ya(this[n.ext.iApiIndex])].concat(Array.prototype.slice.call(arguments));return n.ext.internal[a].apply(this,b)}}var n=function(a){this.$=function(a,b){return this.api(!0).$(a,b)};this._=function(a,b){return this.api(!0).rows(a,b).data()};this.api=function(a){return a?new s(ya(this[x.iApiIndex])):new s(this)};
+this.fnAddData=function(a,b){var c=this.api(!0),d=h.isArray(a)&&(h.isArray(a[0])||h.isPlainObject(a[0]))?c.rows.add(a):c.row.add(a);(b===k||b)&&c.draw();return d.flatten().toArray()};this.fnAdjustColumnSizing=function(a){var b=this.api(!0).columns.adjust(),c=b.settings()[0],d=c.oScroll;a===k||a?b.draw(!1):(""!==d.sX||""!==d.sY)&&la(c)};this.fnClearTable=function(a){var b=this.api(!0).clear();(a===k||a)&&b.draw()};this.fnClose=function(a){this.api(!0).row(a).child.hide()};this.fnDeleteRow=function(a,
+b,c){var d=this.api(!0),a=d.rows(a),e=a.settings()[0],h=e.aoData[a[0][0]];a.remove();b&&b.call(this,e,h);(c===k||c)&&d.draw();return h};this.fnDestroy=function(a){this.api(!0).destroy(a)};this.fnDraw=function(a){this.api(!0).draw(a)};this.fnFilter=function(a,b,c,d,e,h){e=this.api(!0);null===b||b===k?e.search(a,c,d,h):e.column(b).search(a,c,d,h);e.draw()};this.fnGetData=function(a,b){var c=this.api(!0);if(a!==k){var d=a.nodeName?a.nodeName.toLowerCase():"";return b!==k||"td"==d||"th"==d?c.cell(a,b).data():
+c.row(a).data()||null}return c.data().toArray()};this.fnGetNodes=function(a){var b=this.api(!0);return a!==k?b.row(a).node():b.rows().nodes().flatten().toArray()};this.fnGetPosition=function(a){var b=this.api(!0),c=a.nodeName.toUpperCase();return"TR"==c?b.row(a).index():"TD"==c||"TH"==c?(a=b.cell(a).index(),[a.row,a.columnVisible,a.column]):null};this.fnIsOpen=function(a){return this.api(!0).row(a).child.isShown()};this.fnOpen=function(a,b,c){return this.api(!0).row(a).child(b,c).show().child()[0]};
+this.fnPageChange=function(a,b){var c=this.api(!0).page(a);(b===k||b)&&c.draw(!1)};this.fnSetColumnVis=function(a,b,c){a=this.api(!0).column(a).visible(b);(c===k||c)&&a.columns.adjust().draw()};this.fnSettings=function(){return ya(this[x.iApiIndex])};this.fnSort=function(a){this.api(!0).order(a).draw()};this.fnSortListener=function(a,b,c){this.api(!0).order.listener(a,b,c)};this.fnUpdate=function(a,b,c,d,e){var h=this.api(!0);c===k||null===c?h.row(b).data(a):h.cell(b,c).data(a);(e===k||e)&&h.columns.adjust();
+(d===k||d)&&h.draw();return 0};this.fnVersionCheck=x.fnVersionCheck;var b=this,c=a===k,d=this.length;c&&(a={});this.oApi=this.internal=x.internal;for(var e in n.ext.internal)e&&(this[e]=Lb(e));this.each(function(){var e={},g=1").appendTo(q));
+p.nTHead=b[0];b=q.children("tbody");b.length===0&&(b=h(" ").appendTo(q));p.nTBody=b[0];b=q.children("tfoot");if(b.length===0&&a.length>0&&(p.oScroll.sX!==""||p.oScroll.sY!==""))b=h(" ").appendTo(q);if(b.length===0||b.children().length===0)q.addClass(u.sNoFooter);else if(b.length>0){p.nTFoot=b[0];ea(p.aoFooter,p.nTFoot)}if(g.aaData)for(j=0;j/g,Zb=/^\d{2,4}[\.\/\-]\d{1,2}[\.\/\-]\d{1,2}([T ]{1}\d{1,2}[:\.]\d{2}([\.:]\d{2})?)?$/,$b=RegExp("(\\/|\\.|\\*|\\+|\\?|\\||\\(|\\)|\\[|\\]|\\{|\\}|\\\\|\\$|\\^|\\-)","g"),Ya=/[',$£€¥%\u2009\u202F\u20BD\u20a9\u20BArfkɃΞ]/gi,M=function(a){return!a||!0===a||"-"===a?!0:!1},Nb=function(a){var b=parseInt(a,10);return!isNaN(b)&&
+isFinite(a)?b:null},Ob=function(a,b){Za[b]||(Za[b]=RegExp(Qa(b),"g"));return"string"===typeof a&&"."!==b?a.replace(/\./g,"").replace(Za[b],"."):a},$a=function(a,b,c){var d="string"===typeof a;if(M(a))return!0;b&&d&&(a=Ob(a,b));c&&d&&(a=a.replace(Ya,""));return!isNaN(parseFloat(a))&&isFinite(a)},Pb=function(a,b,c){return M(a)?!0:!(M(a)||"string"===typeof a)?null:$a(a.replace(Aa,""),b,c)?!0:null},D=function(a,b,c){var d=[],e=0,f=a.length;if(c!==k)for(;ea.length)){b=a.slice().sort();for(var c=b[0],d=1,e=b.length;d")[0],Wb=va.textContent!==k,Yb=
+/<.*?>/g,Oa=n.util.throttle,Rb=[],w=Array.prototype,ac=function(a){var b,c,d=n.settings,e=h.map(d,function(a){return a.nTable});if(a){if(a.nTable&&a.oApi)return[a];if(a.nodeName&&"table"===a.nodeName.toLowerCase())return b=h.inArray(a,e),-1!==b?[d[b]]:null;if(a&&"function"===typeof a.settings)return a.settings().toArray();"string"===typeof a?c=h(a):a instanceof h&&(c=a)}else return[];if(c)return c.map(function(){b=h.inArray(this,e);return-1!==b?d[b]:null}).toArray()};s=function(a,b){if(!(this instanceof
+s))return new s(a,b);var c=[],d=function(a){(a=ac(a))&&(c=c.concat(a))};if(h.isArray(a))for(var e=0,f=a.length;ea?new s(b[a],this[a]):null},filter:function(a){var b=[];if(w.filter)b=w.filter.call(this,a,this);else for(var c=0,d=this.length;c ").addClass(b),h("td",c).addClass(b).html(a)[0].colSpan=V(d),e.push(c[0]))};f(a,b);c._details&&c._details.detach();c._details=h(e);
+c._detailsShow&&c._details.insertAfter(c.nTr)}return this});o(["row().child.show()","row().child().show()"],function(){Tb(this,!0);return this});o(["row().child.hide()","row().child().hide()"],function(){Tb(this,!1);return this});o(["row().child.remove()","row().child().remove()"],function(){db(this);return this});o("row().child.isShown()",function(){var a=this.context;return a.length&&this.length?a[0].aoData[this[0]]._detailsShow||!1:!1});var bc=/^([^:]+):(name|visIdx|visible)$/,Ub=function(a,b,
+c,d,e){for(var c=[],d=0,f=e.length;d=0?b:g.length+b];if(typeof a==="function"){var e=Ba(c,f);return h.map(g,function(b,f){return a(f,Ub(c,f,0,0,e),i[f])?f:null})}var k=typeof a==="string"?a.match(bc):
+"";if(k)switch(k[2]){case "visIdx":case "visible":b=parseInt(k[1],10);if(b<0){var n=h.map(g,function(a,b){return a.bVisible?b:null});return[n[n.length+b]]}return[aa(c,b)];case "name":return h.map(j,function(a,b){return a===k[1]?b:null});default:return[]}if(a.nodeName&&a._DT_CellIndex)return[a._DT_CellIndex.column];b=h(i).filter(a).map(function(){return h.inArray(this,i)}).toArray();if(b.length||!a.nodeName)return b;b=h(a).closest("*[data-dt-column]");return b.length?[b.data("dt-column")]:[]},c,f)},
+1);c.selector.cols=a;c.selector.opts=b;return c});u("columns().header()","column().header()",function(){return this.iterator("column",function(a,b){return a.aoColumns[b].nTh},1)});u("columns().footer()","column().footer()",function(){return this.iterator("column",function(a,b){return a.aoColumns[b].nTf},1)});u("columns().data()","column().data()",function(){return this.iterator("column-rows",Ub,1)});u("columns().dataSrc()","column().dataSrc()",function(){return this.iterator("column",function(a,b){return a.aoColumns[b].mData},
+1)});u("columns().cache()","column().cache()",function(a){return this.iterator("column-rows",function(b,c,d,e,f){return ja(b.aoData,f,"search"===a?"_aFilterData":"_aSortData",c)},1)});u("columns().nodes()","column().nodes()",function(){return this.iterator("column-rows",function(a,b,c,d,e){return ja(a.aoData,e,"anCells",b)},1)});u("columns().visible()","column().visible()",function(a,b){var c=this.iterator("column",function(b,c){if(a===k)return b.aoColumns[c].bVisible;var f=b.aoColumns,g=f[c],j=b.aoData,
+i,m,l;if(a!==k&&g.bVisible!==a){if(a){var n=h.inArray(!0,D(f,"bVisible"),c+1);i=0;for(m=j.length;id;return!0};n.isDataTable=
+n.fnIsDataTable=function(a){var b=h(a).get(0),c=!1;if(a instanceof n.Api)return!0;h.each(n.settings,function(a,e){var f=e.nScrollHead?h("table",e.nScrollHead)[0]:null,g=e.nScrollFoot?h("table",e.nScrollFoot)[0]:null;if(e.nTable===b||f===b||g===b)c=!0});return c};n.tables=n.fnTables=function(a){var b=!1;h.isPlainObject(a)&&(b=a.api,a=a.visible);var c=h.map(n.settings,function(b){if(!a||a&&h(b.nTable).is(":visible"))return b.nTable});return b?new s(c):c};n.camelToHungarian=J;o("$()",function(a,b){var c=
+this.rows(b).nodes(),c=h(c);return h([].concat(c.filter(a).toArray(),c.find(a).toArray()))});h.each(["on","one","off"],function(a,b){o(b+"()",function(){var a=Array.prototype.slice.call(arguments);a[0]=h.map(a[0].split(/\s/),function(a){return!a.match(/\.dt\b/)?a+".dt":a}).join(" ");var d=h(this.tables().nodes());d[b].apply(d,a);return this})});o("clear()",function(){return this.iterator("table",function(a){oa(a)})});o("settings()",function(){return new s(this.context,this.context)});o("init()",function(){var a=
+this.context;return a.length?a[0].oInit:null});o("data()",function(){return this.iterator("table",function(a){return D(a.aoData,"_aData")}).flatten()});o("destroy()",function(a){a=a||!1;return this.iterator("table",function(b){var c=b.nTableWrapper.parentNode,d=b.oClasses,e=b.nTable,f=b.nTBody,g=b.nTHead,j=b.nTFoot,i=h(e),f=h(f),k=h(b.nTableWrapper),l=h.map(b.aoData,function(a){return a.nTr}),o;b.bDestroying=!0;r(b,"aoDestroyCallback","destroy",[b]);a||(new s(b)).columns().visible(!0);k.off(".DT").find(":not(tbody *)").off(".DT");
+h(E).off(".DT-"+b.sInstance);e!=g.parentNode&&(i.children("thead").detach(),i.append(g));j&&e!=j.parentNode&&(i.children("tfoot").detach(),i.append(j));b.aaSorting=[];b.aaSortingFixed=[];wa(b);h(l).removeClass(b.asStripeClasses.join(" "));h("th, td",g).removeClass(d.sSortable+" "+d.sSortableAsc+" "+d.sSortableDesc+" "+d.sSortableNone);f.children().detach();f.append(l);g=a?"remove":"detach";i[g]();k[g]();!a&&c&&(c.insertBefore(e,b.nTableReinsertBefore),i.css("width",b.sDestroyWidth).removeClass(d.sTable),
+(o=b.asDestroyStripes.length)&&f.children().each(function(a){h(this).addClass(b.asDestroyStripes[a%o])}));c=h.inArray(b,n.settings);-1!==c&&n.settings.splice(c,1)})});h.each(["column","row","cell"],function(a,b){o(b+"s().every()",function(a){var d=this.selector.opts,e=this;return this.iterator(b,function(f,g,h,i,m){a.call(e[b](g,"cell"===b?h:d,"cell"===b?d:k),g,h,i,m)})})});o("i18n()",function(a,b,c){var d=this.context[0],a=S(a)(d.oLanguage);a===k&&(a=b);c!==k&&h.isPlainObject(a)&&(a=a[c]!==k?a[c]:
+a._);return a.replace("%d",c)});n.version="1.10.18";n.settings=[];n.models={};n.models.oSearch={bCaseInsensitive:!0,sSearch:"",bRegex:!1,bSmart:!0};n.models.oRow={nTr:null,anCells:null,_aData:[],_aSortData:null,_aFilterData:null,_sFilterRow:null,_sRowStripe:"",src:null,idx:-1};n.models.oColumn={idx:null,aDataSort:null,asSorting:null,bSearchable:null,bSortable:null,bVisible:null,_sManualType:null,_bAttrSrc:!1,fnCreatedCell:null,fnGetData:null,fnSetData:null,mData:null,mRender:null,nTh:null,nTf:null,
+sClass:null,sContentPadding:null,sDefaultContent:null,sName:null,sSortDataType:"std",sSortingClass:null,sSortingClassJUI:null,sTitle:null,sType:null,sWidth:null,sWidthOrig:null};n.defaults={aaData:null,aaSorting:[[0,"asc"]],aaSortingFixed:[],ajax:null,aLengthMenu:[10,25,50,100],aoColumns:null,aoColumnDefs:null,aoSearchCols:[],asStripeClasses:null,bAutoWidth:!0,bDeferRender:!1,bDestroy:!1,bFilter:!0,bInfo:!0,bLengthChange:!0,bPaginate:!0,bProcessing:!1,bRetrieve:!1,bScrollCollapse:!1,bServerSide:!1,
+bSort:!0,bSortMulti:!0,bSortCellsTop:!1,bSortClasses:!0,bStateSave:!1,fnCreatedRow:null,fnDrawCallback:null,fnFooterCallback:null,fnFormatNumber:function(a){return a.toString().replace(/\B(?=(\d{3})+(?!\d))/g,this.oLanguage.sThousands)},fnHeaderCallback:null,fnInfoCallback:null,fnInitComplete:null,fnPreDrawCallback:null,fnRowCallback:null,fnServerData:null,fnServerParams:null,fnStateLoadCallback:function(a){try{return JSON.parse((-1===a.iStateDuration?sessionStorage:localStorage).getItem("DataTables_"+
+a.sInstance+"_"+location.pathname))}catch(b){}},fnStateLoadParams:null,fnStateLoaded:null,fnStateSaveCallback:function(a,b){try{(-1===a.iStateDuration?sessionStorage:localStorage).setItem("DataTables_"+a.sInstance+"_"+location.pathname,JSON.stringify(b))}catch(c){}},fnStateSaveParams:null,iStateDuration:7200,iDeferLoading:null,iDisplayLength:10,iDisplayStart:0,iTabIndex:0,oClasses:{},oLanguage:{oAria:{sSortAscending:": activate to sort column ascending",sSortDescending:": activate to sort column descending"},
+oPaginate:{sFirst:"First",sLast:"Last",sNext:"Next",sPrevious:"Previous"},sEmptyTable:"No data available in table",sInfo:"Showing _START_ to _END_ of _TOTAL_ entries",sInfoEmpty:"Showing 0 to 0 of 0 entries",sInfoFiltered:"(filtered from _MAX_ total entries)",sInfoPostFix:"",sDecimal:"",sThousands:",",sLengthMenu:"Show _MENU_ entries",sLoadingRecords:"Loading...",sProcessing:"Processing...",sSearch:"Search:",sSearchPlaceholder:"",sUrl:"",sZeroRecords:"No matching records found"},oSearch:h.extend({},
+n.models.oSearch),sAjaxDataProp:"data",sAjaxSource:null,sDom:"lfrtip",searchDelay:null,sPaginationType:"simple_numbers",sScrollX:"",sScrollXInner:"",sScrollY:"",sServerMethod:"GET",renderer:null,rowId:"DT_RowId"};Z(n.defaults);n.defaults.column={aDataSort:null,iDataSort:-1,asSorting:["asc","desc"],bSearchable:!0,bSortable:!0,bVisible:!0,fnCreatedCell:null,mData:null,mRender:null,sCellType:"td",sClass:"",sContentPadding:"",sDefaultContent:null,sName:"",sSortDataType:"std",sTitle:null,sType:null,sWidth:null};
+Z(n.defaults.column);n.models.oSettings={oFeatures:{bAutoWidth:null,bDeferRender:null,bFilter:null,bInfo:null,bLengthChange:null,bPaginate:null,bProcessing:null,bServerSide:null,bSort:null,bSortMulti:null,bSortClasses:null,bStateSave:null},oScroll:{bCollapse:null,iBarWidth:0,sX:null,sXInner:null,sY:null},oLanguage:{fnInfoCallback:null},oBrowser:{bScrollOversize:!1,bScrollbarLeft:!1,bBounding:!1,barWidth:0},ajax:null,aanFeatures:[],aoData:[],aiDisplay:[],aiDisplayMaster:[],aIds:{},aoColumns:[],aoHeader:[],
+aoFooter:[],oPreviousSearch:{},aoPreSearchCols:[],aaSorting:null,aaSortingFixed:[],asStripeClasses:null,asDestroyStripes:[],sDestroyWidth:0,aoRowCallback:[],aoHeaderCallback:[],aoFooterCallback:[],aoDrawCallback:[],aoRowCreatedCallback:[],aoPreDrawCallback:[],aoInitComplete:[],aoStateSaveParams:[],aoStateLoadParams:[],aoStateLoaded:[],sTableId:"",nTable:null,nTHead:null,nTFoot:null,nTBody:null,nTableWrapper:null,bDeferLoading:!1,bInitialised:!1,aoOpenRows:[],sDom:null,searchDelay:null,sPaginationType:"two_button",
+iStateDuration:0,aoStateSave:[],aoStateLoad:[],oSavedState:null,oLoadedState:null,sAjaxSource:null,sAjaxDataProp:null,bAjaxDataGet:!0,jqXHR:null,json:k,oAjaxData:k,fnServerData:null,aoServerParams:[],sServerMethod:null,fnFormatNumber:null,aLengthMenu:null,iDraw:0,bDrawing:!1,iDrawError:-1,_iDisplayLength:10,_iDisplayStart:0,_iRecordsTotal:0,_iRecordsDisplay:0,oClasses:{},bFiltered:!1,bSorted:!1,bSortCellsTop:null,oInit:null,aoDestroyCallback:[],fnRecordsTotal:function(){return"ssp"==y(this)?1*this._iRecordsTotal:
+this.aiDisplayMaster.length},fnRecordsDisplay:function(){return"ssp"==y(this)?1*this._iRecordsDisplay:this.aiDisplay.length},fnDisplayEnd:function(){var a=this._iDisplayLength,b=this._iDisplayStart,c=b+a,d=this.aiDisplay.length,e=this.oFeatures,f=e.bPaginate;return e.bServerSide?!1===f||-1===a?b+d:Math.min(b+a,this._iRecordsDisplay):!f||c>d||-1===a?d:c},oInstance:null,sInstance:null,iTabIndex:0,nScrollHead:null,nScrollFoot:null,aLastSort:[],oPlugins:{},rowIdFn:null,rowId:null};n.ext=x={buttons:{},
+classes:{},build:"dt/dt-1.10.18",errMode:"alert",feature:[],search:[],selector:{cell:[],column:[],row:[]},internal:{},legacy:{ajax:null},pager:{},renderer:{pageButton:{},header:{}},order:{},type:{detect:[],search:{},order:{}},_unique:0,fnVersionCheck:n.fnVersionCheck,iApiIndex:0,oJUIClasses:{},sVersion:n.version};h.extend(x,{afnFiltering:x.search,aTypes:x.type.detect,ofnSearch:x.type.search,oSort:x.type.order,afnSortData:x.order,aoFeatures:x.feature,oApi:x.internal,oStdClasses:x.classes,oPagination:x.pager});
+h.extend(n.ext.classes,{sTable:"dataTable",sNoFooter:"no-footer",sPageButton:"paginate_button",sPageButtonActive:"current",sPageButtonDisabled:"disabled",sStripeOdd:"odd",sStripeEven:"even",sRowEmpty:"dataTables_empty",sWrapper:"dataTables_wrapper",sFilter:"dataTables_filter",sInfo:"dataTables_info",sPaging:"dataTables_paginate paging_",sLength:"dataTables_length",sProcessing:"dataTables_processing",sSortAsc:"sorting_asc",sSortDesc:"sorting_desc",sSortable:"sorting",sSortableAsc:"sorting_asc_disabled",
+sSortableDesc:"sorting_desc_disabled",sSortableNone:"sorting_disabled",sSortColumn:"sorting_",sFilterInput:"",sLengthSelect:"",sScrollWrapper:"dataTables_scroll",sScrollHead:"dataTables_scrollHead",sScrollHeadInner:"dataTables_scrollHeadInner",sScrollBody:"dataTables_scrollBody",sScrollFoot:"dataTables_scrollFoot",sScrollFootInner:"dataTables_scrollFootInner",sHeaderTH:"",sFooterTH:"",sSortJUIAsc:"",sSortJUIDesc:"",sSortJUI:"",sSortJUIAscAllowed:"",sSortJUIDescAllowed:"",sSortJUIWrapper:"",sSortIcon:"",
+sJUIHeader:"",sJUIFooter:""});var Kb=n.ext.pager;h.extend(Kb,{simple:function(){return["previous","next"]},full:function(){return["first","previous","next","last"]},numbers:function(a,b){return[ia(a,b)]},simple_numbers:function(a,b){return["previous",ia(a,b),"next"]},full_numbers:function(a,b){return["first","previous",ia(a,b),"next","last"]},first_last_numbers:function(a,b){return["first",ia(a,b),"last"]},_numbers:ia,numbers_length:7});h.extend(!0,n.ext.renderer,{pageButton:{_:function(a,b,c,d,e,
+f){var g=a.oClasses,j=a.oLanguage.oPaginate,i=a.oLanguage.oAria.paginate||{},m,l,n=0,o=function(b,d){var k,s,u,r,v=function(b){Ta(a,b.data.action,true)};k=0;for(s=d.length;k ").appendTo(b);o(u,r)}else{m=null;l="";switch(r){case "ellipsis":b.append('… ');break;case "first":m=j.sFirst;l=r+(e>0?"":" "+g.sPageButtonDisabled);break;case "previous":m=j.sPrevious;l=r+(e>0?"":" "+g.sPageButtonDisabled);break;case "next":m=
+j.sNext;l=r+(e",{"class":g.sPageButton+" "+l,"aria-controls":a.sTableId,"aria-label":i[r],"data-dt-idx":n,tabindex:a.iTabIndex,id:c===0&&typeof r==="string"?a.sTableId+"_"+r:null}).html(m).appendTo(b);Wa(u,{action:r},v);n++}}}},s;try{s=h(b).find(H.activeElement).data("dt-idx")}catch(u){}o(h(b).empty(),d);s!==k&&h(b).find("[data-dt-idx="+
+s+"]").focus()}}});h.extend(n.ext.type.detect,[function(a,b){var c=b.oLanguage.sDecimal;return $a(a,c)?"num"+c:null},function(a){if(a&&!(a instanceof Date)&&!Zb.test(a))return null;var b=Date.parse(a);return null!==b&&!isNaN(b)||M(a)?"date":null},function(a,b){var c=b.oLanguage.sDecimal;return $a(a,c,!0)?"num-fmt"+c:null},function(a,b){var c=b.oLanguage.sDecimal;return Pb(a,c)?"html-num"+c:null},function(a,b){var c=b.oLanguage.sDecimal;return Pb(a,c,!0)?"html-num-fmt"+c:null},function(a){return M(a)||
+"string"===typeof a&&-1!==a.indexOf("<")?"html":null}]);h.extend(n.ext.type.search,{html:function(a){return M(a)?a:"string"===typeof a?a.replace(Mb," ").replace(Aa,""):""},string:function(a){return M(a)?a:"string"===typeof a?a.replace(Mb," "):a}});var za=function(a,b,c,d){if(0!==a&&(!a||"-"===a))return-Infinity;b&&(a=Ob(a,b));a.replace&&(c&&(a=a.replace(c,"")),d&&(a=a.replace(d,"")));return 1*a};h.extend(x.type.order,{"date-pre":function(a){a=Date.parse(a);return isNaN(a)?-Infinity:a},"html-pre":function(a){return M(a)?
+"":a.replace?a.replace(/<.*?>/g,"").toLowerCase():a+""},"string-pre":function(a){return M(a)?"":"string"===typeof a?a.toLowerCase():!a.toString?"":a.toString()},"string-asc":function(a,b){return ab?1:0},"string-desc":function(a,b){return ab?-1:0}});Da("");h.extend(!0,n.ext.renderer,{header:{_:function(a,b,c,d){h(a.nTable).on("order.dt.DT",function(e,f,g,h){if(a===f){e=c.idx;b.removeClass(c.sSortingClass+" "+d.sSortAsc+" "+d.sSortDesc).addClass(h[e]=="asc"?d.sSortAsc:h[e]=="desc"?d.sSortDesc:
+c.sSortingClass)}})},jqueryui:function(a,b,c,d){h("
").addClass(d.sSortJUIWrapper).append(b.contents()).append(h(" ").addClass(d.sSortIcon+" "+c.sSortingClassJUI)).appendTo(b);h(a.nTable).on("order.dt.DT",function(e,f,g,h){if(a===f){e=c.idx;b.removeClass(d.sSortAsc+" "+d.sSortDesc).addClass(h[e]=="asc"?d.sSortAsc:h[e]=="desc"?d.sSortDesc:c.sSortingClass);b.find("span."+d.sSortIcon).removeClass(d.sSortJUIAsc+" "+d.sSortJUIDesc+" "+d.sSortJUI+" "+d.sSortJUIAscAllowed+" "+d.sSortJUIDescAllowed).addClass(h[e]==
+"asc"?d.sSortJUIAsc:h[e]=="desc"?d.sSortJUIDesc:c.sSortingClassJUI)}})}}});var Vb=function(a){return"string"===typeof a?a.replace(/ /g,">").replace(/"/g,"""):a};n.render={number:function(a,b,c,d,e){return{display:function(f){if("number"!==typeof f&&"string"!==typeof f)return f;var g=0>f?"-":"",h=parseFloat(f);if(isNaN(h))return Vb(f);h=h.toFixed(c);f=Math.abs(h);h=parseInt(f,10);f=c?b+(f-h).toFixed(c).substring(2):"";return g+(d||"")+h.toString().replace(/\B(?=(\d{3})+(?!\d))/g,
+a)+f+(e||"")}}},text:function(){return{display:Vb}}};h.extend(n.ext.internal,{_fnExternApiFunc:Lb,_fnBuildAjax:sa,_fnAjaxUpdate:lb,_fnAjaxParameters:ub,_fnAjaxUpdateDraw:vb,_fnAjaxDataSrc:ta,_fnAddColumn:Ea,_fnColumnOptions:ka,_fnAdjustColumnSizing:$,_fnVisibleToColumnIndex:aa,_fnColumnIndexToVisible:ba,_fnVisbleColumns:V,_fnGetColumns:ma,_fnColumnTypes:Ga,_fnApplyColumnDefs:ib,_fnHungarianMap:Z,_fnCamelToHungarian:J,_fnLanguageCompat:Ca,_fnBrowserDetect:gb,_fnAddData:O,_fnAddTr:na,_fnNodeToDataIndex:function(a,
+b){return b._DT_RowIndex!==k?b._DT_RowIndex:null},_fnNodeToColumnIndex:function(a,b,c){return h.inArray(c,a.aoData[b].anCells)},_fnGetCellData:B,_fnSetCellData:jb,_fnSplitObjNotation:Ja,_fnGetObjectDataFn:S,_fnSetObjectDataFn:N,_fnGetDataMaster:Ka,_fnClearTable:oa,_fnDeleteIndex:pa,_fnInvalidate:da,_fnGetRowElements:Ia,_fnCreateTr:Ha,_fnBuildHead:kb,_fnDrawHead:fa,_fnDraw:P,_fnReDraw:T,_fnAddOptionsHtml:nb,_fnDetectHeader:ea,_fnGetUniqueThs:ra,_fnFeatureHtmlFilter:pb,_fnFilterComplete:ga,_fnFilterCustom:yb,
+_fnFilterColumn:xb,_fnFilter:wb,_fnFilterCreateSearch:Pa,_fnEscapeRegex:Qa,_fnFilterData:zb,_fnFeatureHtmlInfo:sb,_fnUpdateInfo:Cb,_fnInfoMacros:Db,_fnInitialise:ha,_fnInitComplete:ua,_fnLengthChange:Ra,_fnFeatureHtmlLength:ob,_fnFeatureHtmlPaginate:tb,_fnPageChange:Ta,_fnFeatureHtmlProcessing:qb,_fnProcessingDisplay:C,_fnFeatureHtmlTable:rb,_fnScrollDraw:la,_fnApplyToChildren:I,_fnCalculateColumnWidths:Fa,_fnThrottle:Oa,_fnConvertToWidth:Eb,_fnGetWidestNode:Fb,_fnGetMaxLenString:Gb,_fnStringToCss:v,
+_fnSortFlatten:X,_fnSort:mb,_fnSortAria:Ib,_fnSortListener:Va,_fnSortAttachListener:Ma,_fnSortingClasses:wa,_fnSortData:Hb,_fnSaveState:xa,_fnLoadState:Jb,_fnSettingsFromNode:ya,_fnLog:K,_fnMap:F,_fnBindAction:Wa,_fnCallbackReg:z,_fnCallbackFire:r,_fnLengthOverflow:Sa,_fnRenderer:Na,_fnDataSource:y,_fnRowAttributes:La,_fnExtend:Xa,_fnCalculateEnd:function(){}});h.fn.dataTable=n;n.$=h;h.fn.dataTableSettings=n.settings;h.fn.dataTableExt=n.ext;h.fn.DataTable=function(a){return h(this).dataTable(a).api()};
+h.each(n,function(a,b){h.fn.DataTable[a]=b});return h.fn.dataTable});
+
+
diff --git a/public_html/js/dhtmlxchart.css b/public_html/js/dhtmlxchart.css
new file mode 100644
index 0000000..45d58aa
--- /dev/null
+++ b/public_html/js/dhtmlxchart.css
@@ -0,0 +1,6 @@
+/*
+Copyright DHTMLX LTD. http://www.dhtmlx.com
+You allowed to use this component or parts of it under GPL terms
+To use it on other terms or get Professional edition of the component please contact us at sales@dhtmlx.com
+*/
+.dhx_tooltip{display:none;position:absolute;font-family:Tahoma;font-size:8pt;z-index:10000;background-color:white;padding:2px 2px 2px 2px;border:1px solid #A4BED4;}.dhx_chart{position:relative;font-family:Tahoma;font-size:13px;color:#000;overflow:hidden;}.dhx_canvas_text{position:absolute;text-align:center;overflow:hidden;white-space:nowrap;}.dhx_map_img{width:100%;height:100%;position:absolute;top:0;left:0;border:0;filter:alpha(opacity=0);}.dhx_axis_item_y{position:absolute;height:18px;line-height:18px;margin-top:-4px;text-align:right;}.dhx_axis_title_x{text-align:center;}.dhx_axis_title_y{text-align:center;font-family:Tahoma;-webkit-transform:rotate(-90deg);-moz-transform:rotate(-90deg);-o-transform:rotate(-90deg);-ms-transform:rotate(-90deg);transform:rotate(-90deg);height:18px;line-height:18px;}.dhx_ie_filter{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=3);zoom:1;font-family:serif;}.dhx_chart_legend{position:absolute;}.dhx_chart_legend_item{height:18px;line-height:18px;padding:2px;}.dhx_axis_item_y.dhx_radar{color:#666;font-size:11px;padding-right:3px;height:13px;line-height:13px;margin-top:0;}.dhx_canvas_text.dhx_axis_radar_title{margin-top:0;padding-top:0;}.dhx_axis_item_y,.dhx_axis_item_x{color:#666;}
\ No newline at end of file
diff --git a/public_html/js/dhtmlxchart.js b/public_html/js/dhtmlxchart.js
new file mode 100644
index 0000000..e938aef
--- /dev/null
+++ b/public_html/js/dhtmlxchart.js
@@ -0,0 +1,131 @@
+/*
+Copyright DHTMLX LTD. http://www.dhtmlx.com
+You allowed to use this component or parts of it under GPL terms
+To use it on other terms or get Professional edition of the component please contact us at sales@dhtmlx.com
+*/
+window.dhtmlx||(dhtmlx={});dhtmlx.version="3.0";dhtmlx.codebase="./";dhtmlx.extend=function(a,b){for(var c in b)a[c]=b[c];b.k&&a.k();return a};
+dhtmlx.proto_extend=function(){for(var a=arguments,b=a[0],c=[],d=a.length-1;d>0;d--){if(typeof a[d]=="function")a[d]=a[d].prototype;for(var e in a[d])if(e=="_init")c.push(a[d][e]);else b[e]||(b[e]=a[d][e])}a[0].k&&c.push(a[0].k);b.k=function(){for(var g=0;g=0)this.splice(a,b||1)},remove:function(a){this.removeAt(this.find(a))},insertAt:function(a,b){if(!b&&b!==0)this.push(a);else{var c=this.splice(b,this.length-b);this[b]=a;this.push.apply(this,c)}},find:function(a){for(i=0;i0;){str=this.fb[a%16]+str;a=Math.floor(a/16)}for(;str.length")},addSector:function(a,b,c,d,e,f,g){var i=[];i.push(d);i.push(Math.floor(e*g));for(var j=b;j"+this.s.join("\n")+" ";a.v=b;this.s=[]}};
+dhtmlx.chart={};
+dhtmlx.chart.area={pvt_render_area:function(a,b,c,d,e,f){var g=this.C(a,b,c,d,e),i=Math.floor(g.cellWidth/2);if(b.length){a.globalAlpha=this.e.alpha.call(this,b[0]);a.fillStyle=this.e.color.call(this,b[0]);var j=this.p(b[0],c,d,g),k=this.e.offset?c.x+g.cellWidth*0.5:c.x;a.beginPath();a.moveTo(k,d.y);a.lineTo(k,j);f.addRect(b[0].id,[k-i,j-i,k+i,j+i]);this.e.yAxis||this.renderTextAt(false,!this.e.offset?false:true,k,j-this.e.labelOffset,this.e.label(b[0]));for(var h=1;h=0;l--){n=h+Math.floor(g.cellWidth*l)-0.5;var s=b[l].$startY;a.lineTo(n,s)}else a.lineTo(h+Math.floor(g.cellWidth*(length-1))-0.5,k);a.lineTo(h,k);a.fill();for(l=0;l=1;h--)e[h]=(d[h]-
+b[h]*e[h+1])/c[h];f=[];g=[];i=[];j=[];for(h=0;hn)q=n/this.h.length-4;var v=Math.floor((n-q*this.h.length)/2),p=typeof this.e.radius!="undefined"?parseInt(this.e.radius,
+10):Math.round(q/5),u=false,r=this.e.gradient;if(r&&typeof r!="function"){u=r;r=false}else if(r){r=a.createLinearGradient(c.x,c.y,d.x,c.y);this.e.gradient(r)}m||this.i(a,c.x-0.5,c.y,c.x-0.5,d.y,"#000000",1);for(d=0;dg)w=g;w-=i;w*=j;var x=c.x,y=c.y+v+d*n+(q+1)*e;if(w<0||this.e.yAxis&&w===0)this.renderTextAt("middle",true,x+10,y+q/2+v,this.e.label(b[d]));else{m||(w+=t/s);var B=r||this.e.color.call(this,b[d]);if(this.e.border){a.beginPath();a.fillStyle=
+B;this.o(a,x,y,q,p,s,w,0);a.lineTo(x,0);a.fill();a.fillStyle="#000000";a.globalAlpha=0.37;a.beginPath();this.o(a,x,y,q,p,s,w,0);a.fill()}a.globalAlpha=this.e.alpha.call(this,b[d]);a.fillStyle=r||this.e.color.call(this,b[d]);a.beginPath();var z=this.o(a,x,y,q,p,s,w,this.e.border?1:0);if(r&&!u)a.lineTo(c.x+h,y+(this.e.border?1:0));a.fill();a.globalAlpha=1;if(u!=false){var A=this.G(a,c.x,y+q,c.x+s*w+2,y,u,B,"x");a.fillStyle=A.gradient;a.beginPath();z=this.o(a,x,y+A.offset,q-A.offset*2,p,s,w,A.offset);
+a.fill();a.globalAlpha=1}this.renderTextAt("middle",false,z[0]+3,parseInt(y+(z[1]-y)/2,10),this.e.label(b[d]));f.addRect(b[d].id,[x,y,z[0],z[1]],e)}}},o:function(a,b,c,d,e,f,g,i){var j=0;if(e>f*g){var k=(e-f*g)/e;j=-Math.asin(k)+Math.PI/2}a.moveTo(b,c+i);var h=b+f*g-e-(e?0:i);el)k=l-4;var s=Math.floor((l-k)/2),t=0,q=false,v=this.e.gradient;q=false;if(v=this.e.gradient)q=true;m||this.i(a,c.x-0.5,c.y,
+c.x-0.5,d.y,"#000000",1);for(d=0;dg)p=g;p-=i;p*=j;var u=c.x,r=c.y+s+d*l;if(e)u=b[d].$startX;if(p<0||this.e.yAxis&&p===0)this.renderTextAt("middle",true,u+10,r+k/2,this.e.label(b[d]));else{m||(p+=o/n);var w=this.e.color.call(this,b[d]);if(this.e.border){a.beginPath();a.fillStyle=w;this.o(a,u,r,k,t,n,p,0);a.lineTo(u,0);a.fill();a.fillStyle="#000000";a.globalAlpha=0.37;a.beginPath();this.o(a,u,r,k,t,n,p,0);a.fill()}a.globalAlpha=
+1;a.globalAlpha=this.e.alpha.call(this,b[d]);a.fillStyle=this.e.color.call(this,b[d]);a.beginPath();var x=this.o(a,u,r,k,t,n,p,this.e.border?1:0);if(v&&!q)a.lineTo(c.x+h,r+(this.e.border?1:0));a.fill();if(q!=false){w=this.G(a,u,r+k,u,r,q,w,"x");a.fillStyle=w.gradient;a.beginPath();x=this.o(a,u,r,k,t,n,p,0);a.fill();a.globalAlpha=1}this.renderTextAt("middle",true,b[d].$startX+(x[0]-b[d].$startX)/2-1,r+(x[1]-r)/2,this.e.label(b[d]));f.addRect(b[d].id,[b[d].$startX,r,x[0],x[1]],e);b[d].$startX=x[0]}}}};
+dhtmlx.chart.stackedBar={pvt_render_stackedBar:function(a,b,c,d,e,f){var g,i,j,k=d.y-c.y;j=!!this.e.yAxis;var h=!!this.e.xAxis;i=this.Q(b);g=i.max;i=i.min;var m=Math.floor((d.x-c.x)/b.length);e||this.N(a,b,c,d,i,g,m);if(j){g=parseFloat(this.e.yAxis.end);i=parseFloat(this.e.yAxis.start)}g=this.z(i,g);j=g[0];g=g[1];j=j?k/j:10;var l=parseInt(this.e.width,10);if(l+4>m)l=m-4;var n=Math.floor((m-l)/2),o=this.e.gradient?this.e.gradient:false;h||this.i(a,c.x,d.y+0.5,d.x,d.y+0.5,"#000000",1);for(h=0;hf)d=b.y;if(a10?f.unit:10;f.unit=
+a?(f.totalHeight-f.startValue)/a:10}return f}};
+dhtmlx.chart.bar={pvt_render_bar:function(a,b,c,d,e,f){var g,i,j,k,h=d.y-c.y,m=!!this.e.yAxis,l=!!this.e.xAxis;i=this.O();g=i.max;i=i.min;var n=Math.floor((d.x-c.x)/b.length);!e&&!(this.e.origin!="auto"&&!m)&&this.N(a,b,c,d,i,g,n);if(m){g=parseFloat(this.e.yAxis.end);i=parseFloat(this.e.yAxis.start)}j=this.z(i,g);k=j[0];j=j[1];var o=k?h/k:k;if(!m&&!(this.e.origin!="auto"&&l)){var s=10;o=k?(h-s)/k:s}!e&&this.e.origin!="auto"&&!m&&this.e.origin>i&&this.da(a,b,c,d,n,d.y-o*(this.e.origin-i));h=parseInt(this.e.width,
+10);if(this.h&&h*this.h.length+4>n)h=n/this.h.length-4;k=Math.floor((n-h*this.h.length)/2);var t=typeof this.e.radius!="undefined"?parseInt(this.e.radius,10):Math.round(h/5),q=false,v=this.e.gradient;if(v&&typeof v!="function"){q=v;v=false}else if(v){v=a.createLinearGradient(0,d.y,0,c.y);this.e.gradient(v)}l||this.i(a,c.x,d.y+0.5,d.x,d.y+0.5,"#000000",1);for(var p=0;pg)u=g;u-=i;u*=j;var r=c.x+k+p*n+(h+1)*e,w=d.y;if(u<0||this.e.yAxis&&u===0&&
+!(this.e.origin!="auto"&&this.e.origin>i))this.renderTextAt(true,true,r+Math.floor(h/2),w,this.e.label(b[p]));else{if(!m&&!(this.e.origin!="auto"&&l))u+=s/o;var x=v||this.e.color.call(this,b[p]);this.e.border&&this.va(a,r,w,h,i,t,o,u,x);a.globalAlpha=this.e.alpha.call(this,b[p]);var y=this.ua(a,c,r,w,h,i,t,o,u,x,v,q);a.globalAlpha=1;q&&this.wa(a,r,w,h,i,t,o,u,x,q);y[0]!=r?this.renderTextAt(false,true,r+Math.floor(h/2),y[1],this.e.label(b[p])):this.renderTextAt(true,true,r+Math.floor(h/2),y[3],this.e.label(b[p]));
+f.addRect(b[p].id,[r,y[3],y[2],y[1]],e)}}},K:function(a,b,c,d,e,f,g){var i=this.e.xAxis,j=c;if(i&&this.e.origin!="auto"&&this.e.origin>g){c-=(this.e.origin-g)*e;j=c;d-=this.e.origin-g;if(d<0){d*=-1;a.translate(b+f,c);a.rotate(Math.PI);c=b=0}c-=0.5}return{value:d,x0:b,y0:c,start:j}},ua:function(a,b,c,d,e,f,g,i,j,k,h,m){a.save();a.fillStyle=k;var l=this.K(a,c,d,j,i,e,f);e=this.H(a,l.x0,l.y0,e,g,i,l.value,this.e.border?1:0);if(h&&!m)a.lineTo(l.x0+(this.e.border?1:0),b.y);a.fill();a.restore();a=l.x0;
+b=l.x0!=c?c+e[0]:e[0];d=l.x0!=c?l.start-e[1]:d;c=l.x0!=c?l.start:e[1];return[a,d,b,c]},va:function(a,b,c,d,e,f,g,i,j){a.save();b=this.K(a,b,c,i,g,d,e);a.fillStyle=j;this.H(a,b.x0,b.y0,d,f,g,b.value,0);a.lineTo(b.x0,0);a.fill();a.fillStyle="#000000";a.globalAlpha=0.37;this.H(a,b.x0,b.y0,d,f,g,b.value,0);a.fill();a.restore()},wa:function(a,b,c,d,e,f,g,i,j,k){a.save();b=this.K(a,b,c,i,g,d,e);j=this.G(a,b.x0,b.y0,b.x0+d,b.y0-g*b.value+2,k,j,"y");a.fillStyle=j.gradient;this.H(a,b.x0+j.offset,b.y0,d-j.offset*
+2,f,g,b.value,j.offset);a.fill();a.restore()},H:function(a,b,c,d,e,f,g,i){a.beginPath();var j=0;if(e>f*g){var k=(e-f*g)/e;j=-Math.acos(k)+Math.PI/2}a.moveTo(b+i,c);var h=c-Math.floor(f*g)+e+(e?0:i);e=0||d>=0&&e<=Math.PI||d<=Math.PI&&e>=Math.PI){if(d<=0&&e>=0){d=0;g=false;this.ca(a,b,c,f,d,e)}if(d<=Math.PI&&e>=Math.PI){e=Math.PI;g=false;this.ca(a,b,c,f,d,e)}var i=
+(this.e.height||Math.floor(f/4))/this.e.cant;a.beginPath();a.arc(b,c,f,d,e,false);a.lineTo(b+f*Math.cos(e),c+f*Math.sin(e)+i);a.arc(b,c+i,f,e,d,true);a.lineTo(b+f*Math.cos(d),c+f*Math.sin(d));a.fill();g&&a.stroke()}},ca:function(a,b,c,d,e,f){a.beginPath();a.arc(b,c,d,e,f,false);a.stroke()},sa:function(a,b,c,d){for(var e=["#676767","#7b7b7b","#a0a0a0","#bcbcbc","#d1d1d1","#d6d6d6"],f=e.length-1;f>-1;f--){a.beginPath();a.fillStyle=e[f];a.arc(b+2,c+2,d+f,0,Math.PI*2,true);a.fill()}},Fa:function(a){a.addColorStop(0,
+"#ffffff");a.addColorStop(0.7,"#7a7a7a");a.addColorStop(1,"#000000");return a},bb:function(a,b,c,d,e,f){a.globalAlpha=0.3;a.beginPath();var g;if(typeof this.e.gradient!="function"){g=a.createRadialGradient(e,f,d/4,b,c,d);g=this.Fa(g)}else g=this.e.gradient(g);a.fillStyle=g;a.arc(b,c,d,0,Math.PI*2,true);a.fill();a.globalAlpha=1},ba:function(a,b,c,d,e,f,g,i){var j=this.renderText(0,0,g,0,1);if(j){var k=j.scrollWidth;j.style.width=k+"px";if(k>a)k=a;var h=8;if(i)h=k/1.8;var m=d+(e-d)/2;c-=(h-8)/2;var l=
+-h,n=-8,o="left";if(m>=Math.PI/2&&m=Math.PI){l=-k-l+1;o="right"}d=(b+Math.floor(c*Math.sin(m)))*f+n;h=a+Math.floor((c+h/2)*Math.cos(m))+l;var s=eb*f)d+=this.e.height||Math.floor(c/4);j.style.top=d+"px";j.style.left=h+"px";j.style.width=k+"px";j.style.textAlign=o;j.style.whiteSpace="nowrap"}}};
+dhtmlx.chart.pie3D={pvt_render_pie3D:function(a,b,c,d,e,f){this.na(a,b,c,d,this.e.cant,f)}};
+dhtmlx.Template={J:{},empty:function(){return""},setter:function(a,b){return dhtmlx.Template.fromHTML(b)},obj_setter:function(a,b){var c=dhtmlx.Template.setter(a,b),d=this;return function(){return c.apply(d,arguments)}},fromHTML:function(a){if(typeof a=="function")return a;if(this.J[a])return this.J[a];a=(a||"").toString();a=a.replace(/[\r\n]+/g,"\\n");a=a.replace(/\{obj\.([^}?]+)\?([^:]*):([^}]*)\}/g,'"+(obj.$1?"$2":"$3")+"');a=a.replace(/\{common\.([^}\(]*)\}/g,'"+common.$1+"');a=a.replace(/\{common\.([^\}\(]*)\(\)\}/g,
+'"+(common.$1?common.$1(obj):"")+"');a=a.replace(/\{obj\.([^}]*)\}/g,'"+obj.$1+"');a=a.replace(/#([a-z0-9_]+)#/gi,'"+obj.$1+"');a=a.replace(/\{obj\}/g,'"+obj+"');a=a.replace(/\{-obj/g,"{obj");a=a.replace(/\{-common/g,"{common");a='return "'+a+'";';return this.J[a]=Function("obj","common",a)}};
+dhtmlx.Type={add:function(a,b){if(!a.types&&a.prototype.types)a=a.prototype;var c=b.name||"default";this.T(b);this.T(b,"edit");this.T(b,"loading");a.types[c]=dhtmlx.extend(dhtmlx.extend({},a.types[c]||this.ta),b);return c},ta:{css:"default",template:function(){return""},template_edit:function(){return""},template_loading:function(){return"..."},width:150,height:80,margin:5,padding:0},T:function(a,b){b="template"+(b?"_"+b:"");var c=a[b];if(c&&typeof c=="string"){if(c.indexOf("->")!=-1){c=c.split("->");
+switch(c[0]){case "html":c=dhtmlx.html.getValue(c[1]).replace(/\"/g,'\\"');break;case "http":c=(new dhtmlx.ajax).sync().get(c[1],{uid:(new Date).valueOf()}).responseText;break;default:break}}a[b]=dhtmlx.Template.fromHTML(c)}}};
+dhtmlx.SingleRender={k:function(){},eb:function(a){return this.type.Oa(a,this.type)+this.type.template(a,this.type)+this.type.Na},render:function(){if(!this.callEvent||this.callEvent("onBeforeRender",[this.data])){if(this.data)this.L.innerHTML=this.eb(this.data);this.callEvent&&this.callEvent("onAfterRender",[])}}};
+dhtmlx.ui.Tooltip=function(a){this.name="Tooltip";this.version="3.0";if(typeof a=="string")a={template:a};dhtmlx.extend(this,dhtmlx.Settings);dhtmlx.extend(this,dhtmlx.SingleRender);this.B(a,{type:"default",dy:0,dx:20});this.L=this.g=document.createElement("DIV");this.g.className="dhx_tooltip";dhtmlx.html.insertBefore(this.g,document.body.firstChild)};
+dhtmlx.ui.Tooltip.prototype={show:function(a,b){if(!this.Z){if(this.data!=a){this.data=a;this.render(a)}this.g.style.top=b.y+this.e.dy+"px";this.g.style.left=b.x+this.e.dx+"px";this.g.style.display="block"}},hide:function(){this.data=null;this.g.style.display="none"},disable:function(){this.Z=true},enable:function(){this.Z=false},types:{"default":dhtmlx.Template.fromHTML("{obj.id}")},template_item_start:dhtmlx.Template.empty,template_item_end:dhtmlx.Template.empty};
+dhtmlx.AutoTooltip={tooltip_setter:function(a,b){var c=new dhtmlx.ui.Tooltip(b);this.attachEvent("onMouseMove",function(d,e){c.show(this.get(d),dhtmlx.html.pos(e))});this.attachEvent("onMouseOut",function(){c.hide()});this.attachEvent("onMouseMoving",function(){c.hide()});return c}};dhtmlx.DataStore=function(){this.name="DataStore";dhtmlx.extend(this,dhtmlx.EventSystem);this.setDriver("xml");this.pull={};this.order=dhtmlx.toArray();this.gb=false};
+dhtmlx.DataStore.prototype={setDriver:function(a){this.driver=dhtmlx.DataDriver[a]},qa:function(a){if(a.item){if(!(a.item instanceof Array))a.item=[a.item];for(var b=0;bb){var c=b;b=a;a=c}}else{a=this.min||0;b=Math.min(this.max||Infinity,this.dataCount()-1)}return this.getIndexRange(a,b)},getIndexRange:function(a,b){b=Math.min(b,this.dataCount()-1);var c=dhtmlx.toArray();for(a=a;a<=b;a++)c.push(this.get(this.order[a]));return c},dataCount:function(){return this.order.length},exists:function(a){return!!this.pull[a]},move:function(a,b){if(!(a<0||b<0)){var c=this.idByIndex(a),d=this.get(c);this.order.removeAt(a);this.order.insertAt(c,
+Math.min(this.order.length,b));this.callEvent("onStoreUpdated",[c,d,"move"])}},add:function(a,b){var c=this.id(a),d=this.dataCount();if(dhtmlx.isNotDefined(b)||b<0)b=d;if(b>d)b=Math.min(this.order.length,b);if(this.callEvent("onbeforeAdd",[c,b])){if(this.exists(c))return null;this.pull[c]=a;this.order.insertAt(c,b);if(this.m){var e=this.m.length;if(!b&&this.order.length)e=0;this.m.insertAt(c,e)}this.callEvent("onafterAdd",[c,b]);this.callEvent("onStoreUpdated",[c,a,"add"]);return c}},remove:function(a){if(a instanceof
+Array)for(var b=0;bb?1:ab?1:ab?1:ac)c=a(d)*1});return c},cb:function(a){var b=function(j,k){j=dhtmlx.Template.setter(0,j);return j(k[0])},c=dhtmlx.Template.setter(0,a.by);a.map[c]||(a.map[c]=[c,b]);var d={},e=[];this.data.each(function(j){var k=c(j);
+if(!d[k]){e.push({id:k});d[k]=dhtmlx.toArray()}d[k].push(j)});for(var f in a.map){var g=a.map[f][1]||b;if(typeof g!="function")g=this[g];for(var i=0;i5?10:5;c=parseInt(i,10)*g;if(c>Math.abs(a))d=a<0?-c:0;else{var j=Math.abs(a),k=Math.floor(this.ga(j)),h=j/Math.pow(10,k);d=Math.ceil(h*10)/10*Math.pow(10,k)-c;if(a<0)d=-d-2*c}for(e=d;e1)for(var d=1;db)b=e;if(fb)b=a[d].$sum;if(a[d].$min0)c=0}return{max:b,min:c}},G:function(a,b,c,d,e,f,g,i){if(f=="light"){a=i=="x"?a.createLinearGradient(b,c,d,c):a.createLinearGradient(b,c,b,e);a.addColorStop(0,"#FFFFFF");a.addColorStop(0.9,g);a.addColorStop(1,g);g=2}else{a.globalAlpha=0.37;g=0;a=i=="x"?a.createLinearGradient(b,e,b,c):a.createLinearGradient(b,c,d,c);a.addColorStop(0,"#000000");a.addColorStop(0.5,
+"#FFFFFF");a.addColorStop(0.6,"#FFFFFF");a.addColorStop(1,"#000000")}return{gradient:a,offset:g}}};dhtmlx.compat("layout");
diff --git a/public_html/js/dhtmlxcommon.js b/public_html/js/dhtmlxcommon.js
new file mode 100644
index 0000000..63e78e0
--- /dev/null
+++ b/public_html/js/dhtmlxcommon.js
@@ -0,0 +1,95 @@
+
+dhtmlx=function(obj){for (var a in obj)dhtmlx[a]=obj[a];return dhtmlx;};dhtmlx.extend_api=function(name,map,ext){var t = window[name];if (!t)return;window[name]=function(obj){if (obj && typeof obj == "object" && !obj.tagName){var that = t.apply(this,(map._init?map._init(obj):arguments));for (var a in dhtmlx)if (map[a])this[map[a]](dhtmlx[a]);for (var a in obj){if (map[a])this[map[a]](obj[a]);else if (a.indexOf("on")==0){this.attachEvent(a,obj[a]);}}}else
+ var that = t.apply(this,arguments);if (map._patch)map._patch(this);return that||this;};window[name].prototype=t.prototype;if (ext)dhtmlXHeir(window[name].prototype,ext);};dhtmlxAjax={get:function(url,callback){var t=new dtmlXMLLoaderObject(true);t.async=(arguments.length<3);t.waitCall=callback;t.loadXML(url)
+ return t;},
+ post:function(url,post,callback){var t=new dtmlXMLLoaderObject(true);t.async=(arguments.length<4);t.waitCall=callback;t.loadXML(url,true,post)
+ return t;},
+ getSync:function(url){return this.get(url,null,true)
+ },
+ postSync:function(url,post){return this.post(url,post,null,true);}};function dtmlXMLLoaderObject(funcObject, dhtmlObject, async, rSeed){this.xmlDoc="";if (typeof (async)!= "undefined")
+ this.async=async;else
+ this.async=true;this.onloadAction=funcObject||null;this.mainObject=dhtmlObject||null;this.waitCall=null;this.rSeed=rSeed||false;return this;};dtmlXMLLoaderObject.prototype.waitLoadFunction=function(dhtmlObject){var once = true;this.check=function (){if ((dhtmlObject)&&(dhtmlObject.onloadAction != null)){if ((!dhtmlObject.xmlDoc.readyState)||(dhtmlObject.xmlDoc.readyState == 4)){if (!once)return;once=false;if (typeof dhtmlObject.onloadAction == "function")dhtmlObject.onloadAction(dhtmlObject.mainObject, null, null, null, dhtmlObject);if (dhtmlObject.waitCall){dhtmlObject.waitCall.call(this,dhtmlObject);dhtmlObject.waitCall=null;}}}};return this.check;};dtmlXMLLoaderObject.prototype.getXMLTopNode=function(tagName, oldObj){if (this.xmlDoc.responseXML){var temp = this.xmlDoc.responseXML.getElementsByTagName(tagName);if(temp.length==0 && tagName.indexOf(":")!=-1)
+ var temp = this.xmlDoc.responseXML.getElementsByTagName((tagName.split(":"))[1]);var z = temp[0];}else
+ var z = this.xmlDoc.documentElement;if (z){this._retry=false;return z;};if ((_isIE)&&(!this._retry)){var xmlString = this.xmlDoc.responseText;var oldObj = this.xmlDoc;this._retry=true;this.xmlDoc=new ActiveXObject("Microsoft.XMLDOM");this.xmlDoc.async=false;this.xmlDoc["loadXM"+"L"](xmlString);return this.getXMLTopNode(tagName, oldObj);};dhtmlxError.throwError("LoadXML", "Incorrect XML", [
+ (oldObj||this.xmlDoc),
+ this.mainObject
+ ]);return document.createElement("DIV");};dtmlXMLLoaderObject.prototype.loadXMLString=function(xmlString){{
+ try{var parser = new DOMParser();this.xmlDoc=parser.parseFromString(xmlString, "text/xml");}catch (e){this.xmlDoc=new ActiveXObject("Microsoft.XMLDOM");this.xmlDoc.async=this.async;this.xmlDoc["loadXM"+"L"](xmlString);}};this.onloadAction(this.mainObject, null, null, null, this);if (this.waitCall){this.waitCall();this.waitCall=null;}};dtmlXMLLoaderObject.prototype.loadXML=function(filePath, postMode, postVars, rpc){if (this.rSeed)filePath+=((filePath.indexOf("?") != -1) ? "&" : "?")+"a_dhx_rSeed="+(new Date()).valueOf();this.filePath=filePath;if ((!_isIE)&&(window.XMLHttpRequest))
+ this.xmlDoc=new XMLHttpRequest();else {if (document.implementation&&document.implementation.createDocument){this.xmlDoc=document.implementation.createDocument("", "", null);this.xmlDoc.onload=new this.waitLoadFunction(this);this.xmlDoc.load(filePath);return;}else
+ this.xmlDoc=new ActiveXObject("Microsoft.XMLHTTP");};if (this.async)this.xmlDoc.onreadystatechange=new this.waitLoadFunction(this);this.xmlDoc.open(postMode ? "POST" : "GET", filePath, this.async);if (rpc){this.xmlDoc.setRequestHeader("User-Agent", "dhtmlxRPC v0.1 ("+navigator.userAgent+")");this.xmlDoc.setRequestHeader("Content-type", "text/xml");}else if (postMode)this.xmlDoc.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');this.xmlDoc.setRequestHeader("X-Requested-With","XMLHttpRequest");this.xmlDoc.send(null||postVars);if (!this.async)(new this.waitLoadFunction(this))();};dtmlXMLLoaderObject.prototype.destructor=function(){this._filterXPath = null;this._getAllNamedChilds = null;this._retry = null;this.async = null;this.rSeed = null;this.filePath = null;this.onloadAction = null;this.mainObject = null;this.xmlDoc = null;this.doXPath = null;this.doXPathOpera = null;this.doXSLTransToObject = null;this.doXSLTransToString = null;this.loadXML = null;this.loadXMLString = null;this.doSerialization = null;this.xmlNodeToJSON = null;this.getXMLTopNode = null;this.setXSLParamValue = null;return null;};dtmlXMLLoaderObject.prototype.xmlNodeToJSON = function(node){var t={};for (var i=0;i-1)
+ _isChrome=true;if ((navigator.userAgent.indexOf('Safari')!= -1)||(navigator.userAgent.indexOf('Konqueror') != -1)){var _KHTMLrv = parseFloat(navigator.userAgent.substr(navigator.userAgent.indexOf('Safari')+7, 5));if (_KHTMLrv > 525){_isFF=true;var _FFrv = 1.9;}else
+ _isKHTML=true;}else if (navigator.userAgent.indexOf('Opera')!= -1){_isOpera=true;_OperaRv=parseFloat(navigator.userAgent.substr(navigator.userAgent.indexOf('Opera')+6, 3));}else if (navigator.appName.indexOf("Microsoft")!= -1){_isIE=true;if (navigator.appVersion.indexOf("MSIE 8.0")!= -1 && document.compatMode != "BackCompat") _isIE=8;}else {_isFF=true;var _FFrv = parseFloat(navigator.userAgent.split("rv:")[1])
+};dtmlXMLLoaderObject.prototype.doXPath=function(xpathExp, docObj, namespace, result_type){if (_isKHTML || (!_isIE && !window.XPathResult))
+ return this.doXPathOpera(xpathExp, docObj);if (_isIE){if (!docObj)if (!this.xmlDoc.nodeName)docObj=this.xmlDoc.responseXML
+ else
+ docObj=this.xmlDoc;if (!docObj)dhtmlxError.throwError("LoadXML", "Incorrect XML", [
+ (docObj||this.xmlDoc),
+ this.mainObject
+ ]);if (namespace != null)docObj.setProperty("SelectionNamespaces", "xmlns:xsl='"+namespace+"'");if (result_type == 'single'){return docObj.selectSingleNode(xpathExp);}else {return docObj.selectNodes(xpathExp)||new Array(0);}}else {var nodeObj = docObj;if (!docObj){if (!this.xmlDoc.nodeName){docObj=this.xmlDoc.responseXML
+ }else {docObj=this.xmlDoc;}};if (!docObj)dhtmlxError.throwError("LoadXML", "Incorrect XML", [
+ (docObj||this.xmlDoc),
+ this.mainObject
+ ]);if (docObj.nodeName.indexOf("document")!= -1){nodeObj=docObj;}else {nodeObj=docObj;docObj=docObj.ownerDocument;};var retType = XPathResult.ANY_TYPE;if (result_type == 'single')retType=XPathResult.FIRST_ORDERED_NODE_TYPE
+ var rowsCol = new Array();var col = docObj.evaluate(xpathExp, nodeObj, function(pref){return namespace
+ }, retType, null);if (retType == XPathResult.FIRST_ORDERED_NODE_TYPE){return col.singleNodeValue;};var thisColMemb = col.iterateNext();while (thisColMemb){rowsCol[rowsCol.length]=thisColMemb;thisColMemb=col.iterateNext();};return rowsCol;}};function _dhtmlxError(type, name, params){if (!this.catches)this.catches=new Array();return this;};_dhtmlxError.prototype.catchError=function(type, func_name){this.catches[type]=func_name;};_dhtmlxError.prototype.throwError=function(type, name, params){if (this.catches[type])return this.catches[type](type, name, params);if (this.catches["ALL"])return this.catches["ALL"](type, name, params);alert("Error type: "+arguments[0]+"\nDescription: "+arguments[1]);return null;};window.dhtmlxError=new _dhtmlxError();dtmlXMLLoaderObject.prototype.doXPathOpera=function(xpathExp, docObj){var z = xpathExp.replace(/[\/]+/gi, "/").split('/');var obj = null;var i = 1;if (!z.length)return [];if (z[0] == ".")obj=[docObj];else if (z[0] == ""){obj=(this.xmlDoc.responseXML||this.xmlDoc).getElementsByTagName(z[i].replace(/\[[^\]]*\]/g, ""));i++;}else
+ return [];for (i;i < z.length;i++)obj=this._getAllNamedChilds(obj, z[i]);if (z[i-1].indexOf("[")!= -1)
+ obj=this._filterXPath(obj, z[i-1]);return obj;};dtmlXMLLoaderObject.prototype._filterXPath=function(a, b){var c = new Array();var b = b.replace(/[^\[]*\[\@/g, "").replace(/[\[\]\@]*/g, "");for (var i = 0;i < a.length;i++)if (a[i].getAttribute(b))
+ c[c.length]=a[i];return c;};dtmlXMLLoaderObject.prototype._getAllNamedChilds=function(a, b){var c = new Array();if (_isKHTML)b=b.toUpperCase();for (var i = 0;i < a.length;i++)for (var j = 0;j < a[i].childNodes.length;j++){if (_isKHTML){if (a[i].childNodes[j].tagName&&a[i].childNodes[j].tagName.toUpperCase()== b)
+ c[c.length]=a[i].childNodes[j];}else if (a[i].childNodes[j].tagName == b)c[c.length]=a[i].childNodes[j];};return c;};function dhtmlXHeir(a, b){for (var c in b)if (typeof (b[c])== "function")
+ a[c]=b[c];return a;};function dhtmlxEvent(el, event, handler){if (el.addEventListener)el.addEventListener(event, handler, false);else if (el.attachEvent)el.attachEvent("on"+event, handler);};dtmlXMLLoaderObject.prototype.xslDoc=null;dtmlXMLLoaderObject.prototype.setXSLParamValue=function(paramName, paramValue, xslDoc){if (!xslDoc)xslDoc=this.xslDoc
+
+ if (xslDoc.responseXML)xslDoc=xslDoc.responseXML;var item =
+ this.doXPath("/xsl:stylesheet/xsl:variable[@name='"+paramName+"']", xslDoc,
+ "http:/\/www.w3.org/1999/XSL/Transform", "single");if (item != null)item.firstChild.nodeValue=paramValue
+};dtmlXMLLoaderObject.prototype.doXSLTransToObject=function(xslDoc, xmlDoc){if (!xslDoc)xslDoc=this.xslDoc;if (xslDoc.responseXML)xslDoc=xslDoc.responseXML
+
+ if (!xmlDoc)xmlDoc=this.xmlDoc;if (xmlDoc.responseXML)xmlDoc=xmlDoc.responseXML
+
+
+ if (!_isIE){if (!this.XSLProcessor){this.XSLProcessor=new XSLTProcessor();this.XSLProcessor.importStylesheet(xslDoc);};var result = this.XSLProcessor.transformToDocument(xmlDoc);}else {var result = new ActiveXObject("Msxml2.DOMDocument.3.0");try{xmlDoc.transformNodeToObject(xslDoc, result);}catch(e){result = xmlDoc.transformNode(xslDoc);}};return result;};dtmlXMLLoaderObject.prototype.doXSLTransToString=function(xslDoc, xmlDoc){var res = this.doXSLTransToObject(xslDoc, xmlDoc);if(typeof(res)=="string")
+ return res;return this.doSerialization(res);};dtmlXMLLoaderObject.prototype.doSerialization=function(xmlDoc){if (!xmlDoc)xmlDoc=this.xmlDoc;if (xmlDoc.responseXML)xmlDoc=xmlDoc.responseXML
+ if (!_isIE){var xmlSerializer = new XMLSerializer();return xmlSerializer.serializeToString(xmlDoc);}else
+ return xmlDoc.xml;};dhtmlxEventable=function(obj){obj.attachEvent=function(name, catcher, callObj){name='ev_'+name.toLowerCase();if (!this[name])this[name]=new this.eventCatcher(callObj||this);return(name+':'+this[name].addEvent(catcher));};obj.callEvent=function(name, arg0){name='ev_'+name.toLowerCase();if (this[name])return this[name].apply(this, arg0);return true;};obj.checkEvent=function(name){return (!!this['ev_'+name.toLowerCase()])
+ };obj.eventCatcher=function(obj){var dhx_catch = [];var z = function(){var res = true;for (var i = 0;i < dhx_catch.length;i++){if (dhx_catch[i] != null){var zr = dhx_catch[i].apply(obj, arguments);res=res&&zr;}};return res;};z.addEvent=function(ev){if (typeof (ev)!= "function")
+ ev=eval(ev);if (ev)return dhx_catch.push(ev)-1;return false;};z.removeEvent=function(id){dhx_catch[id]=null;};return z;};obj.detachEvent=function(id){if (id != false){var list = id.split(':');this[list[0]].removeEvent(list[1]);}};obj.detachAllEvents = function(){for (var name in this){if (name.indexOf("ev_")==0)
+ delete this[name];}}};
+//v.2.6 build 100722
+
+/*
+Copyright DHTMLX LTD. http://www.dhtmlx.com
+You allowed to use this component or parts of it under GPL terms
+To use it on other terms or get Professional edition of the component please contact us at sales@dhtmlx.com
+*/
\ No newline at end of file
diff --git a/public_html/js/funciones.js b/public_html/js/funciones.js
new file mode 100644
index 0000000..0613260
--- /dev/null
+++ b/public_html/js/funciones.js
@@ -0,0 +1,295 @@
+/*
+ Autor Tonovarela
+ */
+function base64_encode (data) {
+ // http://kevin.vanzonneveld.net
+ // + original by: Tyler Akins (http://rumkin.com)
+ // + improved by: Bayron Guevara
+ // + improved by: Thunder.m
+ // + improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
+ // + bugfixed by: Pellentesque Malesuada
+ // + improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
+ // + improved by: Rafał Kukawski (http://kukawski.pl)
+ // * example 1: base64_encode('Kevin van Zonneveld');
+ // * returns 1: 'S2V2aW4gdmFuIFpvbm5ldmVsZA=='
+ // mozilla has this native
+ // - but breaks in 2.0.0.12!
+ //if (typeof this.window['atob'] == 'function') {
+ // return atob(data);
+ //}
+ var b64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
+ var o1, o2, o3, h1, h2, h3, h4, bits, i = 0,
+ ac = 0,
+ enc = "",
+ tmp_arr = [];
+
+ if (!data) {
+ return data;
+ }
+
+ do { // pack three octets into four hexets
+ o1 = data.charCodeAt(i++);
+ o2 = data.charCodeAt(i++);
+ o3 = data.charCodeAt(i++);
+
+ bits = o1 << 16 | o2 << 8 | o3;
+
+ h1 = bits >> 18 & 0x3f;
+ h2 = bits >> 12 & 0x3f;
+ h3 = bits >> 6 & 0x3f;
+ h4 = bits & 0x3f;
+
+ // use hexets to index into b64, and append result to encoded string
+ tmp_arr[ac++] = b64.charAt(h1) + b64.charAt(h2) + b64.charAt(h3) + b64.charAt(h4);
+ } while (i < data.length);
+
+ enc = tmp_arr.join('');
+
+ var r = data.length % 3;
+
+ return (r ? enc.slice(0, r - 3) : enc) + '==='.slice(r || 3);
+
+}
+
+function utf8_encode (argString) {
+ // http://kevin.vanzonneveld.net
+ // + original by: Webtoolkit.info (http://www.webtoolkit.info/)
+ // + improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
+ // + improved by: sowberry
+ // + tweaked by: Jack
+ // + bugfixed by: Onno Marsman
+ // + improved by: Yves Sucaet
+ // + bugfixed by: Onno Marsman
+ // + bugfixed by: Ulrich
+ // + bugfixed by: Rafal Kukawski
+ // + improved by: kirilloid
+ // * example 1: utf8_encode('Kevin van Zonneveld');
+ // * returns 1: 'Kevin van Zonneveld'
+
+ if (argString === null || typeof argString === "undefined") {
+ return "";
+ }
+
+ var string = (argString + ''); // .replace(/\r\n/g, "\n").replace(/\r/g, "\n");
+ var utftext = '',
+ start, end, stringl = 0;
+
+ start = end = 0;
+ stringl = string.length;
+ for (var n = 0; n < stringl; n++) {
+ var c1 = string.charCodeAt(n);
+ var enc = null;
+
+ if (c1 < 128) {
+ end++;
+ } else if (c1 > 127 && c1 < 2048) {
+ enc = String.fromCharCode((c1 >> 6) | 192, (c1 & 63) | 128);
+ } else {
+ enc = String.fromCharCode((c1 >> 12) | 224, ((c1 >> 6) & 63) | 128, (c1 & 63) | 128);
+ }
+ if (enc !== null) {
+ if (end > start) {
+ utftext += string.slice(start, end);
+ }
+ utftext += enc;
+ start = end = n + 1;
+ }
+ }
+
+ if (end > start) {
+ utftext += string.slice(start, stringl);
+ }
+
+ return utftext;
+}
+
+
+
+
+function numero(evt)
+ {
+ var keyPressed = (evt.which) ? evt.which : event.keyCode
+ return !(keyPressed > 31 && (keyPressed < 48 || keyPressed > 57));
+ }
+
+function enviar()
+{
+ var cuestionario= new Array();
+
+ var contador=0;
+
+ for (var i=0;i0)
+ {
+ var str=form.name.toString();
+
+ var actual=str.substr(4);
+ var siguiente='seccion'+eval(parseInt(str.substr(11))+1);
+ if (actual=='seccion_1')
+ enviar();
+
+ document.getElementById(siguiente).style.display="block";
+ document.getElementById(actual).style.display="none";
+ }
+ else
+ {
+ alert("No ha respondido todas las preguntas");
+ return false;
+ }
+
+ return true;
+
+}
+
+
+
+
+function sendpost()
+{
+
+$.post('sql/verificar_usuario.php', {cuenta:document.getElementById("cuenta").value},function(data) {
+ if (data=="0")
+ {
+ alert("Datos inválidos");
+ document.getElementById('contrasena').value="";
+ }
+
+ if (data=="1")
+ document.getElementById("datos").submit();
+
+ if (data=="2")
+ alert("Ya contestaste el cuestionario");
+
+
+});
+
+
+
+
+
+
+
+}
+
+
+
+function S(id){
+ return document.getElementById(id);
+}
+
+
+
+function validar_usuario() {
+
+ String.prototype.trim= function() {//Agrega la función trim al objeto String
+ return this.replace(/(^\s*)|(\s*$)/g,""); //elimina espacios a izquierda y derecha
+ }
+
+
+ S('cuenta').value=S('cuenta').value.trim();
+ S('contrasena').value=S('contrasena').value.trim();
+
+ if( S('cuenta').value.length<9){
+ alert("El número de cuenta debe de ser de 9 digitos");/*$.jGrowl("Usuario no válido ", {life: 800});*/
+ S('cuenta').focus();
+ return false;
+ }
+ if( S('contrasena').value.length==0) {
+ alert("Capture la contraseña");/*$.jGrowl("Contraseña no válida ", {life: 800});*/
+ S('contrasena').focus();
+return false;
+ }
+if (S('carrera').value==0)
+ {
+ alert("Capture la carrera");/*$.jGrowl("Contraseña no válida ", {life: 800});*/
+ S('contrasena').focus();
+return false;
+ }
+
+sendpost();
+
+}
+
+function validar_usuario_sin() {
+ String.prototype.trim= function() {//Agrega la función trim al objeto String
+ return this.replace(/(^\s*)|(\s*$)/g,""); //elimina espacios a izquierda y derecha
+ }
+ S('cuenta').value=S('cuenta').value.trim();
+ if( S('cuenta').value.length<9){
+ alert("El número de cuenta debe de ser de 9 digitos");/*$.jGrowl("Usuario no válido ", {life: 800});*/
+ S('cuenta').focus();
+ return false;
+ }
+
+ sendpost_sin();
+}
+
+function comprobante()
+{
+ window.open("comprobante.php", "_blank");
+
+
+}
\ No newline at end of file
diff --git a/public_html/js/jquery.progressbar.min.js b/public_html/js/jquery.progressbar.min.js
new file mode 100644
index 0000000..2f93705
--- /dev/null
+++ b/public_html/js/jquery.progressbar.min.js
@@ -0,0 +1,20 @@
+
+(function($){$.extend({progressBar:new function(){this.defaults={steps:20,stepDuration:20,max:100,showText:true,textFormat:'percentage',width:120,height:12,callback:null,boxImage:'images/progressbar.gif',barImage:{0:'images/progressbg_red.gif',30:'images/progressbg_orange.gif',70:'images/progressbg_green.gif'},running_value:0,value:0,image:null};this.construct=function(arg1,arg2){var argvalue=null;var argconfig=null;if(arg1!=null){if(!isNaN(arg1)){argvalue=arg1;if(arg2!=null){argconfig=arg2;}}else{argconfig=arg1;}}
+return this.each(function(child){var pb=this;var config=this.config;if(argvalue!=null&&this.bar!=null&&this.config!=null){this.config.value=parseInt(argvalue)
+if(argconfig!=null)
+pb.config=$.extend(this.config,argconfig);config=pb.config;}else{var $this=$(this);var config=$.extend({},$.progressBar.defaults,argconfig);config.id=$this.attr('id')?$this.attr('id'):Math.ceil(Math.random()*100000);if(argvalue==null)
+argvalue=$this.html().replace("%","")
+config.value=parseInt(argvalue);config.running_value=0;config.image=getBarImage(config);var numeric=['steps','stepDuration','max','width','height','running_value','value'];for(var i=0;i=parseInt(i)){image=config.barImage[i];}else{break;}}}
+return image;}
+function getText(config){if(config.showText){if(config.textFormat=='percentage'){return" "+Math.round(config.running_value)+"%";}else if(config.textFormat=='fraction'){return" "+config.running_value+'/'+config.max;}}}
+config.increment=Math.round((config.value-config.running_value)/config.steps);if(config.increment<0)
+config.increment*=-1;if(config.increment<1)
+config.increment=1;var t=setInterval(function(){var pixels=config.width/100;if(config.running_value>config.value){if(config.running_value-config.incrementconfig.value){config.running_value=config.value;}else{config.running_value+=config.increment;}}
+if(config.running_value==config.value)
+clearInterval(t);var $bar=$("#"+config.id+"_pbImage");var $text=$("#"+config.id+"_pbText");var image=getBarImage(config);if(image!=config.image){$bar.css("background-image","url("+image+")");config.image=image;}
+$bar.css("background-position",(((config.width*-1))+(getPercentage(config)*pixels))+'px 50%');$bar.attr('title',getText(config));$text.html(getText(config));if(config.callback!=null&&typeof(config.callback)=='function')
+config.callback(config);pb.config=config;},config.stepDuration);});};}});$.fn.extend({progressBar:$.progressBar.construct});})(jQuery);
\ No newline at end of file
diff --git a/public_html/js/jquery.scrollTo-1.4.2-min.js b/public_html/js/jquery.scrollTo-1.4.2-min.js
new file mode 100644
index 0000000..5e78778
--- /dev/null
+++ b/public_html/js/jquery.scrollTo-1.4.2-min.js
@@ -0,0 +1,11 @@
+/**
+ * jQuery.ScrollTo - Easy element scrolling using jQuery.
+ * Copyright (c) 2007-2009 Ariel Flesler - aflesler(at)gmail(dot)com | http://flesler.blogspot.com
+ * Dual licensed under MIT and GPL.
+ * Date: 5/25/2009
+ * @author Ariel Flesler
+ * @version 1.4.2
+ *
+ * http://flesler.blogspot.com/2007/10/jqueryscrollto.html
+ */
+;(function(d){var k=d.scrollTo=function(a,i,e){d(window).scrollTo(a,i,e)};k.defaults={axis:'xy',duration:parseFloat(d.fn.jquery)>=1.3?0:1};k.window=function(a){return d(window)._scrollable()};d.fn._scrollable=function(){return this.map(function(){var a=this,i=!a.nodeName||d.inArray(a.nodeName.toLowerCase(),['iframe','#document','html','body'])!=-1;if(!i)return a;var e=(a.contentWindow||a).document||a.ownerDocument||a;return d.browser.safari||e.compatMode=='BackCompat'?e.body:e.documentElement})};d.fn.scrollTo=function(n,j,b){if(typeof j=='object'){b=j;j=0}if(typeof b=='function')b={onAfter:b};if(n=='max')n=9e9;b=d.extend({},k.defaults,b);j=j||b.speed||b.duration;b.queue=b.queue&&b.axis.length>1;if(b.queue)j/=2;b.offset=p(b.offset);b.over=p(b.over);return this._scrollable().each(function(){var q=this,r=d(q),f=n,s,g={},u=r.is('html,body');switch(typeof f){case'number':case'string':if(/^([+-]=)?\d+(\.\d+)?(px|%)?$/.test(f)){f=p(f);break}f=d(f,this);case'object':if(f.is||f.style)s=(f=d(f)).offset()}d.each(b.axis.split(''),function(a,i){var e=i=='x'?'Left':'Top',h=e.toLowerCase(),c='scroll'+e,l=q[c],m=k.max(q,i);if(s){g[c]=s[h]+(u?0:l-r.offset()[h]);if(b.margin){g[c]-=parseInt(f.css('margin'+e))||0;g[c]-=parseInt(f.css('border'+e+'Width'))||0}g[c]+=b.offset[h]||0;if(b.over[h])g[c]+=f[i=='x'?'width':'height']()*b.over[h]}else{var o=f[h];g[c]=o.slice&&o.slice(-1)=='%'?parseFloat(o)/100*m:o}if(/^\d+$/.test(g[c]))g[c]=g[c]<=0?0:Math.min(g[c],m);if(!a&&b.queue){if(l!=g[c])t(b.onAfterFirst);delete g[c]}});t(b.onAfter);function t(a){r.animate(g,j,b.easing,a&&function(){a.call(this,n,b)})}}).end()};k.max=function(a,i){var e=i=='x'?'Width':'Height',h='scroll'+e;if(!d(a).is('html,body'))return a[h]-d(a)[e.toLowerCase()]();var c='client'+e,l=a.ownerDocument.documentElement,m=a.ownerDocument.body;return Math.max(l[h],m[h])-Math.min(l[c],m[c])};function p(a){return typeof a=='object'?a:{top:a,left:a}}})(jQuery);
\ No newline at end of file
diff --git a/public_html/js/jquery.textareaCounter.plugin.js b/public_html/js/jquery.textareaCounter.plugin.js
new file mode 100644
index 0000000..fe94870
--- /dev/null
+++ b/public_html/js/jquery.textareaCounter.plugin.js
@@ -0,0 +1,163 @@
+/*
+ * jQuery Textarea Characters Counter Plugin v 2.0
+ * Examples and documentation at: http://roy-jin.appspot.com/jsp/textareaCounter.jsp
+ * Copyright (c) 2010 Roy Jin
+ * Version: 2.0 (11-JUN-2010)
+ * Dual licensed under the MIT and GPL licenses:
+ * http://www.opensource.org/licenses/mit-license.php
+ * http://www.gnu.org/licenses/gpl.html
+ * Requires: jQuery v1.4.2 or later
+ */
+(function($){
+ $.fn.textareaCount = function(options, fn) {
+ var defaults = {
+ maxCharacterSize: -1,
+ originalStyle: 'originalTextareaInfo',
+ warningStyle: 'warningTextareaInfo',
+ warningNumber: 20,
+ displayFormat: '#input characters | #words words'
+ };
+ var options = $.extend(defaults, options);
+
+ var container = $(this);
+
+ $("
").insertAfter(container);
+
+ //create charleft css
+ var charLeftCss = {
+ 'width' : container.width()
+ };
+
+ var charLeftInfo = getNextCharLeftInformation(container);
+ charLeftInfo.addClass(options.originalStyle);
+ charLeftInfo.css(charLeftCss);
+
+ var numInput = 0;
+ var maxCharacters = options.maxCharacterSize;
+ var numLeft = 0;
+ var numWords = 0;
+
+ container.bind('keyup', function(event){limitTextAreaByCharacterCount();})
+ .bind('mouseover', function(event){setTimeout(function(){limitTextAreaByCharacterCount();}, 10);})
+ .bind('paste', function(event){setTimeout(function(){limitTextAreaByCharacterCount();}, 10);});
+
+
+ function limitTextAreaByCharacterCount(){
+ charLeftInfo.html(countByCharacters());
+ //function call back
+ if(typeof fn != 'undefined'){
+ fn.call(this, getInfo());
+ }
+ return true;
+ }
+
+ function countByCharacters(){
+ var content = container.val();
+ var contentLength = content.length;
+
+ //Start Cut
+ if(options.maxCharacterSize > 0){
+ //If copied content is already more than maxCharacterSize, chop it to maxCharacterSize.
+ if(contentLength >= options.maxCharacterSize) {
+ content = content.substring(0, options.maxCharacterSize);
+ }
+
+ var newlineCount = getNewlineCount(content);
+
+ // newlineCount new line character. For windows, it occupies 2 characters
+ var systemmaxCharacterSize = options.maxCharacterSize - newlineCount;
+ if (!isWin()){
+ systemmaxCharacterSize = options.maxCharacterSize
+ }
+ if(contentLength > systemmaxCharacterSize){
+ //avoid scroll bar moving
+ var originalScrollTopPosition = this.scrollTop;
+ container.val(content.substring(0, systemmaxCharacterSize));
+ this.scrollTop = originalScrollTopPosition;
+ }
+ charLeftInfo.removeClass(options.warningStyle);
+ if(systemmaxCharacterSize - contentLength <= options.warningNumber){
+ charLeftInfo.addClass(options.warningStyle);
+ }
+
+ numInput = container.val().length + newlineCount;
+ if(!isWin()){
+ numInput = container.val().length;
+ }
+
+ numWords = countWord(getCleanedWordString(container.val()));
+
+ numLeft = maxCharacters - numInput;
+ } else {
+ //normal count, no cut
+ var newlineCount = getNewlineCount(content);
+ numInput = container.val().length + newlineCount;
+ if(!isWin()){
+ numInput = container.val().length;
+ }
+ numWords = countWord(getCleanedWordString(container.val()));
+ }
+
+ return formatDisplayInfo();
+ }
+
+ function formatDisplayInfo(){
+ var format = options.displayFormat;
+ format = format.replace('#input', numInput);
+ format = format.replace('#words', numWords);
+ //When maxCharacters <= 0, #max, #left cannot be substituted.
+ if(maxCharacters > 0){
+ format = format.replace('#max', maxCharacters);
+ format = format.replace('#left', numLeft);
+ }
+ return format;
+ }
+
+ function getInfo(){
+ var info = {
+ input: numInput,
+ max: maxCharacters,
+ left: numLeft,
+ words: numWords
+ };
+ return info;
+ }
+
+ function getNextCharLeftInformation(container){
+ return container.next('.charleft');
+ }
+
+ function isWin(){
+ var strOS = navigator.appVersion;
+ if (strOS.toLowerCase().indexOf('win') != -1){
+ return true;
+ }
+ return false;
+ }
+
+ function getNewlineCount(content){
+ var newlineCount = 0;
+ for(var i=0; i'+
+ ''+
+ 'Este campo es requerido.'+
+ ' '+
+ '
');
+ faltantes.push($(this).attr('id'));
+ }
+ });
+ verificar_correo_reg();
+ //valida la lista de radios
+ if (!$("#condicional_radio").val()){
+ $("#verify_radio").empty();
+ if ($('input:radio[name=sistema]:checked').val()) {
+ //alert($('input:radio[name=titula]:checked').val());
+ } else {
+ $("tipo_evento").focus();
+ $("#verify_radio").append('Este campo es requerido.
');
+ faltantes.push("tipo_evento");
+ }
+ }
+ //valida datos faltantes, sube el screen y envía una alerta
+ if (faltantes.length > 0 || $("#email").val().length == 0) {
+ $("html, body").animate({ scrollTop: 0 }, "slow");
+ alert("¡Hay campos faltantes!");
+ return;
+ }
+ if($("#email_valida").val() == 1){
+ //alert("Datos completos");
+ $('#enviar').attr('disabled','disabled').css({"background-color":"rgb(160,160,160)"}).val("Registrando...");
+ envio_datos();
+ }
+ });
+
+ $("#email").keyup(function () {
+ $("#verify_mail").empty();
+ if ($("#email").val().length == 0) {
+ $("#verify_mail").append('Este campo es requerido.
');
+ return;
+ }
+ if (isValidEmailAddress($("#email").val()))
+ $("#verify_mail").append('Éste parece un correo electrónico válido.
');
+ else{
+ $("#verify_mail").append('Correo electrónico no válido.
');
+ return;
+ }
+ });
+
+ $("#email").focusout(function () {
+ $("#verify_mail").empty();
+ if ($("#email").val().length == 0) {
+ $("#verify_mail").append('Este campo es requerido.
');
+ return;
+ }
+ if (isValidEmailAddress($("#email").val())){
+ $("#verify_mail").append('Éste parece un correo electrónico válido.
');
+ verificar_correo_reg();
+ } else{
+ $("#verify_mail").append('Correo electrónico no válido.
');
+ return;
+ }
+ });
+
+ $('#bt_acceso_admin').click(function (event) {
+ event.preventDefault();
+ var bandera = 0;
+ $(".requerido_admin").empty();
+ if ($.trim($("#usuario_ing").val()).length == 0) {
+ $('#verify_usuario_ing').append("Este campo es requerido.
");
+ bandera = 1;
+ }
+ if ($.trim($("#password_ing").val()).length == 0) {
+ $('#verify_password_ing').append("Este campo es requerido.
");
+ bandera = 1;
+ }
+ if (bandera == 1)
+ return;
+ login_admin();
+ });
+
+ $('.pagado').click(function () {
+ if ($(this).is(":checked")){
+ $.post("sql/validar_pago.php", {id_pagado: $(this).attr("id")}, function (res) {
+ //alert(res);
+ window.location = "monitor.php";
+ });
+ } else {
+ $.post("sql/validar_pago.php", {id_no_pagado: $(this).attr("id")}, function (res) {
+ //alert(res);
+ window.location = "monitor.php";
+ });
+ }
+ });
+
+ $('.eviarCorreo').click(function(){
+ var checkCorreo = $(this);
+ var spiner = document.getElementsByClassName("spin")[0];
+ spiner.style.display = "block";
+ $.post("sql/enviarCorreo.php", {correo: checkCorreo.data("correo"), enviarCorreo: checkCorreo.is(":checked")}, function (res) {
+ //console.log(res);
+
+ if(res.Success)
+ {
+ alert('El correo envió correo correctamente');
+ }
+ else if(res.Error)
+ {
+ if(res.Error=="Verifique los datos")
+ {
+ document.getElementById('ingresaCorreo').style.display ="block";
+ alert("Verifique los datos, ingrese nuevamente");
+ }
+ else if(res.Error=="Correo")
+ {
+ document.getElementById('ingresaCorreo').style.display ="block";
+ }
+ else
+ {
+ document.getElementById('ingresaCorreo').style.display ="block";
+ alert("Error inesperado, intente nuevamente por favor");
+ }
+ checkCorreo.attr("checked",false);
+ }
+ else if(res.Baja)
+ {
+ if(res.Baja=="Si")
+ {
+ checkCorreo.attr("checked",false);
+ }
+ else
+ {
+ checkCorreo.attr("checked",true);
+ }
+ }
+ spiner.style.display = "none";
+ //window.location = "monitor.php";
+ },'json');
+ })
+});
+
+function actualiza_mesa(id_registro,mesa) {//alert(id_registro);
+ $.post("sql/actualizar_mesa.php",
+ {folio: $("#"+id_registro).attr("id"), mesa: mesa},
+ function (data) {
+ if (data == 1)
+ window.location.reload();
+ else
+ alert("Hay un problema con la asignación de mesas, favor de reportarlo al Departamento de Servicios de Cómputo del CEDETEC.");
+ });
+}
+
+function login_admin(){
+ $.post("sql/ingresar_admin.php", $("#ingresar_administracion").serialize(), function (data) {
+ if (data == 1)
+ window.location = "monitor.php";
+ else
+ $("#verify_password_ing").append("La combinación de usuario y contraseña es incorrecta.
");
+ });
+}
+
+function envio_datos(){
+ $.post("sql/registro.php", $("#registro_desayuno").serialize(), function (id) {//alert(id);
+ if(id != 0){
+ alert("Datos guardados correctamente.");
+ if(id == 1)
+ window.location = "gracias.php";
+ else if(id == 2 || id == 3){
+ window.location.reload(true);
+ }
+ } else {
+ alert("Error en el guardado de los datos.");
+ window.location = "error.php";
+ }
+ return;
+ });
+}
+
+
+
+function descargarPDF_boleto(){
+ $.post("sql/descargar.php", $("#seccion_descarga").serialize(), function (email) {//alert(id);
+ if(email != ''){
+ window.location = "boleto.php?email="+email;
+ } else {
+ alert("El correo que escribiste no está registrado.");
+ window.location.reload();
+ }
+ return;
+ });
+}
+
+function verificar_correo_reg() {
+ $.post("sql/verificar_correo.php", {
+ email: $("#email").val()
+ },
+ function (data) {
+ $("#verify_mail").empty();
+ if ($("#email").val().length == 0) {
+ $("#email").focus();
+ $("#verify_mail").append('Este campo es requerido.
');
+ return;
+ }
+ if (data == 1){
+ $("#verify_mail").append('Email identificado.
');
+ //$("html, body").animate({ scrollTop: 0 }, "slow");
+ $("#email_valida").val("1");
+ }
+ else{
+ if (isValidEmailAddress($("#email").val())){
+ $("#verify_mail").append('Este parece un correo electrónico válido.
');
+ $("#email_valida").val("1");
+ }
+ else {
+ $("#verify_mail").append('Correo electrónico no válido.
');
+ $("html, body").animate({ scrollTop: 0 }, "slow");
+ $("#email_valida").val("0");
+ }
+ }
+ });
+}
+
+function isValidEmailAddress(emailAddress) {
+ var pattern = new RegExp(/^((([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(\.([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+)*)|((\x22)((((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(([\x01-\x08\x0b\x0c\x0e-\x1f\x7f]|\x21|[\x23-\x5b]|[\x5d-\x7e]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(\\([\x01-\x09\x0b\x0c\x0d-\x7f]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))))*(((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(\x22)))@((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?$/i);
+ return pattern.test(emailAddress);
+}
\ No newline at end of file
diff --git a/public_html/js/login.js.save b/public_html/js/login.js.save
new file mode 100644
index 0000000..20e6fb2
--- /dev/null
+++ b/public_html/js/login.js.save
@@ -0,0 +1,263 @@
+login
+jQuery(document).ready(function($) {
+
+ $('.numerico').keyup(function (e) {
+ this.value = this.value.replace(/[^0-9\.]/g, '');
+ });
+ $('.solo_numeros').keyup(function (e) {
+ this.value = this.value.replace(/[^0-9]/g, '');
+ });
+ $('.texto').keyup(function (e) {
+ this.value = this.value.replace(/['"]/g, '');
+ });
+
+ $('.automatico').keyup(function (e) {
+ e.preventDefault();
+ if (e.keyCode === 13) {
+ $('#bt_acceso_admin').click();
+ }
+ });
+ $('.automatico_boleto').keyup(function (e) {
+ e.preventDefault();
+ if (e.keyCode === 13) {
+ $('#download_ticket').click();
+ }
+ });
+
+ $("#download_ticket").click(function () {
+ verificar_correo_reg();
+ //valida datos faltantes, sube el screen y envía una alerta
+ if($("#email_valida").val() == 1){
+ $('#download_ticket').attr('disabled','disabled').css({"background-color":"rgb(160,160,160)"}).val("Descargando...");
+ descargarPDF_boleto();
+ }
+ });
+
+ $("#enviar").click(function () {
+ $(".requerido").remove();
+ $(".borrar").remove();
+ var faltantes = new Array();
+ //valida elementos con clase valida
+ $('.valida').each(function () {
+ if ($.trim($(this).val()).length === 0) {
+ $(this).focus().after( ' '+
+ ''+
+ 'Este campo es requerido.'+
+ ' '+
+ '
');
+ faltantes.push($(this).attr('id'));
+ }
+ });
+ verificar_correo_reg();
+ //valida la lista de radios
+ if (!$("#condicional_radio").val()){
+ $("#verify_radio").empty();
+ if ($('input:radio[name=sistema]:checked').val()) {
+ //alert($('input:radio[name=titula]:checked').val());
+ } else {
+ $("tipo_evento").focus();
+ $("#verify_radio").append('Este campo es requerido.
');
+ faltantes.push("tipo_evento");
+ }
+ }
+ //valida datos faltantes, sube el screen y envía una alerta
+ if (faltantes.length > 0 || $("#email").val().length == 0) {
+ $("html, body").animate({ scrollTop: 0 }, "slow");
+ alert("¡Hay campos faltantes!");
+ return;
+ }
+ if($("#email_valida").val() == 1){
+ alert("Datos completos");
+ $('#enviar').attr('disabled','disabled').css({"background-color":"rgb(160,160,160)"}).val("Registrando...");
+ envio_datos();
+ }
+ });
+
+ $("#email").keyup(function () {
+ $("#verify_mail").empty();
+ if ($("#email").val().length == 0) {
+ $("#verify_mail").append('Este campo es requerido.
');
+ return;
+ }
+ if (isValidEmailAddress($("#email").val()))
+ $("#verify_mail").append('Éste parece un correo electrónico válido.
');
+ else{
+ $("#verify_mail").append('Correo electrónico no válido.
');
+ return;
+ }
+ });
+
+ $("#email").focusout(function () {
+ $("#verify_mail").empty();
+ if ($("#email").val().length == 0) {
+ $("#verify_mail").append('Este campo es requerido.
');
+ return;
+ }
+ if (isValidEmailAddress($("#email").val())){
+ $("#verify_mail").append('Éste parece un correo electrónico válido.
');
+ verificar_correo_reg();
+ } else{
+ $("#verify_mail").append('Correo electrónico no válido.
');
+ return;
+ }
+ });
+
+ $('#bt_acceso_admin').click(function (event) {
+ event.preventDefault();
+ var bandera = 0;
+ $(".requerido_admin").empty();
+ if ($.trim($("#usuario_ing").val()).length == 0) {
+ $('#verify_usuario_ing').append("Este campo es requerido.
");
+ bandera = 1;
+ }
+ if ($.trim($("#password_ing").val()).length == 0) {
+ $('#verify_password_ing').append("Este campo es requerido.
");
+ bandera = 1;
+ }
+ if (bandera == 1)
+ return;
+ login_admin();
+ });
+
+ $('.pagado').click(function () {
+ if ($(this).is(":checked")){
+ $.post("sql/validar_pago.php", {id_pagado: $(this).attr("id")}, function (res) {
+ //alert(res);
+ window.location = "monitor.php";
+ });
+ } else {
+ $.post("sql/validar_pago.php", {id_no_pagado: $(this).attr("id")}, function (res) {
+ //alert(res);
+ window.location = "monitor.php";
+ });
+ }
+ });
+ $('.eviarCorreo').click(function(){
+ var checkCorreo = $(this);
+ var spiner = document.getElementsByClassName("spin")[0];
+ spiner.style.display = "block";
+ $.post("sql/enviarCorreo.php", {correo: checkCorreo.data("correo"), enviarCorreo: checkCorreo.is(":checked")}, function (res) {
+ //console.log(res);
+
+ if(res.Success)
+ {
+ alert('El correo envió correo correctamente');
+ }
+ else if(res.Error)
+ {
+ if(res.Error=="Verifique los datos")
+ {
+ document.getElementById('ingresaCorreo').style.display ="block";
+ alert("Verifique los datos, ingrese nuevamente");
+ }
+ else if(res.Error=="Correo")
+ {
+ document.getElementById('ingresaCorreo').style.display ="block";
+ }
+ else
+ {
+ document.getElementById('ingresaCorreo').style.display ="block";
+ alert("Error inesperado, intente nuevamente por favor");
+ }
+ checkCorreo.attr("checked",false);
+ }
+ else if(res.Baja)
+ {
+ if(res.Baja=="Si")
+ {
+ checkCorreo.attr("checked",false);
+ }
+ else
+ {
+ checkCorreo.attr("checked",true);
+ }
+ }
+ spiner.style.display = "none";
+ //window.location = "monitor.php";
+ },'json');
+ })
+});
+
+function actualiza_mesa(id_registro,mesa) {//alert(id_registro);
+ $.post("sql/actualizar_mesa.php",
+ {folio: $("#"+id_registro).attr("id"), mesa: mesa},
+ function (data) {
+ if (data == 1)
+ window.location.reload();
+ else
+ alert("Hay un problema con la asignación de mesas, favor de reportarlo al Departamento de Servicios de Cómputo del CEDETEC.");
+ });
+}
+
+function login_admin(){
+ $.post("sql/ingresar_admin.php", $("#ingresar_administracion").serialize(), function (data) {
+ if (data == 1)
+ window.location = "monitor.php";
+ else
+ $("#verify_password_ing").append("La combinación de usuario y contraseña es incorrecta.
");
+ });
+}
+
+function envio_datos(){
+ $.post("sql/registro.php", $("#registro_desayuno").serialize(), function (id) {//alert(id);
+ if(id != 0){
+ alert("Datos guardados correctamente.");
+ if(id == 1)
+ window.location = "gracias.php";
+ else if(id == 2 || id == 3){
+ window.location.reload(true);
+ }
+ } else {
+ alert("Error en el guardado de los datos.");
+ window.location = "error.php";
+ }
+ return;
+ });
+}
+
+function descargarPDF_boleto(){
+ $.post("sql/descargar.php", $("#seccion_descarga").serialize(), function (email) {//alert(id);
+ if(email != ''){
+ window.location = "boleto.php?email="+email;
+ } else {
+ alert("El correo que escribiste no está registrado.");
+ window.location.reload();
+ }
+ return;
+ });
+}
+
+function verificar_correo_reg() {
+ $.post("sql/verificar_correo.php", {
+ email: $("#email").val()
+ },
+ function (data) {
+ $("#verify_mail").empty();
+ if ($("#email").val().length == 0) {
+ $("#email").focus();
+ $("#verify_mail").append('Este campo es requerido.
');
+ return;
+ }
+ if (data == 1){
+ $("#verify_mail").append('Email identificado.
');
+ //$("html, body").animate({ scrollTop: 0 }, "slow");
+ $("#email_valida").val("1");
+ }
+ else{
+ if (isValidEmailAddress($("#email").val())){
+ $("#verify_mail").append('Este parece un correo electrónico válido.
');
+ $("#email_valida").val("1");
+ }
+ else {
+ $("#verify_mail").append('Correo electrónico no válido.
');
+ $("html, body").animate({ scrollTop: 0 }, "slow");
+ $("#email_valida").val("0");
+ }
+ }
+ });
+}
+
+function isValidEmailAddress(emailAddress) {
+ var pattern = new RegExp(/^((([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(\.([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+)*)|((\x22)((((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(([\x01-\x08\x0b\x0c\x0e-\x1f\x7f]|\x21|[\x23-\x5b]|[\x5d-\x7e]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(\\([\x01-\x09\x0b\x0c\x0d-\x7f]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))))*(((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(\x22)))@((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?$/i);
+ return pattern.test(emailAddress);
+}
diff --git a/public_html/js/quicksand.js b/public_html/js/quicksand.js
new file mode 100644
index 0000000..626f490
--- /dev/null
+++ b/public_html/js/quicksand.js
@@ -0,0 +1,307 @@
+/*
+
+Quicksand 1.2.2
+
+Reorder and filter items with a nice shuffling animation.
+
+Copyright (c) 2010 Jacek Galanciak (razorjack.net) and agilope.com
+Big thanks for Piotr Petrus (riddle.pl) for deep code review and wonderful docs & demos.
+
+Dual licensed under the MIT and GPL version 2 licenses.
+http://github.com/jquery/jquery/blob/master/MIT-LICENSE.txt
+http://github.com/jquery/jquery/blob/master/GPL-LICENSE.txt
+
+Project site: http://razorjack.net/quicksand
+Github site: http://github.com/razorjack/quicksand
+
+*/
+
+(function ($) {
+ $.fn.quicksand = function (collection, customOptions) {
+ var options = {
+ duration: 750,
+ easing: 'swing',
+ attribute: 'data-id', // attribute to recognize same items within source and dest
+ adjustHeight: 'auto', // 'dynamic' animates height during shuffling (slow), 'auto' adjusts it before or after the animation, false leaves height constant
+ useScaling: true, // disable it if you're not using scaling effect or want to improve performance
+ enhancement: function(c) {}, // Visual enhacement (eg. font replacement) function for cloned elements
+ selector: '> *',
+ dx: 0,
+ dy: 0
+ };
+ $.extend(options, customOptions);
+
+ if ($.browser.msie || (typeof($.fn.scale) == 'undefined')) {
+ // Got IE and want scaling effect? Kiss my ass.
+ options.useScaling = false;
+ }
+
+ var callbackFunction;
+ if (typeof(arguments[1]) == 'function') {
+ var callbackFunction = arguments[1];
+ } else if (typeof(arguments[2] == 'function')) {
+ var callbackFunction = arguments[2];
+ }
+
+
+ return this.each(function (i) {
+ var val;
+ var animationQueue = []; // used to store all the animation params before starting the animation; solves initial animation slowdowns
+ var $collection = $(collection).clone(); // destination (target) collection
+ var $sourceParent = $(this); // source, the visible container of source collection
+ var sourceHeight = $(this).css('height'); // used to keep height and document flow during the animation
+
+ var destHeight;
+ var adjustHeightOnCallback = false;
+
+ var offset = $($sourceParent).offset(); // offset of visible container, used in animation calculations
+ var offsets = []; // coordinates of every source collection item
+
+ var $source = $(this).find(options.selector); // source collection items
+
+ // Replace the collection and quit if IE6
+ if ($.browser.msie && $.browser.version.substr(0,1)<7) {
+ $sourceParent.html('').append($collection);
+ return;
+ }
+
+ // Gets called when any animation is finished
+ var postCallbackPerformed = 0; // prevents the function from being called more than one time
+ var postCallback = function () {
+
+ if (!postCallbackPerformed) {
+ postCallbackPerformed = 1;
+
+ // hack:
+ // used to be: $sourceParent.html($dest.html()); // put target HTML into visible source container
+ // but new webkit builds cause flickering when replacing the collections
+ $toDelete = $sourceParent.find('> *');
+ $sourceParent.prepend($dest.find('> *'));
+ $toDelete.remove();
+
+ if (adjustHeightOnCallback) {
+ $sourceParent.css('height', destHeight);
+ }
+ options.enhancement($sourceParent); // Perform custom visual enhancements on a newly replaced collection
+ if (typeof callbackFunction == 'function') {
+ callbackFunction.call(this);
+ }
+ }
+ };
+
+ // Position: relative situations
+ var $correctionParent = $sourceParent.offsetParent();
+ var correctionOffset = $correctionParent.offset();
+ if ($correctionParent.css('position') == 'relative') {
+ if ($correctionParent.get(0).nodeName.toLowerCase() == 'body') {
+
+ } else {
+ correctionOffset.top += (parseFloat($correctionParent.css('border-top-width')) || 0);
+ correctionOffset.left +=( parseFloat($correctionParent.css('border-left-width')) || 0);
+ }
+ } else {
+ correctionOffset.top -= (parseFloat($correctionParent.css('border-top-width')) || 0);
+ correctionOffset.left -= (parseFloat($correctionParent.css('border-left-width')) || 0);
+ correctionOffset.top -= (parseFloat($correctionParent.css('margin-top')) || 0);
+ correctionOffset.left -= (parseFloat($correctionParent.css('margin-left')) || 0);
+ }
+
+ // perform custom corrections from options (use when Quicksand fails to detect proper correction)
+ if (isNaN(correctionOffset.left)) {
+ correctionOffset.left = 0;
+ }
+ if (isNaN(correctionOffset.top)) {
+ correctionOffset.top = 0;
+ }
+
+ correctionOffset.left -= options.dx;
+ correctionOffset.top -= options.dy;
+
+ // keeps nodes after source container, holding their position
+ $sourceParent.css('height', $(this).height());
+
+ // get positions of source collections
+ $source.each(function (i) {
+ offsets[i] = $(this).offset();
+ });
+
+ // stops previous animations on source container
+ $(this).stop();
+ var dx = 0; var dy = 0;
+ $source.each(function (i) {
+ $(this).stop(); // stop animation of collection items
+ var rawObj = $(this).get(0);
+ if (rawObj.style.position == 'absolute') {
+ dx = -options.dx;
+ dy = -options.dy;
+ } else {
+ dx = options.dx;
+ dy = options.dy;
+ }
+
+ rawObj.style.position = 'absolute';
+ rawObj.style.margin = '0';
+
+ rawObj.style.top = (offsets[i].top - parseFloat(rawObj.style.marginTop) - correctionOffset.top + dy) + 'px';
+ rawObj.style.left = (offsets[i].left - parseFloat(rawObj.style.marginLeft) - correctionOffset.left + dx) + 'px';
+ });
+
+ // create temporary container with destination collection
+ var $dest = $($sourceParent).clone();
+ var rawDest = $dest.get(0);
+ rawDest.innerHTML = '';
+ rawDest.setAttribute('id', '');
+ rawDest.style.height = 'auto';
+ rawDest.style.width = $sourceParent.width() + 'px';
+ $dest.append($collection);
+ // insert node into HTML
+ // Note that the node is under visible source container in the exactly same position
+ // The browser render all the items without showing them (opacity: 0.0)
+ // No offset calculations are needed, the browser just extracts position from underlayered destination items
+ // and sets animation to destination positions.
+ $dest.insertBefore($sourceParent);
+ $dest.css('opacity', 0.0);
+ rawDest.style.zIndex = -1;
+
+ rawDest.style.margin = '0';
+ rawDest.style.position = 'absolute';
+ rawDest.style.top = offset.top - correctionOffset.top + 'px';
+ rawDest.style.left = offset.left - correctionOffset.left + 'px';
+
+
+
+
+
+ if (options.adjustHeight === 'dynamic') {
+ // If destination container has different height than source container
+ // the height can be animated, adjusting it to destination height
+ $sourceParent.animate({height: $dest.height()}, options.duration, options.easing);
+ } else if (options.adjustHeight === 'auto') {
+ destHeight = $dest.height();
+ if (parseFloat(sourceHeight) < parseFloat(destHeight)) {
+ // Adjust the height now so that the items don't move out of the container
+ $sourceParent.css('height', destHeight);
+ } else {
+ // Adjust later, on callback
+ adjustHeightOnCallback = true;
+ }
+ }
+
+ // Now it's time to do shuffling animation
+ // First of all, we need to identify same elements within source and destination collections
+ $source.each(function (i) {
+ var destElement = [];
+ if (typeof(options.attribute) == 'function') {
+
+ val = options.attribute($(this));
+ $collection.each(function() {
+ if (options.attribute(this) == val) {
+ destElement = $(this);
+ return false;
+ }
+ });
+ } else {
+ destElement = $collection.filter('[' + options.attribute + '=' + $(this).attr(options.attribute) + ']');
+ }
+ if (destElement.length) {
+ // The item is both in source and destination collections
+ // It it's under different position, let's move it
+ if (!options.useScaling) {
+ animationQueue.push(
+ {
+ element: $(this),
+ animation:
+ {top: destElement.offset().top - correctionOffset.top,
+ left: destElement.offset().left - correctionOffset.left,
+ opacity: 1.0
+ }
+ });
+
+ } else {
+ animationQueue.push({
+ element: $(this),
+ animation: {top: destElement.offset().top - correctionOffset.top,
+ left: destElement.offset().left - correctionOffset.left,
+ opacity: 1.0,
+ scale: '1.0'
+ }
+ });
+
+ }
+ } else {
+ // The item from source collection is not present in destination collections
+ // Let's remove it
+ if (!options.useScaling) {
+ animationQueue.push({element: $(this),
+ animation: {opacity: '0.0'}});
+ } else {
+ animationQueue.push({element: $(this), animation: {opacity: '0.0',
+ scale: '0.0'}});
+ }
+ }
+ });
+
+ $collection.each(function (i) {
+ // Grab all items from target collection not present in visible source collection
+
+ var sourceElement = [];
+ var destElement = [];
+ if (typeof(options.attribute) == 'function') {
+ val = options.attribute($(this));
+ $source.each(function() {
+ if (options.attribute(this) == val) {
+ sourceElement = $(this);
+ return false;
+ }
+ });
+
+ $collection.each(function() {
+ if (options.attribute(this) == val) {
+ destElement = $(this);
+ return false;
+ }
+ });
+ } else {
+ sourceElement = $source.filter('[' + options.attribute + '=' + $(this).attr(options.attribute) + ']');
+ destElement = $collection.filter('[' + options.attribute + '=' + $(this).attr(options.attribute) + ']');
+ }
+
+ var animationOptions;
+ if (sourceElement.length === 0) {
+ // No such element in source collection...
+ if (!options.useScaling) {
+ animationOptions = {
+ opacity: '1.0'
+ };
+ } else {
+ animationOptions = {
+ opacity: '1.0',
+ scale: '1.0'
+ };
+ }
+ // Let's create it
+ d = destElement.clone();
+ var rawDestElement = d.get(0);
+ rawDestElement.style.position = 'absolute';
+ rawDestElement.style.margin = '0';
+ rawDestElement.style.top = destElement.offset().top - correctionOffset.top + 'px';
+ rawDestElement.style.left = destElement.offset().left - correctionOffset.left + 'px';
+ d.css('opacity', 0.0); // IE
+ if (options.useScaling) {
+ d.css('transform', 'scale(0.0)');
+ }
+ d.appendTo($sourceParent);
+
+ animationQueue.push({element: $(d),
+ animation: animationOptions});
+ }
+ });
+
+ $dest.remove();
+ options.enhancement($sourceParent); // Perform custom visual enhancements during the animation
+ for (i = 0; i < animationQueue.length; i++) {
+ animationQueue[i].element.animate(animationQueue[i].animation, options.duration, options.easing, postCallback);
+ }
+ });
+ };
+})(jQuery);
\ No newline at end of file
diff --git a/public_html/js/tabs.js b/public_html/js/tabs.js
new file mode 100644
index 0000000..4cd6940
--- /dev/null
+++ b/public_html/js/tabs.js
@@ -0,0 +1,283 @@
+/**
+ * @license
+ * jQuery Tools 1.2.5 Tabs- The basics of UI design.
+ *
+ * NO COPYRIGHTS OR LICENSES. DO WHAT YOU LIKE.
+ *
+ * http://flowplayer.org/tools/tabs/
+ *
+ * Since: November 2008
+ * Date: Wed Sep 22 06:02:10 2010 +0000
+ */
+(function($) {
+
+ // static constructs
+ $.tools = $.tools || {version: '1.2.5'};
+
+ $.tools.tabs = {
+
+ conf: {
+ tabs: 'a',
+ current: 'current',
+ onBeforeClick: null,
+ onClick: null,
+ effect: 'default',
+ initialIndex: 0,
+ event: 'click',
+ rotate: false,
+
+ // 1.2
+ history: false
+ },
+
+ addEffect: function(name, fn) {
+ effects[name] = fn;
+ }
+
+ };
+
+ var effects = {
+
+ // simple "toggle" effect
+ 'default': function(i, done) {
+ this.getPanes().hide().eq(i).show();
+ done.call();
+ },
+
+ /*
+ configuration:
+ - fadeOutSpeed (positive value does "crossfading")
+ - fadeInSpeed
+ */
+ fade: function(i, done) {
+
+ var conf = this.getConf(),
+ speed = conf.fadeOutSpeed,
+ panes = this.getPanes();
+
+ if (speed) {
+ panes.fadeOut(speed);
+ } else {
+ panes.hide();
+ }
+
+ panes.eq(i).fadeIn(conf.fadeInSpeed, done);
+ },
+
+ // for basic accordions
+ slide: function(i, done) {
+ this.getPanes().slideUp(200);
+ this.getPanes().eq(i).slideDown(400, done);
+ },
+
+ /**
+ * AJAX effect
+ */
+ ajax: function(i, done) {
+ this.getPanes().eq(0).load(this.getTabs().eq(i).attr("href"), done);
+ }
+ };
+
+ var w;
+
+ /**
+ * Horizontal accordion
+ *
+ * @deprecated will be replaced with a more robust implementation
+ */
+ $.tools.tabs.addEffect("horizontal", function(i, done) {
+
+ // store original width of a pane into memory
+ if (!w) { w = this.getPanes().eq(0).width(); }
+
+ // set current pane's width to zero
+ this.getCurrentPane().animate({width: 0}, function() { $(this).hide(); });
+
+ // grow opened pane to it's original width
+ this.getPanes().eq(i).animate({width: w}, function() {
+ $(this).show();
+ done.call();
+ });
+
+ });
+
+
+ function Tabs(root, paneSelector, conf) {
+
+ var self = this,
+ trigger = root.add(this),
+ tabs = root.find(conf.tabs),
+ panes = paneSelector.jquery ? paneSelector : root.children(paneSelector),
+ current;
+
+
+ // make sure tabs and panes are found
+ if (!tabs.length) { tabs = root.children(); }
+ if (!panes.length) { panes = root.parent().find(paneSelector); }
+ if (!panes.length) { panes = $(paneSelector); }
+
+
+ // public methods
+ $.extend(this, {
+ click: function(i, e) {
+
+ var tab = tabs.eq(i);
+
+ if (typeof i == 'string' && i.replace("#", "")) {
+ tab = tabs.filter("[href*=" + i.replace("#", "") + "]");
+ i = Math.max(tabs.index(tab), 0);
+ }
+
+ if (conf.rotate) {
+ var last = tabs.length -1;
+ if (i < 0) { return self.click(last, e); }
+ if (i > last) { return self.click(0, e); }
+ }
+
+ if (!tab.length) {
+ if (current >= 0) { return self; }
+ i = conf.initialIndex;
+ tab = tabs.eq(i);
+ }
+
+ // current tab is being clicked
+ if (i === current) { return self; }
+
+ // possibility to cancel click action
+ e = e || $.Event();
+ e.type = "onBeforeClick";
+ trigger.trigger(e, [i]);
+ if (e.isDefaultPrevented()) { return; }
+
+ // call the effect
+ effects[conf.effect].call(self, i, function() {
+
+ // onClick callback
+ e.type = "onClick";
+ trigger.trigger(e, [i]);
+ });
+
+ // default behaviour
+ current = i;
+ tabs.removeClass(conf.current);
+ tab.addClass(conf.current);
+
+ return self;
+ },
+
+ getConf: function() {
+ return conf;
+ },
+
+ getTabs: function() {
+ return tabs;
+ },
+
+ getPanes: function() {
+ return panes;
+ },
+
+ getCurrentPane: function() {
+ return panes.eq(current);
+ },
+
+ getCurrentTab: function() {
+ return tabs.eq(current);
+ },
+
+ getIndex: function() {
+ return current;
+ },
+
+ next: function() {
+ return self.click(current + 1);
+ },
+
+ prev: function() {
+ return self.click(current - 1);
+ },
+
+ destroy: function() {
+ tabs.unbind(conf.event).removeClass(conf.current);
+ panes.find("a[href^=#]").unbind("click.T");
+ return self;
+ }
+
+ });
+
+ // callbacks
+ $.each("onBeforeClick,onClick".split(","), function(i, name) {
+
+ // configuration
+ if ($.isFunction(conf[name])) {
+ $(self).bind(name, conf[name]);
+ }
+
+ // API
+ self[name] = function(fn) {
+ if (fn) { $(self).bind(name, fn); }
+ return self;
+ };
+ });
+
+
+ if (conf.history && $.fn.history) {
+ $.tools.history.init(tabs);
+ conf.event = 'history';
+ }
+
+ // setup click actions for each tab
+ tabs.each(function(i) {
+ $(this).bind(conf.event, function(e) {
+ self.click(i, e);
+ return e.preventDefault();
+ });
+ });
+
+ // cross tab anchor link
+ panes.find("a[href^=#]").bind("click.T", function(e) {
+ self.click($(this).attr("href"), e);
+ });
+
+ // open initial tab
+ if (location.hash && conf.tabs == "a" && root.find("[href=" +location.hash+ "]").length) {
+ self.click(location.hash);
+
+ } else {
+ if (conf.initialIndex === 0 || conf.initialIndex > 0) {
+ self.click(conf.initialIndex);
+ }
+ }
+
+ }
+
+
+ // jQuery plugin implementation
+ $.fn.tabs = function(paneSelector, conf) {
+
+ // return existing instance
+ var el = this.data("tabs");
+ if (el) {
+ el.destroy();
+ this.removeData("tabs");
+ }
+
+ if ($.isFunction(conf)) {
+ conf = {onBeforeClick: conf};
+ }
+
+ // setup conf
+ conf = $.extend({}, $.tools.tabs.conf, conf);
+
+
+ this.each(function() {
+ el = new Tabs($(this), paneSelector, conf);
+ $(this).data("tabs", el);
+ });
+
+ return conf.api ? el: this;
+ };
+
+}) (jQuery);
+
+
diff --git a/public_html/monitor.php b/public_html/monitor.php
new file mode 100644
index 0000000..abcc37d
--- /dev/null
+++ b/public_html/monitor.php
@@ -0,0 +1,402 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
Enviando
+ .
+ .
+ .
+
+
+
+
+prepare('call st_traer_BD()');
+ $resultado->execute();
+ $datos = $resultado->fetchAll();
+ $dbo = null;
+ return $datos;
+}
+$BD_1 = traer_BD_1();
+$BD_2 = traer_BD_2();
+if($BD_1['database()'] == $BD_2[0]['database()']){
+ $pos = strpos($BD_1['database()'], 'orion');
+ if($pos === false) $aviso = "";
+ else $aviso = "Apunta a BD de pruebas.";
+} else $aviso = "Las conexiones están mezcladas, revisar conexiones a las BD.";
+?>
+
diff --git a/public_html/muestra_querys.php b/public_html/muestra_querys.php
new file mode 100644
index 0000000..9f627da
--- /dev/null
+++ b/public_html/muestra_querys.php
@@ -0,0 +1,9 @@
+addStringAttachment($pdf->Output('', 'S'), 'message.pdf', "base64", 'application/pdf');
+
+?>
\ No newline at end of file
diff --git a/public_html/php/enviarCorreo.php b/public_html/php/enviarCorreo.php
new file mode 100644
index 0000000..f3f50a2
--- /dev/null
+++ b/public_html/php/enviarCorreo.php
@@ -0,0 +1,4 @@
+
\ No newline at end of file
diff --git a/public_html/php/footer.php b/public_html/php/footer.php
new file mode 100644
index 0000000..6382d7d
--- /dev/null
+++ b/public_html/php/footer.php
@@ -0,0 +1,22 @@
+
+
+
Hecho en México, todos los derechos reservados . Esta página puede ser reproducida con fines no lucrativos, siempre y cuando no se mutile, se cite la fuente completa y su dirección electrónica. De otra forma requiere permiso previo por escrito de la institución.
+
+Centro de Desarrollo Tecnológico - Departamento de Servicios de Cómputo - Facultad de Estudios Superiores Acatlán
+
+
+
Aviso de privacidad
+
+
+
+
+
+
+
+
+
+
+
+
+
+