﻿<!--

/*
* Copyright (c)2010 Petr Koci, Czech Republic
* homepage: http://www.txtester.com
*/

if(!window['txtester']){
	window['txtester']={};
	txtester.Error=function(mycode,mymessage){
		this.code=mycode || -1;
		this.message=mymessage || "This error has no a description.";
	}
}

if(!window['txtester']['chordtrans']){

	window['txtester']['chordtrans']={};

/*
* txtester.chordtrans.transpose()
*/
	txtester.chordtrans.transpose=function(text,param1,splitchar,scaleid,fc){

		var result=function(){
			this.error=false;
			this.errnum=0;
			this.text="";
			this.arr=null;
		};

		var strTon;
		var strAkord="";
		var strZnak="";
		var intPocetPultonu=0;
		var intPozice=0;
		var intTonPozice=0;
		var i=0;
		var bolSmerNastaven=false;
		var strVysledek="";

		var arrStupnice=new Array(12);
		arrStupnice[0]=new Array("C*","C*");
		arrStupnice[1]=new Array("Db","C#");
		arrStupnice[2]=new Array("D*","D*");
		arrStupnice[3]=new Array("Eb","D#");
		arrStupnice[4]=new Array("E*","E*");
		arrStupnice[5]=new Array("F*","F*");
		arrStupnice[6]=new Array("Gb","F#");
		arrStupnice[7]=new Array("G*","G*");
		arrStupnice[8]=new Array("Ab","G#");
		arrStupnice[9]=new Array("A*","A*");
		arrStupnice[10]=new Array("Hb","A#");
		arrStupnice[11]=new Array("H*","H*");

		//kontrola param1
		var interr=m_param1_ctrl(param1)
		if(interr!=0){
			result.error=true;
			result.errnum=interr;
			fc(result);
			return;
		}

		//kontrola deliciho znaku
		splitchar=splitchar.toString();
		interr=m_splitchar_ctrl(splitchar);
		if(interr!=0){
			result.error=true;
			result.errnum=interr;
			fc(result);
			return;
		}

		//kontrola stupnice
		interr=m_stupnice_ctrl(scaleid)
		if(interr!=0){
			result.error=true;
			result.errnum=interr;
			fc(result);
			return;
		}

		// proměnnou inttext zbavím mezer
		var arrAkordy=text.split(" ");
		text="";
		for (i=0; i<arrAkordy.length;i++){
  			text+=arrAkordy[i];
		}

		//kontrola textu s akordy
		if(text==""){
			result.error=true;
			result.errnum=40;
			fc(result);
			return;
		}

		//rozsekani textu podle deliciho znaku
		arrAkordy=text.split(splitchar);

		//smycka postupne zpracuje kazdy segment s akordem
		for (i=0; i<arrAkordy.length;i++){

			strAkord=arrAkordy[i];

  			// převede platné tóny s neplatnou syntaxí na platné
  			strAkord=m_korekce(strAkord);

 			 // u celých tónů přidá znak "*"
  			strAkord=m_uprav_akord(strAkord);

			  // pozice akordu ve stupnici - pokud je výsledek = 0, je uživatelem zadán nesmyslný akord
			intPozice=m_najdi_id_akordu(strAkord,arrStupnice);

			if (intPozice<0){
    				strAkord=m_korekce_hvezdy(strAkord);
    				if (strAkord=="*"){
      					strAkord="";
      				}
    				else{
					strAkord="[" + strAkord + "]";
      				}
    			}
  			else{

 				//definování intPocetPultonu při první platné smyčce
    				if (!bolSmerNastaven){
      					if (param1>11) {
        						strTon=arrStupnice[param1-12][1];
        						intTonPozice=m_najdi_id_akordu(strTon,arrStupnice);
        						intPocetPultonu=intTonPozice-intPozice;
      					}
      					else {
        						intPocetPultonu=param1;
      					}
      					bolSmerNastaven=true;
    				}

				intPozice=intPozice+intPocetPultonu;

				if(intPozice>11)intPozice=intPozice-12;
				if (intPozice<0) intPozice=12-(intPozice*(-1));

				strAkord=arrStupnice[intPozice][scaleid] + strAkord.substr(2,strAkord.length-2)
				strAkord=m_korekce_hvezdy(strAkord);
			}
			arrAkordy[i]=strAkord;
		}//for

		result.arr = arrAkordy;

		//zretezeni pole akordu a deliciho znaku do textu
		for (i=0; i<arrAkordy.length;i++){
  			strVysledek+=arrAkordy[i] + splitchar;
		}

		result.text =strVysledek;
		fc(result);


		function m_uprav_akord(strAkord){
			var strZnak="";
			var intLen=strAkord.length;

			if(intLen==1)return(strAkord += "*");

			strZnak=strAkord.substr(1,1)
			switch(strZnak.toLowerCase()){
				case "b":
					//písmeno b nebo B vždy přepíšu na b 
      					strAkord=strAkord.substr(0,1) + "b" + strAkord.substr(2,intLen-2);
      					break;
    				case "#":break;
				case "*":break;
    				default:
      					strAkord=strAkord.substr(0,1) + "*" + strAkord.substr(1,intLen-1);
  			}
  			return(strAkord);
		}//m_uprav_akord

		function m_najdi_id_akordu(strAkord, arrStupnice){
			var intPar2=0;
			var i=0;
			var strAkordCast="";
			var strAkordStupnice="";
 
			if(strAkord.substr(1,1)=="#") intPar2=1;

			strAkordCast=strAkord.substr(0,2);
			for(i=0;i<12;i++){
				strAkordStupnice=arrStupnice[i][intPar2];
				if(strAkordCast.toUpperCase() == strAkordStupnice.toUpperCase()) return(i);
			}
			return(-1);
		}//m_najdi_id_akordu

		function m_korekce(strAkord){
  			var strText=strAkord.substr(0,2)
  			switch(strText.toUpperCase()){
    				case "E#":
      					strText="F*";
      					break;
    				case "B#":
      					strText="H*";
      					break;
    				case "H#":
      					strText="C*";
      					break;
    				case "CB":
      					strText="H*";
      					break;
    				case "BB":
      					strText="A*";
      					break;
    				case "FB":
      					strText="E*";
      					break;
    				default:
      					strText=strText;
  			}
	 		strAkord=strText + strAkord.substr(2,strAkord.length - 2);
  			strText=strAkord.substr(0,1);
  			if (strText.toUpperCase()=="B") strAkord="A#" + strAkord.substr(1,strAkord.length - 1);
  			return(strAkord);
		}//m_korekce

		function m_korekce_hvezdy(strAkord){
			if(strAkord.substr(1,1)=="*")strAkord=strAkord.substr(0,1) + strAkord.substr(2,strAkord.length-2);
			return(strAkord);
		}

		function m_param1_ctrl(intParam1){
			if (intParam1<-11) return(10);
			if (intParam1==0) return(11);
			if (intParam1>23) return(12);
			return(0);
		}

		function m_splitchar_ctrl(strChar){
			if (strChar==",") return(0);
			if (strChar=="-") return(0);
			if (strChar=="/") return(0);
			if (strChar==";") return(0);
			if (strChar=="") return(20);
			return(21);
		}

		function m_stupnice_ctrl(id){
			if (id==0) return(0);
			if (id==1) return(0);
			return(30);
		}


	}//txtester.chordtrans.transpose

};//if(!window['txtester']['chordtrans'])

-->