/* Hatena.Star.Entry */
Hatena.Star.Entry = new Ten.Class({
    initialize: function(e) {
        this.entry = e;
        this.uri = e.uri;
        this.title = e.title;
        this.star_container = e.star_container;
        this.comment_container = e.comment_container;
        this.entryNode = e.entryNode;
        this.stars = [];
        this.colored_stars = [];
        this.comments = [];
        this.starEntry = null;
    },
    maxStarCount: 11
},{
    flushStars: function() {
        this.stars = [];
        this.star_container.innerHTML = '';
    },
    bindStarEntry: function(se) {
        this.starEntry = se;
        if (se.colored_stars) {
            var colored_star_hash = {};
            for (var i = 0, len = se.colored_stars.length; i < len ; i++){
                colored_star_hash[se.colored_stars[i].color] = se.colored_stars[i].stars;
            }
            var cs = "blue,red,green".split(',');
            for (var i = 0, len = cs.length; i < len ; i++){
                var csh = colored_star_hash[cs[i]];
                if (csh) this.pushStars(csh,cs[i]);
            }
        }
        this.pushStars(se.stars);
        if (se.comments && !this.comments.length) {
            for (var i = 0; i < se.comments.length; i++) {
                this.comments.push(new Hatena.Star.Comment(se.comments[i]));
            }
        }
        this.can_comment = se.can_comment;
    },
    pushStars: function(s,c) {
        for (var i = 0; i < s.length; i++) {
            if (typeof(s[i]) == 'number') {
                this.stars.push(new Hatena.Star.InnerCount(s[i],this,c));
            } else if(s[i]) {
                var args = s[i];
                args.entry = this.entry;
                args.container = this.star_container;
                args.color = c;
                this.stars.push(new Hatena.Star.Star(args));
            }
        }
    },
    setCanComment: function(v) {
        this.can_comment = v;
    },
    showButtons: function() {
        this.addAddButton();
        this.addCommentButton();
    },
    addAddButton: function() {
        var sc = this.star_container;
        if (sc) {
            if(sc.parentNode.id!='redContainer' && sc.parentNode.id!='greenContainer' && sc.parentNode.id!='yellowContainer') {
              this.addButton = new Hatena.Star.AddButton(this,sc);
              sc.appendChild(this.addButton);
            }
        }
    },
    addCommentButton: function() {
        var cc = this.comment_container;
        if (cc) {
            this.commentButton = new Hatena.Star.CommentButton(this,cc);
            cc.appendChild(this.commentButton.img);
        }
    },
    showStars: function() {
        var sc = this.star_container;
        for (var i = 0; i < this.stars.length; i++) {
            sc.appendChild(this.stars[i].asElement());
        }
    },
    showCommentButton: function() {
        if (this.can_comment) {
            this.commentButton.show();
            if (this.comments.length) this.commentButton.activate();
        } else {
            // this.commentButton.hide();
        }
    },
    addTemporaryStar: function(args) {
//        if (this.temporaryStar) return;
        if (this.temporaryStar) {
            this.temporaryStar.parentNode.removeChild(this.temporaryStar);
        }
        var s = new Hatena.Star.Star({
            color: 'temp',
            name: '',
            entry: this,
            container: document.getElementById(document.getElementById('mySelectedColor').value+'Container').getElementsByTagName('span')[1]

        });
        this.temporaryStar = s.asElement();
        document.getElementById(document.getElementById('mySelectedColor').value+'Container').getElementsByTagName('span')[1].appendChild(this.temporaryStar);
    },
    removeTemporaryStar: function() {
        if (!this.temporaryStar) return;
        this.temporaryStar.style.display = 'none';
        this.temporaryStar = null;
    },
    addStar: function(args) {
        var star = new Hatena.Star.Star({
            color: args.color,
            name: args.name,
            quote: args.quote,
            entry: this,
            container: document.getElementById(document.getElementById('mySelectedColor').value+'Container').getElementsByTagName('span')[1]
        });
        this.stars.push(star);
        star.container.appendChild(star.asElement());
        //this.constructor.dispatchEvent('starAdded', this);
    },
    addComment: function(com) {
        if (!this.comments) this.comments = [];
        if (this.comments.length == 0) {
            this.commentButton.activate();
        }
        this.comments.push(com);
    },
    showCommentCount: function() {
        this.comment_container.innerHTML += this.comments.length;
    }
});


Hatena.Star.Star.getImage = function(container) {
        var color = this.ColorPallet[container._starColor];
        color = (color) ? color : this.ColorPallet['yellow'];
        if(color.ImgSrcSelector==".hatena-star-temp-star-image") {
            if(!this.gotImage['temp']) {
                var imgTemp = document.createElement('img');
                imgTemp.src = color.ImgSrc;
                imgTemp.setAttribute('tabIndex', 0);
                imgTemp.className = 'hatena-star-star';
                with (imgTemp.style) {
                    padding = '0';
                    border = 'none';
                }
                this.gotImage['temp'] = imgTemp;
            }
            return this.gotImage['temp'];
        } else if (!this.gotImage[container.parentNode.id]) {
            var img = document.createElement('img');
            img.src = getStarSrc(color, container);//'http://s.hatena.ne.jp/images/star-red.gif';
            img.setAttribute('tabIndex', 0);
            img.className = 'hatena-star-star';
            with (img.style) {
                padding = '0';
                border = 'none';
            }
            this.gotImage[container.parentNode.id] = img;
        }
        return this.gotImage[container.parentNode.id].cloneNode(false);
    }


function getStarSrc(color, container) {
  if(container.parentNode.id=='redContainer') {
    return 'http://s.hatena.ne.jp/images/star-red.gif';
  } else   if(container.parentNode.id=='blueContainer') {
    return 'http://s.hatena.ne.jp/images/star-blue.gif';
  } else if(container.parentNode.id=='greenContainer') {
    return 'http://s.hatena.ne.jp/images/star-green.gif';
  }

  return 'http://s.hatena.ne.jp/images/star.gif';

}

/* Hatena.Star.Pallet */
Hatena.Star.Pallet = new Ten.Class({
    base: [Ten.SubWindow],
    style: {
        padding: '0px',
        textAlign: 'center',
        border: '0px'
    },
    containerStyle: {
        textAlign: 'left',
        margin: 0,
        padding: 0
    },
    handleStyle: null,
    closeButton: null,
    draggable: false,
    SELECTED_COLOR_ELEMENT_ID: 'hatena-star-selected-color',
    PALLET_ELEMENT_ID: 'hatena-star-color-pallet'
},{
    isSelectedColor : function() {
        return (this.container && this.container.getElementById && this.container.getElementById(Hatena.Star.Pallet.SELECTED_COLOR_ELEMENT_ID)) ? true : false;
    },
    isColorPallet : function() {
        return (this.container && this.container.getElenentById && this.container.getElementById(Hatena.Star.Pallet.PALLET_ELEMENT_ID)) ? true : false;
    },
    showSelectedColor: function(pos, addButton) {
        this.hide();
        this.container.innerHTML = '';
        if (addButton) this.addButton = addButton;
        if (pos) this.selected_color_pos = pos;
        var iframeStyle;
        if (Ten.Browser.isIE) iframeStyle = "width:16px;height:5px;border:1px solid #bbbbbb;";
        else iframeStyle = "width:14px;height:3px;border:1px solid #bbbbbb;";
        this.container.innerHTML = '<iframe id="' + Hatena.Star.Pallet.SELECTED_COLOR_ELEMENT_ID + '" src="http://blog.isocchi.com/selected'+document.getElementById('mySelectedColor').value+'.html" frameborder="0" border="0" scrolling="no" style="' + iframeStyle + 'position:absolute;margin:0;padding:0;overflow:hidden;"/>';
        var clickhandlerStyle = {
            position: "absolute",
            top: "0px",
            left: "0px",
            width: "16px",
            height: "5px",
            margin: "0",
            padding: "0",
            display: "block",
            cursor: "pointer"
        }; 
        var E = Ten.Element;
        var div = E('div',{
                title : 'select color',
                alt   : 'select color',
                style : clickhandlerStyle
            });
        this.container.appendChild(div);
        this.selectedColor =this.container.childNodes[0];
        this.isNowLoading = true;
        new Ten.Observer(this.selectedColor,'onload',this , 'showSelectedColorDelay');
        new Ten.Observer(this.container.childNodes[1],'onclick',this.addButton,'showColorPallet');
    },
    showSelectedColorDelay: function() {
        this.show(this.selected_color_pos);
        this.isNowLoading = false;
        this.screen.style.display = 'none';
    },
    showPallet: function(pos, addButton) {
        this.hide();
        this.container.innerHTML = '';
        if (addButton) this.addButton = addButton;
        if (pos) this.pallet_pos = pos;
        this.addButton.clearSelectedColorTimer();
        this.container.innerHTML = '<iframe id="' + Hatena.Star.Pallet.PALLET_ELEMENT_ID + '" src="http://blog.isocchi.com/palette.html#'+document.getElementById('mySelectedColor').value+'" frameborder="0" border="0" scrolling="no" style="width:16px;height:55px;overflow:hidden;"/>';
        this.pallet =this.container.childNodes[0];
        this.isNowLoading = true;
        new Ten.Observer(this.pallet,'onload',this , 'observerSelectColor');
    },
    hidePallet: function() {
        var self = this;
        setTimeout(function() {
            if( self.isColorPallet) self.showSelectedColor();
        },2000);
    },
    selectColor: function(e){
        this.addButton.color = e.target.className.split('-')[2];
        this.showSelectedColor();
    },
    observerSelectedColor: function(){
        this.show(this.pallet_pos);
    },
    observerSelectColor: function(){
        this._pallet_onloaded = (this._pallet_onloaded) ? this._pallet_onloaded : 0;
        this._pallet_onloaded ++;
        if (this._pallet_onloaded == 1){
            this.show(this.pallet_pos);
            this.isNowLoading = false;
        } else if (this._pallet_onloaded > 1) {
            this._pallet_onloaded = 0;
            this.showSelectedColor();
            this.isNowLoading = true;
        }
    }
});

/* Hatena.Star.AddButton */
Hatena.Star.AddButton = new Ten.Class({
    base: [Hatena.Star.Button],
    initialize: function(entry,container) {
        this.entry = entry;
        this.lastPosition = null;
        this.selectedText = null;
        this.showSelectedColorTimerId = null;
        this.hideSelectedColorTimerId = null;
        var src = Hatena.Star.Button.getImgSrc(this.constructor,container);
        var img = Hatena.Star.Button.createButton({
            src: src,
            tabIndex: 0,
            alt: 'Add Star',
            title: 'Add Star'
        });
        img.className = 'hatena-star-add-button';
        new Ten.Observer(img,'onclick',this,'addStar');
        new Ten.Observer(img,'onkeyup',this,'handleKeyUp');
        new Ten.Observer(img,'onmouseover',this,'showSelectedColor');
        new Ten.Observer(img,'onmouseover',this,'copySelectedText');
        new Ten.Observer(img,'onmouseout',this,'clearSelectedColorTimer');
        this.img = img;
        return img;
    },
    ImgSrcSelector: '.hatena-star-add-button-image',
    ImgSrc: Hatena.Star.BaseURL + 'images/add.gif'
},{
    handleKeyUp: function(e) {
        if (!e.isKey('enter')) return;
        this.addStar(e);
    },
    clearSelectedColorTimer : function() {
        try{ clearTimeout(this.showSelectedColorTimerId); }catch(e){};
        try{ clearTimeout(this.hideSelectedColorTimerId); }catch(e){};
    },
    showSelectedColor : function(e) {
        var self = this;
        this.clearSelectedColorTimer();
        this.showSelectedColorTimerId = setTimeout(function(){
            self._showSelectedColor();
        },1000);
    },
    _showSelectedColor : function(e) {
        if (this.pallet) {
        } else {
            this.pallet = new Hatena.Star.Pallet();
        }
        if (this.pallet.isNowLoading) return;
        var pos = Ten.Geometry.getElementPosition(this.img);
        if (Ten.Browser.isFirefox || Ten.Browser.isOpera) {
            pos.y += 15;
            pos.x += 2;
        } else {
            pos.y += 13;
        }
        this.pallet.showSelectedColor(pos, this);
    },
    hideSelectedColor : function(e) {
        var self = this;
        this.clearSelectedColorTimer();
        this.hideSelectedColorTimerId = setTimeout(function(){
            if (self.pallet.isSelectedColor) {
                self.pallet.hide();
            }
        },2000);
    },
    showColorPallet : function(e) {
        this.clearSelectedColorTimer();
        if (!this.pallet) this.pallet = new Hatena.Star.Pallet();
        var pos = Ten.Geometry.getElementPosition(this.img);
        if (Ten.Browser.isFirefox || Ten.Browser.isOpera) {
            pos.y += 15;
            pos.x += 2;
        } else {
            pos.y += 13;
        }
        this.pallet.showPallet(pos, this);
    },
    copySelectedText: function(e) {
        this.selectedText = Ten.DOM.getSelectedText().substr(0,200);
    },
    addStar: function(e) {
        this.color = (this.color) ? this.color : 'yellow';
        this.entry.addTemporaryStar({color: this.color});
        this.lastPosition = e.mousePosition();
        var quote = this.selectedText;
        var entryUrlWithColor = this.entry.uri;
        if(entryUrlWithColor.lastIndexOf('#') != -1) {
            entryUrlWithColor = entryUrlWithColor.substring(0, entryUrlWithColor.lastIndexOf('#'));
        }
        entryUrlWithColor += '#'+document.getElementById('mySelectedColor').value;
        var uri = Hatena.Star.BaseURL + 'star.add.json?uri=' + encodeURIComponent(entryUrlWithColor) +
            '&title=' + encodeURIComponent(this.entry.title) +
            '&quote=' + encodeURIComponent(quote) +
            '&location=' + encodeURIComponent(document.location.href);
        if (Hatena.Star.Token) {
            uri += '&token=' + Hatena.Star.Token;
        }
        if (Hatena.Visitor) {
            if (Hatena.Visitor.RKS) {
                uri += '&rks=' + Hatena.Visitor.RKS;
            }
            if (Hatena.Visitor.sessionParams) {
                var params = Hatena.Visitor.sessionParams;
                for (var key in params) {
                    uri += '&' + key + '=' + encodeURIComponent(params[key]);
                }
            }
        }
        new Ten.JSONP(uri, this, 'receiveResult');
    },
    receiveResult: function(args) {
        this.entry.removeTemporaryStar();
        var name = args ? args.name : null;
        var color = args ? args.color : '';
        var pos = this.lastPosition;
        pos.x -= 10;
        pos.y += 25;
        if (name) {
            this.entry.addStar({
                color: color,
                name: name,
                quote: args.quote
            });
        } else if (args.is_guest && args.html) {
            var win = new Hatena.LoginWindow();
            win.addLoginForm(args.html);
            win.show(pos);
        } else if (args.errors) {
            var scroll = Ten.Geometry.getScroll();
            var scr = new Hatena.Star.AlertScreen();
            var alert = args.errors[0];
            scr.showAlert(alert, pos);
        }
    }
});


