/** @fileoverview Funkcje przydatne w biurach prasowych.
 * 
 * @version 1.0 
*/

/** @namespace */
var NETPR = NETPR||{};

/** @namespace */
NETPR = (function() {
    "use strict";
    
    var commons = {};
    
    function initialize(passed) {        
        commons = $.extend(true,commons,passed);       
    }
    
    function getCommons() {
        return commons;
    }
    
    function log(msg){
        if(typeof console!=="undefined") {
            console.log(msg);
        }
    }
    
    //jquery tmpl template compilation
    function compileTemplate(name,tmpl) {
        var t = tmpl;

        //check if template format is an array
        if(t instanceof Array) {t = t.join("");}

        //compile template
        $.template(name,t);                
    }
    
    
    /**
    * Pobiera plik json z okreÅ›lonymi parametrami.
    * @param {String} url Adres pliku jsona.
    * @param params Parametry jsona.
    * @param {Function} callback Funkcja do wywoÅ‚ania po udanym pobraniu jsona.
    */
    function getJson(url,params,callback) {
        $.getJSON(url,params).success(function(data){
            callback(data);
        }).error(function(){
            log("Nie udaÅ‚o siÄ™ pobraÄ‡ pliku json");
        });
    }
    
    function getTagsCloud(params) {
        var defaults = {
            element: $("body"),
            insert: function(obj) {
                $("body").prepend(obj);
            },
            params: {
                clientId: commons.id,                
                lang: commons.lang
            },
            tmpl: {
                cls: "", //??
                url: "", //??
                html: ['<div class="tag power-${$item.tagPower(count)}"><a href="/'+commons.lang.toLowerCase()+'/releases?tag_s=${$item.encode(tag)}">${tag} (${count})</a></div>']
            }
        };
        
        var extendedParams = $.extend(true,defaults,params);
        
        function callback(data) {
            var tmpl;
            
            compileTemplate("myTemplate",extendedParams.tmpl.html);
            
            tmpl = $.tmpl("myTemplate",data,{
                tagPower: function(count){
                    if (count<3) {
                        return 1;
                    } else if (count>2 && count<7) {
                        return 2;
                    } else if (count>6 && count<10) {
                        return 3;
                    } else if (count>9 && count<13) {
                        return 4;
                    } else if (count>12 && count<16) {
                        return 5;
                    } else {
                        return 6;
                    }
                },
                encode: function(tag) {
                    return encodeURI(tag);
                }
            });
            
            if(typeof params.insert!=="undefined") {
                extendedParams.insert(tmpl);
            } else {
                extendedParams.element.append(tmpl);
            }
        }
        
        getJson("http://media.netpr.pl/getTagCloud.jsn?jsonp_callback=?",extendedParams.params,callback);
        
    }
    
    function getReleases(params) {
        /** @private */
        var defaults = {
            element: $("body"),
            insert: function(obj) {
                $("body").prepend(obj);
            },
            more: {
                pl: "wiêcej",
                en: "more"
            },
            params: {
                client: commons.id,
                offset: 0,
                count: 1,
                lang: commons.lang,
                verbose: false
            },
            tmpl: {
                cls: "",
                url: "",
                html: ['<div class="${$item.releaseClass(id)}">',
                            '<h1><a href="${url}" title="${title}">${title}</a></h1>',
                            '<div class="date">${$item.formatDate(publishedDate)}</div>',
                            '<div class="categories">',
                                '{{each(i, category) categories}}',
                                    '<a class="cat-${category.id}" href="/${$item.lowerCase(category.lang)}/releases/${category.id}" title="${category.description}">${category.description}</a>',
                                '{{/each}}',
                            '</div>',
                            '<div class="lead">${lead}</div>',
                            '<p class="more"><a href="${url}" title="${title}">${$item.morePhrase(id)}</a></p>',
                    '</div>']
            }
        };
        
        var extendedParams = $.extend(true,defaults,params);
        
        function callback(data) {
            var tmpl;
            
            //execute template compilation
            compileTemplate("myTemplate",extendedParams.tmpl.html);
            
            tmpl = $.tmpl("myTemplate",data,{
                releaseClass: function(id) {
                    var cls = "release release-"+id+" "+extendedParams.tmpl.cls;
                    return cls;
                },
                morePhrase: function() {
                    return extendedParams.more[commons.lang.toLowerCase()];
                },
                lowerCase: function(s) {
                    return s.toLowerCase();
                },
                formatDate: function(date){
                    var d = new Date(date);
                    var m = d.getMonth() + 1;
                    
                    function addZero(n) {
                        if(n<10) {
                            return "0"+n;
                        } else {
                            return n;
                        }
                    }
                    
                    return addZero(d.getDate())+"."+addZero(m)+"."+d.getFullYear();
                }
            });
            
            if(typeof params.insert!=="undefined") {
                extendedParams.insert(tmpl);
            } else {
                extendedParams.element.append(tmpl);
            }
        }
        
        getJson("http://media.netpr.pl/pressReleaseGenerator?jsonp_callback=?",extendedParams.params,callback);
    }
    
    function getCategories(params) {
        var defaults = {
            element: $("body"),
            insert: function(obj) {
                $("body").append(obj);
            },
            domain: commons.domain,                        
            params: {
                showFiles: "no",
                client: commons.id
            },
            depth: 20,
            showEmpty: true,
            include: [],
            exclude: [],
            tmpl: {
                cls: "",
                url: "",
                html: [
                    '<li class="${$item.folderClass(id)}">',
                        '<a href="${$item.lowerCase(path)}" title="${name}">${name}</a>',                        
                    '</li>'
                ]
            },
            callback: function(){}
        };
        
        var extendedParams = $.extend(true,defaults,params);
        
        function callback(data) {
            var tmpl, folders = [];
            
            function isEmpty(folder) {                
                if(folder.folders.length===0&&folder.files.length===0) {
                    return true;
                } else {
                    return false;
                }
            }
            
            function isIncluded(folder) {
                var includeArr = extendedParams.include;
                var position, ret = false;
                
                $.each(includeArr,function(i){
                    if(includeArr[i]===folder.id) {
                        ret = true;
                        position = i;
                    }
                    return (includeArr[i]!==folder.id);
                });
                
                function getPosition() {
                    return position;
                }
                
                function getAnswer() {
                    return ret;
                }
                
                return {
                    position: getPosition,
                    answer: getAnswer
                };
            }
            
            function isExcluded(folder) {
                var excludeArr = extendedParams.exclude;
                var ret = false;
                
                $.each(excludeArr,function(i){
                    if(excludeArr[i]===folder.id) {ret = true;}
                    return (excludeArr[i]!==folder.id);
                });
                
                return ret;
            }
            
            function loopFolders() {
                $.each(data,function(i){
                    var current = data[i];
                    
                    if(isEmpty(current)&&extendedParams.showEmpty||!isEmpty(current)) {
                        if((isIncluded(current).answer()||extendedParams.include.length===0)&&(!isExcluded(current)||extendedParams.exclude.length===0)) {
                            if(extendedParams.include.length!==0) {
                                folders[isIncluded(current).position()] = current;
                            } else {
                                folders.push(current);
                            }
                            
                        }
                    }
                });
            }
            
            loopFolders();

            //execute template compilation
            compileTemplate("myTemplate",extendedParams.tmpl.html);

            tmpl = $.tmpl("myTemplate",folders,{
                folderClass: function(folderId) {                    
                    var cls = "category category-"+folderId+" "+extendedParams.tmpl.cls;
                    return cls;
                },
                lowerCase: function(s) {
                    return s.toLowerCase();
                }
            });
            
            extendedParams.insert(tmpl);

            extendedParams.callback();
        }
    
        getJson("http://biuroprasowe.netpr.pl/pressKitGenerator.json?jsonp_callback=?",extendedParams.params,callback);    
        
    }
    
    /**
    * Pobiera strukturÄ™ presskitu.
    * @param params Zawiera informacje dotyczÄ…ce wyÅ›wietlanych materiaÅ‚Ã³w.
    * @param {Object} params.element Obiekt jquery, do ktÃ³rego bÄ™dÄ… dodane materiaÅ‚y.
    * @param {String} params.domain Domena, z ktÃ³rej pobierane sÄ… materiaÅ‚y.
    * @param {Number} params.count IlosÄ‡ materiaÅ‚Ã³w do wyÅ›wietlenia.
    * @param params.params Parametry dla jsona.
    * @param {Number} params.params.catId Kategoria z ktÃ³rej pobierane sÄ… materiaÅ‚y.
    * @param {String} params.params.showFiles Czy uwzglÄ™dniaÄ‡ pliki czy same foldery.
    * @param {String[]} params.ext Pliki z jakimi rozszerzeniami majÄ… byÄ‡ pokazywane.
    * @param params.sort Parametry sortowania plikÃ³w.
    * @param {String} params.sort.type Po czym sortujemy.
    * @param {String} params.sort.order Kierunek sortowania.
    * @param params.tmpl MÃ³wi o tym jak wygladaÄ‡ ma html z pojedynczym materiaÅ‚em.
    * @param {String} params.tmpl.cls dodatkowa klasa diva.
    * @param {String} params.tmpl.url Adres na jaki kierowaÄ‡ ma link.
    * @param {String} params.tmpl.html Szablon materiaÅ‚u stworzony pod jquery.tmpl.
    */    
    function getFiles(params) {
        /** @private */
        var defaults = {
            element: $("body"),
            insert: function(obj) {
                $("body").append(obj);
            },
            domain: commons.domain,
            count: 20,
            onlyFavourites: true,
            params: {
                showFiles: "yes",
                client: commons.id
            },
            ext: [],
            sort: {
                type: "date",
                order: "ascending"
            },
            tmpl: {
                cls: "",
                url: "",
                html: ['<div class="${$item.fileClass(fileId,mime,blocked)}">',
                            '<a href="${$item.fileUrl(url)}" class="thumbnail" title="${description}">',
                                '<table cellpadding="0" cellspacing="0" border="0">',
                                    '<tr>',
                                        '<td>',
                                            '{{html $item.fileThumbnail(mime,thumbnail)}}',
                                        '</td>',
                                    '</tr>',
                                '</table>',
                            '{{html $item.filePlay(mime)}}',
                        '</a>',
                        '<div class="title">',
                            '<div class="name">',
                                '<a href="${$item.fileUrl(url)}" title="${$item.fileTitle(description,name)}">${$item.fileTitle(description,name)}</a>',
                            '</div>',
                        '</div>',
                    '</div>']
            },
            callback: function(){}
        };
        
        var extendedParams = $.extend(true,defaults,params);
        
        function sortAscByFavouriteAndDescByDate(a,b) {
            if(b.favourite>a.favourite) {
                return 1;   
            } else if(a.favourite>b.favourite) {
                return -1;
            } else {
                return b.creationDate - a.creationDate;
            }
        }
        
        /* Co siÄ™ dzieje z danymi otrzymanymi z jsona. */
        function callback(data) {
            var tmpl, arr = [], finalArr=[], c=0, item;
            
            function foldersLookup(arrayObj,level) {
                
                //do something with single file
                function registerFile(file) {
                    var extLength = extendedParams.ext.length;
                    if(extLength>0) {
                        for (var i=0; i<extLength; i++) {
                            if(file.url.indexOf(extendedParams.ext[i])!==-1||file.mime.indexOf(extendedParams.ext[i])!==-1) {
                                if (file.favourite===extendedParams.onlyFavourites||extendedParams.onlyFavourites===false){
                                    arr.push(file);
                                }
                                break;
                            }
                        }
                    } else {
                        if (file.favourite===extendedParams.onlyFavourites||extendedParams.onlyFavourites===false){
                            arr.push(file);
                        }
                    }
                }
                
                //loop through folders
                $.each(arrayObj,function(index){                    
                    item = arrayObj[index];
                    
                    //if folder is not hidden
                    if(item.hidden===false) {
                        /*log(level,item.name,item.hidden);*/
                        
                        //loop through files
                        $.each(item.files,function(index){
                            //execute func that does something with file
                            registerFile(item.files[index]);
                        });
                        
                        //check for subfolders in this folder
                        if(item.folders.length>0) {
                            //loop through subfolders of this folder
                            foldersLookup(item.folders,level+1);
                        }
                    }
                });
                
            }
            
            //execute loop through folders
            foldersLookup(data,0);

            arr.sort(sortAscByFavouriteAndDescByDate);
            
            //cut array to desired files count
            $.each(arr,function(index){
                var maxFiles = extendedParams.count-1;
                if(index<=maxFiles) {
                    finalArr.push(arr[index]);
                }
            });
            
            tmpl = $.tmpl("myTemplate",finalArr,{
                fileClass: function(fileId,mime,blocked) {
                    var mim = mime.split("/");
                    var cls = "file file-"+fileId+" file-"+mim[0]+" file-"+mim[1]+" "+extendedParams.tmpl.cls;
                    return cls;
                },
                fileUrl: function(url) {
                    if (extendedParams.tmpl.url!=="") {
                        return extendedParams.tmpl.url;
                    } else {
                        return url;
                    }
                },
                fileTitle: function(description,name) {
                    if (description!=="") {
                        return description;
                    } else {
                        return name;
                    }
                },
                fileThumbnail: function(mime,thumbnail) {         
                    if(thumbnail!=="") {
                        return "<img alt='' src='http://cdn2.netpr.pl"+thumbnail+"'/>";
                    } else {
                        var ext;
                        if(mime.indexOf('pdf')){
                            ext='pdf';
                        } else if (mime.indexOf('doc')){
                            ext='doc';
                        } else if (mime.indexOf('xls')){
                            ext='xls';
                        } else {
                            ext='none';
                        }
                        return "<img alt='' src='http://cdn2.netpr.pl/m/lib/icons/"+ext+".gif'/>";
                    }
                },
                filePlay: function(mime) {
                    if (mime.indexOf('video')!==-1) {
                        return "<div class='playIcn'></div>";
                    } else {
                        return "";
                    }
                }
            });
            
            //execute template compilation
            compileTemplate("myTemplate",extendedParams.tmpl.html);
            
            if(typeof params.insert!=="undefined") {
                extendedParams.insert(tmpl);
                
            } else {
                extendedParams.element.append(tmpl);
            }
            
            extendedParams.callback();
            
        }
        
        getJson(extendedParams.domain+"/pressKitGenerator.json?jsonp_callback=?",extendedParams.params,callback);
        
    }

    /** @scope NETPR.func */
    return {
        init:initialize,
        getCommons: getCommons,
        getFiles:getFiles,
        getCategories:getCategories,
        getReleases:getReleases,
        getCloud: getTagsCloud
    };
    
}());
