/*
 * S2pBoxator - to skrypt generujący dynamicznie tabele z zajawkami artykułów pism branżowych firmy ProMedia ( www.pws-promedia.pl ). 
 * Skrypt opiera się na technologii Ajax, i żeby działał poprawnie przeglądarka musi mieć zaimplementowaną i nie zablokowaną możliwość
 * korzystania z tej technologii. 
 *
 * Kontakt z autorem: przemek@pws-promedia.pl
 */






/*
 * Konfiguracja domyslna
 */
ilosc_artykulow = 1;			// Ilość wyświetlanych zajawek artykulów
dlugosc_tekstu = 50;			// Dlugość zajawki artykułu
nazwa_portal = 'hotelarz';		// Czasopismo, z którego wyświetlane są zajawki artykułów
arr_url_portal = new Array();

arr_url_portal['hotelarz'] = 'http://www.e-hotelarz.pl';
arr_url_portal['rynek_turystyczny'] = 'http://www.rynekturystyczny.pl';
arr_url_portal['polski_jubiler'] = 'http://www.polskijubiler.pl';

url_xml_file = '';


// initialize XMLHttpRequest object
var xmlobj=null;
var data=new Array();


/************************************************
 * FUNKCJE POMOCNICZE WYKORZYSTYWANE W SKRYPCIE:
 ************************************************/

/*
 * Stripslashes - odpowiednik funkcji stripslashes() z PHP
 */
function stripslashes( str ) { 
	return str.replace(/\\0/g, '\0').replace(/\\(.)/g, '$1'); 
}

/*
 * Trim - odpowiednik funkcji trim() z PHP
 */
function trim( str ) { 
	return str.replace(/(^[\s\xA0]+|[\s\xA0]+$)/g, ''); 
}


/*
 * Funkcja sortujaca tablice liczb (wykorzystywana przy wyszukiwaniu dlugosci skrotu tekstu)
 */
function sortNumber(a,b) { 
	return a - b; 
}


/*
 * Funkcja losująca z podanej tablicy wybraną ilość elementów 
 * i zwracająca tablicę z wylosowanymi elementami 
 */
function array_rand ( input, num_req ) {
    // Pick one or more random entries out of an array
    // 
    // +    discuss at: http://kevin.vanzonneveld.net/techblog/article/javascript_equivalent_for_phps_array_rand/
    // +       version: 802.323
    // +   original by: _argos
    // *     example 1: array_rand( ['Kevin'], 1 );
    // *     returns 1: 0

    var Indexes = [];
    var Ticks = num_req || 1;
    var Check = {
        Duplicate    : function ( input, value ) {
            var Exist = false, Index = 0;
            while ( Index < input.length ) {
                if ( input [ Index ] === value ) {
                    Exist = true;
                    break;
                }
                Index++;
            }
            return Exist;
        }
    };

    if ( input instanceof Array && Ticks <= input.length ) {
        while ( true ) {
            var Rand = Math.floor ( ( Math.random ( ) * input.length ) );
            if ( Indexes.length === Ticks ) { break; }
            if ( !Check.Duplicate ( Indexes, Rand ) ) { Indexes.push ( Rand ); }
        }
    } else {
        Indexes = null;
    }

    return ( ( Ticks == 1 ) ? Indexes.join ( ) : Indexes );
}


/*
 * Funkcja sprawdzanie czy element znajduje sie w tablicy
 */
function in_array(needle, haystack, strict) {
    var found = false, key, strict = !!strict;
    for (key in haystack) {
        if ((strict && haystack[key] === needle) || (!strict && haystack[key] == needle)) { found = true; break; }
    }
    return found;
}

/***************************************************
 *  /  FUNKCJE POMOCNICZE WYKORZYSTYWANE W SKRYPCIE:
 ***************************************************/



/************************************************
 * FUNKCJE GŁÓWNE (AJAX):
 ************************************************/

/*
 * AJAX :: Send HTTP request
 */
function sendRequest(doc){
    // check for existing requests
    if(xmlobj!=null&&xmlobj.readyState!=0&&xmlobj.readyState!=4){
        xmlobj.abort();
    }
    try{ 
    	// instantiate object for Mozilla, Nestcape, etc.
    	xmlobj=new XMLHttpRequest(); 
    }
    catch(e){
        try{
         	// instantiate object for Internet Explorer
			xmlobj=new ActiveXObject('Microsoft.XMLHTTP');
        }
        catch(e){
            // Ajax is not supported by the browser
            xmlobj=null;
            return false;
        }
    }
    // assign state handler
    xmlobj.onreadystatechange=stateChecker;
    // open socket connection
    xmlobj.open('GET',doc,true);
    // send GET request
    xmlobj.send(null);
}


/*
 * AJAX :: check request status
 */
function stateChecker(){
    // if request is completed
    if(xmlobj.readyState==4){
        // if status == 200 display text file
        if(xmlobj.status==200){
            createDataContainer(); // create data container
            data=xmlobj.responseXML.getElementsByTagName('artykul'); // read XML data
            displayData(); // display XML data
        }
        else{ alert('S2pBoxator :: Failed to get response :'+ xmlobj.statusText + '\n\nProsimy zgłosić błąd na adres przemek@pws-promedia.pl'); }
    }
}


/*
 * AJAX :: create data container
 */
function createDataContainer(){
    var div=document.getElementById('boxator-container-'+nazwa_portal);
    if(div){return};
    var div=document.createElement('div');
    div.setAttribute('id','boxator-container-'+nazwa_portal);
    div.setAttribute('title',arr_url_portal[nazwa_portal]);
    document.getElementById( 's2p-dlska432ee-boxator-' + nazwa_portal ).appendChild(div);
}




/*
 * AJAX :: display data at a given time interval
 */
function displayData(){
    // reset data container
    document.getElementById('boxator-container-'+nazwa_portal).innerHTML='';
    document.getElementById('boxator-container-'+nazwa_portal).innerHTML='<div id="boxator-header" style="padding: 3px 0px;"><a title="'+arr_url_portal[nazwa_portal]+'" href="'+arr_url_portal[nazwa_portal]+'" style="display: block; text-align: center;" target="_blank"><img src="http://www.boxator.pws-promedia.pl/images/logo-'+nazwa_portal+'.gif" border="0"></a></div>' + '<div id="boxator-header"><a title="'+arr_url_portal[nazwa_portal]+'" href="'+arr_url_portal[nazwa_portal]+'" target="_blank" id="boxator-naglowek">w najnowszym numerze:</a></div>'
    
    var ul=document.createElement('ul');
    
    
    // Budowanie tablicy z lista (kluczy tablicy elementow z pliku xml) artykulow do wylosowania 
    arr_data = new Array();
    for(var i=0;i<data.length;i++) { arr_data.push(i); }
    // Losowanie artykulow do wyswietlenia
    tmp_data = array_rand( arr_data, ilosc_artykulow );
    
    // Inicjacja zmiennych 
    var str_title = "";
    var str_contents = "";
    var str_url = "";
    var str_last_char = "";
    
    // Znaki, ktore moga konczyc skrocony tekst
    var arr_shortcut_end_chars = new Array( ' ', ',', '.', '?', '!', ';', '-' );  
    
    // alert(data.length);
    for(var i=0;i<data.length;i++){

		// Sprawdzanie czy element zostal wylosowany do wyswietlenia
		if ( in_array( i, tmp_data ) ) {

		// Przypisywanie wartosci z pliku XML zajawkom artykulow do wyswietlenia
	        str_url = trim( data[i].getElementsByTagName('url')[0].firstChild.nodeValue );
	        str_title = trim( stripslashes( data[i].getElementsByTagName('tytul')[0].firstChild.nodeValue ) );
	        str_contents = trim( stripslashes( data[i].getElementsByTagName('tresc')[0].firstChild.nodeValue ) );
	        // str_title  = 'test title';
	        // str_contents = 'test tresc';

// alert( "i:"+i+"\n\n"+data[i].getElementsByTagName('tytul')[0].firstChild.nodeValue );
			// Budowanie tablicy z pozycjami ostatnich wybranych znakow uzywanych do skracania tekstu  
			var arr_cut_pos = new Array();
			for (var j = 0; j < arr_shortcut_end_chars.length; j++ ) {
				arr_cut_pos.push(str_contents.lastIndexOf(arr_shortcut_end_chars[j], dlugosc_tekstu) );
			}
			
			// Sortowanie tablicy
			arr_cut_pos.sort(sortNumber);
			// Odwrocenie kierunku sortowania w tablicy (od najwiekszej do najmniejszej liczby)
			arr_cut_pos.reverse();
			// Pierwszym elementem tablicy jest najwyzsza liczba, ktora oznacza dlugosc tekstu 
			int_cut_pos = arr_cut_pos[0];
		
			// Spradzanie czy na końcu linii nie został znak specjalny
			if ( int_cut_pos != str_contents.lastIndexOf(' ', dlugosc_tekstu) ) int_cut_pos = int_cut_pos - 1;
			
			// Skaracanie tekstu
			str_contents = trim( str_contents.substr( 0, int_cut_pos ) );
	        
	        // Sprawdzenie ostatniego znaku tekstu
	        str_last_char = str_contents.charAt(str_contents.length-1);
	        if ( in_array(str_last_char, arr_shortcut_end_chars) ) {
	        	str_contents = trim( str_contents.substr( 0, int_cut_pos - 1) );
	        }

			// Tworzenie obiektow DOM (element listy oraz link) 	        
	        var li=document.createElement('li');
	        var a=document.createElement('a');
	        
			// Przypisywanie wartosci utworzonym obiektom
	        a.setAttribute('href', str_url );       
	        a.setAttribute('id', 'boxator-tytul' );
	        a.appendChild(document.createTextNode( str_title + ". ") );
	        a.setAttribute('boxator-tytul', 'boxator-tytul' );
	        li.appendChild(a);
	        
			a=document.createElement('a');
	        a.setAttribute('href',str_url );
	        a.appendChild(document.createTextNode( str_contents + "..." ));
	        a.setAttribute('id', 'boxator-tekst' );
	        li.appendChild(a);
	        
	        ul.appendChild(li);
		}

    }
    
              
    document.getElementById('boxator-container-'+nazwa_portal).appendChild(ul);

	str_www = arr_url_portal[nazwa_portal];
	str_www = str_www.replace( 'http://', '' );
	
    document.getElementById('boxator-container-'+nazwa_portal).innerHTML += '<div id="boxator-footer" style="padding: 1px 0px;"><a title="'+arr_url_portal[nazwa_portal]+'" href="'+arr_url_portal[nazwa_portal]+'" style="display: block; text-align: center;" target="_blank" id="boxator-stopka">'+str_www+'</a></div>'

    // update headlines each 1 hour
    // setTimeout("sendRequest( url_xml_file )",5*1000);
}


/*
 * Funkcja inicjujaca rządanie wyświetlenia boxu z zajawkami artykulow.
 * Wartosciami tej funkcji klient może regulować długość i ilość wyświetlanych artykułów dla wybranego portalu.
 */
function S2pBoxator( str_nazwa_portal, int_ilosc_artykulow, int_dlugosc_tekstu ) {

	// url_xml_file = "http://boxator.pws-promedia.pl/boxator/xml/"+str_nazwa_portal+".xml";
	// arr_url_portal[str_nazwa_portal]+
	url_xml_file = "/boxator/xml/"+str_nazwa_portal+".xml";
	
	if ( int_ilosc_artykulow > 20 ) int_ilosc_artykulow = 20; // Maksymalna ilosc artykulow to 30 
	else ilosc_artykulow = int_ilosc_artykulow;
	
	if ( int_dlugosc_tekstu > 300 ) dlugosc_tekstu = 300;
	else dlugosc_tekstu = int_dlugosc_tekstu;
	
	nazwa_portal = str_nazwa_portal;

	// Wysłanie żądania wygenerowania boxu na podstawie pliku XML
	if(document.getElementById&&document.getElementsByTagName&&document.createElement){
        sendRequest( url_xml_file );
    }

}


/************************************************
 *  /  FUNKCJE GŁÓWNE (AJAX):
 ************************************************/